49 theTrackCandidateOutput(
true),
50 theTrajectoryOutput(
false),
51 useSplitting(conf.getParameter<bool>(
"useHitsSplitting")),
52 doSeedingRegionRebuilding(conf.getParameter<bool>(
"doSeedingRegionRebuilding")),
53 cleanTrajectoryAfterInOut(conf.getParameter<bool>(
"cleanTrajectoryAfterInOut")),
54 reverseTrajectories(conf.existsAs<bool>(
"reverseTrajectories") && conf.getParameter<bool>(
"reverseTrajectories")),
55 theMaxNSeeds(conf.getParameter<unsigned int>(
"maxNSeeds")),
56 theTrajectoryBuilderName(conf.getParameter<std::
string>(
"TrajectoryBuilder")),
57 theTrajectoryBuilder(0),
58 theTrajectoryCleanerName(conf.getParameter<std::
string>(
"TrajectoryCleaner")),
59 theTrajectoryCleaner(0),
61 theNavigationSchoolName(conf.getParameter<std::
string>(
"NavigationSchool")),
62 theNavigationSchool(0),
64 maxSeedsBeforeCleaning_(0),
74 if ( conf.
exists(
"maxSeedsBeforeCleaning") )
85 if (cleaner ==
"SeedCleanerByHitPosition") {
87 }
else if (cleaner ==
"SeedCleanerBySharedInput") {
89 }
else if (cleaner ==
"CachingSeedCleanerByHitPosition") {
91 }
else if (cleaner ==
"CachingSeedCleanerBySharedInput") {
92 int numHitsForSeedCleaner =
conf_.
existsAs<
int>(
"numHitsForSeedCleaner") ?
94 int onlyPixelHits =
conf_.
existsAs<
bool>(
"onlyPixelHitsForSeedCleaner") ?
97 }
else if (cleaner ==
"none") {
169 std::auto_ptr<BaseCkfTrajectoryBuilder> trajectoryBuilder;
170 std::auto_ptr<MeasurementTrackerEvent> dataWithMasks;
174 if (data->isStripRegional()) {
197 std::auto_ptr<std::vector<Trajectory> > outputT (
new std::vector<Trajectory>());
200 LogError(
"TooManySeeds")<<
"Exceeded maximum numeber of seeds! theMaxNSeeds="<<
theMaxNSeeds<<
" nSeed="<<(*collseed).size();
207 if ((*collseed).size()>0){
209 unsigned int lastCleanResult=0;
210 vector<Trajectory> rawResult;
211 rawResult.reserve(collseed->size() * 4);
218 vector<Trajectory> theTmpTrajectories;
221 size_t collseed_size = collseed->size();
222 for (
size_t j = 0;
j < collseed_size;
j++){
224 LogDebug(
"CkfPattern") <<
"======== Begin to look for trajectories from seed " <<
j <<
" ========"<<endl;
228 LogDebug(
"CkfTrackCandidateMakerBase")<<
" Seed cleaning kills seed "<<
j;
233 theTmpTrajectories.clear();
234 auto const & startTraj = trajectoryBuilder->buildTrajectories( (*collseed)[j], theTmpTrajectories,
nullptr );
237 LogDebug(
"CkfPattern") <<
"======== In-out trajectory building found " << theTmpTrajectories.size()
238 <<
" trajectories from seed " << j <<
" ========"<<endl
246 LogDebug(
"CkfPattern") <<
"======== In-out trajectory cleaning gave the following valid trajectories from seed "
247 << j <<
" ========"<<endl
255 trajectoryBuilder->rebuildTrajectories(startTraj,(*collseed)[j],theTmpTrajectories);
257 LogDebug(
"CkfPattern") <<
"======== Out-in trajectory building found " << theTmpTrajectories.size()
258 <<
" valid/invalid trajectories from seed " << j <<
" ========"<<endl
266 LogDebug(
"CkfPattern") <<
"======== Trajectory cleaning gave the following valid trajectories from seed "
267 << j <<
" ========"<<endl
270 for(vector<Trajectory>::iterator it=theTmpTrajectories.begin();
271 it!=theTmpTrajectories.end(); it++){
272 if( it->isValid() ) {
273 it->setSeedRef(collseed->refAt(j));
275 rawResult.push_back(*it);
283 theTmpTrajectories.clear();
285 LogDebug(
"CkfPattern") <<
"rawResult trajectories found so far = " << rawResult.size();
289 rawResult.erase(std::remove_if(rawResult.begin(),rawResult.end(),
292 lastCleanResult=rawResult.size();
304 LogDebug(
"CkfPattern") <<
"======== Final cleaning of entire event found " << rawResult.size()
305 <<
" valid/invalid trajectories ======="<<endl
308 LogDebug(
"CkfPattern") <<
"removing invalid trajectories.";
310 vector<Trajectory> & unsmoothedResult(rawResult);
311 unsmoothedResult.erase(std::remove_if(unsmoothedResult.begin(),unsmoothedResult.end(),
313 unsmoothedResult.end());
317 vector<Trajectory> reversed;
318 reversed.reserve(unsmoothedResult.size());
319 for (vector<Trajectory>::const_iterator it = unsmoothedResult.begin(), ed = unsmoothedResult.end(); it != ed; ++it) {
321 if (it->lastMeasurement().updatedState().isValid() &&
322 it->lastMeasurement().recHit().get() != 0 &&
323 it->lastMeasurement().recHit()->isValid()) {
331 DetId initDetId = it->lastMeasurement().recHit()->geographicalId();
334 hits.
push_back(*it->lastMeasurement().recHit()->hit());
335 boost::shared_ptr<const TrajectorySeed> seed(
new TrajectorySeed(state, hits, direction));
342 for (Trajectory::DataContainer::const_reverse_iterator itmeas = meas.rbegin(), endmeas = meas.rend(); itmeas != endmeas; ++itmeas) {
343 trajectory.
push(*itmeas);
345 reversed.push_back(trajectory);
347 edm::LogWarning(
"CkfPattern_InvalidLastMeasurement") <<
"Last measurement of the trajectory is invalid, cannot reverse it";
348 reversed.push_back(*it);
351 unsmoothedResult.swap(reversed);
363 output->reserve(unsmoothedResult.size());
364 for (vector<Trajectory>::const_iterator it = unsmoothedResult.begin();
365 it != unsmoothedResult.end(); ++it) {
369 LogDebug(
"CkfPattern") <<
"retrieving "<<(
useSplitting?
"splitted":
"un-splitted")<<
" hits from trajectory";
373 LogDebug(
"CkfPattern") <<
"cloning hits into new collection.";
374 for (Trajectory::RecHitContainer::const_iterator hitIt = thits.begin();
375 hitIt != thits.end(); ++hitIt) {
376 recHits.
push_back( (**hitIt).hit()->clone());
379 LogDebug(
"CkfPattern") <<
"getting initial state.";
381 std::pair<TrajectoryStateOnSurface, const GeomDet*> initState =
385 if (! initState.first.isValid() || initState.second == 0 ||
edm::isNotFinite(initState.first.globalPosition().x())) {
391 if(
useSplitting && (initState.second != thits.front()->det()) && thits.front()->det() ){
392 LogDebug(
"CkfPattern") <<
"propagating to hit front in case of splitting.";
394 if (!propagated.
isValid())
continue;
396 thits.front()->det()->geographicalId().rawId());
399 initState.second->geographicalId().rawId());
400 LogDebug(
"CkfPattern") <<
"pushing a TrackCandidate.";
401 output->push_back(
TrackCandidate(recHits,it->seed(),state,it->seedRef(),it->nLoops() ) );
407 LogTrace(
"CkfPattern|TrackingRegressionTest") <<
"========== CkfTrackCandidateMaker Info =========="
408 <<
"number of Seed: " << collseed->size()<<endl
virtual ~CkfTrackCandidateMakerBase()
T getParameter(std::string const &) const
virtual void deleteAssocDebugger()
static std::string dumpCandidates(collection &candidates)
void setEventSetup(const edm::EventSetup &es)
Call this at each event until this object will come from the EventSetup as it should.
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
const BaseCkfTrajectoryBuilder * theTrajectoryBuilder
bool theTrackCandidateOutput
bool getByToken(EDGetToken token, Handle< PROD > &result) const
edm::EDGetTokenT< StripClusterMask > maskStrips_
std::vector< TrackCandidate > TrackCandidateCollection
void setNLoops(signed char value)
bool exists(std::string const ¶meterName) const
checks if a parameter exists
tuple MeasurementTrackerEvent
virtual void printHitsDebugger(edm::Event &e)
edm::ESHandle< GeometricSearchTracker > theGeomSearchTracker
virtual void done()=0
Tells the cleaner that the seeds are finished, and so it can clear any cache it has.
unsigned int theMaxNSeeds
virtual void add(const Trajectory *traj)=0
Informs the cleaner that a new trajectory has been made, in case the cleaner keeps a local collection...
virtual bool good(const TrajectorySeed *seed)=0
Returns true if the seed is not overlapping with another trajectory.
uint32_t rawId() const
get the raw id
static std::string regressionTest(const TrackerGeometry &tracker, std::vector< Trajectory > &unsmoothedResult)
edm::EDGetTokenT< PixelClusterMask > maskPixels_
std::vector< TrajectoryMeasurement > DataContainer
const TrajectoryCleaner * theTrajectoryCleaner
const NavigationSchool * theNavigationSchool
std::string theNavigationSchoolName
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
virtual void produceBase(edm::Event &e, const edm::EventSetup &es)
virtual void clean(TrajectoryContainer &) const
edm::EDGetTokenT< MeasurementTrackerEvent > theMTELabel
unsigned int maxSeedsBeforeCleaning_
edm::EDGetTokenT< edm::View< TrajectorySeed > > theSeedLabel
std::string theTrajectoryCleanerName
ConstRecHitContainer RecHitContainer
T const * product() const
bool doSeedingRegionRebuilding
TransientInitialStateEstimator * theInitialState
void setSeedRef(const edm::RefToBase< TrajectorySeed > &seedRef)
void setEventSetup(const edm::EventSetup &es)
Initialize EventSetup objects at each event.
std::string theTrajectoryBuilderName
virtual void beginRunBase(edm::Run const &, edm::EventSetup const &es)
char data[epos_bytes_allocation]
edm::EDGetTokenT< StripClusterLazyMask > maskStripsLazy_
virtual BaseCkfTrajectoryBuilder * clone(const MeasurementTrackerEvent *data) const =0
volatile std::atomic< bool > shutdown_flag false
virtual void countSeedsDebugger()
void push(const TrajectoryMeasurement &tm)
std::pair< TrajectoryStateOnSurface, const GeomDet * > innerState(const Trajectory &traj, bool doBackFit=true) const
virtual void init(const std::vector< Trajectory > *vect)=0
Provides the cleaner a pointer to the vector where trajectories are stored, in case it does not want ...
bool cleanTrajectoryAfterInOut
RedundantSeedCleaner * theSeedCleaner
edm::ESHandle< MagneticField > theMagField