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 34 of file CkfTrackCandidateMakerBase.h.

Member Typedef Documentation

Definition at line 80 of file CkfTrackCandidateMakerBase.h.

Definition at line 78 of file CkfTrackCandidateMakerBase.h.

Definition at line 79 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_, HLT_FULL_cff::numHitsForSeedCleaner, phase2skipClusters_, skipClusters_, AlCaHLTBitMon_QueryRunRegistry::string, theSeedCleaner, and theSeedLabel.

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") &&
67  conf.getParameter<bool>("reverseTrajectories")),
68  theMaxNSeeds(conf.getParameter<unsigned int>("maxNSeeds")),
70  createBaseCkfTrajectoryBuilder(conf.getParameter<edm::ParameterSet>("TrajectoryBuilderPSet"), iC)),
71  theTrajectoryCleanerName(conf.getParameter<std::string>("TrajectoryCleaner")),
72  theTrajectoryCleaner(nullptr),
73  theInitialState(std::make_unique<TransientInitialStateEstimator>(
74  conf.getParameter<ParameterSet>("TransientInitialStateEstimatorParameters"))),
75  theMagFieldName(conf.exists("SimpleMagneticField") ? conf.getParameter<std::string>("SimpleMagneticField")
76  : ""),
77  theNavigationSchoolName(conf.getParameter<std::string>("NavigationSchool")),
78  theNavigationSchool(nullptr),
80  theMTELabel(iC.consumes<MeasurementTrackerEvent>(conf.getParameter<edm::InputTag>("MeasurementTrackerEvent"))),
81  skipClusters_(false),
82  phase2skipClusters_(false) {
84 #ifndef VI_REPRODUCIBLE
85  if (conf.exists("maxSeedsBeforeCleaning"))
86  maxSeedsBeforeCleaning_ = conf.getParameter<unsigned int>("maxSeedsBeforeCleaning");
87 #endif
88  if (conf.existsAs<edm::InputTag>("clustersToSkip")) {
89  skipClusters_ = true;
90  maskPixels_ = iC.consumes<PixelClusterMask>(conf.getParameter<edm::InputTag>("clustersToSkip"));
91  maskStrips_ = iC.consumes<StripClusterMask>(conf.getParameter<edm::InputTag>("clustersToSkip"));
92  }
93  //FIXME:: just temporary solution for phase2!
94  if (conf.existsAs<edm::InputTag>("phase2clustersToSkip")) {
95  phase2skipClusters_ = true;
96  maskPixels_ = iC.consumes<PixelClusterMask>(conf.getParameter<edm::InputTag>("phase2clustersToSkip"));
97  maskPhase2OTs_ = iC.consumes<Phase2OTClusterMask>(conf.getParameter<edm::InputTag>("phase2clustersToSkip"));
98  }
99 #ifndef VI_REPRODUCIBLE
100  std::string cleaner = conf.getParameter<std::string>("RedundantSeedCleaner");
101  if (cleaner == "CachingSeedCleanerBySharedInput") {
103  conf.existsAs<int>("numHitsForSeedCleaner") ? conf.getParameter<int>("numHitsForSeedCleaner") : 4;
104  int onlyPixelHits = conf.existsAs<bool>("onlyPixelHitsForSeedCleaner")
105  ? conf.getParameter<bool>("onlyPixelHitsForSeedCleaner")
106  : false;
107  theSeedCleaner = std::make_unique<CachingSeedCleanerBySharedInput>(numHitsForSeedCleaner, onlyPixelHits);
108  } else if (cleaner != "none") {
109  throw cms::Exception("RedundantSeedCleaner not found, please use CachingSeedCleanerBySharedInput ro none",
110  cleaner);
111  }
112 #endif
113 
114 #ifdef VI_REPRODUCIBLE
115  std::cout << "CkfTrackCandidateMaker in reproducible setting" << std::endl;
116  assert(nullptr == theSeedCleaner);
117  assert(0 >= maxSeedsBeforeCleaning_);
118 #endif
119  }
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:160
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
edm::ContainerMask< edmNew::DetSetVector< SiStripCluster > > StripClusterMask
cms::CkfTrackCandidateMakerBase::~CkfTrackCandidateMakerBase ( )
virtual

Definition at line 122 of file CkfTrackCandidateMakerBase.cc.

122 {}

Member Function Documentation

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

