CMS 3D CMS Logo

CkfTrackCandidateMakerBase.cc
Go to the documentation of this file.
7 
12 
14 
19 
25 
26 
28 
30 
33 
35 
36 #include<algorithm>
37 #include<functional>
38 
39 // #define VI_SORTSEED
40 // #define VI_REPRODUCIBLE
41 // #define VI_TBB
42 
43 #include <thread>
44 #ifdef VI_TBB
45 #include "tbb/parallel_for.h"
46 #endif
47 
49 
50 using namespace edm;
51 using namespace std;
52 
53 namespace {
54  std::unique_ptr<BaseCkfTrajectoryBuilder> createBaseCkfTrajectoryBuilder(const edm::ParameterSet& pset, edm::ConsumesCollector& iC) {
55  return std::unique_ptr<BaseCkfTrajectoryBuilder>{BaseCkfTrajectoryBuilderFactory::get()->create(pset.getParameter<std::string>("ComponentType"), pset, iC)};
56  }
57 }
58 
59 namespace cms{
60  CkfTrackCandidateMakerBase::CkfTrackCandidateMakerBase(edm::ParameterSet const& conf, edm::ConsumesCollector && iC) :
61  theTrackCandidateOutput(true),
62  theTrajectoryOutput(false),
63  useSplitting(conf.getParameter<bool>("useHitsSplitting")),
64  doSeedingRegionRebuilding(conf.getParameter<bool>("doSeedingRegionRebuilding")),
65  cleanTrajectoryAfterInOut(conf.getParameter<bool>("cleanTrajectoryAfterInOut")),
66  reverseTrajectories(conf.existsAs<bool>("reverseTrajectories") && conf.getParameter<bool>("reverseTrajectories")),
67  theMaxNSeeds(conf.getParameter<unsigned int>("maxNSeeds")),
68  theTrajectoryBuilder(createBaseCkfTrajectoryBuilder(conf.getParameter<edm::ParameterSet>("TrajectoryBuilderPSet"), iC)),
69  theTrajectoryCleanerName(conf.getParameter<std::string>("TrajectoryCleaner")),
70  theTrajectoryCleaner(nullptr),
71  theInitialState(std::make_unique<TransientInitialStateEstimator>(conf.getParameter<ParameterSet>("TransientInitialStateEstimatorParameters"))),
72  theMagFieldName(conf.exists("SimpleMagneticField") ? conf.getParameter<std::string>("SimpleMagneticField") : ""),
73  theNavigationSchoolName(conf.getParameter<std::string>("NavigationSchool")),
74  theNavigationSchool(nullptr),
75  maxSeedsBeforeCleaning_(0),
76  theMTELabel(iC.consumes<MeasurementTrackerEvent>(conf.getParameter<edm::InputTag>("MeasurementTrackerEvent"))),
77  skipClusters_(false),
78  phase2skipClusters_(false)
79  {
81 #ifndef VI_REPRODUCIBLE
82  if ( conf.exists("maxSeedsBeforeCleaning") )
83  maxSeedsBeforeCleaning_=conf.getParameter<unsigned int>("maxSeedsBeforeCleaning");
84 #endif
85  if (conf.existsAs<edm::InputTag>("clustersToSkip")) {
86  skipClusters_ = true;
87  maskPixels_ = iC.consumes<PixelClusterMask>(conf.getParameter<edm::InputTag>("clustersToSkip"));
88  maskStrips_ = iC.consumes<StripClusterMask>(conf.getParameter<edm::InputTag>("clustersToSkip"));
89  }
90  //FIXME:: just temporary solution for phase2!
91  if (conf.existsAs<edm::InputTag>("phase2clustersToSkip")) {
92  phase2skipClusters_ = true;
93  maskPixels_ = iC.consumes<PixelClusterMask>(conf.getParameter<edm::InputTag>("phase2clustersToSkip"));
94  maskPhase2OTs_ = iC.consumes<Phase2OTClusterMask>(conf.getParameter<edm::InputTag>("phase2clustersToSkip"));
95  }
96 #ifndef VI_REPRODUCIBLE
97  std::string cleaner = conf.getParameter<std::string>("RedundantSeedCleaner");
98  if (cleaner == "CachingSeedCleanerBySharedInput") {
99  int numHitsForSeedCleaner = conf.existsAs<int>("numHitsForSeedCleaner") ?
100  conf.getParameter<int>("numHitsForSeedCleaner") : 4;
101  int onlyPixelHits = conf.existsAs<bool>("onlyPixelHitsForSeedCleaner") ?
102  conf.getParameter<bool>("onlyPixelHitsForSeedCleaner") : false;
103  theSeedCleaner = std::make_unique<CachingSeedCleanerBySharedInput>(numHitsForSeedCleaner,onlyPixelHits);
104  } else if (cleaner != "none") {
105  throw cms::Exception("RedundantSeedCleaner not found, please use CachingSeedCleanerBySharedInput ro none", cleaner);
106  }
107 #endif
108 
109 #ifdef VI_REPRODUCIBLE
110  std::cout << "CkfTrackCandidateMaker in reproducible setting" << std::endl;
111  assert(nullptr==theSeedCleaner);
112  assert(0>=maxSeedsBeforeCleaning_);
113 #endif
114 
115  }
116 
117 
118  // Virtual destructor needed.
120 
122  {
123  /* no op*/
124  }
125 
127 
128  //services
131  // edm::ESInputTag mfESInputTag(mfName);
132  // es.get<IdealMagneticFieldRecord>().get(mfESInputTag,theMagField );
133 
134  edm::ESHandle<TrajectoryCleaner> trajectoryCleanerH;
135  es.get<TrajectoryCleaner::Record>().get(theTrajectoryCleanerName, trajectoryCleanerH);
136  theTrajectoryCleaner= trajectoryCleanerH.product();
137 
138  edm::ESHandle<NavigationSchool> navigationSchoolH;
139  es.get<NavigationSchoolRecord>().get(theNavigationSchoolName, navigationSchoolH);
140  theNavigationSchool = navigationSchoolH.product();
141  theTrajectoryBuilder->setNavigationSchool(theNavigationSchool);
142  }
143 
144  // Functions that gets called by framework every event
146  {
147  // getting objects from the EventSetup
148  setEventSetup( es );
149 
150  // set the correct navigation
151  // NavigationSetter setter( *theNavigationSchool);
152 
153  // propagator
154  edm::ESHandle<Propagator> thePropagator;
155  es.get<TrackingComponentsRecord>().get("AnyDirectionAnalyticalPropagator",
156  thePropagator);
157 
158  // method for Debugging
160 
161  // Step A: set Event for the TrajectoryBuilder
163  e.getByToken(theMTELabel, data);
164 
165  std::unique_ptr<MeasurementTrackerEvent> dataWithMasks;
166  if (skipClusters_) {
168  e.getByToken(maskPixels_, pixelMask);
170  e.getByToken(maskStrips_, stripMask);
171  dataWithMasks = std::make_unique<MeasurementTrackerEvent>(*data, *stripMask, *pixelMask);
172  //std::cout << "Trajectory builder " << conf_.getParameter<std::string>("@module_label") << " created with masks " << std::endl;
173  theTrajectoryBuilder->setEvent(e, es, &*dataWithMasks);
174  } else if (phase2skipClusters_) {
175  //FIXME:just temporary solution for phase2!
177  e.getByToken(maskPixels_, pixelMask);
179  e.getByToken(maskPhase2OTs_, phase2OTMask);
180  dataWithMasks = std::make_unique<MeasurementTrackerEvent>(*data, *pixelMask, *phase2OTMask);
181  //std::cout << "Trajectory builder " << conf_.getParameter<std::string>("@module_label") << " created with phase2 masks " << std::endl;
182  theTrajectoryBuilder->setEvent(e, es, &*dataWithMasks);
183  } else {
184  //std::cout << "Trajectory builder " << conf_.getParameter<std::string>("@module_label") << " created without masks " << std::endl;
185  theTrajectoryBuilder->setEvent(e, es, &*data);
186  }
187  // TISE ES must be set here due to dependence on theTrajectoryBuilder
188  theInitialState->setEventSetup( es, static_cast<TkTransientTrackingRecHitBuilder const *>(theTrajectoryBuilder->hitBuilder())->cloner() );
189 
190  // Step B: Retrieve seeds
191 
193  e.getByToken(theSeedLabel, collseed);
194 
195  // Step C: Create empty output collection
196  auto output = std::make_unique<TrackCandidateCollection>();
197  auto outputT = std::make_unique<std::vector<Trajectory>>();
198  auto outputSeedStopInfos = std::make_unique<std::vector<SeedStopInfo> >(collseed->size());
199 
200  if ( (*collseed).size()>theMaxNSeeds ) {
201  LogError("TooManySeeds")<<"Exceeded maximum numeber of seeds! theMaxNSeeds="<<theMaxNSeeds<<" nSeed="<<(*collseed).size();
203  if (theTrajectoryOutput){e.put(std::move(outputT));}
204  e.put(std::move(outputSeedStopInfos));
205  return;
206  }
207 
208  // Step D: Invoke the building algorithm
209  if (!(*collseed).empty()){
210 
211  unsigned int lastCleanResult=0;
212  std::vector<Trajectory> rawResult;
213  rawResult.reserve(collseed->size() * 4);
214 
215  if (theSeedCleaner) theSeedCleaner->init( &rawResult );
216 
217  // method for debugging
219 
220  // the mutex
221  std::mutex theMutex;
222  using Lock = std::unique_lock<std::mutex>;
223 
224  // Loop over seeds
225  size_t collseed_size = collseed->size();
226 
227  unsigned int indeces[collseed_size]; for (auto i=0U; i< collseed_size; ++i) indeces[i]=i;
228 
229 
230 
231 
232 #ifdef VI_SORTSEED
233  // std::random_shuffle(indeces,indeces+collseed_size);
234 
235  // here only for reference: does not seems to help
236 
237  auto const & seeds = *collseed;
238 
239 
240  float val[collseed_size];
241  for (auto i=0U; i< collseed_size; ++i)
242  { val[i] = seeds[i].startingState().pt();};
243  // { val[i] = std::abs((*seeds[i].recHits().first).surface()->eta());}
244 
245  /*
246  unsigned long long val[collseed_size];
247  for (auto i=0U; i< collseed_size; ++i) {
248  if (seeds[i].nHits()<2) { val[i]=0; continue;}
249  auto h = seeds[i].recHits().first;
250  auto const & hit = static_cast<BaseTrackerRecHit const&>(*h);
251  val[i] = hit.firstClusterRef().key();
252  if (++h != seeds[i].recHits().second) {
253  auto const & hit = static_cast<BaseTrackerRecHit const&>(*h);
254  val[i] |= (unsigned long long)(hit.firstClusterRef().key())<<32;
255  }
256  }
257  */
258  std::sort(indeces,indeces+collseed_size, [&](unsigned int i, unsigned int j){return val[i]<val[j];});
259 
260 
261  // std::cout << spt(indeces[0]) << ' ' << spt(indeces[collseed_size-1]) << std::endl;
262 #endif
263 
264  std::atomic<unsigned int> ntseed(0);
265  auto theLoop = [&](size_t ii) {
266  auto j = indeces[ii];
267 
268  ntseed++;
269 
270  // to be moved inside a par section (how with tbb??)
271  std::vector<Trajectory> theTmpTrajectories;
272 
273 
274  LogDebug("CkfPattern") << "======== Begin to look for trajectories from seed " << j << " ========\n";
275 
276  { Lock lock(theMutex);
277  // Check if seed hits already used by another track
278  if (theSeedCleaner && !theSeedCleaner->good( &((*collseed)[j])) ) {
279  LogDebug("CkfTrackCandidateMakerBase")<<" Seed cleaning kills seed "<<j;
280  (*outputSeedStopInfos)[j].setStopReason(SeedStopReason::SEED_CLEANING);
281  return; // from the lambda!
282  }}
283 
284 
285  // Build trajectory from seed outwards
286  theTmpTrajectories.clear();
287  unsigned int nCandPerSeed = 0;
288  auto const & startTraj = theTrajectoryBuilder->buildTrajectories( (*collseed)[j], theTmpTrajectories, nCandPerSeed, nullptr );
289  {
290  Lock lock(theMutex);
291  (*outputSeedStopInfos)[j].setCandidatesPerSeed(nCandPerSeed);
292  if(theTmpTrajectories.empty()) {
293  (*outputSeedStopInfos)[j].setStopReason(SeedStopReason::NO_TRAJECTORY);
294  return; // from the lambda!
295  }
296  }
297 
298  LogDebug("CkfPattern") << "======== In-out trajectory building found " << theTmpTrajectories.size()
299  << " trajectories from seed " << j << " ========\n"
300  <<PrintoutHelper::dumpCandidates(theTmpTrajectories);
301 
303 
304  // Select the best trajectory from this seed (declare others invalid)
305  theTrajectoryCleaner->clean(theTmpTrajectories);
306 
307  LogDebug("CkfPattern") << "======== In-out trajectory cleaning gave the following " << theTmpTrajectories.size()
308  << " valid trajectories from seed "
309  << j << " ========\n"
310  << PrintoutHelper::dumpCandidates(theTmpTrajectories);
311  }
312 
313  // Optionally continue building trajectory back through
314  // seed and if possible further inwards.
315 
317  theTrajectoryBuilder->rebuildTrajectories(startTraj,(*collseed)[j],theTmpTrajectories);
318 
319  LogDebug("CkfPattern") << "======== Out-in trajectory building found " << theTmpTrajectories.size()
320  << " valid/invalid trajectories from seed " << j << " ========\n"
321  <<PrintoutHelper::dumpCandidates(theTmpTrajectories);
322  if(theTmpTrajectories.empty()) {
323  Lock lock(theMutex);
324  (*outputSeedStopInfos)[j].setStopReason(SeedStopReason::SEED_REGION_REBUILD);
325  return;
326  }
327  }
328 
329 
330  // Select the best trajectory from this seed (after seed region rebuilding, can be more than one)
331  theTrajectoryCleaner->clean(theTmpTrajectories);
332 
333  LogDebug("CkfPattern") << "======== Trajectory cleaning gave the following " << theTmpTrajectories.size() << " valid trajectories from seed "
334  << j << " ========\n"
335  <<PrintoutHelper::dumpCandidates(theTmpTrajectories);
336 
337  { Lock lock(theMutex);
338  for(vector<Trajectory>::iterator it=theTmpTrajectories.begin();
339  it!=theTmpTrajectories.end(); it++){
340  if( it->isValid() ) {
341  it->setSeedRef(collseed->refAt(j));
342  (*outputSeedStopInfos)[j].setStopReason(SeedStopReason::NOT_STOPPED);
343  // Store trajectory
344  rawResult.push_back(std::move(*it));
345  // Tell seed cleaner which hits this trajectory used.
346  //TO BE FIXED: this cut should be configurable via cfi file
347  if (theSeedCleaner && rawResult.back().foundHits()>3) theSeedCleaner->add( &rawResult.back() );
348  //if (theSeedCleaner ) theSeedCleaner->add( & (*it) );
349  }
350  }}
351 
352  theTmpTrajectories.clear();
353 
354  LogDebug("CkfPattern") << "rawResult trajectories found so far = " << rawResult.size();
355 
356  { Lock lock(theMutex);
357  if ( maxSeedsBeforeCleaning_ >0 && rawResult.size() > maxSeedsBeforeCleaning_+lastCleanResult) {
358  theTrajectoryCleaner->clean(rawResult);
359  rawResult.erase(std::remove_if(rawResult.begin()+lastCleanResult,rawResult.end(),
360  std::not_fn(&Trajectory::isValid)),
361  rawResult.end());
362  lastCleanResult=rawResult.size();
363  }
364  }
365 
366  };
367  // end of loop over seeds
368 
369 
370 #ifdef VI_TBB
371  tbb::parallel_for(0UL,collseed_size,1UL,theLoop);
372 #else
373 #ifdef VI_OMP
374 #pragma omp parallel for schedule(dynamic,4)
375 #endif
376  for (size_t j = 0; j < collseed_size; j++){
377  theLoop(j);
378  }
379 #endif
380  assert(ntseed==collseed_size);
381  if (theSeedCleaner) theSeedCleaner->done();
382 
383  // std::cout << "VICkfPattern " << "rawResult trajectories found = " << rawResult.size() << " in " << ntseed << " seeds " << collseed_size << std::endl;
384 
385 #ifdef VI_REPRODUCIBLE
386  // sort trajectory
387  std::sort(rawResult.begin(), rawResult.end(),[](const Trajectory & a, const Trajectory & b)
388  { return a.seedRef().key() < b.seedRef().key();});
389  //{ return a.chiSquared()*b.ndof() < b.chiSquared()*a.ndof();});
390 #endif
391 
392  // Step E: Clean the results to avoid duplicate tracks
393  // Rejected ones just flagged as invalid.
394  theTrajectoryCleaner->clean(rawResult);
395 
396  LogDebug("CkfPattern") << "======== Final cleaning of entire event found " << rawResult.size()
397  << " valid/invalid trajectories ======="<<endl
398  <<PrintoutHelper::dumpCandidates(rawResult);
399 
400  LogDebug("CkfPattern") << "removing invalid trajectories.";
401 
402  // Assuming here that theLoop() gives at most one Trajectory per seed
403  for(const auto& traj: rawResult) {
404  if(!traj.isValid()) {
405  const auto seedIndex = traj.seedRef().key();
406  if((*outputSeedStopInfos)[seedIndex].stopReason() == SeedStopReason::NOT_STOPPED) {
407  (*outputSeedStopInfos)[seedIndex].setStopReason(SeedStopReason::FINAL_CLEAN);
408  }
409  }
410  }
411 
412  vector<Trajectory> & unsmoothedResult(rawResult);
413  unsmoothedResult.erase(std::remove_if(unsmoothedResult.begin(),unsmoothedResult.end(),
414  std::not_fn(&Trajectory::isValid)),
415  unsmoothedResult.end());
416  unsmoothedResult.shrink_to_fit();
417  // If requested, reverse the trajectories creating a new 1-hit seed on the last measurement of the track
418  if (reverseTrajectories) {
419  for (auto it = unsmoothedResult.begin(), ed = unsmoothedResult.end(); it != ed; ++it) {
420  // reverse the trajectory only if it has valid hit on the last measurement (should happen)
421  if (it->lastMeasurement().updatedState().isValid() &&
422  it->lastMeasurement().recHit().get() != nullptr &&
423  it->lastMeasurement().recHit()->isValid()) {
424  // I can't use reverse in place, because I want to change the seed
425  // 1) reverse propagation direction
426  PropagationDirection direction = it->direction();
427  if (direction == alongMomentum) direction = oppositeToMomentum;
428  else if (direction == oppositeToMomentum) direction = alongMomentum;
429  // 2) make a seed
430  TrajectoryStateOnSurface const & initState = it->lastMeasurement().updatedState();
431  auto initId = it->lastMeasurement().recHitR().rawId();
434  hits.push_back(it->lastMeasurement().recHit()->hit()->clone());
435  boost::shared_ptr<const TrajectorySeed> seed(new TrajectorySeed(state, std::move(hits), direction));
436  // 3) make a trajectory
437  Trajectory trajectory(seed, direction);
438  trajectory.setNLoops(it->nLoops());
439  trajectory.setSeedRef(it->seedRef());
440  trajectory.setStopReason(it->stopReason());
441  // 4) push states in reversed order
442  Trajectory::DataContainer &meas = it->measurements();
443  trajectory.reserve(meas.size());
444  for (auto itmeas = meas.rbegin(), endmeas = meas.rend(); itmeas != endmeas; ++itmeas) {
445  trajectory.push(std::move(*itmeas));
446  }
447  // replace
448  (*it)= std::move(trajectory);
449  } else {
450  edm::LogWarning("CkfPattern_InvalidLastMeasurement") << "Last measurement of the trajectory is invalid, cannot reverse it";
451  }
452  }
453  }
454 
455 
456  int viTotHits=0;
457 
459  // Step F: Convert to TrackCandidates
460  output->reserve(unsmoothedResult.size());
461  Traj2TrackHits t2t(theTrajectoryBuilder->hitBuilder(),true);
462 
463  for (vector<Trajectory>::const_iterator it = unsmoothedResult.begin();
464  it != unsmoothedResult.end(); ++it) {
465 
466  LogDebug("CkfPattern") << "copying "<<(useSplitting?"splitted":"un-splitted")<<" hits from trajectory";
468  if(it->direction() != alongMomentum) LogDebug("CkfPattern") << "not along momentum... " << std::endl;
469  t2t(*it,recHits,useSplitting);
470 
471  viTotHits+=recHits.size();
472 
473 
474  LogDebug("CkfPattern") << "getting initial state.";
475  Trajectory trialTrajectory = (*it);
476  std::pair<TrajectoryStateOnSurface, const GeomDet*> initState;
477  bool failed = false;
478 
479  do {
480  // Drop last hit if previous backFitter was not successful
481  if(failed) {
482  LogDebug("CkfPattern") << "removing last hit";
483  trialTrajectory.pop();
484  LogDebug("CkfPattern") << "hits remaining " << trialTrajectory.foundHits();
485  }
486 
487  // Get inner state
488  const bool doBackFit = (!doSeedingRegionRebuilding) & (!reverseTrajectories);
489  initState = theInitialState->innerState(trialTrajectory, doBackFit);
490 
491  // Check if that was successful
492  failed = (!initState.first.isValid()) || initState.second == nullptr || edm::isNotFinite(initState.first.globalPosition().x());
493  } while(failed && trialTrajectory.foundHits() > 3);
494 
495  if(failed) {
496  const auto seedIndex = it->seedRef().key();
497  (*outputSeedStopInfos)[seedIndex].setStopReason(SeedStopReason::SMOOTHING_FAILED);
498  continue;
499  }
500 
501 
502 
503  PTrajectoryStateOnDet state;
504  if(useSplitting && (initState.second != recHits.front().det()) && recHits.front().det() ){
505  LogDebug("CkfPattern") << "propagating to hit front in case of splitting.";
506  TrajectoryStateOnSurface && propagated = thePropagator->propagate(initState.first,recHits.front().det()->surface());
507  if (!propagated.isValid()) continue;
509  recHits.front().rawId());
510  }
511  else state = trajectoryStateTransform::persistentState( initState.first,
512  initState.second->geographicalId().rawId());
513  LogDebug("CkfPattern") << "pushing a TrackCandidate.";
514  output->emplace_back(recHits,it->seed(),state,it->seedRef(),it->nLoops(), (uint8_t)it->stopReason());
515  }
516  }//output trackcandidates
517 
519  es.get<TrackerDigiGeometryRecord>().get(tracker);
520  LogTrace("CkfPattern|TrackingRegressionTest") << "========== CkfTrackCandidateMaker Info =========="
521  << "number of Seed: " << collseed->size()<<'\n'
522  <<PrintoutHelper::regressionTest(*tracker,unsmoothedResult);
523 
524  assert(viTotHits>=0); // just to use it...
525  // std::cout << "VICkfPattern result " << output->size() << " " << viTotHits << std::endl;
526 
527  if (theTrajectoryOutput){ outputT->swap(unsmoothedResult);}
528 
529  }// end of ((*collseed).size()>0)
530 
531  // method for debugging
533 
534  // Step G: write output to file
536  if (theTrajectoryOutput){e.put(std::move(outputT));}
537  e.put(std::move(outputSeedStopInfos));
538  }
539 
540 }
#define LogDebug(id)
T getParameter(std::string const &) const
static boost::mutex mutex
Definition: Proxy.cc:11
int foundHits() const
Definition: Trajectory.h:225
static std::string dumpCandidates(collection &candidates)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
virtual void clean(TempTrajectoryContainer &) const
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:161
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
edm::EDGetTokenT< StripClusterMask > maskStrips_
void setStopReason(StopReason s)
Definition: Trajectory.h:352
std::unique_ptr< TransientInitialStateEstimator > theInitialState
#define nullptr
size_type size() const
Definition: OwnVector.h:264
void setNLoops(signed char value)
Definition: Trajectory.h:349
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
bool exists(std::string const &parameterName) const
checks if a parameter exists
virtual void printHitsDebugger(edm::Event &e)
edm::ESHandle< GeometricSearchTracker > theGeomSearchTracker
PropagationDirection
void reserve(unsigned int n)
Definition: Trajectory.h:150
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:42
std::unique_ptr< RedundantSeedCleaner > theSeedCleaner
static std::string regressionTest(const TrackerGeometry &tracker, std::vector< Trajectory > &unsmoothedResult)
void push_back(D *&d)
Definition: OwnVector.h:290
edm::EDGetTokenT< PixelClusterMask > maskPixels_
std::vector< TrajectoryMeasurement > DataContainer
Definition: Trajectory.h:44
const TrajectoryCleaner * theTrajectoryCleaner
const NavigationSchool * theNavigationSchool
const GeomDet * det() const
virtual void produceBase(edm::Event &e, const edm::EventSetup &es)
size_t key() const
Definition: RefToBase.h:250
std::unique_ptr< BaseCkfTrajectoryBuilder > theTrajectoryBuilder
edm::EDGetTokenT< MeasurementTrackerEvent > theMTELabel
edm::RefToBase< TrajectorySeed > seedRef(void) const
Definition: Trajectory.h:321
edm::EDGetTokenT< Phase2OTClusterMask > maskPhase2OTs_
#define LogTrace(id)
edm::EDGetTokenT< edm::View< TrajectorySeed > > theSeedLabel
ii
Definition: cuy.py:590
Namespace of DDCMS conversion namespace.
#define noexcept
bool isValid() const
Definition: Trajectory.h:279
void pop()
Definition: Trajectory.cc:29
double b
Definition: hdecay.h:120
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:53
void setSeedRef(const edm::RefToBase< TrajectorySeed > &seedRef)
Definition: Trajectory.h:323
void setEventSetup(const edm::EventSetup &es)
Initialize EventSetup objects at each event.
virtual void beginRunBase(edm::Run const &, edm::EventSetup const &es)
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
double a
Definition: hdecay.h:121
T get() const
Definition: EventSetup.h:71
numHitsForSeedCleaner
these two parameters are relevant only for the CachingSeedCleanerBySharedInput
T const * product() const
Definition: ESHandle.h:86
void push(const TrajectoryMeasurement &tm)
Definition: Trajectory.cc:50
reference front()
Definition: OwnVector.h:423
def move(src, dest)
Definition: eostools.py:511
id_type rawId() const
T get(const Candidate &c)
Definition: component.h:55
Definition: Run.h:45
edm::ESHandle< MagneticField > theMagField