CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Attributes
cms::HITrackVertexMaker Class Reference

#include <HITrackVertexMaker.h>

Public Member Functions

 HITrackVertexMaker (const edm::ParameterSet &, const edm::EventSetup &es1)
 
bool produceTracks (const edm::Event &, const edm::EventSetup &, HICConst *, FmpConst *)
 
 ~HITrackVertexMaker ()
 

Private Attributes

std::string builderName
 
int eventCount
 
edm::InputTag L2candTag_
 
edm::InputTag primaryVertexTag
 
edm::ParameterSet pset_
 
edm::InputTag rphirecHitsTag
 
std::vector< const
NavigationSchool * > 
theNavigationSchoolV
 

Detailed Description

Definition at line 62 of file HITrackVertexMaker.h.

Constructor & Destructor Documentation

cms::HITrackVertexMaker::HITrackVertexMaker ( const edm::ParameterSet ps1,
const edm::EventSetup es1 
)
explicit

Definition at line 110 of file HITrackVertexMaker.cc.

References gather_cfg::cout, and edm::ParameterSet::getParameter().

111 {
112 
113  L2candTag_ = ps1.getParameter< edm::InputTag > ("L2CandTag");
114  rphirecHitsTag = ps1.getParameter< edm::InputTag > ("rphiRecHits");
115  builderName = ps1.getParameter< std::string > ("TTRHBuilder");
116  primaryVertexTag = ps1.getParameter< edm::InputTag > ("PrimaryVertexTag");
117 #ifdef DEBUG
118  std::cout<<" Start HI TrackVertexMaker constructor "<<std::endl;
119 #endif
120  pset_ = ps1;
121  std::cout<<" No initialization "<<std::endl;
122  eventCount = 0;
123 #ifdef DEBUG
124  std::cout<<" HICTrajectoryBuilder constructed "<<std::endl;
125 #endif
126 }
T getParameter(std::string const &) const
tuple cout
Definition: gather_cfg.py:41
cms::HITrackVertexMaker::~HITrackVertexMaker ( )

Definition at line 132 of file HITrackVertexMaker.cc.

133 {
134 // std::cout<<" HITrackVertexMaker::destructor "<<std::endl;
135 }

Member Function Documentation

bool cms::HITrackVertexMaker::produceTracks ( const edm::Event e1,
const edm::EventSetup es1,
HICConst theHICConst,
FmpConst theFmpConst 
)

Definition at line 137 of file HITrackVertexMaker.cc.

References alongMomentum, ClosestApproachInRPhi::calculate(), FreeTrajectoryState::charge(), gather_cfg::cout, cms::HICFTSfromL1orL2::createFTSfromL2(), FreeTrajectoryState::curvilinearError(), GeomDetEnumerators::endcap, first, TrajectoryStateOnSurface::freeState(), TrajectoryStateOnSurface::freeTrajectoryState(), edm::EventSetup::get(), edm::Event::getByLabel(), TrajectoryStateOnSurface::globalMomentum(), TrajectoryStateOnSurface::globalPosition(), i, iseed, TrajectoryStateClosestToBeamLine::isValid(), TrajectoryStateOnSurface::isValid(), TransientVertex::isValid(), j, autoMagneticFieldProducer_cfi::magfield, FreeTrajectoryState::momentum(), VarParsing::mult, TransientVertex::normalisedChiSquared(), TransientVertex::originalTracks(), L1TEmulatorMonitor_cff::p, PV3DBase< T, PVType, FrameType >::perp(), PV3DBase< T, PVType, FrameType >::phi(), pos, FreeTrajectoryState::position(), TransientVertex::position(), cms::DiMuonSeedGeneratorHIC::produce(), edm::ESHandle< class >::product(), ptmin, edm::second(), HICMeasurementEstimator::setHICConst(), HICMeasurementEstimator::setMult(), cms::HICConst::setVertex(), cms::FmpConst::setVertex(), cms::HICTkOuterStartingLayerFinder::startingLayers(), evf::utils::state, TransientVertex::totalChiSquared(), patCandidatesForDimuonsSequences_cff::tracker, testEve_cfg::tracks, TrajectoryStateClosestToBeamLine::trackStateAtPCA(), reco::TrackBase::undefAlgorithm, v, KalmanVertexFitter::vertex(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), PV3DBase< T, PVType, FrameType >::z(), and cms::HICConst::zvert.