Definition at line 124 of file CkfTrackCandidateMakerBase.cc.

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

124  { /* no op*/
125  }
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 86 of file CkfTrackCandidateMakerBase.h.

86  {
87  return theSeedColl.end();
88  }
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(), dqmiolumiharvest::j, 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(), FastTrackerRecHitMaskProducer_cfi::recHits, 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, PbPb_ZMuSkimMuonDPG_cff::tracker, mitigatedMETSequence_cff::U, useSplitting, and heppy_batch::val.

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

145  {
146  // getting objects from the EventSetup
147  setEventSetup(es);
148 
149  // set the correct navigation
150  // NavigationSetter setter( *theNavigationSchool);
151 
152  // propagator
153  edm::ESHandle<Propagator> thePropagator;
154  es.get<TrackingComponentsRecord>().get("AnyDirectionAnalyticalPropagator", thePropagator);
155 
156  // method for Debugging
158 
159  // Step A: set Event for the TrajectoryBuilder
161  e.getByToken(theMTELabel, data);
162 
163  std::unique_ptr<MeasurementTrackerEvent> dataWithMasks;
164  if (skipClusters_) {
166  e.getByToken(maskPixels_, pixelMask);
168  e.getByToken(maskStrips_, stripMask);
169  dataWithMasks = std::make_unique<MeasurementTrackerEvent>(*data, *stripMask, *pixelMask);
170  //std::cout << "Trajectory builder " << conf_.getParameter<std::string>("@module_label") << " created with masks " << std::endl;
171  theTrajectoryBuilder->setEvent(e, es, &*dataWithMasks);
172  } else if (phase2skipClusters_) {
173  //FIXME:just temporary solution for phase2!
175  e.getByToken(maskPixels_, pixelMask);
177  e.getByToken(maskPhase2OTs_, phase2OTMask);
178  dataWithMasks = std::make_unique<MeasurementTrackerEvent>(*data, *pixelMask, *phase2OTMask);
179  //std::cout << "Trajectory builder " << conf_.getParameter<std::string>("@module_label") << " created with phase2 masks " << std::endl;
180  theTrajectoryBuilder->setEvent(e, es, &*dataWithMasks);
181  } else {
182  //std::cout << "Trajectory builder " << conf_.getParameter<std::string>("@module_label") << " created without masks " << std::endl;
183  theTrajectoryBuilder->setEvent(e, es, &*data);
184  }
185  // TISE ES must be set here due to dependence on theTrajectoryBuilder
186  theInitialState->setEventSetup(
187  es, static_cast<TkTransientTrackingRecHitBuilder const*>(theTrajectoryBuilder->hitBuilder())->cloner());
188 
189  // Step B: Retrieve seeds
190 
192  e.getByToken(theSeedLabel, collseed);
193 
194  // Step C: Create empty output collection
195  auto output = std::make_unique<TrackCandidateCollection>();
196  auto outputT = std::make_unique<std::vector<Trajectory>>();
197  auto outputSeedStopInfos = std::make_unique<std::vector<SeedStopInfo>>(collseed->size());
198 
199  if ((*collseed).size() > theMaxNSeeds) {
200  LogError("TooManySeeds") << "Exceeded maximum numeber of seeds! theMaxNSeeds=" << theMaxNSeeds
201  << " nSeed=" << (*collseed).size();
203  e.put(std::move(output));
204  }
205  if (theTrajectoryOutput) {
206  e.put(std::move(outputT));
207  }
208  e.put(std::move(outputSeedStopInfos));
209  return;
210  }
211 
212  // Step D: Invoke the building algorithm
213  if (!(*collseed).empty()) {
214  unsigned int lastCleanResult = 0;
215  std::vector<Trajectory> rawResult;
216  rawResult.reserve(collseed->size() * 4);
217 
218  if (theSeedCleaner)
219  theSeedCleaner->init(&rawResult);
220 
221  // method for debugging
223 
224  // the mutex
225  std::mutex theMutex;
226  using Lock = std::unique_lock<std::mutex>;
227 
228  // Loop over seeds
229  size_t collseed_size = collseed->size();
230 
231  unsigned int indeces[collseed_size];
232  for (auto i = 0U; i < collseed_size; ++i)
233  indeces[i] = i;
234 
235 #ifdef VI_SORTSEED
236  // std::random_shuffle(indeces,indeces+collseed_size);
237 
238  // here only for reference: does not seems to help
239 
240  auto const& seeds = *collseed;
241 
242  float val[collseed_size];
243  for (auto i = 0U; i < collseed_size; ++i) {
244  val[i] = seeds[i].startingState().pt();
245  };
246  // { val[i] = std::abs((*seeds[i].recHits().first).surface()->eta());}
247 
248  /*
249  unsigned long long val[collseed_size];
250  for (auto i=0U; i< collseed_size; ++i) {
251  if (seeds[i].nHits()<2) { val[i]=0; continue;}
252  auto h = seeds[i].recHits().first;
253  auto const & hit = static_cast<BaseTrackerRecHit const&>(*h);
254  val[i] = hit.firstClusterRef().key();
255  if (++h != seeds[i].recHits().second) {
256  auto const & hit = static_cast<BaseTrackerRecHit const&>(*h);
257  val[i] |= (unsigned long long)(hit.firstClusterRef().key())<<32;
258  }
259  }
260  */
261  std::sort(indeces, indeces + collseed_size, [&](unsigned int i, unsigned int j) { return val[i] < val[j]; });
262 
263  // std::cout << spt(indeces[0]) << ' ' << spt(indeces[collseed_size-1]) << std::endl;
264 #endif
265 
266  std::atomic<unsigned int> ntseed(0);
267  auto theLoop = [&](size_t ii) {
268  auto j = indeces[ii];
269 
270  ntseed++;
271 
272  // to be moved inside a par section (how with tbb??)
273  std::vector<Trajectory> theTmpTrajectories;
274 
275  LogDebug("CkfPattern") << "======== Begin to look for trajectories from seed " << j << " ========\n";
276 
277  {
278  Lock lock(theMutex);
279  // Check if seed hits already used by another track
280  if (theSeedCleaner && !theSeedCleaner->good(&((*collseed)[j]))) {
281  LogDebug("CkfTrackCandidateMakerBase") << " Seed cleaning kills seed " << j;
282  (*outputSeedStopInfos)[j].setStopReason(SeedStopReason::SEED_CLEANING);
283  return; // from the lambda!
284  }
285  }
286 
287  // Build trajectory from seed outwards
288  theTmpTrajectories.clear();
289  unsigned int nCandPerSeed = 0;
290  auto const& startTraj =
291  theTrajectoryBuilder->buildTrajectories((*collseed)[j], theTmpTrajectories, nCandPerSeed, nullptr);
292  {
293  Lock lock(theMutex);
294  (*outputSeedStopInfos)[j].setCandidatesPerSeed(nCandPerSeed);
295  if (theTmpTrajectories.empty()) {
296  (*outputSeedStopInfos)[j].setStopReason(SeedStopReason::NO_TRAJECTORY);
297  return; // from the lambda!
298  }
299  }
300 
301  LogDebug("CkfPattern") << "======== In-out trajectory building found " << theTmpTrajectories.size()
302  << " trajectories from seed " << j << " ========\n"
303  << PrintoutHelper::dumpCandidates(theTmpTrajectories);
304 
306  // Select the best trajectory from this seed (declare others invalid)
307  theTrajectoryCleaner->clean(theTmpTrajectories);
308 
309  LogDebug("CkfPattern") << "======== In-out trajectory cleaning gave the following "
310  << theTmpTrajectories.size() << " valid trajectories from seed " << j << " ========\n"
311  << PrintoutHelper::dumpCandidates(theTmpTrajectories);
312  }
313 
314  // Optionally continue building trajectory back through
315  // seed and if possible further inwards.
316 
318  theTrajectoryBuilder->rebuildTrajectories(startTraj, (*collseed)[j], theTmpTrajectories);
319 
320  LogDebug("CkfPattern") << "======== Out-in trajectory building found " << theTmpTrajectories.size()
321  << " valid/invalid trajectories from seed " << j << " ========\n"
322  << PrintoutHelper::dumpCandidates(theTmpTrajectories);
323  if (theTmpTrajectories.empty()) {
324  Lock lock(theMutex);
325  (*outputSeedStopInfos)[j].setStopReason(SeedStopReason::SEED_REGION_REBUILD);
326  return;
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()
334  << " valid trajectories from seed " << j << " ========\n"
335  << PrintoutHelper::dumpCandidates(theTmpTrajectories);
336 
337  {
338  Lock lock(theMutex);
339  for (vector<Trajectory>::iterator it = theTmpTrajectories.begin(); 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)
348  theSeedCleaner->add(&rawResult.back());
349  //if (theSeedCleaner ) theSeedCleaner->add( & (*it) );
350  }
351  }
352  }
353 
354  theTmpTrajectories.clear();
355 
356  LogDebug("CkfPattern") << "rawResult trajectories found so far = " << rawResult.size();
357 
358  {
359  Lock lock(theMutex);
360  if (maxSeedsBeforeCleaning_ > 0 && rawResult.size() > maxSeedsBeforeCleaning_ + lastCleanResult) {
361  theTrajectoryCleaner->clean(rawResult);
362  rawResult.erase(
363  std::remove_if(rawResult.begin() + lastCleanResult, rawResult.end(), std::not_fn(&Trajectory::isValid)),
364  rawResult.end());
365  lastCleanResult = rawResult.size();
366  }
367  }
368  };
369  // end of loop over seeds
370 
371 #ifdef VI_TBB
372  tbb::parallel_for(0UL, collseed_size, 1UL, theLoop);
373 #else
374 #ifdef VI_OMP
375 #pragma omp parallel for schedule(dynamic, 4)
376 #endif
377  for (size_t j = 0; j < collseed_size; j++) {
378  theLoop(j);
379  }
380 #endif
381  assert(ntseed == collseed_size);
382  if (theSeedCleaner)
383  theSeedCleaner->done();
384 
385  // std::cout << "VICkfPattern " << "rawResult trajectories found = " << rawResult.size() << " in " << ntseed << " seeds " << collseed_size << std::endl;
386 
387 #ifdef VI_REPRODUCIBLE
388  // sort trajectory
389  std::sort(rawResult.begin(), rawResult.end(), [](const Trajectory& a, const Trajectory& b) {
390  return a.seedRef().key() < b.seedRef().key();
391  });
392  //{ return a.chiSquared()*b.ndof() < b.chiSquared()*a.ndof();});
393 #endif
394 
395  // Step E: Clean the results to avoid duplicate tracks
396  // Rejected ones just flagged as invalid.
397  theTrajectoryCleaner->clean(rawResult);
398 
399  LogDebug("CkfPattern") << "======== Final cleaning of entire event found " << rawResult.size()
400  << " valid/invalid trajectories =======" << endl
401  << PrintoutHelper::dumpCandidates(rawResult);
402 
403  LogDebug("CkfPattern") << "removing invalid trajectories.";
404 
405  // Assuming here that theLoop() gives at most one Trajectory per seed
406  for (const auto& traj : rawResult) {
407  if (!traj.isValid()) {
408  const auto seedIndex = traj.seedRef().key();
409  if ((*outputSeedStopInfos)[seedIndex].stopReason() == SeedStopReason::NOT_STOPPED) {
410  (*outputSeedStopInfos)[seedIndex].setStopReason(SeedStopReason::FINAL_CLEAN);
411  }
412  }
413  }
414 
415  vector<Trajectory>& unsmoothedResult(rawResult);
416  unsmoothedResult.erase(
417  std::remove_if(unsmoothedResult.begin(), unsmoothedResult.end(), std::not_fn(&Trajectory::isValid)),
418  unsmoothedResult.end());
419  unsmoothedResult.shrink_to_fit();
420  // If requested, reverse the trajectories creating a new 1-hit seed on the last measurement of the track
421  if (reverseTrajectories) {
422  for (auto it = unsmoothedResult.begin(), ed = unsmoothedResult.end(); it != ed; ++it) {
423  // reverse the trajectory only if it has valid hit on the last measurement (should happen)
424  if (it->lastMeasurement().updatedState().isValid() && it->lastMeasurement().recHit().get() != nullptr &&
425  it->lastMeasurement().recHit()->isValid()) {
426  // I can't use reverse in place, because I want to change the seed
427  // 1) reverse propagation direction
428  PropagationDirection direction = it->direction();
429  if (direction == alongMomentum)
430  direction = oppositeToMomentum;
431  else if (direction == oppositeToMomentum)
432  direction = alongMomentum;
433  // 2) make a seed
434  TrajectoryStateOnSurface const& initState = it->lastMeasurement().updatedState();
435  auto initId = it->lastMeasurement().recHitR().rawId();
438  hits.push_back(it->lastMeasurement().recHit()->hit()->clone());
439  std::shared_ptr<const TrajectorySeed> seed(new TrajectorySeed(state, std::move(hits), direction));
440  // 3) make a trajectory
441  Trajectory trajectory(seed, direction);
442  trajectory.setNLoops(it->nLoops());
443  trajectory.setSeedRef(it->seedRef());
444  trajectory.setStopReason(it->stopReason());
445  // 4) push states in reversed order
446  Trajectory::DataContainer& meas = it->measurements();
447  trajectory.reserve(meas.size());
448  for (auto itmeas = meas.rbegin(), endmeas = meas.rend(); itmeas != endmeas; ++itmeas) {
449  trajectory.push(std::move(*itmeas));
450  }
451  // replace
452  (*it) = std::move(trajectory);
453  } else {
454  edm::LogWarning("CkfPattern_InvalidLastMeasurement")
455  << "Last measurement of the trajectory is invalid, cannot reverse it";
456  }
457  }
458  }
459 
460  int viTotHits = 0;
461 
463  // Step F: Convert to TrackCandidates
464  output->reserve(unsmoothedResult.size());
465  Traj2TrackHits t2t(theTrajectoryBuilder->hitBuilder(), true);
466 
467  for (vector<Trajectory>::const_iterator it = unsmoothedResult.begin(); it != unsmoothedResult.end(); ++it) {
468  LogDebug("CkfPattern") << "copying " << (useSplitting ? "splitted" : "un-splitted")
469  << " hits from trajectory";
471  if (it->direction() != alongMomentum)
472  LogDebug("CkfPattern") << "not along momentum... " << std::endl;
473  t2t(*it, recHits, useSplitting);
474 
475  viTotHits += recHits.size();
476 
477  LogDebug("CkfPattern") << "getting initial state.";
478  Trajectory trialTrajectory = (*it);
479  std::pair<TrajectoryStateOnSurface, const GeomDet*> initState;
480  bool failed = false;
481 
482  do {
483  // Drop last hit if previous backFitter was not successful
484  if (failed) {
485  LogDebug("CkfPattern") << "removing last hit";
486  trialTrajectory.pop();
487  LogDebug("CkfPattern") << "hits remaining " << trialTrajectory.foundHits();
488  }
489 
490  // Get inner state
491  const bool doBackFit = (!doSeedingRegionRebuilding) & (!reverseTrajectories);
492  initState = theInitialState->innerState(trialTrajectory, doBackFit);
493 
494  // Check if that was successful
495  failed = (!initState.first.isValid()) || initState.second == nullptr ||
496  edm::isNotFinite(initState.first.globalPosition().x());
497  } while (failed && trialTrajectory.foundHits() > 3);
498 
499  if (failed) {
500  const auto seedIndex = it->seedRef().key();
501  (*outputSeedStopInfos)[seedIndex].setStopReason(SeedStopReason::SMOOTHING_FAILED);
502  continue;
503  }
504 
505  PTrajectoryStateOnDet state;
506  if (useSplitting && (initState.second != recHits.front().det()) && recHits.front().det()) {
507  LogDebug("CkfPattern") << "propagating to hit front in case of splitting.";
508  TrajectoryStateOnSurface&& propagated =
509  thePropagator->propagate(initState.first, recHits.front().det()->surface());
510  if (!propagated.isValid())
511  continue;
512  state = trajectoryStateTransform::persistentState(propagated, recHits.front().rawId());
513  } else
514  state =
515  trajectoryStateTransform::persistentState(initState.first, initState.second->geographicalId().rawId());
516  LogDebug("CkfPattern") << "pushing a TrackCandidate.";
517  output->emplace_back(recHits, it->seed(), state, it->seedRef(), it->nLoops(), (uint8_t)it->stopReason());
518  }
519  } //output trackcandidates
520 
522  es.get<TrackerDigiGeometryRecord>().get(tracker);
523  LogTrace("CkfPattern|TrackingRegressionTest") << "========== CkfTrackCandidateMaker Info =========="
524  << "number of Seed: " << collseed->size() << '\n'
525  << PrintoutHelper::regressionTest(*tracker, unsmoothedResult);
526 
527  assert(viTotHits >= 0); // just to use it...
528  // std::cout << "VICkfPattern result " << output->size() << " " << viTotHits << std::endl;
529 
530  if (theTrajectoryOutput) {
531  outputT->swap(unsmoothedResult);
532  }
533 
534  } // end of ((*collseed).size()>0)
535 
536  // method for debugging
538 
539  // Step G: write output to file
541  e.put(std::move(output));
542  }
543  if (theTrajectoryOutput) {
544  e.put(std::move(outputT));
545  }
546  e.put(std::move(outputSeedStopInfos));
547  }
#define LogDebug(id)
static boost::mutex mutex
Definition: Proxy.cc:9
int foundHits() const
Definition: Trajectory.h:206
static std::string dumpCandidates(collection &candidates)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
virtual void clean(TempTrajectoryContainer &) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
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:300
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:37
std::unique_ptr< RedundantSeedCleaner > theSeedCleaner
static std::string regressionTest(const TrackerGeometry &tracker, std::vector< Trajectory > &unsmoothedResult)
void push_back(D *&d)
Definition: OwnVector.h:326
edm::EDGetTokenT< PixelClusterMask > maskPixels_
std::vector< TrajectoryMeasurement > DataContainer
Definition: Trajectory.h:40
const TrajectoryCleaner * theTrajectoryCleaner
const GeomDet * det() const
size_t key() const
Definition: RefToBase.h:219
std::unique_ptr< BaseCkfTrajectoryBuilder > theTrajectoryBuilder
edm::EDGetTokenT< MeasurementTrackerEvent > theMTELabel
edm::RefToBase< TrajectorySeed > seedRef(void) const
Definition: Trajectory.h:303
edm::EDGetTokenT< Phase2OTClusterMask > maskPhase2OTs_
#define LogTrace(id)
edm::EDGetTokenT< edm::View< TrajectorySeed > > theSeedLabel
ii
Definition: cuy.py:590
bool isValid() const
Definition: Trajectory.h:257
void pop()
Definition: Trajectory.cc:30
double b
Definition: hdecay.h:118
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
void setEventSetup(const edm::EventSetup &es)
Initialize EventSetup objects at each event.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
double a
Definition: hdecay.h:119
T get() const
Definition: EventSetup.h:73
reference front()
Definition: OwnVector.h:459
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 127 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().

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:73
T const * product() const
Definition: ESHandle.h:86
edm::ESHandle< MagneticField > theMagField

