CMS 3D CMS Logo

List of all members | Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Private Member Functions
cms::CkfTrackCandidateMakerBase Class Reference

#include <CkfTrackCandidateMakerBase.h>

Inheritance diagram for cms::CkfTrackCandidateMakerBase:
cms::CkfDebugTrackCandidateMaker cms::CkfTrackCandidateMaker cms::CkfTrajectoryMaker

Public Member Functions

virtual void beginRunBase (edm::Run const &, edm::EventSetup const &es)
 
 CkfTrackCandidateMakerBase (const edm::ParameterSet &conf, edm::ConsumesCollector &&iC)
 
virtual void produceBase (edm::Event &e, const edm::EventSetup &es)
 
virtual ~CkfTrackCandidateMakerBase ()(false)
 

Protected Types

typedef edm::ContainerMask< edmNew::DetSetVector< Phase2TrackerCluster1D > > Phase2OTClusterMask
 
typedef edm::ContainerMask< edmNew::DetSetVector< SiPixelCluster > > PixelClusterMask
 
typedef edm::ContainerMask< edmNew::DetSetVector< SiStripCluster > > StripClusterMask
 

Protected Member Functions

virtual void countSeedsDebugger ()
 
virtual void deleteAssocDebugger ()
 
virtual TrajectorySeedCollection::const_iterator lastSeed (TrajectorySeedCollection const &theSeedColl)
 
virtual void printHitsDebugger (edm::Event &e)
 

Protected Attributes

bool cleanTrajectoryAfterInOut
 
bool doSeedingRegionRebuilding
 
edm::EDGetTokenT< Phase2OTClusterMaskmaskPhase2OTs_
 
edm::EDGetTokenT< PixelClusterMaskmaskPixels_
 
edm::EDGetTokenT< StripClusterMaskmaskStrips_
 
unsigned int maxSeedsBeforeCleaning_
 
bool phase2skipClusters_
 
bool produceSeedStopReasons_
 
bool reverseTrajectories
 
bool skipClusters_
 
edm::ESHandle< GeometricSearchTrackertheGeomSearchTracker
 
std::unique_ptr< TransientInitialStateEstimatortheInitialState
 
edm::ESHandle< MagneticFieldtheMagField
 
const std::string theMagFieldName
 
unsigned int theMaxNSeeds
 
edm::EDGetTokenT< MeasurementTrackerEventtheMTELabel
 
const NavigationSchooltheNavigationSchool
 
std::string theNavigationSchoolName
 
std::unique_ptr< RedundantSeedCleanertheSeedCleaner
 
edm::EDGetTokenT< edm::View< TrajectorySeed > > theSeedLabel
 
bool theTrackCandidateOutput
 
std::unique_ptr< BaseCkfTrajectoryBuildertheTrajectoryBuilder
 
const TrajectoryCleanertheTrajectoryCleaner
 
std::string theTrajectoryCleanerName
 
bool theTrajectoryOutput
 
bool useSplitting
 

Private Member Functions

void setEventSetup (const edm::EventSetup &es)
 Initialize EventSetup objects at each event. More...
 

Detailed Description

Definition at line 35 of file CkfTrackCandidateMakerBase.h.

Member Typedef Documentation

Definition at line 82 of file CkfTrackCandidateMakerBase.h.

Definition at line 80 of file CkfTrackCandidateMakerBase.h.

Definition at line 81 of file CkfTrackCandidateMakerBase.h.

Constructor & Destructor Documentation

cms::CkfTrackCandidateMakerBase::CkfTrackCandidateMakerBase ( const edm::ParameterSet conf,
edm::ConsumesCollector &&  iC 
)
explicit

Definition at line 60 of file CkfTrackCandidateMakerBase.cc.

References gather_cfg::cout, Exception, edm::ParameterSet::exists(), edm::ParameterSet::existsAs(), edm::ParameterSet::getParameter(), maskPhase2OTs_, maskPixels_, maskStrips_, maxSeedsBeforeCleaning_, hiDetachedQuadStep_cff::numHitsForSeedCleaner, phase2skipClusters_, skipClusters_, AlCaHLTBitMon_QueryRunRegistry::string, theSeedCleaner, and theSeedLabel.

60  :
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),
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  }
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:161
edm::EDGetTokenT< StripClusterMask > maskStrips_
std::unique_ptr< TransientInitialStateEstimator > theInitialState
bool exists(std::string const &parameterName) const
checks if a parameter exists
edm::ContainerMask< edmNew::DetSetVector< SiPixelCluster > > PixelClusterMask
std::unique_ptr< RedundantSeedCleaner > theSeedCleaner
edm::EDGetTokenT< PixelClusterMask > maskPixels_
const TrajectoryCleaner * theTrajectoryCleaner
const NavigationSchool * theNavigationSchool
std::unique_ptr< BaseCkfTrajectoryBuilder > theTrajectoryBuilder
edm::EDGetTokenT< MeasurementTrackerEvent > theMTELabel
edm::EDGetTokenT< Phase2OTClusterMask > maskPhase2OTs_
edm::EDGetTokenT< edm::View< TrajectorySeed > > theSeedLabel
edm::ContainerMask< edmNew::DetSetVector< Phase2TrackerCluster1D > > Phase2OTClusterMask
numHitsForSeedCleaner
these two parameters are relevant only for the CachingSeedCleanerBySharedInput
edm::ContainerMask< edmNew::DetSetVector< SiStripCluster > > StripClusterMask
cms::CkfTrackCandidateMakerBase::~CkfTrackCandidateMakerBase ( )
virtual

