CMS 3D CMS Logo

TrackTransformer.cc
Go to the documentation of this file.
2 
6 
9 
13 
20 
24 
26 
27 using namespace std;
28 using namespace edm;
29 
32  theRPCInTheFit(parameterSet.getParameter<bool>("RefitRPCHits")),
33  theDoPredictionsOnly(parameterSet.getParameter<bool>("DoPredictionsOnly")),
34  theRefitDirection(parameterSet.getParameter<string>("RefitDirection")),
35  theFitterName(parameterSet.getParameter<string>("Fitter")),
36  theSmootherName(parameterSet.getParameter<string>("Smoother")),
37  thePropagatorName(parameterSet.getParameter<string>("Propagator")),
38  theTrackerRecHitBuilderName(parameterSet.getParameter<string>("TrackerRecHitBuilder")),
39  theMuonRecHitBuilderName(parameterSet.getParameter<string>("MuonRecHitBuilder")),
40  theMTDRecHitBuilderName(parameterSet.getParameter<string>("MTDRecHitBuilder"))
41  {}
42 
45 
47  bool DoPredictionsOnly,
48  const std::string& Fitter,
49  const std::string& Smoother,
50  const std::string& Propagator,
52  bool RefitRPCHits,
56  desc.add<bool>("DoPredictionsOnly",DoPredictionsOnly);
57  desc.add<std::string>("Fitter",Fitter);
58  desc.add<std::string>("Smoother",Smoother);
59  desc.add<std::string>("Propagator",Propagator);
60  desc.add<std::string>("RefitDirection",RefitDirection);
61  desc.add<bool>("RefitRPCHits",RefitRPCHits);
62  desc.add<std::string>("TrackerRecHitBuilder",TrackerRecHitBuilder);
63  desc.add<std::string>("MuonRecHitBuilder",MuonRecHitBuilder);
64  desc.add<std::string>("MTDRecHitBuilder",MTDRecHitBuilder);
65 }
66 
68 
69  const std::string metname = "Reco|TrackingTools|TrackTransformer";
70 
73  setup.get<TrajectoryFitter::Record>().get(theFitterName,aFitter);
74  setup.get<TrajectoryFitter::Record>().get(theSmootherName,aSmoother);
75  theFitter = aFitter->clone();
76  theSmoother.reset(aSmoother->clone());
77 
78  unsigned long long newCacheId_TC = setup.get<TrackingComponentsRecord>().cacheIdentifier();
79 
80  if ( newCacheId_TC != theCacheId_TC ){
81  LogTrace(metname) << "Tracking Component changed!";
82  theCacheId_TC = newCacheId_TC;
84  }
85 
86  // Global Tracking Geometry
87  unsigned long long newCacheId_GTG = setup.get<GlobalTrackingGeometryRecord>().cacheIdentifier();
88  if ( newCacheId_GTG != theCacheId_GTG ) {
89  LogTrace(metname) << "GlobalTrackingGeometry changed!";
90  theCacheId_GTG = newCacheId_GTG;
92  }
93 
94  // Magfield Field
95  unsigned long long newCacheId_MG = setup.get<IdealMagneticFieldRecord>().cacheIdentifier();
96  if ( newCacheId_MG != theCacheId_MG ) {
97  LogTrace(metname) << "Magnetic Field changed!";
98  theCacheId_MG = newCacheId_MG;
100  }
101 
102  // Transient Rechit Builders
103  unsigned long long newCacheId_TRH = setup.get<TransientRecHitRecord>().cacheIdentifier();
104  if ( newCacheId_TRH != theCacheId_TRH ) {
105  theCacheId_TRH = newCacheId_TRH;
106  LogTrace(metname) << "TransientRecHitRecord changed!";
112  }
113  theFitter->setHitCloner(&hitCloner);
114  theSmoother->setHitCloner(&hitCloner);
115 
116 }
117 
118 
119 vector<Trajectory> TrackTransformer::transform(const reco::TrackRef& track) const {
120  return transform(*track);
121 }
122 
123 
126 
128  auto tkbuilder = static_cast<TkTransientTrackingRecHitBuilder const *>(theTrackerRecHitBuilder.product());
129 
130 
131  for (auto hit = track.recHitsBegin(); hit != track.recHitsEnd(); ++hit) {
132  if((*hit)->isValid()) {
133  if ( (*hit)->geographicalId().det() == DetId::Tracker ) {
134  result.emplace_back((**hit).cloneForFit(*tkbuilder->geometry()->idToDet( (**hit).geographicalId() ) ) );
135  } else if ( (*hit)->geographicalId().det() == DetId::Muon ){
136  if( (*hit)->geographicalId().subdetId() == 3 && !theRPCInTheFit){
137  LogTrace("Reco|TrackingTools|TrackTransformer") << "RPC Rec Hit discarged";
138  continue;
139  }
140  result.push_back(theMuonRecHitBuilder->build(&**hit));
141  } else if ( (*hit)->geographicalId().det() == DetId::Forward &&
142  (*hit)->geographicalId().subdetId() == FastTime ) {
143  if ( theMtdAvailable ) result.push_back(theMTDRecHitBuilder->build(&**hit));
144  else throw cms::Exception("TrackTransformer") << "MTD hit encountered but MTD not available!";
145  }
146  }
147  }
148 
149  return result;
150 }
151 
152 // FIXME: check this method!
155 
156  if (!recHits.empty()){
157  GlobalPoint first = trackingGeometry()->idToDet(recHits.front()->geographicalId())->position();
158  GlobalPoint last = trackingGeometry()->idToDet(recHits.back()->geographicalId())->position();
159 
160  // maybe perp2?
161  auto rFirst = first.mag2();
162  auto rLast = last.mag2();
163  if(rFirst < rLast) return RefitDirection::insideOut;
164  if(rFirst > rLast) return RefitDirection::outsideIn;
165  }
166  LogDebug("Reco|TrackingTools|TrackTransformer") << "Impossible to determine the rechits order" <<endl;
168 }
169 
170 
172 vector<Trajectory> TrackTransformer::transform(const reco::Track& newTrack) const {
173 
174  const std::string metname = "Reco|TrackingTools|TrackTransformer";
175 
177 
178  auto recHitsForReFit = getTransientRecHits(track);
179  return transform(track, recHitsForReFit);
180 }
181 
182 
185  TransientTrackingRecHit::ConstRecHitContainer& recHitsForReFit) const {
186 
187  const std::string metname = "Reco|TrackingTools|TrackTransformer";
188 
189  if(recHitsForReFit.size() < 2) return vector<Trajectory>();
190 
191  // 8 cases are foreseen:
192  // [RH = rec hit order, P = momentum dir, FD = fit direction. IO/OI = inside-out/outside-in, AM/OM = along momentum/opposite to momentum]
193  // (1) RH IO | P IO | FD AM ---> Start from IN
194  // (2) RH IO | P IO | FD OM ---> Reverse RH and start from OUT
195  // (3) RH IO | P OI | FD AM ---> Reverse RH and start from IN
196  // (4) RH IO | P OI | FD OM ---> Start from OUT
197  // (5) RH OI | P IO | FD AM ---> Reverse RH and start from IN
198  // (6) RH OI | P IO | FD OM ---> Start from OUT
199  // (7) RH OI | P OI | FD AM ---> Start from IN
200  // (8) RH OI | P OI | FD OM ---> Reverse RH and start from OUT
201  //
202  // *** Rules: ***
203  // -A- If RH-FD agree (IO-AM,OI-OM) do not reverse the RH
204  // -B- If FD along momentum start from innermost state, otherwise use outermost
205 
206  // Other special cases can be handled:
207  // (1 bis) RH IO | P IO | GFD IO => FD AM ---> Start from IN
208  // (2 bis) RH IO | P IO | GFD OI => FD OM ---> Reverse RH and start from OUT
209  // (3 bis) RH IO | P OI | GFD OI => FD AM ---> Reverse RH and start from OUT
210  // (4 bis) RH IO | P OI | GFD IO => FD OM ---> Start from IN
211  // (5 bis) RH OI | P IO | GFD IO => FD AM ---> Reverse RH and start from IN
212  // (6 bis) RH OI | P IO | GFD OI => FD OM ---> Start from OUT
213  // (7 bis) RH OI | P OI | GFD OI => FD AM ---> Start from OUT
214  // (8 bis) RH OI | P OI | GFD IO => FD OM ---> Reverse RH and start from IN
215  //
216  // *** Additional rule: ***
217  // -A0- If P and GFD agree, then FD is AM otherwise is OM
218  // -A00- rechit must be ordered as GFD in order to handle the case of cosmics
219  // -B0- The starting state is decided by GFD
220 
221  // Determine the RH order
222  RefitDirection::GeometricalDirection recHitsOrder = checkRecHitsOrdering(recHitsForReFit); // FIXME change nome of the *type* --> RecHit order!
223  LogTrace(metname) << "RH order (0-insideOut, 1-outsideIn): " << recHitsOrder;
224 
226 
227  // Apply rule -A0-
228  if(propagationDirection == anyDirection){
231  RefitDirection::GeometricalDirection p = (momentum.x()*position.x() > 0 || momentum.y()*position.y() > 0) ? RefitDirection::insideOut : RefitDirection::outsideIn;
232 
234  LogTrace(metname) << "P (0-insideOut, 1-outsideIn): " << p;
235  LogTrace(metname) << "FD (0-OM, 1-AM, 2-ANY): " << propagationDirection;
236  }
237  // -A0-
238 
239  // Apply rule -A-
241  if((recHitsOrder == RefitDirection::insideOut && propagationDirection == oppositeToMomentum) ||
242  (recHitsOrder == RefitDirection::outsideIn && propagationDirection == alongMomentum) )
243  reverse(recHitsForReFit.begin(),recHitsForReFit.end());}
244  // -A-
245  // Apply rule -A00-
246  else{
247  // reorder the rechit as defined in theRefitDirection.geometricalDirection();
248  if(theRefitDirection.geometricalDirection() != recHitsOrder) reverse(recHitsForReFit.begin(),recHitsForReFit.end());
249  }
250  // -A00-
251 
252  // Apply rule -B-
254  unsigned int innerId = track.track().innerDetId();
256  if(propagationDirection == oppositeToMomentum){
257  innerId = track.track().outerDetId();
258  firstTSOS = track.outermostMeasurementState();
259  }
260  }
261  else { // if(theRefitDirection.propagationDirection() == anyDirection)
262  // Apply rule -B0-
264  innerId = track.track().outerDetId();
265  firstTSOS = track.outermostMeasurementState();
266  }
267  // -B0-
268  }
269  // -B-
270 
271  if(!firstTSOS.isValid()){
272  LogTrace(metname)<<"Error wrong initial state!"<<endl;
273  return vector<Trajectory>();
274  }
275 
277 
278  if(recHitsForReFit.front()->geographicalId() != DetId(innerId)){
279  LogTrace(metname)<<"Propagation occured"<<endl;
280  firstTSOS = propagator()->propagate(firstTSOS, recHitsForReFit.front()->det()->surface());
281  if(!firstTSOS.isValid()){
282  LogTrace(metname)<<"Propagation error!"<<endl;
283  return vector<Trajectory>();
284  }
285  }
286 
288  Trajectory aTraj(seed,propagationDirection);
289  TrajectoryStateOnSurface predTSOS = firstTSOS;
290  for(auto const & hit : recHitsForReFit) {
291  predTSOS = propagator()->propagate(predTSOS, hit->det()->surface());
292  if (predTSOS.isValid()) aTraj.push(TrajectoryMeasurement(predTSOS, hit));
293  }
294  return vector<Trajectory>(1, aTraj);
295  }
296 
297 
298  auto const & trajectories = theFitter->fit(seed,recHitsForReFit,firstTSOS);
299 
300  if(trajectories.empty()){
301  LogTrace(metname)<<"No Track refitted!"<<endl;
302  return trajectories;
303  }
304 
305  auto const & trajectoryBW = trajectories.front();
306 
307  auto const & trajectoriesSM = theSmoother->trajectories(trajectoryBW);
308 
309  if(trajectoriesSM.empty()){
310  LogTrace(metname)<<"No Track smoothed!"<<endl;
311  }
312 
313  return trajectoriesSM;
314 
315 }
316 
317 
#define LogDebug(id)
const std::string theTrackerRecHitBuilderName
T mag2() const
Definition: PV3DBase.h:66
const MagneticField * magneticField() const
the magnetic field
PropagationDirection propagationDirection() const
void setServices(const edm::EventSetup &) override
set the services needed by the TrackTransformer
const std::string metname
const RefitDirection theRefitDirection
GeometricalDirection geometricalDirection() const
const bool theRPCInTheFit
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
GlobalPoint globalPosition() const
PropagationDirection
unsigned long long theCacheId_TRH
TrajectoryStateOnSurface innermostMeasurementState() const
virtual TrajectorySmoother * clone() const =0
RefitDirection::GeometricalDirection checkRecHitsOrdering(TransientTrackingRecHit::ConstRecHitContainer const &) const
edm::ESHandle< GlobalTrackingGeometry > theTrackingGeometry
edm::ESHandle< TransientTrackingRecHitBuilder > theMTDRecHitBuilder
virtual std::unique_ptr< TrajectoryFitter > clone() const =0
edm::ESHandle< Propagator > thePropagator
unsigned long long theCacheId_MG
TransientTrackingRecHit::ConstRecHitContainer getTransientRecHits(const reco::TransientTrack &track) const
const SurfaceType & surface() const
edm::ESHandle< TransientTrackingRecHitBuilder > theMuonRecHitBuilder
std::unique_ptr< TrajectoryFitter > theFitter
unsigned long long theCacheId_TC
const std::string thePropagatorName
const std::string theFitterName
edm::ESHandle< MagneticField > theMGField
unsigned int outerDetId() const
DetId of the detector on which surface the outermost state is located.
Definition: Track.h:96
unsigned long long theCacheId_GTG
TrajectoryStateOnSurface outermostMeasurementState() const
edm::ESHandle< Propagator > const & propagator() const
std::vector< Trajectory > transform(const reco::Track &) const override
Convert a reco::Track into Trajectory.
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::ESHandle< TransientTrackingRecHitBuilder > theTrackerRecHitBuilder
#define LogTrace(id)
const std::string theMuonRecHitBuilderName
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
trackingRecHit_iterator recHitsEnd() const
last iterator to RecHits
std::vector< ConstRecHitPointer > ConstRecHitContainer
TkClonerImpl hitCloner
Definition: DetId.h:18
static void fillPSetDescription(edm::ParameterSetDescription &descriptions, bool DoPredictionsOnly=false, const std::string &Fitter="KFFitterForRefitInsideOut", const std::string &Smoother="KFSmootherForRefitInsideOut", const std::string &Propagator="SmartPropagatorAnyRK", const std::string &RefitDirection="alongMomentum", bool RefitRPCHits=true, const std::string &TrackerRecHitBuilder="WithTrackAngle", const std::string &MuonRecHitBuilder="MuonRecHitBuilder", const std::string &MTDRecHitBuilder="MTDRecHitBuilder")
fillDescriptions
const Track & track() const
const std::string theSmootherName
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
const std::string theMTDRecHitBuilderName
const bool theDoPredictionsOnly
HLT enums.
GlobalVector globalMomentum() const
static int position[264][3]
Definition: ReadPGInfo.cc:509
T get() const
Definition: EventSetup.h:71
const GeomDet * idToDet(DetId) const override
edm::ESHandle< GlobalTrackingGeometry > trackingGeometry() const
the tracking geometry
bool isValid() const
Definition: ESHandle.h:44
T x() const
Definition: PV3DBase.h:62
unsigned int innerDetId() const
DetId of the detector on which surface the innermost state is located.
Definition: Track.h:101
~TrackTransformer() override
Destructor.
T const * product() const
Definition: ESHandle.h:86
void push(const TrajectoryMeasurement &tm)
Definition: Trajectory.cc:50
trackingRecHit_iterator recHitsBegin() const
first iterator to RecHits
std::unique_ptr< TrajectorySmoother > theSmoother
ParameterSet const & parameterSet(Provenance const &provenance)
Definition: Provenance.cc:11
TrackTransformer(const edm::ParameterSet &)
Constructor.