Member Data Documentation

bool cms::CkfTrackCandidateMakerBase::cleanTrajectoryAfterInOut
protected

Definition at line 49 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

bool cms::CkfTrackCandidateMakerBase::doSeedingRegionRebuilding
protected

Definition at line 48 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

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

Definition at line 83 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

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

Definition at line 81 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

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

Definition at line 82 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

unsigned int cms::CkfTrackCandidateMakerBase::maxSeedsBeforeCleaning_
protected

Definition at line 71 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

bool cms::CkfTrackCandidateMakerBase::phase2skipClusters_
protected

Definition at line 77 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

bool cms::CkfTrackCandidateMakerBase::produceSeedStopReasons_
protected

Definition at line 51 of file CkfTrackCandidateMakerBase.h.

bool cms::CkfTrackCandidateMakerBase::reverseTrajectories
protected

Definition at line 50 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

bool cms::CkfTrackCandidateMakerBase::skipClusters_
protected

Definition at line 76 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

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

Definition at line 64 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

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

Definition at line 60 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

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

Definition at line 63 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

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

Definition at line 62 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

unsigned int cms::CkfTrackCandidateMakerBase::theMaxNSeeds
protected

Definition at line 53 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

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

Definition at line 74 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

const NavigationSchool* cms::CkfTrackCandidateMakerBase::theNavigationSchool
protected

Definition at line 67 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

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

Definition at line 66 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

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

Definition at line 69 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

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

Definition at line 73 of file CkfTrackCandidateMakerBase.h.

Referenced by CkfTrackCandidateMakerBase(), and produceBase().

bool cms::CkfTrackCandidateMakerBase::theTrackCandidateOutput
protected

Definition at line 45 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

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

Definition at line 58 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase(), and setEventSetup().

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

Definition at line 57 of file CkfTrackCandidateMakerBase.h.

Referenced by setEventSetup().

bool cms::CkfTrackCandidateMakerBase::theTrajectoryOutput
protected

Definition at line 46 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().

bool cms::CkfTrackCandidateMakerBase::useSplitting
protected

Definition at line 47 of file CkfTrackCandidateMakerBase.h.

Referenced by produceBase().