CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CkfTrajectoryBuilder.cc
Go to the documentation of this file.
2 
4 
6 
10 
16 
17 
20 
22 
26 
28 
29 using namespace std;
30 
31 
34  const TrajectoryStateUpdator* updator,
35  const Propagator* propagatorAlong,
36  const Propagator* propagatorOpposite,
37  const Chi2MeasurementEstimatorBase* estimator,
38  const TransientTrackingRecHitBuilder* recHitBuilder,
39  const MeasurementTracker* measurementTracker,
40  const TrajectoryFilter* filter):
41 
43  updator, propagatorAlong,propagatorOpposite,
44  estimator, recHitBuilder, measurementTracker,filter)
45 {
46  theMaxCand = conf.getParameter<int>("maxCand");
47  theLostHitPenalty = conf.getParameter<double>("lostHitPenalty");
48  theIntermediateCleaning = conf.getParameter<bool>("intermediateCleaning");
49  theAlwaysUseInvalidHits = conf.getParameter<bool>("alwaysUseInvalidHits");
50  /*
51  theSharedSeedCheck = conf.getParameter<bool>("SharedSeedCheck");
52  std::stringstream ss;
53  ss<<"CkfTrajectoryBuilder_"<<conf.getParameter<std::string>("ComponentName")<<"_"<<this;
54  theUniqueName = ss.str();
55  LogDebug("CkfPattern")<<"my unique name is: "<<theUniqueName;
56  */
57 }
58 
59 /*
60  void CkfTrajectoryBuilder::setEvent(const edm::Event& event) const
61  {
62  theMeasurementTracker->update(event);
63  }
64 */
65 
68 {
70  result.reserve(5);
71  trajectories(seed, result);
72  return result;
73 }
74 
75 /*
76  void CkfTrajectoryBuilder::rememberSeedAndTrajectories(const TrajectorySeed& seed,
77  CkfTrajectoryBuilder::TrajectoryContainer &result) const
78  {
79 
80  //result ----> theCachedTrajectories
81  //every first iteration on event. forget about everything that happened before
82  if (edm::Service<UpdaterService>()->checkOnce(theUniqueName))
83  theCachedTrajectories.clear();
84 
85  if (seed.nHits()==0) return;
86 
87  //then remember those trajectories
88  for (TrajectoryContainer::iterator traj=result.begin();
89  traj!=result.end(); ++traj) {
90  theCachedTrajectories.insert(std::make_pair(seed.recHits().first->geographicalId(),*traj));
91  }
92  }
93 
94  bool CkfTrajectoryBuilder::sharedSeed(const TrajectorySeed& s1,const TrajectorySeed& s2) const{
95  //quit right away on nH=0
96  if (s1.nHits()==0 || s2.nHits()==0) return false;
97  //quit right away if not the same number of hits
98  if (s1.nHits()!=s2.nHits()) return false;
99  TrajectorySeed::range r1=s1.recHits();
100  TrajectorySeed::range r2=s2.recHits();
101  TrajectorySeed::const_iterator i1,i2;
102  TrajectorySeed::const_iterator & i1_e=r1.second,&i2_e=r2.second;
103  TrajectorySeed::const_iterator & i1_b=r1.first,&i2_b=r2.first;
104  //quit right away if first detId does not match. front exist because of ==0 ->quit test
105  if(i1_b->geographicalId() != i2_b->geographicalId()) return false;
106  //then check hit by hit if they are the same
107  for (i1=i1_b,i2=i2_b;i1!=i1_e,i2!=i2_e;++i1,++i2){
108  if (!i1->sharesInput(&(*i2),TrackingRecHit::all)) return false;
109  }
110  return true;
111  }
112  bool CkfTrajectoryBuilder::seedAlreadyUsed(const TrajectorySeed& seed,
113  CkfTrajectoryBuilder::TempTrajectoryContainer &candidates) const
114  {
115  //theCachedTrajectories ---> candidates
116  if (seed.nHits()==0) return false;
117  bool answer=false;
118  pair<SharedTrajectory::const_iterator, SharedTrajectory::const_iterator> range =
119  theCachedTrajectories.equal_range(seed.recHits().first->geographicalId());
120  SharedTrajectory::const_iterator trajP;
121  for (trajP = range.first; trajP!=range.second;++trajP){
122  //check whether seeds are identical
123  if (sharedSeed(trajP->second.seed(),seed)){
124  candidates.push_back(trajP->second);
125  answer=true;
126  }//already existing trajectory shares the seed.
127  }//loop already made trajectories
128 
129  return answer;
130  }
131 */
132 
133 void
135 {
136  // analyseSeed( seed);
137  /*
138  if (theSharedSeedCheck){
139  TempTrajectoryContainer candidates;
140  if (seedAlreadyUsed(seed,candidates))
141  {
142  //start with those candidates already made before
143  limitedCandidates(candidates,result);
144  //and quit
145  return;
146  }
147  }
148  */
149 
150  buildTrajectories(seed, result,nullptr);
151 }
152 
155  const TrajectoryFilter*) const {
156 
157  TempTrajectory startingTraj = createStartingTrajectory( seed );
158 
161  limitedCandidates(seed, startingTraj, result);
162 
163  return startingTraj;
164 
165  /*
166  //and remember what you just did
167  if (theSharedSeedCheck) rememberSeedAndTrajectories(seed,result);
168  */
169 
170  // analyseResult(result);
171 }
172 
176 {
177  TempTrajectoryContainer candidates;
178  candidates.push_back( startingTraj);
179  boost::shared_ptr<const TrajectorySeed> sharedSeed(new TrajectorySeed(seed));
180  limitedCandidates(sharedSeed, candidates,result);
181 }
182 
184 limitedCandidates(const boost::shared_ptr<const TrajectorySeed> & sharedSeed, TempTrajectoryContainer &candidates,
186 {
187  unsigned int nIter=1;
188  TempTrajectoryContainer newCand; // = TrajectoryContainer();
189 
190 
191  while ( !candidates.empty()) {
192 
193  newCand.clear();
194  for (TempTrajectoryContainer::iterator traj=candidates.begin();
195  traj!=candidates.end(); traj++) {
196  std::vector<TM> meas;
197  findCompatibleMeasurements(*sharedSeed, *traj, meas);
198 
199  // --- method for debugging
200  if(!analyzeMeasurementsDebugger(*traj,meas,
203  theTTRHBuilder)) return;
204  // ---
205 
206  if ( meas.empty()) {
207  if ( qualityFilter( *traj)) addToResult(sharedSeed, *traj, result);
208  }
209  else {
210  std::vector<TM>::const_iterator last;
211  if ( theAlwaysUseInvalidHits) last = meas.end();
212  else {
213  if (meas.front().recHit()->isValid()) {
214  last = find_if( meas.begin(), meas.end(), RecHitIsInvalid());
215  }
216  else last = meas.end();
217  }
218 
219  for( std::vector<TM>::const_iterator itm = meas.begin();
220  itm != last; itm++) {
221  TempTrajectory newTraj = *traj;
222  updateTrajectory( newTraj, *itm);
223 
224  if ( toBeContinued(newTraj)) {
225  newCand.push_back(newTraj);
226  }
227  else {
228  if ( qualityFilter(newTraj)) addToResult(sharedSeed, newTraj, result);
230  }
231  }
232  }
233 
234  if ((int)newCand.size() > theMaxCand) {
235  sort( newCand.begin(), newCand.end(), TrajCandLess<TempTrajectory>(theLostHitPenalty));
236  newCand.erase( newCand.begin()+theMaxCand, newCand.end());
237  }
238  }
239 
241 
242  candidates.swap(newCand);
243 
244  LogDebug("CkfPattern") <<result.size()<<" candidates after "<<nIter++<<" CKF iteration: \n"
246  <<"\n "<<candidates.size()<<" running candidates are: \n"
247  <<PrintoutHelper::dumpCandidates(candidates);
248 
249  }
250 }
251 
252 
253 
255  const TM& tm) const
256 {
257  TSOS predictedState = tm.predictedState();
259 
260  if ( hit->isValid()) {
261  TM tmp = TM( predictedState, theUpdator->update( predictedState, *hit),
262  hit, tm.estimate(), tm.layer());
263  traj.push(tmp );
264  }
265  else {
266  traj.push( TM( predictedState, hit, 0, tm.layer()));
267  }
268 }
269 
270 
271 void
273  const TempTrajectory& traj,
274  std::vector<TrajectoryMeasurement> & result) const
275 {
276  int invalidHits = 0;
277  std::pair<TSOS,std::vector<const DetLayer*> > stateAndLayers = findStateAndLayers(traj);
278  if (stateAndLayers.second.empty()) return;
279 
280  vector<const DetLayer*>::iterator layerBegin = stateAndLayers.second.begin();
281  vector<const DetLayer*>::iterator layerEnd = stateAndLayers.second.end();
282  LogDebug("CkfPattern")<<"looping on "<< stateAndLayers.second.size()<<" layers.";
283  for (vector<const DetLayer*>::iterator il = layerBegin;
284  il != layerEnd; il++) {
285 
286  LogDebug("CkfPattern")<<"looping on a layer in findCompatibleMeasurements.\n last layer: "<<traj.lastLayer()<<" current layer: "<<(*il);
287 
288  TSOS stateToUse = stateAndLayers.first;
289  if ((*il)==traj.lastLayer())
290  {
291  LogDebug("CkfPattern")<<" self propagating in findCompatibleMeasurements.\n from: \n"<<stateToUse;
292  //self navigation case
293  // go to a middle point first
295  GlobalPoint center(0,0,0);
296  stateToUse = middle.extrapolate(stateToUse, center, *theForwardPropagator);
297 
298  if (!stateToUse.isValid()) continue;
299  LogDebug("CkfPattern")<<"to: "<<stateToUse;
300  }
301 
302  vector<TrajectoryMeasurement> tmp = theLayerMeasurements->measurements((**il),stateToUse, *theForwardPropagator, *theEstimator);
303 
304  if ( !tmp.empty()) {
305  if ( result.empty()) result = tmp;
306  else {
307  // keep one dummy TM at the end, skip the others
308  result.insert( result.end()-invalidHits, tmp.begin(), tmp.end());
309  }
310  invalidHits++;
311  }
312  }
313 
314  // sort the final result, keep dummy measurements at the end
315  if ( result.size() > 1) {
316  sort( result.begin(), result.end()-invalidHits, TrajMeasLessEstim());
317  }
318 
319  LogDebug("CkfPattern")<<"starting from:\n"
320  <<"x: "<<stateAndLayers.first.globalPosition()<<"\n"
321  <<"p: "<<stateAndLayers.first.globalMomentum()<<"\n"
323 
324 #ifdef DEBUG_INVALID
325  bool afterInvalid = false;
326  for (vector<TM>::const_iterator i=result.begin();
327  i!=result.end(); i++) {
328  if ( ! i->recHit().isValid()) afterInvalid = true;
329  if (afterInvalid && i->recHit().isValid()) {
330  edm::LogError("CkfPattern") << "CkfTrajectoryBuilder error: valid hit after invalid!" ;
331  }
332  }
333 #endif
334 
335  //analyseMeasurements( result, traj);
336 
337 }
338 
#define LogDebug(id)
T getParameter(std::string const &) const
std::vector< TrajectoryMeasurement > measurements(const DetLayer &layer, const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
int i
Definition: DBlmapReader.cc:9
static std::string dumpCandidates(collection &candidates)
std::vector< Trajectory > TrajectoryContainer
TrajectoryStateOnSurface const & predictedState() const
ConstRecHitPointer const & recHit() const
static void clean(TempTrajectoryContainer &tracks)
virtual TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TransientTrackingRecHit &) const =0
const TrajectoryStateUpdator * theUpdator
virtual bool analyzeMeasurementsDebugger(Trajectory &traj, const std::vector< TrajectoryMeasurement > &meas, const MeasurementTracker *theMeasurementTracker, const Propagator *theForwardPropagator, const Chi2MeasurementEstimatorBase *theEstimator, const TransientTrackingRecHitBuilder *theTTRHBuilder) const
TempTrajectory buildTrajectories(const TrajectorySeed &, TrajectoryContainer &ret, const TrajectoryFilter *) const
static std::string dumpMeasurements(const std::vector< TrajectoryMeasurement > &v)
bool qualityFilter(const TempTrajectory &traj, bool inOut=false) const
const LayerMeasurements * theLayerMeasurements
const TransientTrackingRecHitBuilder * theTTRHBuilder
tuple result
Definition: query.py:137
CkfTrajectoryBuilder(const edm::ParameterSet &conf, const TrajectoryStateUpdator *updator, const Propagator *propagatorAlong, const Propagator *propagatorOpposite, const Chi2MeasurementEstimatorBase *estimator, const TransientTrackingRecHitBuilder *recHitBuilder, const MeasurementTracker *measurementTracker, const TrajectoryFilter *filter)
const DetLayer * layer() const
void addToResult(boost::shared_ptr< const TrajectorySeed > const &seed, TempTrajectory &traj, TrajectoryContainer &result, bool inOut=false) const
tuple conf
Definition: dbtoconf.py:185
void updateTrajectory(TempTrajectory &traj, const TM &tm) const
StateAndLayers findStateAndLayers(const TrajectorySeed &seed, const TempTrajectory &traj) const
const MeasurementTracker * theMeasurementTracker
virtual TrajectoryContainer trajectories(const TrajectorySeed &seed) const
trajectories building starting from a seed
std::vector< TempTrajectory > TempTrajectoryContainer
TrajectoryStateOnSurface extrapolate(const FreeTrajectoryState &fts, const GlobalPoint &vtx) const
extrapolation with default (=geometrical) propagator
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
bool toBeContinued(TempTrajectory &traj, bool inOut=false) const
virtual void findCompatibleMeasurements(const TrajectorySeed &seed, const TempTrajectory &traj, std::vector< TrajectoryMeasurement > &result) const
const DetLayer * lastLayer() const
Redundant method, returns the layer of lastMeasurement() .
int theMaxCand
set Event for the internal MeasurementTracker data member
std::vector< Trajectory > TrajectoryContainer
const Chi2MeasurementEstimatorBase * theEstimator
TempTrajectory createStartingTrajectory(const TrajectorySeed &seed) const
void limitedCandidates(const TrajectorySeed &seed, TempTrajectory &startingTraj, TrajectoryContainer &result) const
void push(const TrajectoryMeasurement &tm)
const Propagator * theForwardPropagator