CMS 3D CMS Logo

DAFTrackProducerAlgorithm.cc
Go to the documentation of this file.
26 
28  : conf_(conf), minHits_(conf.getParameter<int>("MinHits")) {}
29 
31  const MagneticField* theMF,
33  const MeasurementTrackerEvent* measTk,
34  const TrajectoryFitter* theFitter,
35  const TransientTrackingRecHitBuilder* builder,
36  const MultiRecHitCollector* measurementCollector,
38  const reco::BeamSpot& bs,
39  AlgoProductCollection& algoResults,
40  TrajAnnealingCollection& trajann,
41  bool TrajAnnSaving_,
42  AlgoProductCollection& algoResultsBeforeDAF,
43  AlgoProductCollection& algoResultsAfterDAF) const {
44  LogDebug("DAFTrackProducerAlgorithm") << "Size of map: " << TTmap.size() << "\n";
45 
46  int cont = 0;
47  int nTracksChanged = 0;
48 
49  for (TrajTrackAssociationCollection::const_iterator itTTmap = TTmap.begin(); itTTmap != TTmap.end(); itTTmap++) {
50  const edm::Ref<std::vector<Trajectory> > BeforeDAFTraj = itTTmap->key;
51  std::vector<TrajectoryMeasurement> BeforeDAFTrajMeas = BeforeDAFTraj->measurements();
52  const reco::TrackRef BeforeDAFTrack = itTTmap->val;
53 
54  float ndof = 0;
55  Trajectory CurrentTraj;
56 
57  if (BeforeDAFTraj->isValid()) {
58  LogDebug("DAFTrackProducerAlgorithm") << "The trajectory #" << cont + 1 << " is valid. \n";
59 
60  //getting the MultiRecHit collection and the trajectory with a first fit-smooth round
61  std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface> hits =
62  collectHits(*BeforeDAFTraj, measurementCollector, &*measTk);
63 
64  //new initial fit
65  CurrentTraj = fit(hits, theFitter, *BeforeDAFTraj);
66 
67  //starting the annealing program
68  for (std::vector<double>::const_iterator ian = updator->getAnnealingProgram().begin();
69  ian != updator->getAnnealingProgram().end();
70  ian++) {
71  if (CurrentTraj.isValid()) {
72  LogDebug("DAFTrackProducerAlgorithm") << "Seed direction is " << CurrentTraj.seed().direction()
73  << ".Traj direction is " << CurrentTraj.direction() << std::endl;
74 
75  //updating MultiRecHits and fit-smooth again
76  std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface> curiterationhits =
77  updateHits(CurrentTraj, updator, &*measTk, *ian);
78  if (curiterationhits.first.size() < 3) {
79  LogDebug("DAFTrackProducerAlgorithm")
80  << "Rejecting trajectory with " << curiterationhits.first.size() << " hits" << std::endl;
81  CurrentTraj = Trajectory();
82  break;
83  }
84 
85  CurrentTraj = fit(curiterationhits, theFitter, CurrentTraj);
86 
87  //saving trajectory for each annealing cycle ...
88  if (TrajAnnSaving_) {
89  TrajAnnealing temp(CurrentTraj, *ian);
90  trajann.push_back(temp);
91  }
92 
93  LogDebug("DAFTrackProducerAlgorithm") << "done annealing value " << (*ian);
94 
95  } else
96  break;
97  } //end annealing cycle
98 
99  int percOfHitsUnchangedAfterDAF =
100  (1. * checkHits(*BeforeDAFTraj, CurrentTraj) / (1. * BeforeDAFTrajMeas.size())) * 100.;
101  LogDebug("DAFTrackProducerAlgorithm")
102  << "Ended annealing program with " << percOfHitsUnchangedAfterDAF << " unchanged." << std::endl;
103 
104  //computing the ndof keeping into account the weights
105  ndof = calculateNdof(CurrentTraj);
106 
107  //checking if the trajectory has the minimum number of valid hits ( weight (>1e-6) )
108  //in order to remove tracks with too many outliers.
109  int goodHits = countingGoodHits(CurrentTraj);
110 
111  if (goodHits >= minHits_) {
112  bool ok = buildTrack(CurrentTraj, algoResults, ndof, bs, &BeforeDAFTrack);
113  // or filtered?
114  if (ok)
115  cont++;
116 
117  //saving tracks before and after DAF
118  if ((100. - percOfHitsUnchangedAfterDAF) > 0.) {
119  bool okBefore = buildTrack(*BeforeDAFTraj, algoResultsBeforeDAF, ndof, bs, &BeforeDAFTrack);
120  bool okAfter = buildTrack(CurrentTraj, algoResultsAfterDAF, ndof, bs, &BeforeDAFTrack);
121  if (okBefore && okAfter)
122  nTracksChanged++;
123  }
124  } else {
125  LogDebug("DAFTrackProducerAlgorithm") << "Rejecting trajectory with " << CurrentTraj.foundHits() << " hits";
126  }
127  } //end run on track collection
128  else {
129  LogDebug("DAFTrackProducerAlgorithm") << "Rejecting empty trajectory" << std::endl;
130  }
131  } //end run on track collection
132 
133  LogDebug("DAFTrackProducerAlgorithm") << "Number of Tracks found: " << cont << "\n";
134  LogDebug("DAFTrackProducerAlgorithm") << "Number of Tracks changed: " << nTracksChanged << "\n";
135 }
136 /*------------------------------------------------------------------------------------------------------*/
137 std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface> DAFTrackProducerAlgorithm::collectHits(
138  const Trajectory vtraj,
139  const MultiRecHitCollector* measurementCollector,
140  const MeasurementTrackerEvent* measTk) const {
141  LogDebug("DAFTrackProducerAlgorithm") << "Calling DAFTrackProducerAlgorithm::collectHits";
142 
143  //getting the traj measurements from the MeasurementCollector
144  int nHits = 0;
146  std::vector<TrajectoryMeasurement> collectedmeas = measurementCollector->recHits(vtraj, measTk);
147 
148  //if the MeasurementCollector is empty, make an "empty" pair
149  //else taking the collected measured hits and building the pair
150  if (collectedmeas.empty())
152 
153  for (std::vector<TrajectoryMeasurement>::const_iterator iter = collectedmeas.begin(); iter != collectedmeas.end();
154  iter++) {
155  nHits++;
156  hits.push_back(iter->recHit());
157  }
158 
159  //TrajectoryStateWithArbitraryError() == Creates a TrajectoryState with the same parameters
160  // as the input one, but with "infinite" errors, i.e. errors so big that they don't
161  // bias a fit starting with this state.
162  //return std::make_pair(hits,TrajectoryStateWithArbitraryError()(collectedmeas.front().predictedState()));
163 
164  // I do not have to rescale the error because it is already rescaled in the fit code
165  TrajectoryStateOnSurface initialStateFromTrack = collectedmeas.front().predictedState();
166 
167  LogDebug("DAFTrackProducerAlgorithm")
168  << "Pair (hits, TSOS) with TSOS predicted(collectedmeas.front().predictedState())";
169  return std::make_pair(hits, initialStateFromTrack);
170 }
171 /*------------------------------------------------------------------------------------------------------*/
172 std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface> DAFTrackProducerAlgorithm::updateHits(
173  const Trajectory vtraj,
175  const MeasurementTrackerEvent* theMTE,
176  double annealing) const {
177  LogDebug("DAFTrackProducerAlgorithm") << "Calling DAFTrackProducerAlgorithm::updateHits";
179  std::vector<TrajectoryMeasurement> vmeas = vtraj.measurements();
180  std::vector<TrajectoryMeasurement>::reverse_iterator imeas;
181  unsigned int hitcounter = 1;
182 
183  //I run inversely on the trajectory obtained and update the state
184  for (imeas = vmeas.rbegin(); imeas != vmeas.rend(); imeas++, hitcounter++) {
185  DetId id = imeas->recHit()->geographicalId();
186  MeasurementDetWithData measDet = theMTE->idToDet(id);
187 
189  TrajectoryStateOnSurface combtsos;
190  if (hitcounter == vmeas.size())
191  combtsos = imeas->predictedState(); //fwd
192  else if (hitcounter == 1)
193  combtsos = imeas->backwardPredictedState(); //bwd
194  else
195  combtsos = combiner(imeas->backwardPredictedState(), imeas->predictedState());
196 
197  PrintHit(&*imeas->recHit(), combtsos);
198  if (imeas->recHit()->isValid()) {
199  TransientTrackingRecHit::RecHitPointer updated = updator->update(imeas->recHit(), combtsos, measDet, annealing);
200  hits.push_back(updated);
201  } else {
202  hits.push_back(imeas->recHit());
203  }
204  }
205 
206  TrajectoryStateOnSurface updatedStateFromTrack = vmeas.back().predictedState();
207 
208  //return std::make_pair(hits,TrajectoryStateWithArbitraryError()(vmeas.back().updatedState()));
209  LogDebug("DAFTrackProducerAlgorithm") << "Pair (hits, TSOS) with TSOS predicted (vmeas.back().predictedState())";
210 
211  return std::make_pair(hits, updatedStateFromTrack);
212 }
213 /*------------------------------------------------------------------------------------------------------*/
215  const std::pair<TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface>& hits,
216  const TrajectoryFitter* theFitter,
217  Trajectory vtraj) const {
218  //creating a new trajectory starting from the direction of the seed of the input one and the hits
219  Trajectory newVec = theFitter->fitOne(TrajectorySeed({}, {}, vtraj.seed().direction()), hits.first, hits.second);
220 
221  if (newVec.isValid())
222  return newVec;
223  else {
224  LogDebug("DAFTrackProducerAlgorithm") << "Fit no valid.";
225  return Trajectory();
226  }
227 }
228 /*------------------------------------------------------------------------------------------------------*/
230  AlgoProductCollection& algoResults,
231  float ndof,
232  const reco::BeamSpot& bs,
233  const reco::TrackRef* BeforeDAFTrack) const {
234  LogDebug("DAFTrackProducerAlgorithm") << " BUILDER " << std::endl;
235  ;
236  TrajectoryStateOnSurface innertsos;
237 
238  if (vtraj.isValid()) {
239  std::unique_ptr<Trajectory> theTraj(new Trajectory(vtraj));
240 
241  if (vtraj.direction() == alongMomentum) {
242  //if (theTraj->direction() == oppositeToMomentum) {
243  innertsos = vtraj.firstMeasurement().updatedState();
244  } else {
245  innertsos = vtraj.lastMeasurement().updatedState();
246  }
247 
248  TSCBLBuilderNoMaterial tscblBuilder;
249  TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(*(innertsos.freeState()), bs);
250 
251  if (tscbl.isValid() == false)
252  return false;
253 
255  math::XYZPoint pos(v.x(), v.y(), v.z());
257  math::XYZVector mom(p.x(), p.y(), p.z());
258 
259  // LogDebug("TrackProducer") <<v<<p<<std::endl;
260 
261  auto algo = (*BeforeDAFTrack)->algo();
262  std::unique_ptr<reco::Track> theTrack(new reco::Track(vtraj.chiSquared(),
263  ndof, //in the DAF the ndof is not-integer
264  pos,
265  mom,
266  tscbl.trackStateAtPCA().charge(),
268  algo));
269  theTrack->setQualityMask((*BeforeDAFTrack)->qualityMask());
270 
271  AlgoProduct aProduct{theTraj.release(), theTrack.release(), vtraj.direction(), 0};
272  algoResults.push_back(aProduct);
273 
274  return true;
275  } else {
276  LogDebug("DAFTrackProducerAlgorithm") << " BUILDER NOT POSSIBLE: traj is not valid" << std::endl;
277  ;
278  return false;
279  }
280 }
281 /*------------------------------------------------------------------------------------------------------*/
283  int ngoodhits = 0;
284  std::vector<TrajectoryMeasurement> vtm = traj.measurements();
285 
286  for (std::vector<TrajectoryMeasurement>::const_iterator tm = vtm.begin(); tm != vtm.end(); tm++) {
287  //if the rechit is valid
288  if (tm->recHit()->isValid()) {
289  SiTrackerMultiRecHit const& mHit = dynamic_cast<SiTrackerMultiRecHit const&>(*tm->recHit());
290  std::vector<const TrackingRecHit*> components = mHit.recHits();
291 
292  int iComp = 0;
293 
294  for (std::vector<const TrackingRecHit*>::const_iterator iter = components.begin(); iter != components.end();
295  iter++, iComp++) {
296  //if there is at least one component with weight higher than 1e-6 then the hit is not an outlier
297  if (mHit.weight(iComp) > 1e-6) {
298  ngoodhits++;
299  iComp++;
300  break;
301  }
302  }
303  }
304  }
305 
306  LogDebug("DAFTrackProducerAlgorithm") << "Original number of valid hits " << traj.foundHits()
307  << " -> hit with good weight (>1e-6) are " << ngoodhits;
308  return ngoodhits;
309 }
310 /*------------------------------------------------------------------------------------------------------*/
311 
313  std::vector<Trajectory>& input,
314  int minhits,
315  std::vector<Trajectory>& output,
316  const TransientTrackingRecHitBuilder* builder) const {
317  if (input.empty())
318  return;
319 
320  int ngoodhits = 0;
321  std::vector<TrajectoryMeasurement> vtm = input[0].measurements();
323 
324  //count the number of non-outlier and non-invalid hits
325  for (std::vector<TrajectoryMeasurement>::reverse_iterator tm = vtm.rbegin(); tm != vtm.rend(); tm++) {
326  //if the rechit is valid
327  if (tm->recHit()->isValid()) {
328  SiTrackerMultiRecHit const& mHit = dynamic_cast<SiTrackerMultiRecHit const&>(*tm->recHit());
329  std::vector<const TrackingRecHit*> components = mHit.recHits();
330  int iComp = 0;
331  bool isGood = false;
332  for (std::vector<const TrackingRecHit*>::const_iterator iter = components.begin(); iter != components.end();
333  iter++, iComp++) {
334  //if there is at least one component with weight higher than 1e-6 then the hit is not an outlier
335  if (mHit.weight(iComp) > 1e-6) {
336  ngoodhits++;
337  iComp++;
338  isGood = true;
339  break;
340  }
341  }
342  if (isGood) {
343  TkClonerImpl hc = static_cast<TkTransientTrackingRecHitBuilder const*>(builder)->cloner();
344  auto tempHit = hc.makeShared(tm->recHit(), tm->updatedState());
345  hits.push_back(tempHit);
346  } else
347  hits.push_back(std::make_shared<InvalidTrackingRecHit>(*tm->recHit()->det(), TrackingRecHit::missing));
348  } else {
349  TkClonerImpl hc = static_cast<TkTransientTrackingRecHitBuilder const*>(builder)->cloner();
350  auto tempHit = hc.makeShared(tm->recHit(), tm->updatedState());
351  hits.push_back(tempHit);
352  }
353  }
354 
355  LogDebug("DAFTrackProducerAlgorithm") << "Original number of valid hits " << input[0].foundHits()
356  << "; after filtering " << ngoodhits;
357  if (ngoodhits > input[0].foundHits())
358  edm::LogError("DAFTrackProducerAlgorithm")
359  << "Something wrong: the number of good hits from DAFTrackProducerAlgorithm::filter " << ngoodhits
360  << " is higher than the original one " << input[0].foundHits();
361 
362  if (ngoodhits < minhits)
363  return;
364 
365  TrajectoryStateOnSurface curstartingTSOS = input.front().lastMeasurement().updatedState();
366  LogDebug("DAFTrackProducerAlgorithm") << "starting tsos for final refitting " << curstartingTSOS;
367  //curstartingTSOS.rescaleError(100);
368 
369  output = fitter->fit(TrajectorySeed({}, {}, input.front().seed().direction()),
370  hits,
371  TrajectoryStateWithArbitraryError()(curstartingTSOS));
372 
373  LogDebug("DAFTrackProducerAlgorithm") << "After filtering " << output.size() << " trajectories";
374 }
375 /*------------------------------------------------------------------------------------------------------*/
377  if (!vtraj.isValid())
378  return 0;
379  float ndof = 0;
380  const std::vector<TrajectoryMeasurement>& meas = vtraj.measurements();
381  for (std::vector<TrajectoryMeasurement>::const_iterator iter = meas.begin(); iter != meas.end(); iter++) {
382  if (iter->recHit()->isValid()) {
383  SiTrackerMultiRecHit const& mHit = dynamic_cast<SiTrackerMultiRecHit const&>(*iter->recHit());
384  std::vector<const TrackingRecHit*> components = mHit.recHits();
385  int iComp = 0;
386  for (std::vector<const TrackingRecHit*>::const_iterator iter2 = components.begin(); iter2 != components.end();
387  iter2++, iComp++) {
388  if ((*iter2)->isValid())
389  ndof += ((*iter2)->dimension()) * mHit.weight(iComp);
390  }
391  }
392  }
393 
394  return ndof - 5;
395 }
396 //------------------------------------------------------------------------------------------------
397 int DAFTrackProducerAlgorithm::checkHits(Trajectory iInitTraj, const Trajectory iFinalTraj) const {
398  std::vector<TrajectoryMeasurement> initmeasurements = iInitTraj.measurements();
399  std::vector<TrajectoryMeasurement> finalmeasurements = iFinalTraj.measurements();
400  std::vector<TrajectoryMeasurement>::iterator jmeas;
401  int nSame = 0;
402  int ihit = 0;
403 
404  if (initmeasurements.empty() || finalmeasurements.empty()) {
405  LogDebug("DAFTrackProducerAlgorithm") << "Initial or Final Trajectory empty.";
406  return 0;
407  }
408 
409  if (initmeasurements.size() != finalmeasurements.size()) {
410  LogDebug("DAFTrackProducerAlgorithm")
411  << "Initial Trajectory size(" << initmeasurements.size() << " hits) "
412  << "is different to final traj size (" << finalmeasurements.size() << ")! No checkHits possible! ";
413  return 0;
414  }
415 
416  for (jmeas = initmeasurements.begin(); jmeas != initmeasurements.end(); jmeas++) {
417  const TrackingRecHit* initHit = jmeas->recHit()->hit();
418  if (!initHit->isValid() && ihit == 0)
419  continue;
420 
421  if (initHit->isValid()) {
422  TrajectoryMeasurement imeas = finalmeasurements.at(ihit);
423  const TrackingRecHit* finalHit = imeas.recHit()->hit();
424  const TrackingRecHit* MaxWeightHit = nullptr;
425  float maxweight = 0;
426 
427  const SiTrackerMultiRecHit* mrh = dynamic_cast<const SiTrackerMultiRecHit*>(finalHit);
428  if (mrh) {
429  std::vector<const TrackingRecHit*> components = mrh->recHits();
430  std::vector<const TrackingRecHit*>::const_iterator icomp;
431  int hitcounter = 0;
432 
433  for (icomp = components.begin(); icomp != components.end(); icomp++) {
434  if ((*icomp)->isValid()) {
435  double weight = mrh->weight(hitcounter);
436  if (weight > maxweight) {
437  MaxWeightHit = *icomp;
438  maxweight = weight;
439  }
440  }
441  hitcounter++;
442  }
443  if (!MaxWeightHit)
444  continue;
445 
446  auto myref1 = reinterpret_cast<const BaseTrackerRecHit*>(initHit)->firstClusterRef();
447  auto myref2 = reinterpret_cast<const BaseTrackerRecHit*>(MaxWeightHit)->firstClusterRef();
448 
449  if (myref1 == myref2) {
450  nSame++;
451  } else {
452  LogDebug("DAFTrackProducerAlgorithm") << "diverso hit!" << std::endl;
453  TrajectoryStateOnSurface dummState;
454  LogTrace("DAFTrackProducerAlgorithm") << " This hit was:\n ";
455  PrintHit(initHit, dummState);
456  LogTrace("DAFTrackProducerAlgorithm") << " instead now is:\n ";
457  PrintHit(MaxWeightHit, dummState);
458  }
459  }
460  } else {
461  TrajectoryMeasurement imeas = finalmeasurements.at(ihit);
462  const TrackingRecHit* finalHit = imeas.recHit()->hit();
463  if (!finalHit->isValid()) {
464  nSame++;
465  }
466  }
467 
468  ihit++;
469  }
470 
471  return nSame;
472 }
473 
475  if (hit->isValid()) {
476  LogTrace("DAFTrackProducerAlgorithm")
477  << " Valid Hit with DetId " << hit->geographicalId().rawId() << " and dim:" << hit->dimension()
478  << " local position " << hit->localPosition() << " global position " << hit->globalPosition() << " and r "
479  << hit->globalPosition().perp();
480  if (tsos.isValid())
481  LogTrace("DAFTrackProducerAlgorithm") << " TSOS combtsos " << tsos.localPosition();
482 
483  } else {
484  LogTrace("DAFTrackProducerAlgorithm") << " Invalid Hit with DetId " << hit->geographicalId().rawId();
485  }
486 }
Trajectory fit(const std::pair< TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface > &hits, const TrajectoryFitter *theFitter, Trajectory vtraj) const
accomplishes the fitting-smoothing step for each annealing value
bool isValid() const
Definition: Trajectory.h:257
void PrintHit(const TrackingRecHit *const &hit, TrajectoryStateOnSurface &tsos) const
const CurvilinearTrajectoryError & curvilinearError() const
float calculateNdof(const Trajectory vtraj) const
bool buildTrack(const Trajectory, AlgoProductCollection &algoResults, float, const reco::BeamSpot &, const reco::TrackRef *) const
Construct Tracks to be put in the event.
std::pair< TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface > updateHits(const Trajectory vtraj, const SiTrackerMultiRecHitUpdator *updator, const MeasurementTrackerEvent *theMTE, double annealing) const
MeasurementDetWithData idToDet(const DetId &id) const
Previous MeasurementDetSystem interface.
std::vector< ConstRecHitPointer > RecHitContainer
std::pair< TransientTrackingRecHit::RecHitContainer, TrajectoryStateOnSurface > collectHits(const Trajectory vtraj, const MultiRecHitCollector *measurementCollector, const MeasurementTrackerEvent *measTk) const
virtual std::vector< TrajectoryMeasurement > recHits(const Trajectory &, const MeasurementTrackerEvent *theMTE) const =0
Definition: weight.py:1
float chiSquared() const
Definition: Trajectory.h:241
Log< level::Error, false > LogError
TrackingRecHit::ConstRecHitPointer makeShared(SiPixelRecHit const &hit, TrajectoryStateOnSurface const &tsos) const override
Definition: TkClonerImpl.cc:64
int foundHits() const
Definition: Trajectory.h:206
std::map< reco::TransientTrack, AlgebraicMatrix33 > TTmap
Definition: TTtoTTmap.h:11
key_type key() const
Accessor for product key.
Definition: Ref.h:250
TrajectoryMeasurement const & lastMeasurement() const
Definition: Trajectory.h:150
#define LogTrace(id)
static std::string const input
Definition: EdmProvDump.cc:50
std::vector< TrajAnnealing > TrajAnnealingCollection
DataContainer const & measurements() const
Definition: Trajectory.h:178
GlobalPoint position() const
PropagationDirection direction() const
bool isValid() const
PropagationDirection const & direction() const
Definition: Trajectory.cc:133
TrackCharge charge() const
GlobalVector momentum() const
virtual Trajectory fitOne(const Trajectory &traj, fitType type=standard) const =0
void filter(const TrajectoryFitter *fitter, std::vector< Trajectory > &input, int minhits, std::vector< Trajectory > &output, const TransientTrackingRecHitBuilder *builder) const
std::shared_ptr< TrackingRecHit const > RecHitPointer
Definition: DetId.h:17
TrajectorySeed const & seed() const
Access to the seed used to reconstruct the Trajectory.
Definition: Trajectory.h:263
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
TrajectoryStateOnSurface const & updatedState() const
float weight(unsigned int i) const
int checkHits(Trajectory iInitTraj, const Trajectory iFinalTraj) const
TrajectoryMeasurement const & firstMeasurement() const
Definition: Trajectory.h:166
int countingGoodHits(const Trajectory traj) const
typename Base::AlgoProductCollection AlgoProductCollection
FreeTrajectoryState const * freeState(bool withErrors=true) const
virtual TrackingRecHit const * hit() const
TupleMultiplicity< TrackerTraits > const *__restrict__ uint32_t nHits
DAFTrackProducerAlgorithm(const edm::ParameterSet &conf)
void runWithCandidate(const TrackingGeometry *, const MagneticField *, const TrajTrackAssociationCollection &, const MeasurementTrackerEvent *measTk, const TrajectoryFitter *, const TransientTrackingRecHitBuilder *, const MultiRecHitCollector *measurementTracker, const SiTrackerMultiRecHitUpdator *, const reco::BeamSpot &, AlgoProductCollection &, TrajAnnealingCollection &, bool, AlgoProductCollection &, AlgoProductCollection &) const
Run the Final Fit taking TrackCandidates as input.
std::vector< Trajectory > fit(const Trajectory &traj, fitType type=standard) const
std::vector< const TrackingRecHit * > recHits() const override
Access to component RecHits (if any)
cont
load Luminosity info ##
Definition: generateEDF.py:628
ConstRecHitPointer const & recHit() const
#define LogDebug(id)