Referenced by cms::HLTHIMuL1L2L3Filter::filter(), cms::TestMuL1L2FilterSTA::filter(), and cms::TestMuL1L2Filter::filter().

138 {
139  bool dimuon = false;
140 
142 // edm::Handle<TrackCollection> L2mucands;
143  e1.getByLabel (L2candTag_,L2mucands);
144 
145 #ifdef DEBUG
146  cout<<" Number of muon candidates "<<L2mucands->size()<<endl;
147  if( L2mucands->size() < 2 ) cout<<"L2 muon failed"<<endl;
148 #endif
149 
150  if( L2mucands->size() < 2 ) return dimuon;
151 
152 #ifdef DEBUG
153  cout<<"L2 muon accepted"<<endl;
154 #endif
155 // std::cout<<" Just do nothing for L3 but initiate ESHandles "<<std::endl;
157  e1.getByLabel (primaryVertexTag,vertexcands);
158 
159 #ifdef DEBUG
160  cout<<" Number of vertices primary "<<vertexcands->size()<<endl;
161  if(vertexcands->size()<1) cout<<" Primary vertex failed "<<endl;
162 #endif
163 
164  if(vertexcands->size()<1) return dimuon;
165 
166 #ifdef DEBUG_COUNT
167  cout<<" Accepted for L3 propagation "<<endl;
168 #endif
169 
170 
171  int iv = 0;
172  for (reco::VertexCollection::const_iterator ipvertex=vertexcands->begin();ipvertex!=vertexcands->end();ipvertex++)
173  {
174 // cout<<" Vertex position from pixels "<<(*ipvertex).position().z()<<endl;
175  if (iv == 0) {theHICConst->setVertex((*ipvertex).position().z()); theFmpConst->setVertex((*ipvertex).position().z());}
176  iv++;
177  }
178 
179 // cout << " Vertex is set to (found by pixel finder)"<<theHICConst->zvert<<endl;
180 
181  eventCount++;
182 // ============================ Event accepted for L3
183 // Initialization from Records
184 //
185  std::string updatorName = "KFUpdator";
186  std::string propagatorAlongName = "PropagatorWithMaterial";
187  std::string propagatorOppositeName = "PropagatorWithMaterialOpposite";
188  double theChiSquareCut = 500.;
189  double nsig = 3.;
190  double ptmin=1.;
191 
192 
195  edm::ESHandle<MeasurementTracker> measurementTrackerHandle;
197  edm::ESHandle<Propagator> propagatorAlongHandle;
198  edm::ESHandle<Propagator> propagatorOppositeHandle;
200 
201  es1.get<TrackerRecoGeometryRecord>().get( tracker );
202  es1.get<IdealMagneticFieldRecord>().get(magfield);
203  es1.get<CkfComponentsRecord>().get("",measurementTrackerHandle);
204  es1.get<TransientRecHitRecord>().get(builderName,recHitBuilderHandle);
205  es1.get<TrackingComponentsRecord>().get(propagatorAlongName,propagatorAlongHandle);
206  es1.get<TrackingComponentsRecord>().get(propagatorOppositeName,propagatorOppositeHandle);
207  es1.get<TrackingComponentsRecord>().get(updatorName,updatorHandle);
208 
209 // Initialization of navigation school
210 
211  if(eventCount == 1) {
212 
213  int lost=-1;
214  int lostf=-1;
215  theNavigationSchoolV.push_back(new HICSimpleNavigationSchool(&(*tracker), &(*magfield), lost, lostf));
216  for(int i=11;i>-1;i--) {
217  theNavigationSchoolV.push_back(new HICSimpleNavigationSchool(&(*tracker), &(*magfield), i, lostf));
218  }
219  lost=-1;
220  for(int i=12;i>-1;i--) {
221  theNavigationSchoolV.push_back(new HICSimpleNavigationSchool(&(*tracker), &(*magfield), lost, i));
222  }
223 
224  } // initialization at the first event
225 
226 
227 
228  MinPtTrajectoryFilter theMinPtFilter(ptmin);
229  HICMeasurementEstimator theEstimator(&(*tracker), &(*magfield), theChiSquareCut, nsig);
230 
231 
232  HICTrajectoryBuilder theTrajectoryBuilder( pset_, es1,
233  updatorHandle.product(),
234  propagatorAlongHandle.product(),
235  propagatorOppositeHandle.product(),
236  &theEstimator,
237  recHitBuilderHandle.product(),
238  measurementTrackerHandle.product(),
239  &theMinPtFilter);
240 
241 
242 
243 
244 
245  measurementTrackerHandle->update(e1);
246 
247 #ifdef DEBUG
248  std::cout<<" After first tracker update "<<std::endl;
249 #endif
250 
251 
252 // For trajectory builder
253  int theLowMult = 1;
254  theEstimator.setHICConst(theHICConst);
255  theEstimator.setMult(theLowMult);
256 
257 
258  theTrajectoryBuilder.settracker(measurementTrackerHandle.product());
259 
260 //============================
261 // FastMuPropagator* theFmp = new FastMuPropagator(&(*magfield),theFmpConst);
262 // StateOnTrackerBound state(theFmp);
263 
264  FastMuPropagator theFmp(&(*magfield),theFmpConst);
265  StateOnTrackerBound state(&theFmp);
266 
268 
269 
270  HICFTSfromL1orL2 vFts(&(*magfield));
271 
272 
273  int NumOfSigma=4;
274  HICTkOuterStartingLayerFinder TkOSLF(NumOfSigma, &(*magfield), &(*tracker), theHICConst);
275 
276  int mult = 1;
277  DiMuonSeedGeneratorHIC Seed(rphirecHitsTag,&(*magfield),&(*tracker), theHICConst, builderName, mult);
278 
279 // vector<FreeTrajectoryState> theFts = vFts.createFTSfromStandAlone((*mucands));
280 
281  vector<FreeTrajectoryState> theFts = vFts.createFTSfromL2((*L2mucands));
282 
283 #ifdef DEBUG
284  cout<<" Size of the freeTS "<<theFts.size()<<endl;
285 #endif
286 
287 
288 
290  map<DetLayer*, DiMuonSeedGeneratorHIC::SeedContainer> seedmap;
291  vector<Trajectory> theTmpTrajectories0;
292 
293 // map< FreeTrajectoryState*, Trajectory>
294 
295  vector<FreeTrajectoryState*> theFoundFts;
296  map<FreeTrajectoryState*, vector<Trajectory> > theMapFtsTraj;
297 
298 
299  for(vector<FreeTrajectoryState>::iterator ifts=theFts.begin(); ifts!=theFts.end(); ifts++)
300  {
301  theTmpTrajectories0.clear();
302 #ifdef DEBUG
303  cout<<" cycle on Muon Trajectory State " <<(*ifts).parameters().position().perp()<<
304  " " <<(*ifts).parameters().position().z() <<endl;
305 #endif
306 
307  tsos=state((*ifts));
308  if(tsos.isValid())
309  {
310 
311 // vector<Trajectory> theTmpTrajectories0;
312 #ifdef DEBUG
313  cout<<" Position "<<tsos.globalPosition().perp()<<" "<<tsos.globalPosition().phi()<<
314  " "<<tsos.globalPosition().z()<<" "<<tsos.globalMomentum().perp()<<endl;
315 #endif
316 
317 // Start to find starting layers
319  vector<DetLayer*> seedlayers = TkOSLF.startingLayers((*ftsnew));
320 
321 #ifdef DEBUG
322  std::cout<<" The size of the starting layers "<<seedlayers.size()<<std::endl;
323 #endif
324 
325  if( seedlayers.size() == 0 ) {
326 #ifdef DEBUG
327  cout<<" Starting layers failed for muon candidate "<<endl;
328 #endif
329  continue;
330  }
331  map<DetLayer*, DiMuonSeedGeneratorHIC::SeedContainer> seedmap = Seed.produce(e1 ,es1,
332  (*ftsnew), tsos, (*ifts),
333  recHitBuilderHandle.product(),
334  measurementTrackerHandle.product(),
335  &seedlayers);
336 
337 
338 
339  for( vector<DetLayer*>::iterator it = seedlayers.begin(); it != seedlayers.end(); it++)
340  {
341 
342  DiMuonSeedGeneratorHIC::SeedContainer seeds = (*seedmap.find(*it)).second;
343 
344 #ifdef DEBUG
345  std::cout<<" Layer::Position z "<<(**it).surface().position().z()<<
346  " Number of seeds in layer "<<seeds.size()<<std::endl;
347 #endif
348 
349  if(seeds.size() == 0) {
350 #ifdef DEBUG
351  std::cout<<" No seeds are found: do not continue with this Detlayer "<<std::endl;
352 #endif
353  continue;
354  }
355  // set the first navigation (all layers without gap)
356 
357  NavigationSetter setter( *(theNavigationSchoolV[0]));
358 
359  for(DiMuonSeedGeneratorHIC::SeedContainer::iterator iseed=seeds.begin();
360  iseed!=seeds.end();iseed++)
361  {
362  std::vector<TrajectoryMeasurement> theV = (*iseed).measurements();
363 
364 #ifdef DEBUG
365  std::cout<< "RecHIT Layer position r "<<
366  theV[0].recHit()->globalPosition().perp()<<" phi "<<
367  theV[0].recHit()->globalPosition().phi()<<" z "<<
368  theV[0].recHit()->globalPosition().z()<<" momentum "<<
369  theV[0].updatedState().freeTrajectoryState()->parameters().momentum().perp()<<" "<<
370  theV[0].updatedState().freeTrajectoryState()->parameters().momentum().z()<<std::endl;
371 #endif
372 
373  vector<Trajectory> theTmpTrajectories = theTrajectoryBuilder.trajectories(*iseed);
374 
375 #ifdef DEBUG
376  cout<<" Number of found trajectories "<<theTmpTrajectories.size()<<endl;
377 #endif
378  if(theTmpTrajectories.size()>0) {
379 
380  theTmpTrajectories0.insert(theTmpTrajectories0.end(),
381  theTmpTrajectories.begin(),
382  theTmpTrajectories.end());
383 #ifdef DEBUG
384  std::cout<<"We found trajectories for at least one seed "<<theTmpTrajectories0.size()<<std::endl;
385 #endif
386  break;
387  } // There are trajectories
388  } // seeds
389 
390  if( theTmpTrajectories0.size() > 0 ) {
391 #ifdef DEBUG
392  std::cout<<"We found trajectories for at least one seed "<<theTmpTrajectories0.size()<<"break layer cycle "<<std::endl;
393 #endif
394  break;
395  }
396  } // seedlayer
397 
398  if( theTmpTrajectories0.size() > 0 ) {
399 #ifdef DEBUG
400  std::cout<<"We found trajectories for at least one seed "<<theTmpTrajectories0.size()
401  <<"continue"<<std::endl;
402 #endif
403  theFoundFts.push_back(&(*ifts));
404  theMapFtsTraj[&(*ifts)] = theTmpTrajectories0;
405  continue;
406  }
407 
408 #ifdef DEBUG
409  std::cout<<"No trajectories for this FTS "<<theTmpTrajectories0.size()<<
410  "try second path"<<std::endl;
411 #endif
412 
413 
414 // No trajectories found for this Muon FTS although seeds exist.
415 // Try to allow another trajectory map with lost 1 layer (only for barrel layers)
416 
417  for( vector<DetLayer*>::iterator it = seedlayers.begin(); it != seedlayers.end(); it++)
418  {
419 
420  DiMuonSeedGeneratorHIC::SeedContainer seeds = (*seedmap.find(*it)).second;
421 
422  if(seeds.size() == 0) {
423 #ifdef DEBUG
424  std::cout<<" Second path: No seeds are found: do not continue with this Detlayer "<<std::endl;
425 #endif
426  continue;
427  }
428 
429  if((**it).location() == GeomDetEnumerators::endcap) {
430  for(unsigned int j=13; j<theNavigationSchoolV.size();j++){
432  for(DiMuonSeedGeneratorHIC::SeedContainer::iterator iseed=seeds.begin();
433  iseed!=seeds.end();iseed++)
434  {
435  std::vector<TrajectoryMeasurement> theV = (*iseed).measurements();
436  vector<Trajectory> theTmpTrajectories = theTrajectoryBuilder.trajectories(*iseed);
437 
438  if(theTmpTrajectories.size()>0) {
439 
440  theTmpTrajectories0.insert(theTmpTrajectories0.end(),
441  theTmpTrajectories.begin(),
442  theTmpTrajectories.end());
443 #ifdef DEBUG
444  std::cout<<"Second path: We found trajectories for at least one seed in barrel layer "<<
445  theTmpTrajectories0.size()<<std::endl;
446 #endif
447  break;
448  } // There are trajectories
449  } // seeds
450 
451  if( theTmpTrajectories0.size() > 0 ) {
452 #ifdef DEBUG
453  std::cout<<"Second path: no trajectories: we try next barrel layer "<<
454  theTmpTrajectories0.size()<<std::endl;
455 #endif
456  break;
457  }
458  } // navigation maps
459  } else {
460  for(int j=1; j<13;j++){
462  for(DiMuonSeedGeneratorHIC::SeedContainer::iterator iseed=seeds.begin();
463  iseed!=seeds.end();iseed++)
464  {
465  std::vector<TrajectoryMeasurement> theV = (*iseed).measurements();
466  vector<Trajectory> theTmpTrajectories = theTrajectoryBuilder.trajectories(*iseed);
467 
468  if(theTmpTrajectories.size()>0) {
469 
470  theTmpTrajectories0.insert(theTmpTrajectories0.end(),
471  theTmpTrajectories.begin(),
472  theTmpTrajectories.end());
473 #ifdef DEBUG
474  std::cout<<"Second path: We found trajectories for at least one seed in barrel layer "<<
475  theTmpTrajectories0.size()<<std::endl;
476 #endif
477  break;
478  } // There are trajectories
479  } // seeds
480 
481  if( theTmpTrajectories0.size() > 0 ) {
482 #ifdef DEBUG
483  std::cout<<
484  "Second path: We found trajectories for at least one seed in barrel/endcap layer"<<
485  theTmpTrajectories0.size()<<std::endl;
486 #endif
487  break;
488  }
489  } // navigation maps
490  } // barrel or endcap seed
491  if( theTmpTrajectories0.size() > 0 ) {
492 #ifdef DEBUG
493  std::cout<<
494  "Second path: We found trajectories for at least one seed in barrel/endcap layer "
495  <<
496  theTmpTrajectories0.size()<<std::endl;
497 #endif
498  theFoundFts.push_back(&(*ifts));
499  theMapFtsTraj[&(*ifts)] = theTmpTrajectories0;
500  break;
501  }
502  } // seedlayer
503  } // tsos. isvalid
504  } // Muon Free trajectory state
505 
506 //
507 // start fitting procedure
508 //
509 #ifdef DEBUG
510  if(theFoundFts.size()>0 ) {
511  std::cout<<" Event reconstruction finished with "<<theFoundFts.size()
512  <<std::endl;}
513  else {std::cout<<" Event reconstruction::no tracks found"<<std::endl;}
514 #endif
515  if(theFoundFts.size()<2) return dimuon;
516 
517 // Look for vertex constraints
518 
519  edm::ESHandle<GlobalTrackingGeometry> globTkGeomHandle;
520  es1.get<GlobalTrackingGeometryRecord>().get(globTkGeomHandle);
521 
523  matrix(2,2) = 0.001;
524  matrix(3,3) = 0.001;
525 
526  reco::BeamSpot bs( reco::BeamSpot::Point(0., 0., theHICConst->zvert),
527  0.1,
528  0.,
529  0.,
530  0.,
531  matrix
532  );
533 
534 
536 
537 // For trajectory refitting
538  vector<reco::Track> firstTrack;
539  vector<reco::TransientTrack> firstTransTracks;
540  vector<reco::TrackRef> firstTrackRefs;
541  vector<reco::Track> secondTrack;
542  vector<reco::TransientTrack> secondTransTracks;
543  vector<reco::TrackRef> secondTrackRefs;
544 
545  for(vector<FreeTrajectoryState*>::iterator it = theFoundFts.begin(); it!= theFoundFts.end(); it++)
546  {
547  vector<Trajectory> first = (*theMapFtsTraj.find(*it)).second;
548 
549  for(vector<Trajectory>::iterator im=first.begin();im!=first.end(); im++) {
550 
551  TrajectoryStateOnSurface innertsos;
552  if (im->direction() == alongMomentum) {
553  innertsos = im->firstMeasurement().updatedState();
554  } else {
555  innertsos = im->lastMeasurement().updatedState();
556  }
557 
558 
559  // CMSSW31X
560  TSCBLBuilderNoMaterial tscblBuilder;
561  // CMSSW22X
562  //TrajectoryStateClosestToBeamLineBuilder tscblBuilder;
563  TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(*(innertsos.freeState()),bs);
564 
565  if (tscbl.isValid()==false) {
566  //cout<<" false track "<<endl;
567  continue;
568  }
569 
571  math::XYZPoint pos( v.x(), v.y(), v.z() );
572 
573 // cout<<" Position of track close to vertex "<<v.perp()<<" "<<v.z()<<" Primary vertex "<<theHICConst->zvert<<
574 // " charge "<<tscbl.trackStateAtPCA().charge()<<endl;
575 
576  if(v.perp() > 0.1 ) continue;
577  if(fabs(v.z() - theHICConst->zvert ) > 0.4 ) continue;
578 
580  math::XYZVector mom( p.x(), p.y(), p.z() );
581 
582  Track theTrack(im->chiSquared(),
583  im->ndof(),
584  pos, mom, tscbl.trackStateAtPCA().charge(),
585  tscbl.trackStateAtPCA().curvilinearError(),Algo);
586  TransientTrack tmpTk( theTrack, &(*magfield), globTkGeomHandle );
587 
588 
589  firstTrack.push_back( theTrack );
590  firstTransTracks.push_back( tmpTk );
591  }
592 
593  if( firstTrack.size() == 0 ) continue;
594 
595  for(vector<FreeTrajectoryState*>::iterator jt = it+1; jt!= theFoundFts.end(); jt++)
596  {
597  vector<Trajectory> second = (*theMapFtsTraj.find(*jt)).second;
598  // cout<<" Number of trajectories first "<<first.size()<<" second "<<second.size()<<endl;
599 
600  for(vector<Trajectory>::iterator im=second.begin();im!=second.end(); im++) {
601 
602  TrajectoryStateOnSurface innertsos;
603 
604  if (im->direction() == alongMomentum) {
605  innertsos = im->firstMeasurement().updatedState();
606  } else {
607  innertsos = im->lastMeasurement().updatedState();
608  }
609 
610  TSCBLBuilderNoMaterial tscblBuilder;
611  //TrajectoryStateClosestToBeamLineBuilder tscblBuilder;
612  TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(*(innertsos.freeState()),bs);
613 
614  if (tscbl.isValid()==false) {
615  //cout<<" false track "<<endl;
616  continue;
617  }
618 
619  GlobalPoint v = tscbl.trackStateAtPCA().position();
620  math::XYZPoint pos( v.x(), v.y(), v.z() );
621 
622 // cout<<" Position of track close to vertex "<<v.perp()<<" "<<v.z()<<" Primary vertex "<<theHICConst->zvert<<
623 // " charge "<<tscbl.trackStateAtPCA().charge()<<endl;
624 
625  if(v.perp() > 0.1 ) continue;
626  if(fabs(v.z() - theHICConst->zvert ) > 0.4 ) continue;
627 
628  GlobalVector p = tscbl.trackStateAtPCA().momentum();
629  math::XYZVector mom( p.x(), p.y(), p.z() );
630 
631  Track theTrack(im->chiSquared(),
632  im->ndof(),
633  pos, mom, tscbl.trackStateAtPCA().charge(),
634  tscbl.trackStateAtPCA().curvilinearError(),Algo);
635  TransientTrack tmpTk( theTrack, &(*magfield), globTkGeomHandle );
636 
637 
638  secondTrack.push_back( theTrack );
639  secondTransTracks.push_back( tmpTk );
640  }
641  if( secondTrack.size() == 0 ) continue;
642 
643  } // FTS
644  } // FTS
645 
646 
647  if( firstTrack.size() < 1 || secondTrack.size() < 1 ){
648 #ifdef DEBUG
649  cout<<" No enough tracks to get vertex "<<endl;
650 #endif
651  return dimuon;
652  }
653 
654 
655  bool useRefTrax=true;
656  KalmanVertexFitter theFitter(useRefTrax);
657  TransientVertex theRecoVertex;
658 //
659 // Create possible two particles vertices
660 //
661  vector<reco::TransientTrack> theTwoTransTracks;
662 
663  vector<TransientVertex> theVertexContainer;
664 
665  for(vector<reco::TransientTrack>::iterator iplus = firstTransTracks.begin();
666  iplus != firstTransTracks.end(); iplus++)
667  {
668  for(vector<reco::TransientTrack>::iterator iminus = secondTransTracks.begin();
669  iminus != secondTransTracks.end(); iminus++)
670  {
671  // To chech CAIR error before the vertex fitting
673  bool CAIR_ST = false;
674  GlobalTrajectoryParameters sta = (*iminus).impactPointState().globalParameters();
675  GlobalTrajectoryParameters stb = (*iplus).impactPointState().globalParameters();
676  ClosestApproachInRPhi theIniAlgo;
677 
678  CAIR_ST = theIniAlgo.calculate( sta, stb );
679  //cout<<"%%%%% CAIR_ST : "<<CAIR_ST<<" %%%%%"<<endl;
680  if(CAIR_ST == 0) continue;
681 
682  theTwoTransTracks.clear();
683  theTwoTransTracks.push_back(*iplus);
684  theTwoTransTracks.push_back(*iminus);
685  theRecoVertex = theFitter.vertex(theTwoTransTracks);
686  if( !theRecoVertex.isValid() ) {
687  continue;
688  }
689 
690  // cout<<" Vertex is found "<<endl;
691  // cout<<" Chi2 = "<<theRecoVertex.totalChiSquared()<<
692  // " r= "<<theRecoVertex.position().perp()<<
693  // " z= "<<theRecoVertex.position().z()<<endl;
694 
695 // Additional cuts
696  if ( theRecoVertex.totalChiSquared() > 0.0002 ) {
697  // cout<<" Vertex is failed with Chi2 : "<<theRecoVertex.totalChiSquared()<<endl;
698  continue;
699  }
700  if ( theRecoVertex.position().perp() > 0.08 ) {
701  // cout<<" Vertex is failed with r position : "<<theRecoVertex.position().perp()<<endl;
702  continue;
703  }
704  if ( fabs(theRecoVertex.position().z()-theHICConst->zvert) > 0.06 ) {
705  // cout<<" Vertex is failed with z position : "<<theRecoVertex.position().z()<<endl;
706  continue;
707  }
708  double quality = theRecoVertex.normalisedChiSquared();
709  std::vector<reco::TransientTrack> tracks = theRecoVertex.originalTracks();
710 
711  for (std::vector<reco::TransientTrack>::iterator ivb = tracks.begin(); ivb != tracks.end(); ivb++)
712  {
713  quality = quality * (*ivb).chi2() /(*ivb).ndof();
714  }
715  if( quality > 70. ) {
716  // cout<<" Vertex failed quality cut "<<quality<<endl;
717  continue;
718  }
719  theVertexContainer.push_back(theRecoVertex);
720 
721  dimuon = true;
722  break;
723  } // iminus
724  if(dimuon) break;
725  } // iplus
726  return dimuon;
727 
728 }
math::Error< dimension >::type CovarianceMatrix
Definition: BeamSpot.h:32
int i
Definition: DBlmapReader.cc:9
T perp() const
Definition: PV3DBase.h:66
FreeTrajectoryState * freeTrajectoryState(bool withErrors=true) const
std::vector< const NavigationSchool * > theNavigationSchoolV
std::vector< DiMuonTrajectorySeed > SeedContainer
float totalChiSquared() const
Geom::Phi< T > phi() const
Definition: PV3DBase.h:63
T y() const
Definition: PV3DBase.h:57
GlobalPoint globalPosition() const
math::XYZPoint Point
point in the space
Definition: BeamSpot.h:30
TrackCharge charge() const
const CurvilinearTrajectoryError & curvilinearError() const
std::vector< reco::TransientTrack > originalTracks() const
TrackAlgorithm
track algorithm
Definition: TrackBase.h:82
U second(std::pair< T, U > const &p)
float normalisedChiSquared() const
FreeTrajectoryState * freeState(bool withErrors=true) const
GlobalPoint position() const
T z() const
Definition: PV3DBase.h:58
int j
Definition: DBlmapReader.cc:9
bool first
Definition: L1TdeRCT.cc:79
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:355
GlobalVector momentum() const
GlobalPoint position() const
int iseed
Definition: AMPTWrapper.h:124
virtual bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb)
tuple tracks
Definition: testEve_cfg.py:39
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:13
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
char state
Definition: procUtils.cc:75
double ptmin
Definition: HydjetWrapper.h:86
GlobalVector globalMomentum() const
tuple cout
Definition: gather_cfg.py:41
T x() const
Definition: PV3DBase.h:56
bool isValid() const
mathSSE::Vec4< T > v
Definition: fakeMenu.h:4

Member Data Documentation

std::string cms::HITrackVertexMaker::builderName
private

Definition at line 86 of file HITrackVertexMaker.h.

int cms::HITrackVertexMaker::eventCount
private

Definition at line 80 of file HITrackVertexMaker.h.

edm::InputTag cms::HITrackVertexMaker::L2candTag_
private

Definition at line 81 of file HITrackVertexMaker.h.

edm::InputTag cms::HITrackVertexMaker::primaryVertexTag
private

Definition at line 83 of file HITrackVertexMaker.h.

edm::ParameterSet cms::HITrackVertexMaker::pset_
private

Definition at line 85 of file HITrackVertexMaker.h.

edm::InputTag cms::HITrackVertexMaker::rphirecHitsTag
private

Definition at line 82 of file HITrackVertexMaker.h.

std::vector<const NavigationSchool*> cms::HITrackVertexMaker::theNavigationSchoolV
private

Definition at line 87 of file HITrackVertexMaker.h.