Definition at line 119 of file CkfTrackCandidateMakerBase.cc.

119 {}

Member Function Documentation

void cms::CkfTrackCandidateMakerBase::beginRunBase ( edm::Run const &  r,
edm::EventSetup const &  es 
)
virtual

Definition at line 121 of file CkfTrackCandidateMakerBase.cc.

Referenced by cms::CkfDebugTrackCandidateMaker::beginRun().

122  {
123  /* no op*/
124  }
virtual void cms::CkfTrackCandidateMakerBase::countSeedsDebugger ( )
inlineprotectedvirtual

Reimplemented in cms::CkfDebugTrackCandidateMaker.

Definition at line 90 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

90 {;}
virtual void cms::CkfTrackCandidateMakerBase::deleteAssocDebugger ( )
inlineprotectedvirtual

Reimplemented in cms::CkfDebugTrackCandidateMaker.

Definition at line 91 of file CkfTrackCandidateMakerBase.h.

References setEventSetup().

Referenced by produceBase().

91 {;}
virtual TrajectorySeedCollection::const_iterator cms::CkfTrackCandidateMakerBase::lastSeed ( TrajectorySeedCollection const &  theSeedColl)
inlineprotectedvirtual

Reimplemented in cms::CkfDebugTrackCandidateMaker.

Definition at line 88 of file CkfTrackCandidateMakerBase.h.

88 {return theSeedColl.end();}
virtual void cms::CkfTrackCandidateMakerBase::printHitsDebugger ( edm::Event e)
inlineprotectedvirtual

Reimplemented in cms::CkfDebugTrackCandidateMaker.

Definition at line 89 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

89 {;}
void cms::CkfTrackCandidateMakerBase::produceBase ( edm::Event e,
const edm::EventSetup es 
)
virtual

Definition at line 145 of file CkfTrackCandidateMakerBase.cc.

References a, alongMomentum, b, TrajectoryCleaner::clean(), cleanTrajectoryAfterInOut, countSeedsDebugger(), data, deleteAssocDebugger(), TrackingRecHit::det(), doSeedingRegionRebuilding, PrintoutHelper::dumpCandidates(), runEdmFileComparison::failed, FINAL_CLEAN, Trajectory::foundHits(), edm::OwnVector< T, P >::front(), edm::EventSetup::get(), edm::Event::getByToken(), hfClusterShapes_cfi::hits, mps_fire::i, cuy::ii, edm::isNotFinite(), TrajectoryStateOnSurface::isValid(), Trajectory::isValid(), edm::RefToBase< T >::key(), CommonMethods::lock(), LogDebug, LogTrace, maskPhase2OTs_, maskPixels_, maskStrips_, maxSeedsBeforeCleaning_, eostools::move(), mutex, NO_TRAJECTORY, NOT_STOPPED, oppositeToMomentum, convertSQLitetoXML_cfg::output, trajectoryStateTransform::persistentState(), phase2skipClusters_, Trajectory::pop(), printHitsDebugger(), Propagator::propagate(), Trajectory::push(), edm::OwnVector< T, P >::push_back(), edm::Event::put(), TrackingRecHit::rawId(), PrintoutHelper::regressionTest(), Trajectory::reserve(), reverseTrajectories, SurveyInfoScenario_cff::seed, SEED_CLEANING, SEED_REGION_REBUILD, Trajectory::seedRef(), setEventSetup(), Trajectory::setNLoops(), Trajectory::setSeedRef(), Trajectory::setStopReason(), edm::OwnVector< T, P >::size(), skipClusters_, SMOOTHING_FAILED, GeomDet::surface(), theInitialState, theMaxNSeeds, theMTELabel, theSeedCleaner, theSeedLabel, theTrackCandidateOutput, theTrajectoryBuilder, theTrajectoryCleaner, theTrajectoryOutput, trackingTruthProducer_cfi::tracker, mitigatedMETSequence_cff::U, useSplitting, and heppy_batch::val.

