CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
InOutConversionTrackFinder.cc
Go to the documentation of this file.
2 //
4 
5 //
10 //
14 //
16 //
18 
19 #include <sstream>
20 
21 
23  const edm::ParameterSet& conf ) : ConversionTrackFinder (es, conf )
24 {
25 
26 
28 
29  // get the seed cleaner
30  std::string cleaner = conf_.getParameter<std::string>("InOutRedundantSeedCleaner");
31  if (cleaner == "SeedCleanerByHitPosition") {
33  } else if (cleaner == "CachingSeedCleanerByHitPosition") {
35  } else if (cleaner == "CachingSeedCleanerBySharedInput") {
37  } else if (cleaner == "none") {
38  theSeedCleaner_ = 0;
39  } else {
40  throw cms::Exception("InOutRedundantSeedCleaner not found", cleaner);
41  }
42 
43 }
44 
45 
47 
48  delete theTrajectoryCleaner_;
49  if (theSeedCleaner_) delete theSeedCleaner_;
50 }
51 
52 
53 
54 
55 std::vector<Trajectory> InOutConversionTrackFinder::tracks(const TrajectorySeedCollection& inOutSeeds,
56  TrackCandidateCollection &output_p ) const {
57 
58 
59 
60  // std::cout << " InOutConversionTrackFinder::tracks getting " << inOutSeeds.size() << " In-Out seeds " << "\n";
61 
62  std::vector<Trajectory> tmpO;
63  tmpO.erase(tmpO.begin(), tmpO.end() ) ;
64 
65  std::vector<Trajectory> result;
66  result.erase(result.begin(), result.end() ) ;
67 
68 
69  std::vector<Trajectory> rawResult;
70  if (theSeedCleaner_) theSeedCleaner_->init( &rawResult );
71 
72 
73 
74  // Loop over the seeds
75  int goodSeed=0;
76  for(TrajectorySeedCollection::const_iterator iSeed=inOutSeeds.begin(); iSeed!=inOutSeeds.end();iSeed++){
77  if (!theSeedCleaner_ || theSeedCleaner_->good(&(*iSeed))) {
78  goodSeed++;
79 
80  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::tracks hits in the seed " << iSeed->nHits() << "\n";
81  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::tracks seed starting state position " << iSeed->startingState().parameters().position() << " momentum " << iSeed->startingState().parameters().momentum() << " charge " << iSeed->startingState().parameters().charge() << "\n";
82  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::tracks seed starting state para, vector " << iSeed->startingState().parameters().vector() << "\n";
83 
84 
85 
86  std::vector<Trajectory> theTmpTrajectories;
87 
88  theTmpTrajectories = theCkfTrajectoryBuilder_->trajectories(*iSeed);
89 
90  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::track returned " << theTmpTrajectories.size() << " trajectories for this seed " << "\n";
91 
92  theTrajectoryCleaner_->clean(theTmpTrajectories);
93 
94  for(std::vector<Trajectory>::const_iterator it=theTmpTrajectories.begin(); it!=theTmpTrajectories.end(); it++){
95  if( it->isValid() ) {
96  rawResult.push_back(*it);
97  if (theSeedCleaner_) theSeedCleaner_->add( & (*it) );
98  }
99  }
100  }
101  } // end loop over the seeds
102 
103 
104 
105  LogDebug("InOutConversionTrackFinder") << "InOutConversionTrackFinder::track Good seeds " << goodSeed << "\n" ;
106  LogDebug("InOutConversionTrackFinder") << "InOutConversionTrackFinder::track rawResult size after cleaning " << rawResult.size() << "\n";
107 
109 
110 
111  std::vector<Trajectory> unsmoothedResult;
112  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::track Start second cleaning " << "\n";
113  theTrajectoryCleaner_->clean(rawResult);
114  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::track rawResult size after cleaning " << rawResult.size() << "\n";
115 
116 
117 
118  int tra=0;
119  for (std::vector<Trajectory>::const_iterator itraw = rawResult.begin(); itraw != rawResult.end(); itraw++) {
120  tra++;
121  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder looping of rawResult after cleaning " << tra << "\n";
122  if((*itraw).isValid()) {
123  // unsmoothedResult.push_back( *itraw);
124  tmpO.push_back( *itraw );
125  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::track rawResult num of valid recHits per trajectory " << (*itraw).foundHits() << "\n";
126  }
127 
128  }
129 
130  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder tmpO size " << tmpO.size() << " before sorting " << "\n";
131  // for (std::vector<Trajectory>::const_iterator it =tmpO.begin(); it != tmpO.end(); it++) {
132  // LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder tmpO num of hits " << (*it).foundHits() << " before ordering " << "\n";
133  //}
134 
135  precomputed_value_sort( tmpO.begin(), tmpO.end(), ExtractNumOfHits() );
136 
137 
138  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder tmpO after sorting " << "\n";
139  // for (std::vector<Trajectory>::const_iterator it =tmpO.begin(); it != tmpO.end(); it++) {
140  // LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder tmpO num of hits " << (*it).foundHits() << "\n";
141  // }
142 
143  for (int i=tmpO.size()-1; i>=0; i--) {
144  unsmoothedResult.push_back( tmpO[i] );
145  }
146  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder unsmoothedResult size " << unsmoothedResult.size() << "\n";
147 
148  // for (std::vector<Trajectory>::const_iterator it = unsmoothedResult.begin(); it != unsmoothedResult.end(); it++) {
149  // LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder unsmoothedResult after reordering " <<(*it).foundHits() << "\n";
150  // }
151 
152 
153  // Convert to TrackCandidates and fill in the output_p
154  for (std::vector<Trajectory>::const_iterator it = unsmoothedResult.begin(); it != unsmoothedResult.end(); it++) {
155 
156  // if( !it->isValid() ) continue;
157 
160  it->recHitsV(thits,useSplitHits_);
161  recHits.reserve(thits.size());
162  for (Trajectory::RecHitContainer::const_iterator hitIt = thits.begin(); hitIt != thits.end(); hitIt++) {
163  recHits.push_back( (**hitIt).hit()->clone());
164  }
165 
166 
167  std::pair<TrajectoryStateOnSurface, const GeomDet*> initState = theInitialState_->innerState( *it);
168 
169  // temporary protection againt invalid initial states
170  if (! initState.first.isValid() || initState.second == 0) {
171  //cout << "invalid innerState, will not make TrackCandidate" << endl;
172  continue;
173  }
174 
175  PTrajectoryStateOnDet state;
176  if(useSplitHits_ && (initState.second != thits.front()->det()) && thits.front()->det() ){
177  TrajectoryStateOnSurface propagated = thePropagator_->propagate(initState.first,thits.front()->det()->surface());
178  if (!propagated.isValid()) continue;
180  thits.front()->det()->geographicalId().rawId());
181  }
182  else state = trajectoryStateTransform::persistentState( initState.first,
183  initState.second->geographicalId().rawId());
184 
185  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::track Making the result: seed position " << it->seed().startingState().parameters().position() << " seed momentum " << it->seed().startingState().parameters().momentum() << " charge " << it->seed().startingState().parameters().charge () << "\n";
186  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::track TSOS charge " << initState.first.charge() << "\n";
187 
188  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::track PTrajectoryStateOnDet* state position "
189  << state.parameters().position() << " momentum " << state.parameters().momentum() << " charge " << state.parameters().charge () << "\n";
190 
191  result.push_back(*it);
192 
193  output_p.push_back(TrackCandidate(recHits, it->seed(),state ) );
194  }
195 
196  LogDebug("InOutConversionTrackFinder") << " InOutConversionTrackFinder::track Returning " << result.size() << " valid In Out Trajectories " << "\n";
197  return result;
198 }
#define LogDebug(id)
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
const TrajectoryBuilder * theCkfTrajectoryBuilder_
TrajectoryCleanerBySharedHits * theTrajectoryCleaner_
edm::ESHandle< Propagator > thePropagator_
LocalPoint position() const
Local x and y position coordinates.
std::vector< TrackCandidate > TrackCandidateCollection
virtual void clean(TrajectoryPointerContainer &) const
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
virtual void done()=0
Tells the cleaner that the seeds are finished, and so it can clear any cache it has.
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.
virtual std::vector< Trajectory > tracks(const TrajectorySeedCollection &seeds, TrackCandidateCollection &candidate) const
TransientInitialStateEstimator * theInitialState_
void push_back(D *&d)
Definition: OwnVector.h:273
std::vector< TrajectorySeed > TrajectorySeedCollection
tuple result
Definition: query.py:137
LocalVector momentum() const
Momentum vector in the local frame.
RedundantSeedCleaner * theSeedCleaner_
tuple conf
Definition: dbtoconf.py:185
virtual TrajectoryContainer trajectories(const TrajectorySeed &) const =0
ConstRecHitContainer RecHitContainer
Definition: Trajectory.h:44
TrackCharge charge() const
Charge (-1, 0 or 1)
void precomputed_value_sort(RandomAccessIterator begin, RandomAccessIterator end, const Extractor &extr)
InOutConversionTrackFinder(const edm::EventSetup &es, const edm::ParameterSet &config)
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 ...
void reserve(size_t)
Definition: OwnVector.h:267
const LocalTrajectoryParameters & parameters() const