CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
RoadSearchTrackCandidateMakerAlgorithm.cc
Go to the documentation of this file.
1 //
2 // Package: RecoTracker/RoadSearchTrackCandidateMaker
3 // Class: RoadSearchTrackCandidateMakerAlgorithm
4 //
5 // Description: Converts cleaned clouds into
6 // TrackCandidates using the
7 // TrajectoryBuilder framework
8 //
9 // Original Author: Oliver Gutsche, gutsche@fnal.gov
10 // Created: Wed Mar 15 13:00:00 UTC 2006
11 //
12 // $Author: elmer $
13 // $Date: 2010/10/03 20:54:08 $
14 // $Revision: 1.67 $
15 //
16 
17 #include <vector>
18 #include <iostream>
19 #include <cmath>
20 
22 
24 
28 
33 
36 
41 
47 
57 
68 
72 
74 
75  theNumHitCut = (unsigned int)conf_.getParameter<int>("NumHitCut");
76  theChi2Cut = conf_.getParameter<double>("HitChi2Cut");
77 
79  theUpdator = new KFUpdator();
82 
83  CosmicReco_ = conf_.getParameter<bool>("StraightLineNoBeamSpotCloud");
84  CosmicTrackMerging_ = conf_.getParameter<bool>("CosmicTrackMerging");
85  MinChunkLength_ = conf_.getParameter<int>("MinimumChunkLength");
86  nFoundMin_ = conf_.getParameter<int>("nFoundMin");
87 
88  initialVertexErrorXY_ = conf_.getParameter<double>("InitialVertexErrorXY");
89  splitMatchedHits_ = conf_.getParameter<bool>("SplitMatchedHits");
90  cosmicSeedPt_ = conf_.getParameter<double>("CosmicSeedPt");
91 
92  measurementTrackerName_ = conf_.getParameter<std::string>("MeasurementTrackerName");
93 
94  debug_ = false;
95  debugCosmics_ = false;
96 
97  maxPropagationDistance = 1000.0; // 10m
98 }
99 
101  delete theEstimator;
102  delete theUpdator;
103  delete theTransformer;
104  delete theTrajectoryCleaner;
105  // delete theMeasurementTracker;
106 
107 }
108 
110  const edm::Event& e,
111  const edm::EventSetup& es,
113 {
114 
115  //
116  // right now, track candidates are just filled from cleaned
117  // clouds. The trajectory of the seed is taken as the initial
118  // trajectory for the final fit
119  //
120 
121  //
122  // get the transient builder
123  //
125  std::string builderName = conf_.getParameter<std::string>("TTRHBuilder");
126  es.get<TransientRecHitRecord>().get(builderName,theBuilder);
127  ttrhBuilder = theBuilder.product();
128 
129  edm::ESHandle<MeasurementTracker> measurementTrackerHandle;
130  es.get<CkfComponentsRecord>().get(measurementTrackerName_, measurementTrackerHandle);
131  theMeasurementTracker = measurementTrackerHandle.product();
132 
133  std::vector<Trajectory> FinalTrajectories;
134 
135 
136  // need this to sort recHits, sorting done after getting seed because propagationDirection is needed
137  // get tracker geometry
139  es.get<TrackerDigiGeometryRecord>().get(tracker);
140  trackerGeom = tracker.product();
141 
143  es.get<IdealMagneticFieldRecord>().get(magField_);
144  magField = magField_.product();
145 
146  NoFieldCosmic_ = (CosmicReco_ && (magField->inTesla(GlobalPoint(0,0,0)).mag() < 0.01));
147 
149  //const MeasurementTracker* theMeasurementTracker = new MeasurementTracker(es,mt_params); // will need this later
150 
154 
156 
157  //KFTrajectorySmoother theSmoother(*theRevPropagator, *theUpdator, *theEstimator);
159 
160  // get hit matcher
162 
163  //debug_ = true;
164  //if (input->size()>0) debug_ = true;
165 
166  LogDebug("RoadSearch") << "Clean Clouds input size: " << input->size();
167  if (debug_) std::cout << std::endl << std::endl
168  << "*** NEW EVENT: Clean Clouds input size: " << input->size() << std::endl;
169 
170  int i_c = 0;
171  int nchit = 0;
172  for ( RoadSearchCloudCollection::const_iterator cloud = input->begin(); cloud != input->end(); ++cloud ) {
173 
174  // fill rechits from cloud into new
175  RoadSearchCloud::RecHitVector recHits = cloud->recHits();
176  nchit = recHits.size();
177 
178  std::vector<Trajectory> CloudTrajectories;
179 
180  if (!CosmicReco_){
181  std::sort(recHits.begin(),recHits.end(),SortHitPointersByGlobalPosition(tracker.product(),alongMomentum));
182  }
183  else {
184  std::sort(recHits.begin(),recHits.end(),SortHitPointersByY(*tracker));
185  }
186 
187  const unsigned int nlost_max = 2;
188 
189  // make a list of layers in cloud and mark stereo layers
190 
191  const unsigned int max_layers = 128;
192 
193  // collect hits in cloud by layer
194  std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > > RecHitsByLayer;
195  std::map<const DetLayer*, int> cloud_layer_reference; // for debugging
196  std::map<const DetLayer*, int>::iterator hiter;
197  for(RoadSearchCloud::RecHitVector::const_iterator ihit = recHits.begin();
198  ihit != recHits.end(); ihit++) {
199  // only use useful layers
200  const DetLayer* thisLayer =
201  theMeasurementTracker->geometricSearchTracker()->detLayer((*ihit)->geographicalId());
202 
203  std::map<const DetLayer*, int>::const_iterator ilyr = cloud_layer_reference.find(thisLayer);
204  if (ilyr==cloud_layer_reference.end())
205  cloud_layer_reference.insert(std::make_pair( thisLayer, RecHitsByLayer.size()));
206 
207  if (!RecHitsByLayer.empty() && RecHitsByLayer.back().first == thisLayer) { // Same as previous layer
208  RecHitsByLayer.back().second.push_back(*ihit);
209  }
210  else { // check if this is a new layer
211  if (ilyr != cloud_layer_reference.end()){// Not a New Layer
212  int ilayer = ilyr->second;
213  (RecHitsByLayer.begin()+ilayer)->second.push_back(*ihit);
214  }
215  else{// New Layer
216  if (RecHitsByLayer.size() >= max_layers) break; // should never happen
217  lstereo[RecHitsByLayer.size()] = false;
218  if ((*ihit)->localPositionError().yy()<1.) lstereo[RecHitsByLayer.size()] = true;
220  rhc.push_back(*ihit);
221  RecHitsByLayer.push_back(std::make_pair(thisLayer, rhc));
222  }
223  }
224  }
225 
226  LogDebug("RoadSearch")<<"Cloud #"<<i_c<<" has "<<recHits.size()<<" hits in "<<RecHitsByLayer.size()<<" layers ";
227  if (debug_) std::cout <<"Cloud "<<i_c<<" has "<<recHits.size()<<" hits in " <<RecHitsByLayer.size() << " layers " <<std::endl;;
228  ++i_c;
229 
230  if (debug_){
231  int ntothit = 0;
232 
233  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilhv = RecHitsByLayer.begin();
234  ilhv != RecHitsByLayer.end(); ++ilhv) {
235  std::cout<<" Layer " << ilhv-RecHitsByLayer.begin() << " has " << ilhv->second.size() << " hits " << std::endl;
236  }
237  std::cout<<std::endl;
238  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilhv = RecHitsByLayer.begin();
239  ilhv != RecHitsByLayer.end(); ++ilhv) {
240  RoadSearchCloud::RecHitVector theLayerHits = ilhv->second;
241  for (RoadSearchCloud::RecHitVector::const_iterator ihit = theLayerHits.begin();
242  ihit != theLayerHits.end(); ++ihit) {
243 
244  GlobalPoint gp = trackerGeom->idToDet((*ihit)->geographicalId())->surface().toGlobal((*ihit)->localPosition());
245  if (CosmicReco_){
246  std::cout << " Hit "<< ntothit
247  << " x/y/z = "
248  << gp.x() << " " << gp.y() << " " << gp.z()
249  <<" in layer " << ilhv-RecHitsByLayer.begin()
250  << " is hit " << (ihit-theLayerHits.begin())+1
251  << " of " << theLayerHits.size() << std::endl;
252  }
253  else {
254  std::cout << " Hit "<< ntothit
255  << " r/z = "
256  << gp.perp() << " " << gp.z()
257  <<" in layer " << ilhv-RecHitsByLayer.begin()
258  << " is hit " << (ihit-theLayerHits.begin())+1
259  << " of " << theLayerHits.size() << std::endl;
260  }
261  ntothit++;
262  }
263  }
264  std::cout<<std::endl;
265  }
266 
267  // try to start from all layers until the chunk is too short
268  //
269 
270  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilyr0 = RecHitsByLayer.begin();
271  ilyr0 != RecHitsByLayer.end(); ++ilyr0) {
272 
273  unsigned int ilayer0 = (unsigned int)(ilyr0-RecHitsByLayer.begin());
274  if (ilayer0 > RecHitsByLayer.size()-MinChunkLength_) continue;
275 
276  std::vector<Trajectory> ChunkTrajectories;
277  std::vector<Trajectory> CleanChunks;
278  bool all_chunk_layers_used = false;
279 
280  if (debug_) std::cout << "*** START NEW CHUNK --> layer range (" << ilyr0-RecHitsByLayer.begin()
281  << "-" << RecHitsByLayer.size()-1 << ")";
282 
283  // collect hits from the starting layer
284  RoadSearchCloud::RecHitVector recHits_start = ilyr0->second;
285 
286  //
287  // Step 1: find small tracks (chunks) made of hits
288  // in layers with low occupancy
289  //
290 
291  // find layers with small number of hits
292  // TODO: try to keep earliest layers + at least one stereo layer
293  std::multimap<int, const DetLayer*> layer_map;
294  std::map<const DetLayer*, int> layer_reference; // for debugging
295  // skip starting layer, as it is always included
296  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilayer = ilyr0+1;
297  ilayer != RecHitsByLayer.end(); ++ilayer) {
298  layer_map.insert(std::make_pair(ilayer->second.size(), ilayer->first));
299  layer_reference.insert(std::make_pair(ilayer->first, ilayer-RecHitsByLayer.begin()));
300  }
301 
302  if (debug_) {
303  std::cout<<std::endl<<" Available layers are: " << std::endl;
304  for (std::multimap<int, const DetLayer*>::iterator ilm1 = layer_map.begin();
305  ilm1 != layer_map.end(); ++ilm1) {
306  std::map<const DetLayer*, int>::iterator ilr = layer_reference.find(ilm1->second);
307  if (ilr != layer_reference.end() && debug_)
308  std::cout << "Layer " << ilr->second << " with " << ilm1->first <<" hits" <<std::endl;;
309  }
310  }
311 
312  //const int max_middle_layers = 2;
313  std::set<const DetLayer*> the_good_layers;
314  std::vector<const DetLayer*> the_middle_layers;
315  RoadSearchCloud::RecHitVector the_recHits_middle;
316 
317  // bool StartLayers =
318  chooseStartingLayers(RecHitsByLayer,ilyr0,layer_map,the_good_layers,the_middle_layers,the_recHits_middle);
319  if (debug_) {
320  std::cout << " From new code... With " << the_good_layers.size() << " useful layers: ";
321  for (std::set<const DetLayer*>::iterator igl = the_good_layers.begin();
322  igl!= the_good_layers.end(); ++igl){
323  std::map<const DetLayer*, int>::iterator ilr = layer_reference.find(*igl);
324  if (ilr != layer_reference.end()) std::cout << " " << ilr->second;
325  }
326  std::cout << std::endl;
327  std::cout << " From new code... and middle layers: ";
328  for (std::vector<const DetLayer*>::iterator iml = the_middle_layers.begin();
329  iml!= the_middle_layers.end(); ++iml){
330  std::map<const DetLayer*, int>::iterator ilr = layer_reference.find(*iml);
331  if (ilr != layer_reference.end()) std::cout << " " << ilr->second;
332  }
333  std::cout << std::endl;
334  }
335  RoadSearchCloud::RecHitVector recHits_inner = recHits_start;
336  RoadSearchCloud::RecHitVector recHits_outer = the_recHits_middle;
337  std::set<const DetLayer*> good_layers = the_good_layers;
338  unsigned int ngoodlayers = good_layers.size();
339 
340  if (debug_)
341  std::cout<<"Found " << recHits_inner.size() << " inner hits and " << recHits_outer.size() << " outer hits" << std::endl;
342 
343  // collect hits in useful layers
344  std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > > goodHits;
345  // mark layers that will be skipped in first pass
346  std::set<const DetLayer*> skipped_layers;
347  std::map<int, const DetLayer*> skipped_layer_detmap;
348 
349 
350  goodHits.push_back(*ilyr0); // save hits from starting layer
351  // save hits from other good layers
352  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilyr = ilyr0+1;
353  ilyr != RecHitsByLayer.end(); ++ilyr) {
354  if (good_layers.find(ilyr->first) != good_layers.end()){
355  goodHits.push_back(*ilyr);
356  }
357  else {
358  skipped_layers.insert(ilyr->first);
359  std::map<const DetLayer*, int>::iterator ilr = layer_reference.find(ilyr->first);
360  if (ilr != layer_reference.end())
361  skipped_layer_detmap.insert(std::make_pair(ilr->second,ilyr->first));
362  else
363  if (debug_) std::cout<<"Couldn't find thisLayer to insert into map..."<<std::endl;
364  }
365  }
366 
367  // try various hit combinations
368  for (RoadSearchCloud::RecHitVector::const_iterator innerHit = recHits_inner.begin();
369  innerHit != recHits_inner.end(); ++innerHit) {
370 
371  const DetLayer* innerHitLayer =
372  theMeasurementTracker->geometricSearchTracker()->detLayer((*innerHit)->geographicalId());
373 
374 
375  RoadSearchCloud::RecHitVector::iterator middleHit, outerHit;
376  RoadSearchCloud::RecHitVector::iterator firstHit, lastHit;
377 
378  bool triplets = (CosmicReco_ && (magField->inTesla(GlobalPoint(0,0,0)).mag() > 0.01));
379 
380  if (!triplets){
381  firstHit = recHits_outer.begin();
382  lastHit = recHits_outer.end();
383  }
384  else if (triplets){
385  firstHit = recHits_outer.begin()+1;
386  lastHit = recHits_outer.end();
387  }
388 
389  for (RoadSearchCloud::RecHitVector::iterator outerHit = firstHit; outerHit != lastHit; ++outerHit) {
390 
391  const DetLayer* middleHitLayer = 0;
392  if (triplets){
393  middleHit = outerHit-1;
394  middleHitLayer = theMeasurementTracker->geometricSearchTracker()->detLayer((*middleHit)->geographicalId());
395  }
396  const DetLayer* outerHitLayer =
397  theMeasurementTracker->geometricSearchTracker()->detLayer((*outerHit)->geographicalId());
398  if (middleHitLayer == outerHitLayer) continue;
399 
401  if (!triplets){
402  if (debug_){
403  std::map<const DetLayer*, int>::iterator ilro = layer_reference.find(outerHitLayer);
404  if (ilro != layer_reference.end()) {
405  std::cout << "Try trajectory with Inner Hit on Layer " << ilayer0 << " and " ;
406  std::cout << "Outer Hit on Layer " << ilro->second << std::endl;
407  }
408  }
409  fts = initialTrajectory(es,*innerHit,*outerHit);
410  }
411  else if (triplets){
412  if (debug_){
413  std::map<const DetLayer*, int>::iterator ilrm = layer_reference.find(middleHitLayer);
414  std::map<const DetLayer*, int>::iterator ilro = layer_reference.find(outerHitLayer);
415  if (ilro != layer_reference.end() && ilrm != layer_reference.end()) {
416  std::cout << "Try trajectory with Hits on Layers " << ilayer0 << " , "
417  << ilrm->second << " and " << ilro->second << std::endl;
418  }
419  }
420  fts = initialTrajectoryFromTriplet(es,*innerHit,*middleHit,*outerHit);
421  }
422 
423  if (!fts.hasError()) continue;
424  if (debug_) std::cout<<"FTS: " << fts << std::endl;
425 
426  Trajectory seedTraj = createSeedTrajectory(fts,*innerHit,innerHitLayer);
427 
428  std::vector<Trajectory> rawTrajectories;
429  if (seedTraj.isValid() && !seedTraj.measurements().empty() ) rawTrajectories.push_back(seedTraj);//GC
430  //rawTrajectories.push_back(seedTraj);
431 
432  int ntested = 0;
433  // now loop on hits
434  std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilyr_start = (goodHits.begin()+1);
435  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilhv = ilyr_start;
436  ilhv != goodHits.end(); ++ilhv) {
437  RoadSearchCloud::RecHitVector& hits = ilhv->second;
438  //std::vector<Trajectory> newTrajectories;
439  ++ntested;
440  if (debug_){
441  std::map<const DetLayer*, int>::iterator ilr = cloud_layer_reference.find(ilhv->first);
442  if (ilr != cloud_layer_reference.end())
443  std::cout << "extrapolating " << rawTrajectories.size()
444  << " trajectories to layer " << ilr->second
445  << " which has " << hits.size() << " hits " << std::endl;
446  }
447 
448  std::vector<Trajectory>newTrajectories;
449  for (std::vector<Trajectory>::const_iterator it = rawTrajectories.begin();
450  it != rawTrajectories.end(); it++) {
451  if (debug_) std::cout << "extrapolating Trajectory #" << it-rawTrajectories.begin() << std::endl;
452  if (it->direction()==alongMomentum) thePropagator = theAloPropagator;//GC
454 
455  std::vector<Trajectory> theTrajectories = extrapolateTrajectory(*it,hits,
456  innerHitLayer, *outerHit, outerHitLayer);
457  if (theTrajectories.empty()) {
458  if (debug_) std::cout<<" Could not add the hit in this layer " << std::endl;
459  if (debug_){
460  std::cout << " --> trajectory " << it-rawTrajectories.begin()
461  << " has "<<it->recHits().size()<<" hits after "
462  << (ilhv-ilyr_start+1) << " tested (ntested=" <<ntested<<") "
463  << " --> misses="<< (ilhv-ilyr_start+1)-(it->recHits().size()-1)
464  << " but there are " << (goodHits.end() - ilhv)
465  <<" more layers in first pass and "<< skipped_layers.size() <<" skipped layers " <<std::endl;
466 
467 
468  }
469  // layer missed
470  if ((ilhv-ilyr_start+1)-(it->recHits().size()-1) <= nlost_max){
471  newTrajectories.push_back(*it);
472  }
473  }
474  else{ // added hits in this layers
475  for (std::vector<Trajectory>::const_iterator it = theTrajectories.begin();
476  it != theTrajectories.end(); it++) {
477  newTrajectories.push_back(*it);
478  }
479  }
480  } // end loop over rawTrajectories
481  rawTrajectories = newTrajectories;
482  if (newTrajectories.empty()) break;
483  }
484  if (rawTrajectories.size()==0){
485  continue;
486  if (debug_) std::cout<<" --> yields ZERO raw trajectories!" << std::endl;
487  }
488  if (debug_){
489  for (std::vector<Trajectory>::const_iterator it = rawTrajectories.begin();
490  it != rawTrajectories.end(); it++) {
491  std::cout << " --> yields trajectory with "<<it->recHits().size()<<" hits with chi2="
492  <<it->chiSquared()<<" and is valid? "<<it->isValid() <<std::endl;
493  }
494  }
495  std::vector<Trajectory> rawCleaned;
496  theTrajectoryCleaner->clean(rawTrajectories);
497  for (std::vector<Trajectory>::const_iterator itr = rawTrajectories.begin();
498  itr != rawTrajectories.end(); ++itr) {
499  // see how many layers have been found
500  if (!itr->isValid()) continue;
501  std::set<const DetLayer*> used_layers;
502  Trajectory::DataContainer tmv = itr->measurements();
503  for (Trajectory::DataContainer::iterator itm = tmv.begin();
504  itm != tmv.end(); ++itm) {
506  if (!rh->isValid()) continue;
507  used_layers.insert(theMeasurementTracker->geometricSearchTracker()->detLayer(rh->geographicalId()));
508  }
509 
510  // need to subtract 1 from used_layers since it includes the starting layer
511  if (debug_) std::cout<<"Used " << (used_layers.size()-1) << " layers out of " << ngoodlayers
512  << " good layers, so " << ngoodlayers - (used_layers.size()-1) << " missed "
513  << std::endl;
514  if ((int)used_layers.size() < nFoundMin_) continue;
515  unsigned int nlostlayers = ngoodlayers - (used_layers.size()-1);
516  if (nlostlayers > nlost_max) continue;
517 
518  rawCleaned.push_back(*itr);
519 
520  }
521  if (!rawCleaned.empty()) {
522  ChunkTrajectories.insert(ChunkTrajectories.end(), rawCleaned.begin(), rawCleaned.end());
523  }
524  } // END LOOP OVER OUTER HITS
525  } // END LOOP OVER INNER HITS
526  // At this point we have made all the trajectories from the low occupancy layers
527  // We clean these trajectories first, and then try to add hits from the skipped layers
528 
529  // }
530  if (debug_) std::cout << "Clean the " << ChunkTrajectories.size()<<" trajectories for this chunk" << std::endl;
531  // clean the intermediate result
532  theTrajectoryCleaner->clean(ChunkTrajectories);
533  for (std::vector<Trajectory>::const_iterator it = ChunkTrajectories.begin();
534  it != ChunkTrajectories.end(); it++) {
535  if (it->isValid()) CleanChunks.push_back(*it);
536  }
537  if (debug_) std::cout <<"After cleaning there are " << CleanChunks.size() << " trajectories for this chunk" << std::endl;
538 
539 
540  // ********************* BEGIN NEW ADDITION
541 
542  //
543  // Step 2: recover measurements from busy layers
544  //
545 
546  std::vector<Trajectory> extendedChunks;
547 
548 
549  // see if there are layers that we skipped
550 
551  if (debug_){
552  if (skipped_layers.empty()) {
553  std::cout << "all layers were used in first pass" << std::endl;
554  } else {
555  std::cout << "There are " << skipped_layer_detmap.size() << " skipped layers:";
556  for (std::map<int, const DetLayer*>::const_iterator imap = skipped_layer_detmap.begin();
557  imap!=skipped_layer_detmap.end(); imap++){
558  std::cout<< " " <<imap->first;
559  }
560  std::cout << std::endl;
561  }
562  }
563 
564  for (std::vector<Trajectory>::const_iterator i = CleanChunks.begin();
565  i != CleanChunks.end(); i++) {
566  if (!(*i).isValid()) continue;
567  if (debug_) std::cout<< "Now process CleanChunk trajectory " << i-CleanChunks.begin() << std::endl;
568  bool all_layers_used = false;
569  if (skipped_layers.empty() && i->measurements().size() >= theNumHitCut) {
570  if (debug_) std::cout<<"The trajectory has " << i->measurements().size()
571  << " hits from a cloud of " << RecHitsByLayer.size()
572  << " layers and a chunk of " << (RecHitsByLayer.size() - ilayer0) << " layers " << std::endl;
573  extendedChunks.insert(extendedChunks.end(), *i);
574  if (i->measurements().size() >= (RecHitsByLayer.size() - ilayer0)){
575  all_layers_used = true;
576  break;
577  }
578  }
579  else {
580 
581  Trajectory temptraj = *i;
582  Trajectory::DataContainer tmv = (*i).measurements();
583  if (tmv.size()+skipped_layer_detmap.size() < theNumHitCut) continue;
584 
585  // Debug dump of hits
586  if (debug_){
587  for (Trajectory::DataContainer::const_iterator ih=tmv.begin();
588  ih!=tmv.end();++ih){
590  const DetLayer* Layer =
591  theMeasurementTracker->geometricSearchTracker()->detLayer(rh->geographicalId());
592  std::map<const DetLayer*, int>::iterator ilr = cloud_layer_reference.find(Layer);
593  if (ilr != cloud_layer_reference.end())
594  std::cout << " Hit #"<<ih-tmv.begin() << " of " << tmv.size()
595  <<" is on Layer " << ilr->second << std::endl;
596  else
597  std::cout << " Layer for Hit #"<<ih-tmv.begin() <<" can't be found " << std::endl;
598  std::cout<<" updatedState:\n" << ih->updatedState() << std::endl;
599  std::cout<<" predictState:\n" << ih->predictedState() << std::endl;
600  }
601  }
602 
603  // Loop over the layers in the cloud
604 
605  std::set<const DetLayer*> final_layers;
606  Trajectory::DataContainer::const_iterator im = tmv.begin();
607  Trajectory::DataContainer::const_iterator im2 = tmv.begin();
608 
609  TrajectoryMeasurement firstMeasurement = i->firstMeasurement();
610  const DetLayer* firstDetLayer =
611  theMeasurementTracker->geometricSearchTracker()->detLayer(firstMeasurement.recHit()->geographicalId());
612 
613  std::vector<Trajectory> freshStartv = theSmoother->trajectories(*i);
614 
615  if(debug_) std::cout<<"Smoothing has returned " << freshStartv.size() <<" trajectory " << std::endl;
616  if (!freshStartv.empty()){
617  if(debug_) std::cout<< "Smoothing of trajectory " <<i-CleanChunks.begin() << " has succeeded with " << freshStartv.begin()->measurements().size() << " hits and a chi2 of " << freshStartv.begin()->chiSquared() <<" for " << freshStartv.begin()->ndof() << " DOF. Now add hits." <<std::endl;
618  } else {
619  if (debug_) std::cout<< "Smoothing of trajectory " <<i-CleanChunks.begin() <<" has failed"<<std::endl;
620  continue;
621  }
622 
623  Trajectory freshStart = *freshStartv.begin();
624  std::vector<TrajectoryMeasurement> freshStartTM = freshStart.measurements();
625 
626  if (debug_) {
627  for (std::vector<TrajectoryMeasurement>::const_iterator itm = freshStartTM.begin();itm != freshStartTM.end(); ++itm){
628  std::cout<<"Trajectory hit " << itm-freshStartTM.begin() <<" updatedState:\n" << itm->updatedState() << std::endl;
629  }
630  }
631 
632  TrajectoryStateOnSurface NewFirstTsos = freshStart.lastMeasurement().updatedState();
633  if(debug_) std::cout<<"NewFirstTSOS is valid? " << NewFirstTsos.isValid() << std::endl;
634  if(debug_) std::cout << " NewFirstTSOS:\n " << NewFirstTsos << std::endl;
636 
637  if(debug_) {
638  std::cout<< "First hit for fresh start on det " << rh->det() << ", r/phi/z = " << rh->globalPosition().perp() << " " << rh->globalPosition().phi() << " " << rh->globalPosition().z();
639  }
640 
641  PTrajectoryStateOnDet* pFirstState = TrajectoryStateTransform().persistentState(NewFirstTsos,
642  rh->geographicalId().rawId());
644  newHits.push_back(rh->hit()->clone());
645 
646  TrajectorySeed tmpseed = TrajectorySeed(*pFirstState,
647  newHits,
648  i->direction());
649 
651  if (i->direction()==oppositeToMomentum) thePropagator = theRevPropagator;
652 
653  delete pFirstState;
654 
655 
656  Trajectory newTrajectory(tmpseed,tmpseed.direction());
657 
658  const GeomDet* det = trackerGeom->idToDet(rh->geographicalId());
659  TrajectoryStateOnSurface invalidState(new BasicSingleTrajectoryState(det->surface()));
660  newTrajectory.push(TrajectoryMeasurement(invalidState, NewFirstTsos, rh, 0, firstDetLayer));
661  final_layers.insert(firstDetLayer);
662 
663  if(debug_) std::cout << "TRAJ is valid: " << newTrajectory.isValid() <<std::endl;
664 
665  TrajectoryStateOnSurface testTsos = newTrajectory.measurements().back().updatedState();
666 
667  if(debug_) {
668  std::cout << "testTSOS is valid!!" << testTsos.isValid() << std::endl;
669  std::cout << " testTSOS (x/y/z): " << testTsos.globalPosition().x()<< " / " << testTsos.globalPosition().y()<< " / " << testTsos.globalPosition().z() << std::endl;
670  std::cout << " local position x: " << testTsos.localPosition().x() << "+-" << sqrt(testTsos.localError().positionError().xx()) << std::endl;
671  }
672 
673  if (firstDetLayer != ilyr0->first){
674  if (debug_) std::cout<<"!!! ERROR !!! firstDetLayer ("<<firstDetLayer<<") != ilyr0 ( " <<ilyr0->first <<")"<< std::endl;
675  }
676  ++im;
677 
678  if (debug_){
679  std::map<const DetLayer*, int>::iterator ilr = cloud_layer_reference.find(firstDetLayer);
680  if (ilr != cloud_layer_reference.end() ){
681  std::cout << " First hit is on layer " << ilr->second << std::endl;
682  }
683  }
684  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilyr = ilyr0+1;
685  ilyr != RecHitsByLayer.end(); ++ilyr) {
686 
687  TrajectoryStateOnSurface predTsos;
688  TrajectoryStateOnSurface currTsos;
690 
691  if(debug_)
692  std::cout<<"Trajectory has " << newTrajectory.measurements().size() << " measurements with " << (RecHitsByLayer.end()-ilyr)
693  << " remaining layers " << std::endl;
694 
695  if (im != tmv.end()) im2 = im;
696  TransientTrackingRecHit::ConstRecHitPointer rh = im2->recHit(); // Current
697  if (rh->isValid() &&
698  theMeasurementTracker->geometricSearchTracker()->detLayer(rh->geographicalId()) == ilyr->first) {
699 
700  if (debug_) std::cout<<" Layer " << ilyr-RecHitsByLayer.begin() <<" has a good hit " << std::endl;
701  ++im;
702 
703  const GeomDet* det = trackerGeom->idToDet(rh->geographicalId());
704 
705  currTsos = newTrajectory.measurements().back().updatedState();
706  predTsos = thePropagator->propagate(currTsos, det->surface());
707  if (!predTsos.isValid()) continue;
708  GlobalVector propagationDistance = predTsos.globalPosition() - currTsos.globalPosition();
709  if (propagationDistance.mag() > maxPropagationDistance) continue;
711  if(debug_) {
712  std::cout << "Propagation distance2 is " << propagationDistance.mag() << std::endl;
713  std::cout << "predTSOS is valid!!" << std::endl;
714  std::cout << " predTSOS (x/y/z): " << predTsos.globalPosition().x()<< " / " << predTsos.globalPosition().y()<< " / " << predTsos.globalPosition().z() << std::endl;
715  std::cout << " local position x: " << predTsos.localPosition().x() << "+-" << sqrt(predTsos.localError().positionError().xx()) << std::endl;
716  std::cout << " local position y: " << predTsos.localPosition().y() << "+-" << sqrt(predTsos.localError().positionError().yy()) << std::endl;
717  std::cout << "currTSOS is valid!! " << currTsos.isValid() << std::endl;
718  std::cout << " currTSOS (x/y/z): " << currTsos.globalPosition().x()<< " / " << currTsos.globalPosition().y()<< " / " << currTsos.globalPosition().z() << std::endl;
719  std::cout << " local position x: " << currTsos.localPosition().x() << "+-" << sqrt(currTsos.localError().positionError().xx()) << std::endl;
720  std::cout << " local position y: " << currTsos.localPosition().y() << "+-" << sqrt(currTsos.localError().positionError().yy()) << std::endl;
721  }
722 
723  if (!est.first) {
724  if (debug_) std::cout<<"Failed to add one of the original hits on a low occupancy layer!!!!" << std::endl;
725  continue;
726  }
727  currTsos = theUpdator->update(predTsos, *rh);
728  tm = TrajectoryMeasurement(predTsos, currTsos, &(*rh),est.second,ilyr->first);
729 
730  const TrajectoryStateOnSurface theTSOS = newTrajectory.lastMeasurement().updatedState();
731 
732  //std::cout << "11TsosBefore (x/y/z): " << theTSOS.globalPosition().x()<< " / " << theTSOS.globalPosition().y()<< " / " << theTSOS.globalPosition().z() << std::endl;
733  //std::cout << " 11local position x: " << theTSOS.localPosition().x() << "+-" << sqrt(theTSOS.localError().positionError().xx()) << std::endl;
734  //std::cout << " 11local position y: " << theTSOS.localPosition().y() << "+-" << sqrt(theTSOS.localError().positionError().yy()) << std::endl;
735 
736 
737 
738  newTrajectory.push(tm,est.second);
739  final_layers.insert(ilyr->first);
740  }
741  else{
742  if (debug_) std::cout<<" Layer " << ilyr-RecHitsByLayer.begin() <<" is one of the skipped layers " << std::endl;
743 
744  //collect hits in the skipped layer
745  edm::OwnVector<TrackingRecHit> skipped_hits;
746  std::set<const GeomDet*> dets;
747  for (RoadSearchCloud::RecHitVector::const_iterator ih = ilyr->second.begin();
748  ih != ilyr->second.end(); ++ih) {
749  skipped_hits.push_back((*ih)->clone());
750  dets.insert(trackerGeom->idToDet((*ih)->geographicalId()));
751  }
752 
753  if(debug_){
754  std::cout<<" ---> probing missing hits (nh="<< skipped_hits.size() << ", nd=" << dets.size()
755  << ") in layer " << ilyr-RecHitsByLayer.begin() <<std::endl;
756  }
757 
758  const TrajectoryStateOnSurface theTSOS = newTrajectory.lastMeasurement().updatedState();
759 
760  //std::cout << "TsosBefore (x/y/z): " << theTSOS.globalPosition().x()<< " / " << theTSOS.globalPosition().y()<< " / " << theTSOS.globalPosition().z() << std::endl;
761  //std::cout << " local position x: " << theTSOS.localPosition().x() << "+-" << sqrt(theTSOS.localError().positionError().xx()) << std::endl;
762  //std::cout << " local position y: " << theTSOS.localPosition().y() << "+-" << sqrt(theTSOS.localError().positionError().yy()) << std::endl;
763 
764  std::vector<TrajectoryMeasurement> theGoodHits = FindBestHits(theTSOS,dets,theHitMatcher,skipped_hits);
765  if (!theGoodHits.empty()){
766  final_layers.insert(ilyr->first);
767  if (debug_) std::cout<<"Found " << theGoodHits.size() << " good hits to add" << std::endl;
768  for (std::vector<TrajectoryMeasurement>::const_iterator im=theGoodHits.begin();im!=theGoodHits.end();++im){
769  newTrajectory.push(*im,im->estimate());
770  }
771  }
772  }
773  } // END 2nd PASS LOOP OVER LAYERS IN CLOUD
774 
775  if (debug_) std::cout<<"Finished loop over layers in cloud. Trajectory now has " <<newTrajectory.measurements().size()
776  << " hits. " << std::endl;
777  if (debug_) std::cout<<"The trajectory has " << newTrajectory.measurements().size() <<" hits on " << final_layers.size()
778  << " layers from a cloud of " << RecHitsByLayer.size()
779  << " layers and a chunk of " << (RecHitsByLayer.size() - ilayer0) << " layers " << std::endl;
780  if (newTrajectory.measurements().size() >= theNumHitCut)
781  extendedChunks.insert(extendedChunks.end(), newTrajectory);
782  if (final_layers.size() >= (RecHitsByLayer.size() - ilayer0)){
783  if (debug_) std::cout<<"All layers of the chunk have been used..." << std::endl;
784  all_layers_used = true;
785  }
786  } // END ELSE TO RECOVER SKIPPED LAYERS
787  if (all_layers_used) {
788  if (debug_) std::cout << "All layers were used, so break....." << std::endl;
789  all_chunk_layers_used = true;
790  break;
791  }
792  if (debug_) std::cout<<"Going to next clean chunk....." << std::endl;
793  } // END LOOP OVER CLEAN CHUNKS
794  if (debug_) std::cout<< "Now Clean the " << extendedChunks.size() << " extended chunks " <<std::endl;
795  if (extendedChunks.size() > 1) theTrajectoryCleaner->clean(extendedChunks);
796  for (std::vector<Trajectory>::const_iterator it = extendedChunks.begin();
797  it != extendedChunks.end(); it++) {
798  if (it->isValid()) CloudTrajectories.push_back(*it);
799  }
800  if (all_chunk_layers_used) break;
801  }
802 
803  // ********************* END NEW ADDITION
804 
805  if (debug_) std::cout<< "Finished with the cloud, so clean the "
806  << CloudTrajectories.size() << " cloud trajectories "<<std::endl ;
807  theTrajectoryCleaner->clean(CloudTrajectories);
808  for (std::vector<Trajectory>::const_iterator it = CloudTrajectories.begin();
809  it != CloudTrajectories.end(); it++) {
810  if (it->isValid()) FinalTrajectories.push_back(*it);
811  }
812 
813  if (debug_) std::cout<<" Final trajectories now has size " << FinalTrajectories.size()<<std::endl ;
814 
815  } // End loop over Cloud Collection
816 
817 
818  if (debug_) std::cout<< " Finished loop over all clouds " <<std::endl;
819 
820  output = PrepareTrackCandidates(FinalTrajectories);
821 
822  delete theAloPropagator;
823  delete theRevPropagator;
825  delete theHitMatcher;
826  delete theSmoother;
827 
828  if (debug_ || debugCosmics_) std::cout<< "Found " << output.size() << " track candidate(s)."<<std::endl;
829 
830 }
831 
832 
833 //edm::OwnVector<TrackingRecHit>
834 std::vector<TrajectoryMeasurement>
836  const std::set<const GeomDet*>& theDets,
838 // edm::OwnVector<TrackingRecHit> *theBestHits)
839 {
840 
841  //edm::OwnVector<TrackingRecHit> theBestHits;
842  std::vector<TrajectoryMeasurement> theBestHits;
843 
844  // extrapolate to all detectors from the list
845  std::map<const GeomDet*, TrajectoryStateOnSurface> dmmap;
846  for (std::set<const GeomDet*>::iterator idet = theDets.begin();
847  idet != theDets.end(); ++idet) {
848  TrajectoryStateOnSurface predTsos = thePropagator->propagate(tsosBefore, (**idet).surface());
849  if (predTsos.isValid()) {
850  GlobalVector propagationDistance = predTsos.globalPosition() - tsosBefore.globalPosition();
851  if (propagationDistance.mag() > maxPropagationDistance) continue;
852  dmmap.insert(std::make_pair(*idet, predTsos));
853  }
854  }
855  // evaluate hit residuals
856  std::map<const GeomDet*, TrajectoryMeasurement> dtmmap;
858  ih != theHits.end(); ++ih) {
859  const GeomDet* det = trackerGeom->idToDet(ih->geographicalId());
860 
861  std::map<const GeomDet*, TrajectoryStateOnSurface>::iterator idm = dmmap.find(det);
862  if (idm == dmmap.end()) continue;
863  TrajectoryStateOnSurface predTsos = idm->second;
866 
867  // Take the best hit on a given Det
868  if (est.first) {
869  TrajectoryStateOnSurface currTsos = theUpdator->update(predTsos, *rhit);
870  std::map<const GeomDet*, TrajectoryMeasurement>::iterator idtm = dtmmap.find(det);
871  if (idtm == dtmmap.end()) {
872  TrajectoryMeasurement tm(predTsos, currTsos, &(*rhit),est.second,
873  theMeasurementTracker->geometricSearchTracker()->detLayer(ih->geographicalId()));
874  dtmmap.insert(std::make_pair(det, tm));
875  } else if (idtm->second.estimate() > est.second) {
876  dtmmap.erase(idtm);
877  TrajectoryMeasurement tm(predTsos, currTsos, &(*rhit),est.second,
878  theMeasurementTracker->geometricSearchTracker()->detLayer(ih->geographicalId()));
879  dtmmap.insert(std::make_pair(det, tm));
880  }
881  }
882  }
883 
884  if (!dtmmap.empty()) {
885  for (std::map<const GeomDet*, TrajectoryMeasurement>::iterator idtm = dtmmap.begin();
886  idtm != dtmmap.end(); ++idtm) {
887  TrajectoryMeasurement itm = idtm->second;
888  theBestHits.push_back(itm);
889  }
890  }
891 
892  return theBestHits;
893 }
894 
895 
896 std::vector<TrajectoryMeasurement>
898  const std::set<const GeomDet*>& theDets,
900 {
901 
902  std::vector<TrajectoryMeasurement> theBestHits;
903 
904  double bestchi = 10000.0;
905  // extrapolate to all detectors from the list
906  std::map<const GeomDet*, TrajectoryStateOnSurface> dmmap;
907  for (std::set<const GeomDet*>::iterator idet = theDets.begin();
908  idet != theDets.end(); ++idet) {
909  TrajectoryStateOnSurface predTsos = thePropagator->propagate(tsosBefore, (**idet).surface());
910  if (predTsos.isValid()) {
911  GlobalVector propagationDistance = predTsos.globalPosition() - tsosBefore.globalPosition();
912  if (propagationDistance.mag() > maxPropagationDistance) continue;
913  dmmap.insert(std::make_pair(*idet, predTsos));
914  }
915  }
916  // evaluate hit residuals
917  std::map<const GeomDet*, TrajectoryMeasurement> dtmmap;
919  ih != theHits.end(); ++ih) {
920  const GeomDet* det = trackerGeom->idToDet(ih->geographicalId());
921 
922  std::map<const GeomDet*, TrajectoryStateOnSurface>::iterator idm = dmmap.find(det);
923  if (idm == dmmap.end()) continue;
924  TrajectoryStateOnSurface predTsos = idm->second;
927 
928  // Take the best hit on any Det
929  if (est.first) {
930  TrajectoryStateOnSurface currTsos = theUpdator->update(predTsos, *rhit);
931  if (est.second < bestchi){
932  if(!theBestHits.empty()){
933  theBestHits.erase(theBestHits.begin());
934  }
935  bestchi = est.second;
936  TrajectoryMeasurement tm(predTsos, currTsos, &(*rhit),est.second,
937  theMeasurementTracker->geometricSearchTracker()->detLayer(ih->geographicalId()));
938  theBestHits.push_back(tm);
939  }
940  }
941  }
942 
943  if (theBestHits.empty()){
944  if (debug_) std::cout<< "no hits to add! " <<std::endl;
945  }
946  else{
947  for (std::vector<TrajectoryMeasurement>::const_iterator im=theBestHits.begin();im!=theBestHits.end();++im)
948  if (debug_) std::cout<<" Measurement on layer "
949  << theMeasurementTracker->geometricSearchTracker()->detLayer(im->recHit()->geographicalId())
950  << " with estimate " << im->estimate()<<std::endl ;
951  }
952 
953  return theBestHits;
954 }
955 
956 std::vector<TrajectoryMeasurement>
958  const std::set<const GeomDet*>& theDets,
959  const SiStripRecHitMatcher* theHitMatcher,
961 // edm::OwnVector<TrackingRecHit> *theBestHits)
962 {
963 
964 
965  std::vector<TrajectoryMeasurement> theBestHits;
966  //TrajectoryMeasurement* theBestTM = 0;
967  TrajectoryMeasurement theBestTM;
968  bool firstTM = true;
969 
970  // extrapolate to all detectors from the list
971  std::map<const GeomDet*, TrajectoryStateOnSurface> dmmap;
972  for (std::set<const GeomDet*>::iterator idet = theDets.begin();
973  idet != theDets.end(); ++idet) {
974  TrajectoryStateOnSurface predTsos = thePropagator->propagate(tsosBefore, (**idet).surface());
975  if (predTsos.isValid()) {
976  GlobalVector propagationDistance = predTsos.globalPosition() - tsosBefore.globalPosition();
977  if (propagationDistance.mag() > maxPropagationDistance) continue;
978  dmmap.insert(std::make_pair(*idet, predTsos));
979  }
980  }
981 
982  if(debug_) std::cout << "TRAJECTORY INTERSECTS " << dmmap.size() << " DETECTORS." << std::endl;
983 
984  // evaluate hit residuals
985  std::map<const GeomDet*, TrajectoryMeasurement> dtmmap;
986  for (edm::OwnVector<TrackingRecHit>::const_iterator ih = theHits.begin(); ih != theHits.end(); ++ih) {
987  const GeomDet* det = trackerGeom->idToDet(ih->geographicalId());
988  //if (*isl != theMeasurementTracker->geometricSearchTracker()->detLayer(ih->geographicalId()))
989  // std::cout <<" You don't know what you're doing !!!!" << std::endl;
990 
991  std::map<const GeomDet*, TrajectoryStateOnSurface>::iterator idm = dmmap.find(det);
992  if (idm == dmmap.end()) continue;
993  TrajectoryStateOnSurface predTsos = idm->second;
995 
996  const SiStripMatchedRecHit2D *origHit = dynamic_cast<const SiStripMatchedRecHit2D *>(&(*ih));
997  if (origHit !=0){
998  const GluedGeomDet *gdet = dynamic_cast<const GluedGeomDet*>(det);
999  const SiStripMatchedRecHit2D *corrHit = theHitMatcher->match(origHit,gdet,predTsos.localDirection());
1000  if (corrHit!=0){
1001  rhit = ttrhBuilder->build(&(*corrHit));
1002  delete corrHit;
1003  }
1004  }
1005 
1006  if (debug_) {
1007  std::cout << "predTSOS (x/y/z): " << predTsos.globalPosition().x()<< " / " << predTsos.globalPosition().y()<< " / " << predTsos.globalPosition().z() << std::endl;
1008  std::cout << "local position x: " << predTsos.localPosition().x() << "+-" << sqrt(predTsos.localError().positionError().xx()) << std::endl;
1009  std::cout << "local position y: " << predTsos.localPosition().y() << "+-" << sqrt(predTsos.localError().positionError().yy()) << std::endl;
1010  std::cout << "rhit local position x: " << rhit->localPosition().x() << "+-" << sqrt(rhit->localPositionError().xx()) << std::endl;
1011  std::cout << "rhit local position y: " << rhit->localPosition().y() << "+-" << sqrt(rhit->localPositionError().yy()) << std::endl;
1012  }
1013 
1015  if (debug_) std::cout<< "hit " << ih-theHits.begin()
1016  << ": est = " << est.first << " " << est.second <<std::endl;
1017 
1018 
1019  // Take the best hit on a given Det
1020  if (est.first) {
1022  TrajectoryStateOnSurface currTsos = theUpdator->update(predTsos, *rhit);
1023  std::map<const GeomDet*, TrajectoryMeasurement>::iterator idtm = dtmmap.find(det);
1024  if (idtm == dtmmap.end()) {
1025  tm = TrajectoryMeasurement (predTsos, currTsos, &(*rhit),est.second,
1026  theMeasurementTracker->geometricSearchTracker()->detLayer(ih->geographicalId()));
1027  dtmmap.insert(std::make_pair(det, tm));
1028  } else if (idtm->second.estimate() > est.second) {
1029  dtmmap.erase(idtm);
1030  tm = TrajectoryMeasurement(predTsos, currTsos, &(*rhit),est.second,
1031  theMeasurementTracker->geometricSearchTracker()->detLayer(ih->geographicalId()));
1032  dtmmap.insert(std::make_pair(det, tm));
1033  }
1034  if ((firstTM)){
1035  theBestTM = tm;
1036  if (debug_) std::cout <<"Initialize best to " << theBestTM.estimate() << std::endl;
1037  firstTM = false;
1038  }
1039  else if (!firstTM) {
1040  if (debug_) std::cout << "Current best is " << theBestTM.estimate() << " while this hit is " << est.second;
1041  if (est.second < theBestTM.estimate()) {
1042  if (debug_) std::cout << " so replace it " ;
1043  theBestTM = tm;
1044  }
1045  if (debug_) std::cout << std::endl;
1046  }
1047  }
1048  }
1049  if (debug_) std::cout<< "Hits(Dets) to add: " << dtmmap.size() <<std::endl;
1050  if (!dtmmap.empty()) {
1051 
1052  std::vector<std::pair<TransientTrackingRecHit::ConstRecHitPointer, TrajectoryMeasurement*> > OverlapHits;
1053  for (std::map<const GeomDet*, TrajectoryMeasurement>::iterator idtm = dtmmap.begin();
1054  idtm != dtmmap.end(); ++idtm) {
1055  OverlapHits.push_back(std::make_pair(idtm->second.recHit(),&idtm->second));
1056 
1057  if (debug_) std::cout<<" Measurement on layer "
1058  << theMeasurementTracker->geometricSearchTracker()->detLayer(idtm->second.recHit()->geographicalId())
1059  << " with estimate " << idtm->second.estimate()<<std::endl ;
1060  }
1061  if (debug_)
1062  std::cout<<" Best Measurement is on layer "
1063  << theMeasurementTracker->geometricSearchTracker()->detLayer(theBestTM.recHit()->geographicalId())
1064  << " with estimate " << theBestTM.estimate()<<std::endl ;
1065 
1066 
1067  if (dtmmap.size()==1){ // only one hit so we can just return that one
1068  for (std::map<const GeomDet*, TrajectoryMeasurement>::iterator idtm = dtmmap.begin();
1069  idtm != dtmmap.end(); ++idtm) {
1070  TrajectoryMeasurement itm = idtm->second;
1071  if (debug_) std::cout<<" Measurement on layer "
1072  << theMeasurementTracker->geometricSearchTracker()->detLayer(itm.recHit()->geographicalId())
1073  << " with estimate " << itm.estimate()<<std::endl ;
1074  theBestHits.push_back(itm);
1075  }
1076  }
1077  else if (dtmmap.size()>=2) { // try for the overlaps -- first have to sort inside out
1078 
1079  if (debug_) std::cout<<"Unsorted OverlapHits has size " <<OverlapHits.size() << std::endl;
1080 
1081  for (std::vector<std::pair<TransientTrackingRecHit::ConstRecHitPointer,TrajectoryMeasurement*> >::iterator irh =OverlapHits.begin();
1082  irh!=OverlapHits.end();++irh){
1083  if (debug_) std::cout << "Hit " << irh-OverlapHits.begin()
1084  << " on det " << irh->first->det()
1085  << " detLayer "
1086  << theMeasurementTracker->geometricSearchTracker()->detLayer(irh->first->geographicalId())
1087  << ", r/phi/z = "
1088  << irh->first->globalPosition().perp() << " "
1089  << irh->first->globalPosition().phi() << " "
1090  << irh->first->globalPosition().z()
1091  << std::endl;
1092  }
1093 
1094  std::sort( OverlapHits.begin(),OverlapHits.end(),SortHitTrajectoryPairsByGlobalPosition());
1095  if (debug_) std::cout<<"Sorted OverlapHits has size " <<OverlapHits.size() << std::endl;
1096 
1097  float workingBestChi2 = 1000000.0;
1098  std::vector<TrajectoryMeasurement> workingBestHits;
1099 
1100  std::vector<std::pair<TransientTrackingRecHit::ConstRecHitPointer,TrajectoryMeasurement*> >::iterator irh1;
1101  std::vector<std::pair<TransientTrackingRecHit::ConstRecHitPointer,TrajectoryMeasurement*> >::iterator irh2;
1102  for (irh1 =OverlapHits.begin(); irh1!=--OverlapHits.end(); ++irh1){
1103  theBestHits.clear();
1104  float running_chi2=0;
1105  if (debug_) std::cout << "Hit " << irh1-OverlapHits.begin()
1106  << " on det " << irh1->first->det()
1107  << " detLayer "
1108  << theMeasurementTracker->geometricSearchTracker()->detLayer(irh1->first->geographicalId())
1109  << ", r/phi/z = "
1110 
1111  << irh1->first->globalPosition().perp() << " "
1112  << irh1->first->globalPosition().phi() << " "
1113  << irh1->first->globalPosition().z()
1114  << std::endl;
1115 
1116  TrajectoryStateOnSurface currTsos = irh1->second->updatedState();
1118  theBestHits.push_back(*(irh1->second));
1119  if (debug_) std::cout<<"Added first hit with chi2 = " << irh1->second->estimate() << std::endl;
1120  running_chi2 += irh1->second->estimate();
1121  for (irh2 = irh1; irh2!=OverlapHits.end(); ++irh2){
1122  if (irh2 == irh1) continue;
1124  const GeomDet* det = irh2->first->det();
1125  // extrapolate the trajectory to the next hit
1126  TrajectoryStateOnSurface predTsos = thePropagator->propagate(currTsos, det->surface());
1127  // test if matches
1128  if (predTsos.isValid()){
1130  if (debug_) std::cout<<"Added overlap hit with est = " << est.first << " " << est.second << std::endl;
1131  if (est.first){
1132  TrajectoryMeasurement tm(predTsos, currTsos, &(*rh),est.second,
1133  theMeasurementTracker->geometricSearchTracker()->detLayer(rh->geographicalId()));
1134  theBestHits.push_back(tm);
1135  running_chi2 += est.second ;
1136  }
1137  else { // couldn't add 2nd hit so return best single hit
1138  }
1139  }
1140 
1141  }
1142  if (theBestHits.size()==dtmmap.size()){ // added the best hit in every layer
1143  if (debug_) std::cout<<"Added all "<<theBestHits.size()<<" hits out of " << dtmmap.size() << std::endl;
1144  break;
1145  }
1146  // Didn't add hits from every Det
1147  if (theBestHits.size() < dtmmap.size()){
1148  if (debug_) std::cout<<"Added only "<<theBestHits.size()<<" hits out of " << dtmmap.size() << std::endl;
1149  // Take the combination with the most hits
1150  if (theBestHits.size() > workingBestHits.size()){
1151  if (debug_) std::cout<<"Current combo has more hits so replace best" << std::endl;
1152  workingBestHits = theBestHits;
1153  }
1154  // has same number of hits as best, so check chi2
1155  else if (theBestHits.size() == workingBestHits.size()){
1156  if (running_chi2< workingBestChi2){
1157  if (debug_) std::cout<<"Current combo has same # of hits but lower chi2 so replace best" << std::endl;
1158  workingBestHits = theBestHits;
1159  workingBestChi2 = running_chi2;
1160  }
1161  }
1162  }
1163  }
1164  if (theBestHits.size()<2){
1165  if (debug_) std::cout<<"Only one good hit in overlap"<<std::endl;
1166  if (debug_) std::cout<<" Added hit on layer on det "
1167  << theBestTM.recHit()->det()
1168  << " detLayer "
1169  << theMeasurementTracker->geometricSearchTracker()->detLayer(theBestTM.recHit()->geographicalId())
1170  << ", r/phi/z = "
1171  << theBestTM.recHit()->globalPosition().perp() << " "
1172  << theBestTM.recHit()->globalPosition().phi() << " "
1173  << theBestTM.recHit()->globalPosition().z()
1174  << " with estimate " << theBestTM.estimate()<<std::endl ;
1175  theBestHits.clear();
1176  theBestHits.push_back(theBestTM);
1177  }
1178 
1179  }
1180  else {
1181  if (debug_)std::cout << "ERROR: Unexpected size from DTMMAP = " << dtmmap.size() << std::endl;
1182  theBestHits.push_back(theBestTM);
1183  }
1184  }
1185 
1186  return theBestHits;
1187 }
1188 
1189 
1190 //bool RoadSearchTrackCandidateMakerAlgorithm::chooseStartingLayers( RoadSearchCloud::RecHitVector& recHits, int ilayer0,
1191 bool RoadSearchTrackCandidateMakerAlgorithm::chooseStartingLayers( std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >& recHitsByLayer,
1192  //int ilayer0,
1193  std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilyr0,
1194  const std::multimap<int, const DetLayer*>& layer_map,
1195  std::set<const DetLayer*>& good_layers,
1196  std::vector<const DetLayer*>& middle_layers ,
1197  RoadSearchCloud::RecHitVector& recHits_middle)
1198 {
1199  const unsigned int max_middle_layers = 2;
1200 
1201  // consider the best nFoundMin layers + other layers with only one hit
1202  // This has implications, based on the way we locate the hits.
1203  // For now, use only the low occupancy layers in the first pass
1204  //const int nfound_min = min_chunk_length-1;
1205  //const int nfound_min = 4;
1206  std::multimap<int, const DetLayer*>::const_iterator ilm = layer_map.begin();
1207  int ngoodlayers = 0;
1208  while (ilm != layer_map.end()) {
1209  if (ngoodlayers >= nFoundMin_ && ilm->first > 1) break;
1210  //if (ilm->first > 1) break;
1211  good_layers.insert(ilm->second);
1212  ++ngoodlayers;
1213  ++ilm;
1214  }
1215 
1216  // choose intermediate layers
1217  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilayer = ilyr0+1;
1218  ilayer != recHitsByLayer.end(); ++ilayer) {
1219  // only use useful layers
1220  if (good_layers.find(ilayer->first) == good_layers.end()) continue;
1221  // only use stereo layers
1222  if (!CosmicReco_ && !lstereo[ilayer-recHitsByLayer.begin()]) continue;
1223  middle_layers.push_back(ilayer->first);
1224  if (middle_layers.size() >= max_middle_layers) break;
1225  }
1226 
1227  for (std::vector<const DetLayer*>::iterator ml = middle_layers.begin();
1228  ml!=middle_layers.end();++ml){
1229  unsigned int middle_layers_found = 0;
1230  for (std::vector<std::pair<const DetLayer*, RoadSearchCloud::RecHitVector > >::iterator ilyr = recHitsByLayer.begin();
1231  ilyr != recHitsByLayer.end(); ++ilyr) {
1232  if (ilyr->first == *ml){
1233  for (RoadSearchCloud::RecHitVector::const_iterator ih = ilyr->second.begin();
1234  ih != ilyr->second.end(); ++ih) {
1235  recHits_middle.push_back(*ih);
1236  }
1237  ++middle_layers_found;
1238  }
1239  if (middle_layers_found == middle_layers.size()) continue;
1240  }
1241 
1242  }
1243  return (recHits_middle.size()>0);
1244 }
1245 
1247  const TrackingRecHit* theInnerHit,
1248  const TrackingRecHit* theOuterHit)
1249 {
1250  FreeTrajectoryState fts;
1251 
1252  GlobalPoint inner = trackerGeom->idToDet(theInnerHit->geographicalId())->surface().toGlobal(theInnerHit->localPosition());
1253  GlobalPoint outer = trackerGeom->idToDet(theOuterHit->geographicalId())->surface().toGlobal(theOuterHit->localPosition());
1254 
1255  LogDebug("RoadSearch") << "inner hit: r/phi/z = "<< inner.perp() << " " << inner.phi() << " " << inner.z() ;
1256  LogDebug("RoadSearch") << "outer hit: r/phi/z = "<< outer.perp() << " " << outer.phi() << " " << outer.z() ;
1257 
1258  // hits should be reasonably separated in r
1259  const double dRmin = 0.1; // cm
1260  if (outer.perp() - inner.perp() < dRmin) return fts;
1261  //GlobalPoint vertexPos(0,0,0);
1262  const double dr2 = initialVertexErrorXY_*initialVertexErrorXY_;
1263  //const double dr2 = 0.0015*0.0015;
1264  //const double dr2 = 0.2*0.2;
1265  const double dz2 = 5.3*5.3;
1266 
1267  // linear z extrapolation of two hits have to be inside tracker ( |z| < 275 cm)
1268  FastLine linearFit(outer, inner);
1269  double z_0 = -linearFit.c()/linearFit.n2();
1270  if ( std::abs(z_0) > 275 && !CosmicReco_ ) return fts;
1271 
1272  GlobalError vertexErr(dr2,
1273  0, dr2,
1274  0, 0, dz2);
1275  //TrivialVertex vtx( vertexPos, vertexErr);
1276  //FastHelix helix(outerHit.globalPosition(),
1277  // (*innerHit).globalPosition(),
1278  // vtx.position());
1279 
1280  double x0=0.0,y0=0.0,z0=0.0;
1281  double phi0 = -999.0;
1282  if (NoFieldCosmic_){
1283  phi0=atan2(outer.y()-inner.y(),outer.x()-inner.x());
1285  if (inner.y()<outer.y()){
1286  if (debug_) std::cout<<"Flipping direction!!!" << std::endl;
1287  thePropagator = theRevPropagator;
1288  phi0=phi0-M_PI;
1289  }
1290  double alpha=atan2(inner.y(),inner.x());
1291  double d1=sqrt(inner.x()*inner.x()+inner.y()*inner.y());
1292  double d0=-d1*sin(alpha-phi0); x0=d0*sin(phi0); y0=-d0*cos(phi0);
1293  double l1=0.0,l2=0.0;
1294  if (fabs(cos(phi0))>0.1){
1295  l1=(inner.x()-x0)/cos(phi0);l2=(outer.x()-x0)/cos(phi0);
1296  }else{
1297  l1=(inner.y()-y0)/sin(phi0);l2=(outer.y()-y0)/sin(phi0);
1298  }
1299  z0=(l2*inner.z()-l1*outer.z())/(l2-l1);
1300  }
1301  //FastHelix helix(outer, inner, vertexPos, es);
1302  FastHelix helix(outer, inner, GlobalPoint(x0,y0,z0), es);
1303  if (!NoFieldCosmic_ && !helix.isValid()) return fts;
1304 
1306  float zErr = vertexErr.czz();
1307  float transverseErr = vertexErr.cxx(); // assume equal cxx cyy
1308  C(3, 3) = transverseErr;
1309  C(4, 4) = zErr;
1310  CurvilinearTrajectoryError initialError(C);
1311 
1312  if (NoFieldCosmic_) {
1313  TrackCharge q = 1;
1314  FastLine flfit(outer, inner);
1315  double dzdr = -flfit.n1()/flfit.n2();
1316  if (inner.y()<outer.y()) dzdr*=-1;
1317 
1318  GlobalPoint XYZ0(x0,y0,z0);
1319  if (debug_) std::cout<<"Initial Point (x0/y0/z0): " << x0 <<'\t'<< y0 <<'\t'<< z0 << std::endl;
1320  GlobalVector PXYZ(cosmicSeedPt_*cos(phi0),
1321  cosmicSeedPt_*sin(phi0),
1322  cosmicSeedPt_*dzdr);
1323  GlobalTrajectoryParameters thePars(XYZ0,PXYZ,q,magField);
1325  CErr *= 5.0;
1326  // CErr(3,3) = (theInnerHit->localPositionError().yy()*theInnerHit->localPositionError().yy() +
1327  // theOuterHit->localPositionError().yy()*theOuterHit->localPositionError().yy());
1328  fts = FreeTrajectoryState(thePars,
1329  CartesianTrajectoryError(CErr));
1330  if (debug_) std::cout<<"\nInitial CError (dx/dy/dz): " << CErr(1,1) <<'\t'<< CErr(2,2) <<'\t'<< CErr(3,3) << std::endl;
1331  if (debug_) std::cout<<"\n\ninner dy = " << theInnerHit->localPositionError().yy() <<"\t\touter dy = " << theOuterHit->localPositionError().yy() << std::endl;
1332  }
1333  else {
1334  fts = FreeTrajectoryState( helix.stateAtVertex().parameters(), initialError);
1335  }
1336  // RoadSearchSeedFinderAlgorithm::initialError( *outerHit, *(*innerHit),
1337  // vertexPos, vertexErr));
1338 
1339  return fts;
1340 }
1341 
1343  const TrackingRecHit* theInnerHit,
1344  const TrackingRecHit* theMiddleHit,
1345  const TrackingRecHit* theOuterHit)
1346 {
1347  FreeTrajectoryState fts;
1348 
1349  GlobalPoint inner = trackerGeom->idToDet(theInnerHit->geographicalId())->surface().toGlobal(theInnerHit->localPosition());
1350  GlobalPoint middle= trackerGeom->idToDet(theMiddleHit->geographicalId())->surface().toGlobal(theMiddleHit->localPosition());
1351  GlobalPoint outer = trackerGeom->idToDet(theOuterHit->geographicalId())->surface().toGlobal(theOuterHit->localPosition());
1352 
1353  LogDebug("RoadSearch") << "inner hit: r/phi/z = "<< inner.perp() << " " << inner.phi() << " " << inner.z() ;
1354  LogDebug("RoadSearch") << "middlehit: r/phi/z = "<< inner.perp() << " " << inner.phi() << " " << inner.z() ;
1355  LogDebug("RoadSearch") << "outer hit: r/phi/z = "<< outer.perp() << " " << outer.phi() << " " << outer.z() ;
1356 
1357  // hits should be reasonably separated in r
1358  const double dRmin = 0.1; // cm
1359  if (outer.perp() - inner.perp() < dRmin) return fts;
1360  const double dr2 = initialVertexErrorXY_*initialVertexErrorXY_;
1361  const double dz2 = 5.3*5.3;
1362 
1363  // linear z extrapolation of two hits have to be inside tracker ( |z| < 275 cm)
1364  FastLine linearFit(outer, inner);
1365  double z_0 = -linearFit.c()/linearFit.n2();
1366  if ( std::abs(z_0) > 275 && !CosmicReco_ ) return fts;
1367 
1368 
1369  FastHelix helix(outer, middle, inner, es);
1370  // check that helix is OK
1371  if (!helix.isValid() ||
1372  std::isnan(helix.stateAtVertex().parameters().momentum().perp())) return fts;
1373  // simple cuts on pt and dz
1374  if (helix.stateAtVertex().parameters().momentum().perp() < 0.5 ||
1375  std::abs(helix.stateAtVertex().parameters().position().z()) > 550.0)
1376  return fts;
1377 
1379  float zErr = dz2;
1380  float transverseErr = dr2; // assume equal cxx cyy
1381  C(3, 3) = transverseErr;
1382  C(4, 4) = zErr;
1383  CurvilinearTrajectoryError initialError(C);
1384 
1385 
1388  float charge=helix.stateAtVertex().parameters().charge();
1389 
1390  if (CosmicReco_ && gv.y()>0){
1391  if (debug_) std::cout<<"Flipping direction!!!" << std::endl;
1393  gv=-1.*gv;
1394  charge=-1.*charge;
1395  }
1396 
1397  GlobalTrajectoryParameters Gtp(inner,gv,int(charge),&(*magField));
1398  fts = FreeTrajectoryState(Gtp, initialError);
1399 
1400  //fts = FreeTrajectoryState( helix.stateAtVertex().parameters(), initialError);
1401 
1402  return fts;
1403 }
1404 
1405 
1406 
1408  const TrackingRecHit* theInnerHit,
1409  const DetLayer* theInnerHitLayer)
1410 
1411 {
1412  Trajectory theSeedTrajectory;
1413 
1414  // Need to put the first hit on the trajectory
1415  const GeomDet* innerDet = trackerGeom->idToDet((theInnerHit)->geographicalId());
1416  const TrajectoryStateOnSurface innerState =
1417  thePropagator->propagate(fts,innerDet->surface());
1418  if ( !innerState.isValid() ||
1419  std::isnan(innerState.globalMomentum().perp())) {
1420  if (debug_) std::cout<<"*******DISASTER ********* seed doesn't make it to first hit!!!!!" << std::endl;
1421  return theSeedTrajectory;
1422  }
1424  // if this first hit is a matched hit, it should be updated for the trajectory
1425  const SiStripMatchedRecHit2D *origHit = dynamic_cast<const SiStripMatchedRecHit2D *>(theInnerHit);
1426  if (origHit !=0){
1427  const GluedGeomDet *gdet = dynamic_cast<const GluedGeomDet*>(innerDet);
1428  const SiStripMatchedRecHit2D *corrHit = theHitMatcher->match(origHit,gdet,innerState.localDirection());
1429  if (corrHit!=0){
1430  intrhit = ttrhBuilder->build(&(*corrHit));
1431  delete corrHit;
1432  }
1433  }
1434 
1435  MeasurementEstimator::HitReturnType est = theEstimator->estimate(innerState, *intrhit);
1436  if (!est.first) return theSeedTrajectory;
1437  TrajectoryStateOnSurface innerUpdated= theUpdator->update( innerState,*intrhit);
1438  if (debug_) std::cout<<"InnerUpdated: " << innerUpdated << std::endl;
1439  if (!innerUpdated.isValid() ||
1440  std::isnan(innerUpdated.globalMomentum().perp())) {
1441  if (debug_) std::cout<<"Trajectory updated with first hit is invalid!!!" << std::endl;
1442  return theSeedTrajectory;
1443  }
1444  TrajectoryMeasurement tm = TrajectoryMeasurement(innerState, innerUpdated, &(*intrhit),est.second,theInnerHitLayer);
1445 
1446  PTrajectoryStateOnDet* pFirstStateTwo = theTransformer->persistentState(innerUpdated,
1447  intrhit->geographicalId().rawId());
1448  edm::OwnVector<TrackingRecHit> newHitsTwo;
1449  newHitsTwo.push_back(intrhit->hit()->clone());
1450 
1451  TrajectorySeed tmpseedTwo = TrajectorySeed(*pFirstStateTwo,
1452  newHitsTwo,
1453  alongMomentum);
1455  tmpseedTwo = TrajectorySeed(*pFirstStateTwo,
1456  newHitsTwo,
1458  }
1459 
1460  delete pFirstStateTwo;
1461 
1462  //Trajectory seedTraj(tmpseedTwo, alongMomentum);
1463  theSeedTrajectory = Trajectory(tmpseedTwo, tmpseedTwo.direction());
1464 
1465  theSeedTrajectory.push(tm,est.second);
1466 
1467  return theSeedTrajectory;
1468 }
1469 
1470 
1471 
1473  RoadSearchCloud::RecHitVector& theLayerHits,
1474  const DetLayer* innerHitLayer,
1475  const TrackingRecHit* outerHit,
1476  const DetLayer* outerHitLayer)
1477 {
1478  std::vector<Trajectory> newTrajectories;
1479 
1480  for(RoadSearchCloud::RecHitVector::const_iterator ihit = theLayerHits.begin();
1481  ihit != theLayerHits.end(); ihit++) {
1482  Trajectory traj = theTrajectory;
1483  const DetLayer* thisLayer =
1484  theMeasurementTracker->geometricSearchTracker()->detLayer((*ihit)->geographicalId());
1485  if (thisLayer == innerHitLayer){
1486  // Right now we are assuming that ONLY single hit layers are in this initial collection
1487  //if (thisLayer == innerHitLayer && !(ihit->recHit() == innerHit->recHit())){
1488  // if (debug_) std::cout<<"On inner hit layer, but have wrong hit?!?!?" << std::endl;
1489  continue;
1490  }
1491  if (thisLayer == outerHitLayer){
1492  LocalPoint p1 = (*ihit)->localPosition();
1493  LocalPoint p2 = outerHit->localPosition();
1494  if (p1.x()!=p2.x() || p1.y()!=p2.y()) continue;
1495  }
1496  // extrapolate
1497 
1499 
1500  if (debug_){
1501  if (rhit->isValid()) {
1502  LogDebug("RoadSearch") << "RecHit " << ihit-theLayerHits.begin()
1503  << ", det " << rhit->det() << ", r/phi/z = "
1504  << rhit->globalPosition().perp() << " "
1505  << rhit->globalPosition().phi() << " "
1506  << rhit->globalPosition().z();
1507  } else {
1508  LogDebug("RoadSearch") << "RecHit " << ihit-theLayerHits.begin()
1509  << " (invalid)";
1510  }
1511  }
1512 
1513  const GeomDet* det = trackerGeom->idToDet(rhit->geographicalId());
1514 
1515  TrajectoryStateOnSurface predTsos;
1516  TrajectoryStateOnSurface currTsos;
1517 
1518  if (traj.measurements().empty()) {
1519  //predTsos = thePropagator->propagate(fts, det->surface());
1520  if (debug_) std::cout<<"BIG ERROR!!! How did we make it to here with no trajectory measurements?!?!?"<<std::endl;
1521  } else {
1522  currTsos = traj.measurements().back().updatedState();
1523  predTsos = thePropagator->propagate(currTsos, det->surface());
1524  }
1525  if (!predTsos.isValid()){
1526  continue;
1527  }
1528  GlobalVector propagationDistance = predTsos.globalPosition() - currTsos.globalPosition();
1529  if (propagationDistance.mag() > maxPropagationDistance) continue;
1530  if (debug_) {
1531  std::cout << "currTsos (x/y/z): "
1532  << currTsos.globalPosition().x() << " / "
1533  << currTsos.globalPosition().y() << " / "
1534  << currTsos.globalPosition().z() << std::endl;
1535  std::cout << "predTsos (x/y/z): "
1536  << predTsos.globalPosition().x() << " / "
1537  << predTsos.globalPosition().y() << " / "
1538  << predTsos.globalPosition().z() << std::endl;
1539  std::cout << "Propagation distance1 is " << propagationDistance.mag() << std::endl;
1540  }
1542  if (debug_){
1543  std::cout<< "trajectory at r/z=" << det->surface().position().perp()
1544  << " " << det->surface().position().z()
1545  << ", hit " << ihit-theLayerHits.begin()
1546  << " local prediction " << predTsos.localPosition().x()
1547  << " +- " << sqrt(predTsos.localError().positionError().xx())
1548  << ", hit at " << rhit->localPosition().x() << " +- " << sqrt(rhit->localPositionError().xx())
1549  << std::endl;
1550  }
1551 
1552  // update
1553  // first correct for angle
1554 
1555  const SiStripMatchedRecHit2D *origHit = dynamic_cast<const SiStripMatchedRecHit2D *>(*ihit);
1556  if (origHit !=0){
1557  const GluedGeomDet *gdet = dynamic_cast<const GluedGeomDet*>(rhit->det());
1558  const SiStripMatchedRecHit2D *corrHit = theHitMatcher->match(origHit,gdet,predTsos.localDirection());
1559  if (corrHit!=0){
1560  rhit = ttrhBuilder->build(&(*corrHit));
1561  delete corrHit;
1562  }
1563  }
1564 
1566  if (debug_) std::cout << "estimation: " << est.first << " " << est.second << std::endl;
1567  if (!est.first) continue;
1568  currTsos = theUpdator->update(predTsos, *rhit);
1569  tm = TrajectoryMeasurement(predTsos, currTsos, &(*rhit),est.second,thisLayer);
1570  traj.push(tm,est.second);
1571  newTrajectories.push_back(traj);
1572 
1573 
1574  }
1575 
1576  return newTrajectories;
1577 }
1578 
1579 
1581 {
1582 
1583  TrackCandidateCollection theCollection;
1584 
1585  theTrajectoryCleaner->clean(theTrajectories);
1586 
1587  //==========NEW CODE ==========
1588 
1589  if(CosmicTrackMerging_) {
1590 
1591  //generate vector of *valid* trajectories -> traj
1592  std::vector<Trajectory> traj;
1593 
1594  //keep track of trajectories which are used during merging
1595  std::vector<bool> trajUsed;
1596 
1597  for (std::vector<Trajectory>::iterator it = theTrajectories.begin(); it != theTrajectories.end(); ++it) {
1598  if (it->isValid()) {
1599  traj.push_back(*it);
1600  trajUsed.push_back(false);
1601  }
1602  }
1603 
1604  if(debugCosmics_) {
1605  std::cout << "==========ENTERING COSMIC MODE===========" << std::endl;
1606  // int t=0;
1607  for (std::vector<Trajectory>::iterator it = traj.begin(); it != traj.end(); it++) {
1608  std::cout << "Trajectory " << it-traj.begin() << " has "<<it->recHits().size()<<" hits and is valid: " << it->isValid() << std::endl;
1609  TransientTrackingRecHit::ConstRecHitContainer itHits = it->recHits();
1610 
1611 
1612  for (TransientTrackingRecHit::ConstRecHitContainer::const_iterator rhit=itHits.begin(); rhit!=itHits.end(); ++rhit)
1613  std::cout << "-->good hit position: " << (*rhit)->globalPosition().x() << ", "
1614  << (*rhit)->globalPosition().y() << ", "<< (*rhit)->globalPosition().z() << std::endl;
1615 
1616  }
1617  }
1618 
1619  //double nested looop to find trajectories that match in phi
1620  for ( unsigned int i = 0; i < traj.size(); ++i) {
1621  if (trajUsed[i]) continue;
1622  for ( unsigned int j = i+1; j != traj.size(); ++j) {
1623  if (trajUsed[j]) continue;
1624 
1625  if (debugCosmics_) std::cout<< "Trajectory " <<i<< " has "<<traj[i].recHits().size()<<" hits with chi2=" << traj[i].chiSquared() << " and is valid"<<std::endl;
1626  if (debugCosmics_) std::cout<< "Trajectory " <<j<< " has "<<traj[j].recHits().size()<<" hits with chi2=" << traj[j].chiSquared() << " and is valid"<<std::endl;
1627 
1628  TrajectoryMeasurement firstTraj1 = traj[i].firstMeasurement();
1629  TrajectoryMeasurement firstTraj2 = traj[j].firstMeasurement();
1630  TrajectoryStateOnSurface firstTraj1TSOS = firstTraj1.updatedState();
1631  TrajectoryStateOnSurface firstTraj2TSOS = firstTraj2.updatedState();
1632 
1633 
1634  if(debugCosmics_)
1635  std::cout << "phi1: " << firstTraj1TSOS.globalMomentum().phi()
1636  << " phi2: " << firstTraj2TSOS.globalMomentum().phi()
1637  << " --> delta_phi: " << firstTraj1TSOS.globalMomentum().phi()-firstTraj2TSOS.globalMomentum().phi() << std::endl;
1638 
1639  //generate new trajectory if delta_phi<0.3
1640  //use phi of momentum vector associated to *innermost* hit of trajectories
1641  if( fabs(firstTraj1TSOS.globalMomentum().phi()-firstTraj2TSOS.globalMomentum().phi())<0.3 ) {
1642  if(debugCosmics_) std::cout << "-->match successful" << std::endl;
1643  } else {
1644  if(debugCosmics_) std::cout << "-->match not successful" << std::endl;
1645  }
1646  if( fabs(firstTraj1TSOS.globalMomentum().phi()-firstTraj2TSOS.globalMomentum().phi())>0.3 ) continue;
1647 
1648 
1649  //choose starting trajectory: use trajectory in lower hemisphere (with y<0) to start new combined trajectory
1650  //use y position of outermost hit
1651  TrajectoryMeasurement lastTraj1 = traj[i].lastMeasurement();
1652  TrajectoryMeasurement lastTraj2 = traj[j].lastMeasurement();
1653  TrajectoryStateOnSurface lastTraj1TSOS = lastTraj1.updatedState();
1654  TrajectoryStateOnSurface lastTraj2TSOS = lastTraj2.updatedState();
1655 
1656  if(debugCosmics_){
1657  std::cout<<"Traj1 first (x/y/z): "
1658  << firstTraj1TSOS.globalPosition().x() <<" / "
1659  << firstTraj1TSOS.globalPosition().y() <<" / "
1660  << firstTraj1TSOS.globalPosition().z()
1661  << " phi: " << firstTraj1TSOS.globalMomentum().phi() << std::endl;
1662  std::cout<<"Traj1 last (x/y/z): "
1663  << lastTraj1TSOS.globalPosition().x() <<" / "
1664  << lastTraj1TSOS.globalPosition().y() <<" / "
1665  << lastTraj1TSOS.globalPosition().z()
1666  << " phi: " << lastTraj1TSOS.globalMomentum().phi() << std::endl;
1667 
1668  std::cout<<"Traj2 first (x/y/z): "
1669  << firstTraj2TSOS.globalPosition().x() <<" / "
1670  << firstTraj2TSOS.globalPosition().y() <<" / "
1671  << firstTraj2TSOS.globalPosition().z()
1672  << " phi: " << firstTraj2TSOS.globalMomentum().phi() << std::endl;
1673  std::cout<<"Traj2 last (x/y/z): "
1674  << lastTraj2TSOS.globalPosition().x() <<" / "
1675  << lastTraj2TSOS.globalPosition().y() <<" / "
1676  << lastTraj2TSOS.globalPosition().z()
1677  << " phi: " << lastTraj2TSOS.globalMomentum().phi() << std::endl;
1678 
1679  }
1680 
1681  Trajectory *upperTrajectory, *lowerTrajectory;
1682 
1683  TrajectoryStateOnSurface lowerTSOS1,upperTSOS1;
1684  if (lastTraj1TSOS.globalPosition().y()<firstTraj1TSOS.globalPosition().y()) {
1685  lowerTSOS1=lastTraj1TSOS; upperTSOS1=firstTraj1TSOS;
1686  }
1687  else {
1688  lowerTSOS1=firstTraj1TSOS; upperTSOS1=lastTraj1TSOS;
1689  }
1690  TrajectoryStateOnSurface lowerTSOS2;
1691  if (lastTraj2TSOS.globalPosition().y()<firstTraj2TSOS.globalPosition().y()) lowerTSOS2=lastTraj2TSOS;
1692  else lowerTSOS2=firstTraj2TSOS;
1693  if(lowerTSOS1.globalPosition().y() > lowerTSOS2.globalPosition().y()) {
1694  if(debugCosmics_)
1695  std::cout << "-->case A: "<< lowerTSOS1.globalPosition().y() << " > " << lowerTSOS2.globalPosition().y() << std::endl;
1696 
1697  upperTrajectory = &(traj[i]);
1698  lowerTrajectory = &(traj[j]);
1699 
1700  } else {
1701  if(debugCosmics_)
1702  std::cout << "-->case B: "<< lowerTSOS1.globalPosition().y() << " < " << lowerTSOS2.globalPosition().y() << std::endl;
1703 
1704  upperTrajectory = &(traj[j]);
1705  lowerTrajectory = &(traj[i]);
1706  }
1707 
1708  std::vector<Trajectory> freshStartUpperTrajectory = theSmoother->trajectories(*upperTrajectory);
1709  std::vector<Trajectory> freshStartLowerTrajectory = theSmoother->trajectories(*lowerTrajectory);
1710  //--JR
1711  if (freshStartUpperTrajectory.empty() || freshStartLowerTrajectory .empty()){
1712  if (debugCosmics_) std::cout << " the smoother has failed."<<std::endl;
1713  continue;
1714  }
1715  //--JR
1716  TrajectoryStateOnSurface NewFirstTsos = freshStartUpperTrajectory.begin()->lastMeasurement().updatedState();
1717  TrajectoryStateOnSurface forwardTsos = freshStartUpperTrajectory.begin()->firstMeasurement().forwardPredictedState();
1718  TrajectoryStateOnSurface backwardTsos = freshStartUpperTrajectory.begin()->lastMeasurement().backwardPredictedState();
1719 
1720  Trajectory freshStartTrajectory = *freshStartUpperTrajectory.begin();
1721  if(debugCosmics_) std::cout << "seed hit updatedState: " << NewFirstTsos.globalMomentum().x() << ", " << NewFirstTsos.globalMomentum().y() << ", " << NewFirstTsos.globalMomentum().z() << std::endl;
1722  if(debugCosmics_) std::cout << "seed hit updatedState (pos x/y/z): " << NewFirstTsos.globalPosition().x() << ", " << NewFirstTsos.globalPosition().y() << ", " << NewFirstTsos.globalPosition().z() << std::endl;
1723  if(debugCosmics_) std::cout << "seed hit forwardPredictedState: " << forwardTsos.globalMomentum().x() << ", " << forwardTsos.globalMomentum().y() << ", " << forwardTsos.globalMomentum().z() << std::endl;
1724  if(debugCosmics_) std::cout << "seed hit forwardPredictedState (pos x/y/z): " << forwardTsos.globalPosition().x() << ", " << forwardTsos.globalPosition().y() << ", " << forwardTsos.globalPosition().z() << std::endl;
1725  if(debugCosmics_) std::cout << "seed hit backwardPredictedState: " << backwardTsos.globalMomentum().x() << ", " << backwardTsos.globalMomentum().y() << ", " << backwardTsos.globalMomentum().z() << std::endl;
1726  if(debugCosmics_) std::cout << "seed hit backwardPredictedState (pos x/y/z): " << backwardTsos.globalPosition().x() << ", " << backwardTsos.globalPosition().y() << ", " << backwardTsos.globalPosition().z() << std::endl;
1727 
1728  if(debugCosmics_) std::cout<<"#hits for upper trajectory: " << freshStartTrajectory.measurements().size() << std::endl;
1729 
1730  //loop over hits in upper trajectory and add them to lower trajectory
1732 
1733  if(debugCosmics_) std::cout << "loop over hits in lower trajectory..." << std::endl;
1734 
1735  bool addHitToFreshStartTrajectory = false;
1736  bool propagationFailed = false;
1737  int lostHits = 0;
1738  for (TransientTrackingRecHit::ConstRecHitContainer::const_iterator rhit=ttHits.begin(); rhit!=ttHits.end(); ++rhit){
1739 
1740  if(debugCosmics_ && lostHits>0){
1741  std::cout << " Lost " << lostHits << " of " << ttHits.size() << " on lower trajectory " << std::endl;
1742  std::cout << " Lost " << ((float)lostHits/(float)ttHits.size()) << " of hits of on lower trajectory " << std::endl;
1743  }
1744  if ((float)lostHits/(float)ttHits.size() > 0.5) {
1745  propagationFailed = true;
1746  break;
1747  }
1748  if(debugCosmics_) std::cout << "-->hit position: " << (*rhit)->globalPosition().x() << ", " << (*rhit)->globalPosition().y() << ", "<< (*rhit)->globalPosition().z() << std::endl;
1749 
1750  TrajectoryStateOnSurface predTsos;
1751  TrajectoryStateOnSurface currTsos;
1753 
1755 
1756 
1757 
1758  /*
1759  if( rh->isValid() ) {
1760  if(debugCosmics_) std::cout << "-->hit is valid"<<std::endl;
1761  const GeomDet* det = trackerGeom->idToDet(rh->geographicalId());
1762 
1763  std::vector<TrajectoryMeasurement> measL = freshStartTrajectory.measurements();
1764  bool alreadyUsed = false;
1765  for (std::vector<TrajectoryMeasurement>::iterator mh=measL.begin();mh!=measL.end();++mh) {
1766  if (rh->geographicalId().rawId()==mh->recHit()->geographicalId().rawId()) {
1767  if (debugCosmics_) std::cout << "this hit is already in the trajectory, skip it" << std::endl;
1768  alreadyUsed = true;
1769  break;
1770  }
1771  }
1772  if (alreadyUsed) continue;
1773  //std::vector<TrajectoryMeasurement> measU = freshStartUpperTrajectory[0].measurements();
1774  if (freshStartTrajectory.direction()==0) {
1775  std::vector<TrajectoryMeasurement>::iterator ml;
1776  for (ml=measL.begin();ml!=measL.end();++ml) {
1777  if (debugCosmics_) std::cout << "hit y="<<ml->recHit()->globalPosition().y()
1778  << " tsos validity fwd="<<ml->forwardPredictedState().isValid()
1779  << " bwd="<<ml->backwardPredictedState().isValid()
1780  << " upd="<<ml->updatedState().isValid()
1781  <<std::endl;
1782  if (ml->recHit()->globalPosition().y()>(*rhit)->globalPosition().y() && ml!=measL.begin()) {
1783  break;
1784  }
1785  }
1786  if ((ml-1)->forwardPredictedState().isValid()) currTsos = (ml-1)->forwardPredictedState();
1787  else currTsos = (ml-1)->backwardPredictedState();
1788 
1789  if (debugCosmics_) std::cout << "currTsos y=" << currTsos.globalPosition().y() << std::endl;
1790  }
1791  else {
1792  std::vector<TrajectoryMeasurement>::reverse_iterator ml;
1793  for (ml=measL.rbegin();ml!=measL.rend();++ml) {
1794  if (debugCosmics_) std::cout << "hit y="<<ml->recHit()->globalPosition().y()
1795  << " tsos validity fwd="<<ml->forwardPredictedState().isValid()
1796  << " bwd="<<ml->backwardPredictedState().isValid()
1797  << " upd="<<ml->updatedState().isValid()
1798  <<std::endl;
1799  if (ml->recHit()->globalPosition().y()>(*rhit)->globalPosition().y() && ml!=measL.rbegin()) {
1800  break;
1801  }
1802  }
1803  if ((ml-1)->forwardPredictedState().isValid()) {
1804  currTsos = (ml-1)->forwardPredictedState();
1805  }
1806  else {
1807  currTsos = (ml-1)->backwardPredictedState();
1808  }
1809 
1810  if (debugCosmics_) std::cout << "reverse. currTsos y=" << currTsos.globalPosition().y() << std::endl;
1811  }
1812 
1813 
1814  }
1815  */
1816 
1817 
1818  if( rh->isValid() ) {
1819  if(debugCosmics_) std::cout << "-->hit is valid"<<std::endl;
1820  const GeomDet* det = trackerGeom->idToDet(rh->geographicalId());
1821  if( addHitToFreshStartTrajectory==false ) {
1822  //first hit from upper trajectory that is being added to lower trajectory requires usage of backwardPredictedState (of lower trajectory)
1823  currTsos = freshStartTrajectory.lastMeasurement().backwardPredictedState();
1824  } else {
1825  //remaining hits from upper trajectory that are being added to lower trajectory require usage of forwardPredictedState
1826  currTsos = freshStartTrajectory.lastMeasurement().forwardPredictedState();
1827  }
1828 
1829  if(debugCosmics_) std::cout << "current TSOS: " << currTsos.globalPosition().x() << ", " << currTsos.globalPosition().y() << ", " << currTsos.globalPosition().z() << ", " << std::endl;
1830 
1831  predTsos = theAloPropagator->propagate(currTsos, det->surface());
1832 
1833  if (!predTsos.isValid()) {
1834  if(debugCosmics_) std::cout<<"predTsos is not valid!" <<std::endl;
1835  //propagationFailed = true;
1836  ++lostHits;
1837  //break;
1838  continue;
1839  }
1840  GlobalVector propagationDistance = predTsos.globalPosition() - currTsos.globalPosition();
1841  if (propagationDistance.mag() > maxPropagationDistance) continue;
1842 
1843  if(debugCosmics_) std::cout << "predicted TSOS: " << predTsos.globalPosition().x() << ", " << predTsos.globalPosition().y() << ", " << predTsos.globalPosition().z() << ", " << std::endl;
1845  if (!est.first) {
1846  if(debugCosmics_) std::cout<<"Failed to add one of the original hits on a low occupancy layer!!!!" << std::endl;
1847  //propagationFailed = true;
1848  ++lostHits;
1849  //break;
1850  continue;
1851  }
1852 
1853  currTsos = theUpdator->update(predTsos, *rh);
1854  if(debugCosmics_) std::cout << "current updated TSOS: " << currTsos.globalPosition().x() << ", " << currTsos.globalPosition().y() << ", " << currTsos.globalPosition().z() << ", " << std::endl;
1855  tm = TrajectoryMeasurement(predTsos, currTsos,&(*rh),est.second,theMeasurementTracker->geometricSearchTracker()->detLayer(rh->geographicalId()));
1856  freshStartTrajectory.push(tm,est.second);
1857  addHitToFreshStartTrajectory=true;
1858 
1859  }
1860 
1861  if(debugCosmics_) std::cout<<"#hits for new trajectory (his from upper trajectory added): " << freshStartTrajectory.measurements().size() << std::endl;
1862  }
1863 
1864  if (propagationFailed) {
1865  if (debugCosmics_) std::cout<<"Propagation failed so go to next trajectory" << std::endl;
1866  continue;
1867  }
1868 
1869  //put final trajectory together
1870  if(debugCosmics_) std::cout << "put final trajectory together..." << std::endl;
1872  TransientTrackingRecHit::ConstRecHitContainer tttempHits = freshStartTrajectory.recHits(splitMatchedHits_);
1873 
1874  for (int k=tttempHits.size()-1; k>=0; k--) {
1875  if(debugCosmics_) std::cout << "-->good hit position: " << tttempHits[k]->globalPosition().x() << ", " << tttempHits[k]->globalPosition().y() << ", "<< tttempHits[k]->globalPosition().z() << std::endl;
1876  goodHits.push_back(tttempHits[k]->hit()->clone());
1877  }
1878  TrajectoryStateOnSurface firstState;
1879 
1880  // check if Trajectory from seed is on first hit of the cloud, if not, propagate
1881  // exclude if first state on first hit is not valid
1882  DetId FirstHitId = (*(freshStartTrajectory.recHits().end()-1))->geographicalId(); //was begin
1883 
1884  TrajectoryMeasurement maxYMeasurement = freshStartTrajectory.lastMeasurement();
1885  const GeomDet* det = trackerGeom->idToDet(FirstHitId);
1886  firstState = theAnalyticalPropagator->propagate(maxYMeasurement.updatedState(),det->surface());
1887  if (firstState.isValid() == false) continue;
1888  PTrajectoryStateOnDet *state = theTransformer->persistentState(firstState,FirstHitId.rawId());
1889 
1890  //generate new trajectory seed
1891  TrajectoryStateOnSurface firstTSOS = freshStartTrajectory.lastMeasurement().updatedState();
1892  if(debugCosmics_) std::cout << "generate new trajectory seed with hit (x/y/z): " << firstTSOS.globalPosition().x() << ", " << firstTSOS.globalPosition().y() << ", " << firstTSOS.globalPosition().z() << ", " << std::endl;
1893  TransientTrackingRecHit::ConstRecHitPointer rhit = freshStartTrajectory.lastMeasurement().recHit();
1894  PTrajectoryStateOnDet* pFirstState = TrajectoryStateTransform().persistentState(NewFirstTsos,rhit->geographicalId().rawId());
1896  newHits.push_back(rhit->hit()->clone());
1897  TrajectorySeed tmpseed = TrajectorySeed(*pFirstState,newHits,alongMomentum);
1898 
1899  theCollection.push_back(TrackCandidate(goodHits,freshStartTrajectory.seed(),*state));
1900  delete state;
1901  delete pFirstState;
1902 
1903  //trajectory usage
1904  trajUsed[i]=true;
1905  trajUsed[j]=true;
1906 
1907  } //for loop trajectory2
1908 
1909  } //for loop trajectory1
1910 
1911  //add all trajectories to the resulting vector if they have *not* been used by the trajectory merging algorithm
1912  for ( unsigned int i = 0; i < traj.size(); ++i) {
1913 
1914  if (trajUsed[i]==true) continue;
1915 
1916  if (debugCosmics_) std::cout<< "Trajectory (not merged) has "<<traj[i].recHits().size()<<" hits with chi2=" << traj[i].chiSquared() << " and is valid? "<< traj[i].isValid()<<std::endl;
1919  for (TransientTrackingRecHit::ConstRecHitContainer::const_iterator rhit=ttHits.begin(); rhit!=ttHits.end(); ++rhit){
1920  goodHits.push_back((*rhit)->hit()->clone());
1921  }
1922  TrajectoryStateOnSurface firstState;
1923 
1924  // check if Trajectory from seed is on first hit of the cloud, if not, propagate
1925  // exclude if first state on first hit is not valid
1926  DetId FirstHitId = (*(traj[i].recHits().begin()))->geographicalId();
1927 
1928  // propagate back to first hit
1929  TrajectoryMeasurement firstMeasurement = traj[i].measurements()[0];
1930  const GeomDet* det = trackerGeom->idToDet(FirstHitId);
1931  firstState = theAnalyticalPropagator->propagate(firstMeasurement.updatedState(), det->surface());
1932  if (firstState.isValid()) {
1933  PTrajectoryStateOnDet *state = theTransformer->persistentState(firstState,FirstHitId.rawId());
1934  theCollection.push_back(TrackCandidate(goodHits,traj[i].seed(),*state));
1935  delete state;
1936  }
1937  }
1938  if (debugCosmics_) std::cout << "Original collection had " << theTrajectories.size()
1939  << " candidates. Merged collection has " << theCollection.size() << std::endl;
1940  } //if(CosmicTrackMerging_)
1941 
1942 
1943  if(!CosmicTrackMerging_) {
1944  for (std::vector<Trajectory>::const_iterator it = theTrajectories.begin(); it != theTrajectories.end(); it++) {
1945  if (debug_) std::cout<< " Trajectory has "<<it->recHits().size()<<" hits with chi2=" << it->chiSquared() << " and is valid? "<<it->isValid()<<std::endl;
1946  if (it->isValid()){
1947 
1950  for (TransientTrackingRecHit::ConstRecHitContainer::const_iterator rhit=ttHits.begin(); rhit!=ttHits.end(); ++rhit){
1951  goodHits.push_back((*rhit)->hit()->clone());
1952  }
1953  TrajectoryStateOnSurface firstState;
1954 
1955  // check if Trajectory from seed is on first hit of the cloud, if not, propagate
1956  // exclude if first state on first hit is not valid
1957  DetId FirstHitId = (*(it->recHits().begin()))->geographicalId();
1958 
1959  // propagate back to first hit
1960  TrajectoryMeasurement firstMeasurement = it->measurements()[0];
1961  const GeomDet* det = trackerGeom->idToDet(FirstHitId);
1962  firstState = theAnalyticalPropagator->propagate(firstMeasurement.updatedState(), det->surface());
1963  if (firstState.isValid() == false) continue;
1964  PTrajectoryStateOnDet *state = theTransformer->persistentState(firstState,FirstHitId.rawId());
1965  theCollection.push_back(TrackCandidate(goodHits,it->seed(),*state));
1966  delete state;
1967 
1968  }
1969  }
1970  }
1971 
1972  return theCollection;
1973 }
#define LogDebug(id)
PropagationDirection direction() const
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
float xx() const
Definition: LocalError.h:19
FTS stateAtVertex() const
Definition: FastHelix.cc:7
float alpha
Definition: AMPTWrapper.h:95
std::vector< TrajectoryMeasurement > FindBestHit(const TrajectoryStateOnSurface &tsosBefore, const std::set< const GeomDet * > &theDets, edm::OwnVector< TrackingRecHit > &theHits)
bool isValid() const
Definition: FastHelix.h:70
T perp() const
Definition: PV3DBase.h:66
virtual PropagationDirection propagationDirection() const
Definition: Propagator.h:143
TrajectoryStateOnSurface propagate(const FreeTrajectoryState &fts, const Plane &plane) const
propagation to plane
TrajectorySeed const & seed() const
Access to the seed used to reconstruct the Trajectory.
Definition: Trajectory.h:231
tuple d0
Definition: debug_cff.py:3
const GlobalTrajectoryParameters & parameters() const
FreeTrajectoryState initialTrajectory(const edm::EventSetup &es, const TrackingRecHit *InnerHit, const TrackingRecHit *OuterHit)
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TransientTrackingRecHit &hit) const =0
FreeTrajectoryState initialTrajectoryFromTriplet(const edm::EventSetup &es, const TrackingRecHit *InnerHit, const TrackingRecHit *MiddleHit, const TrackingRecHit *OuterHit)
void run(const RoadSearchCloudCollection *input, const edm::Event &e, const edm::EventSetup &es, TrackCandidateCollection &output)
Runs the algorithm.
TrajectoryStateOnSurface forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
SiStripMatchedRecHit2D * match(const SiStripRecHit2D *monoRH, const SiStripRecHit2D *stereoRH, const GluedGeomDet *gluedDet, LocalVector trackdirection) const
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
virtual TrajectoryStateOnSurface update(const TrajectoryStateOnSurface &, const TransientTrackingRecHit &) const =0
LocalVector localDirection() const
ROOT::Math::SMatrixIdentity AlgebraicMatrixID
virtual void update(const edm::Event &) const
std::vector< Trajectory > extrapolateTrajectory(const Trajectory &inputTrajectory, RoadSearchCloud::RecHitVector &theLayerHits, const DetLayer *innerHitLayer, const TrackingRecHit *outerHit, const DetLayer *outerHitLayer)
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::vector< TrackCandidate > TrackCandidateCollection
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
size_type size() const
Definition: OwnVector.h:260
Geom::Phi< T > phi() const
Definition: PV3DBase.h:63
virtual void clean(TrajectoryPointerContainer &) const
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:57
#define abs(x)
Definition: mlp_lapack.h:159
GlobalPoint globalPosition() const
ConstRecHitPointer recHit() const
ROOT::Math::SMatrix< double, 5, 5, ROOT::Math::MatRepSym< double, 5 > > AlgebraicSymMatrix55
std::vector< TrajectoryMeasurement > FindBestHitsByDet(const TrajectoryStateOnSurface &tsosBefore, const std::set< const GeomDet * > &theDets, edm::OwnVector< TrackingRecHit > &theHits)
tuple d1
Definition: debug_cff.py:7
double charge(const std::vector< uint8_t > &Ampls)
LocalError positionError() const
ConstRecHitContainer recHits(bool splitting=false) const
Definition: Trajectory.cc:67
iterator begin()
Definition: OwnVector.h:234
uint32_t rawId() const
get the raw id
Definition: DetId.h:45
U second(std::pair< T, U > const &p)
virtual std::vector< Trajectory > trajectories(const Trajectory &aTraj) const
DataContainer const & measurements() const
Definition: Trajectory.h:169
int TrackCharge
Definition: TrackCharge.h:4
void push_back(D *&d)
Definition: OwnVector.h:288
std::vector< TrajectoryMeasurement > DataContainer
Definition: Trajectory.h:42
T mag() const
Definition: PV3DBase.h:61
float yy() const
Definition: LocalError.h:21
bool isnan(float x)
Definition: math.h:13
T sqrt(T t)
Definition: SSEVec.h:28
virtual RecHitPointer build(const TrackingRecHit *p) const =0
build a tracking rechit from an existing rechit
TrajectoryMeasurement const & lastMeasurement() const
Definition: Trajectory.h:147
T z() const
Definition: PV3DBase.h:58
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
int j
Definition: DBlmapReader.cc:9
const DetLayer * detLayer(const DetId &id) const
obsolete method. Use idToLayer() instead.
Trajectory createSeedTrajectory(FreeTrajectoryState &fts, const TrackingRecHit *InnerHit, const DetLayer *innerHitLayer)
double n1() const
Definition: FastLine.h:28
TrajectoryStateOnSurface updatedState() const
PTrajectoryStateOnDet * persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid) const
const LocalTrajectoryError & localError() const
double p2[4]
Definition: TauolaWrapper.h:90
virtual const GeomDet * idToDet(DetId) const
tuple conf
Definition: dbtoconf.py:185
tuple input
Definition: collect_tpl.py:10
int k[5][pyjets_maxn]
virtual TrajectoryStateOnSurface propagate(const TrajectoryStateOnSurface &tsos, const Plane &plane) const
std::vector< ConstRecHitPointer > ConstRecHitContainer
Definition: DetId.h:20
std::pair< bool, double > HitReturnType
iterator end()
Definition: OwnVector.h:241
bool isValid() const
Definition: Trajectory.h:225
#define M_PI
Definition: BFit3D.cc:3
virtual LocalError localPositionError() const =0
T * clone(const T *tp)
Definition: Ptr.h:42
const T & get() const
Definition: EventSetup.h:55
double c() const
Definition: FastLine.h:32
T const * product() const
Definition: ESHandle.h:62
char state
Definition: procUtils.cc:75
void linearFit(T const *__restrict__ x, T const *__restrict__ y, int ndat, T const *__restrict__ sigy2, T &slope, T &intercept, T &covss, T &covii, T &covsi)
Definition: LinearFit.h:26
double p1[4]
Definition: TauolaWrapper.h:89
std::vector< TrajectoryMeasurement > FindBestHits(const TrajectoryStateOnSurface &tsosBefore, const std::set< const GeomDet * > &theDets, const SiStripRecHitMatcher *theHitMatcher, edm::OwnVector< TrackingRecHit > &theHits)
GlobalVector globalMomentum() const
double n2() const
Definition: FastLine.h:30
const Surface & surface() const
tuple cout
Definition: gather_cfg.py:41
std::vector< const TrackingRecHit * > RecHitVector
bool chooseStartingLayers(std::vector< std::pair< const DetLayer *, RoadSearchCloud::RecHitVector > > &RecHitsByLayer, std::vector< std::pair< const DetLayer *, RoadSearchCloud::RecHitVector > >::iterator ilyr0, const std::multimap< int, const DetLayer * > &layer_map, std::set< const DetLayer * > &good_layers, std::vector< const DetLayer * > &middle_layers, RoadSearchCloud::RecHitVector &recHits_middle)
DetId geographicalId() const
const GeometricSearchTracker * geometricSearchTracker() const
T x() const
Definition: PV3DBase.h:56
virtual LocalPoint localPosition() const =0
const PositionType & position() const
TrackCandidateCollection PrepareTrackCandidates(std::vector< Trajectory > &theTrajectories)
void push(const TrajectoryMeasurement &tm)
Definition: Trajectory.cc:35
virtual const BoundPlane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
std::vector< RoadSearchCloud > RoadSearchCloudCollection
TrajectoryStateOnSurface backwardPredictedState() const
Access to backward predicted state (from smoother)