Referenced by cms::CkfDebugTrackCandidateMaker::produce().

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  }
#define LogDebug(id)
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 getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
edm::EDGetTokenT< StripClusterMask > maskStrips_
std::unique_ptr< TransientInitialStateEstimator > theInitialState
size_type size() const
Definition: OwnVector.h:264
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
virtual void printHitsDebugger(edm::Event &e)
PropagationDirection
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 GeomDet * det() const
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
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 setEventSetup(const edm::EventSetup &es)
Initialize EventSetup objects at each event.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
double a
Definition: hdecay.h:121
T get() const
Definition: EventSetup.h:71
reference front()
Definition: OwnVector.h:423
def move(src, dest)
Definition: eostools.py:511
id_type rawId() const
void cms::CkfTrackCandidateMakerBase::setEventSetup ( const edm::EventSetup es)
private

Initialize EventSetup objects at each event.

Definition at line 126 of file CkfTrackCandidateMakerBase.cc.

References edm::EventSetup::get(), edm::ESHandle< T >::product(), theGeomSearchTracker, theMagField, theMagFieldName, theNavigationSchool, theNavigationSchoolName, theTrajectoryBuilder, theTrajectoryCleaner, and theTrajectoryCleanerName.

Referenced by deleteAssocDebugger(), and produceBase().

126  {
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  }
edm::ESHandle< GeometricSearchTracker > theGeomSearchTracker
const TrajectoryCleaner * theTrajectoryCleaner
const NavigationSchool * theNavigationSchool
std::unique_ptr< BaseCkfTrajectoryBuilder > theTrajectoryBuilder
T get() const
Definition: EventSetup.h:71
T const * product() const
Definition: ESHandle.h:86
edm::ESHandle< MagneticField > theMagField

Member Data Documentation

bool cms::CkfTrackCandidateMakerBase::cleanTrajectoryAfterInOut
protected

Definition at line 51 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

bool cms::CkfTrackCandidateMakerBase::doSeedingRegionRebuilding
protected

Definition at line 50 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

edm::EDGetTokenT<Phase2OTClusterMask> cms::CkfTrackCandidateMakerBase::maskPhase2OTs_
protected

Definition at line 85 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

edm::EDGetTokenT<PixelClusterMask> cms::CkfTrackCandidateMakerBase::maskPixels_
protected

Definition at line 83 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

edm::EDGetTokenT<StripClusterMask> cms::CkfTrackCandidateMakerBase::maskStrips_
protected

Definition at line 84 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

unsigned int cms::CkfTrackCandidateMakerBase::maxSeedsBeforeCleaning_
protected

Definition at line 73 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

bool cms::CkfTrackCandidateMakerBase::phase2skipClusters_
protected

Definition at line 79 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

bool cms::CkfTrackCandidateMakerBase::produceSeedStopReasons_
protected

Definition at line 53 of file CkfTrackCandidateMakerBase.h.

bool cms::CkfTrackCandidateMakerBase::reverseTrajectories
protected

Definition at line 52 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

bool cms::CkfTrackCandidateMakerBase::skipClusters_
protected

Definition at line 78 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

edm::ESHandle<GeometricSearchTracker> cms::CkfTrackCandidateMakerBase::theGeomSearchTracker
protected

Definition at line 66 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

std::unique_ptr<TransientInitialStateEstimator> cms::CkfTrackCandidateMakerBase::theInitialState
protected

Definition at line 62 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

edm::ESHandle<MagneticField> cms::CkfTrackCandidateMakerBase::theMagField
protected

Definition at line 65 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

const std::string cms::CkfTrackCandidateMakerBase::theMagFieldName
protected

Definition at line 64 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

unsigned int cms::CkfTrackCandidateMakerBase::theMaxNSeeds
protected

Definition at line 55 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

edm::EDGetTokenT<MeasurementTrackerEvent> cms::CkfTrackCandidateMakerBase::theMTELabel
protected

Definition at line 76 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

const NavigationSchool* cms::CkfTrackCandidateMakerBase::theNavigationSchool
protected

Definition at line 69 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

std::string cms::CkfTrackCandidateMakerBase::theNavigationSchoolName
protected

Definition at line 68 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

std::unique_ptr<RedundantSeedCleaner> cms::CkfTrackCandidateMakerBase::theSeedCleaner
protected

Definition at line 71 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

edm::EDGetTokenT<edm::View<TrajectorySeed> > cms::CkfTrackCandidateMakerBase::theSeedLabel
protected

Definition at line 75 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

bool cms::CkfTrackCandidateMakerBase::theTrackCandidateOutput
protected

Definition at line 47 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

std::unique_ptr<BaseCkfTrajectoryBuilder> cms::CkfTrackCandidateMakerBase::theTrajectoryBuilder
protected
const TrajectoryCleaner* cms::CkfTrackCandidateMakerBase::theTrajectoryCleaner
protected

Definition at line 60 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase(), and setEventSetup().

std::string cms::CkfTrackCandidateMakerBase::theTrajectoryCleanerName
protected

Definition at line 59 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

bool cms::CkfTrackCandidateMakerBase::theTrajectoryOutput
protected

Definition at line 48 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

bool cms::CkfTrackCandidateMakerBase::useSplitting
protected

Definition at line 49 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().