CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ValidationMisalignedTracker.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: ValidationMisalignedTracker
4 // Class: ValidationMisalignedTracker
5 //
13 //
14 // Original Author: Nicola De Filippis
15 // Created: Thu Dec 14 13:13:32 CET 2006
16 // $Id: ValidationMisalignedTracker.cc,v 1.4 2010/03/29 13:18:44 mussgill Exp $
17 //
18 //
19 
20 
22 
23 
24 // user include files
25 
29 
36 
37 //
38 // constructors and destructor
39 //
41 {
42 
43  //now do what ever initialization is needed
45  recenezmu=0., enezmu=0., pLzmu=0., recpLzmu=0.,yzmu=0.,recyzmu=0.,mxptmu=0.,recmxptmu=0., minptmu=0.,recminptmu=0.;
46  // mzele=0.,recmzele=0.
47 
48  flag=0,flagrec=0,count=0,countrec=0;
49  nAssoc=0;
50 
51  for (int i=0;i<2;i++){
52  countpart[i]=0;
53  countpartrec[i]=0;
54  for (int j=0;j<2;j++){
55  ene[i][j]=0.;
56  p[i][j]=0.;
57  px[i][j]=0.;
58  py[i][j]=0.;
59  pz[i][j]=0.;
60  ptmu[i][j]=0.;
61  recene[i][j]=0.;
62  recp[i][j]=0.;
63  recpx[i][j]=0.;
64  recpy[i][j]=0.;
65  recpz[i][j]=0.;
66  recptmu[i][j]=0.;
67  }
68  }
69 
70 
71  eventCount_ = 0;
72 
73  selection_eff = iConfig.getUntrackedParameter<bool>("selection_eff","false");
74  selection_fake = iConfig.getUntrackedParameter<bool>("selection_fake","true");
75  ZmassSelection_ = iConfig.getUntrackedParameter<bool>("ZmassSelection","false");
76  simobject = iConfig.getUntrackedParameter<std::string>("simobject","g4SimHits");
77  trackassociator = iConfig.getUntrackedParameter<std::string>("TrackAssociator","ByHits");
78  associators = iConfig.getParameter< std::vector<std::string> >("associators");
79  label = iConfig.getParameter< std::vector<edm::InputTag> >("label");
80  label_tp_effic = iConfig.getParameter< edm::InputTag >("label_tp_effic");
81  label_tp_fake = iConfig.getParameter< edm::InputTag >("label_tp_fake");
82 
83  rootfile_ = iConfig.getUntrackedParameter<std::string>("rootfile","myroot.root");
84  file_ = new TFile(rootfile_.c_str(),"RECREATE");
85 
86  // initialize the tree
87  tree_eff = new TTree("EffTracks","Efficiency Tracks Tree");
88 
89  tree_eff->Branch("Run",&irun,"irun/i");
90  tree_eff->Branch("Event",&ievt,"ievt/i");
91 
92  // SimTrack
93  tree_eff->Branch("TrackID",&trackType,"trackType/i");
94  tree_eff->Branch("pt",&pt,"pt/F");
95  tree_eff->Branch("eta",&eta,"eta/F");
96  tree_eff->Branch("CotTheta",&cottheta,"cottheta/F");
97  tree_eff->Branch("phi",&phi,"phi/F");
98  tree_eff->Branch("d0",&d0,"d0/F");
99  tree_eff->Branch("z0",&z0,"z0/F");
100  tree_eff->Branch("nhit",&nhit,"nhit/i");
101 
102  // RecTrack
103  tree_eff->Branch("recpt",&recpt,"recpt/F");
104  tree_eff->Branch("receta",&receta,"receta/F");
105  tree_eff->Branch("CotRecTheta",&reccottheta,"reccottheta/F");
106  tree_eff->Branch("recphi",&recphi,"recphi/F");
107  tree_eff->Branch("recd0",& recd0,"recd0/F");
108  tree_eff->Branch("recz0",& recz0,"recz0/F");
109  tree_eff->Branch("nAssoc",&nAssoc,"nAssoc/i");
110  tree_eff->Branch("recnhit",&recnhit,"recnhit/i");
111  tree_eff->Branch("CHISQ",&recchiq,"recchiq/F");
112 
113  tree_eff->Branch("reseta",&reseta,"reseta/F");
114  tree_eff->Branch("respt",&respt,"respt/F");
115  tree_eff->Branch("resd0",&resd0,"resd0/F");
116  tree_eff->Branch("resz0",&resz0,"resz0/F");
117  tree_eff->Branch("resphi",&resphi,"resphi/F");
118  tree_eff->Branch("rescottheta",&rescottheta,"rescottheta/F");
119  tree_eff->Branch("eff",&eff,"eff/F");
120 
121  // Invariant masses, pt of Z
122  tree_eff->Branch("mzmu",&mzmu,"mzmu/F");
123  tree_eff->Branch("ptzmu",&ptzmu,"ptzmu/F");
124  tree_eff->Branch("pLzmu",&pLzmu,"pLzmu/F");
125  tree_eff->Branch("enezmu",&enezmu,"enezmu/F");
126  tree_eff->Branch("etazmu",&etazmu,"etazmu/F");
127  tree_eff->Branch("thetazmu",&thetazmu,"thetazmu/F");
128  tree_eff->Branch("phizmu",&phizmu,"phizmu/F");
129  tree_eff->Branch("yzmu",&yzmu,"yzmu/F");
130  tree_eff->Branch("mxptmu",&mxptmu,"mxptmu/F");
131  tree_eff->Branch("minptmu",&minptmu,"minptmu/F");
132 
133  tree_eff->Branch("recmzmu",&recmzmu,"recmzmu/F");
134  tree_eff->Branch("recptzmu",&recptzmu,"recptzmu/F");
135  tree_eff->Branch("recpLzmu",&recpLzmu,"recpLzmu/F");
136  tree_eff->Branch("recenezmu",&recenezmu,"recenezmu/F");
137  tree_eff->Branch("recetazmu",&recetazmu,"recetazmu/F");
138  tree_eff->Branch("recthetazmu",&recthetazmu,"recthetazmu/F");
139  tree_eff->Branch("recphizmu",&recphizmu,"recphizmu/F");
140  tree_eff->Branch("recyzmu",&recyzmu,"recyzmu/F");
141  tree_eff->Branch("recmxptmu",&recmxptmu,"recmxptmu/F");
142  tree_eff->Branch("recminptmu",&recminptmu,"recminptmu/F");
143 
144 
145  //tree->Branch("mzele",&ntmzele,"ntmzele/F");
146  //tree->Branch("recmzele",&ntmzeleRec,"ntmzeleRec/F");
147  tree_eff->Branch("chi2Associator",&recchiq,"recchiq/F");
148 
149  // Fake
150 
151  tree_fake = new TTree("FakeTracks","Fake Rate Tracks Tree");
152 
153  tree_fake->Branch("Run",&irun,"irun/i");
154  tree_fake->Branch("Event",&ievt,"ievt/i");
155 
156  // SimTrack
157  tree_fake->Branch("fakeTrackID",&faketrackType,"faketrackType/i");
158  tree_fake->Branch("fakept",&fakept,"fakept/F");
159  tree_fake->Branch("fakeeta",&fakeeta,"fakeeta/F");
160  tree_fake->Branch("fakeCotTheta",&fakecottheta,"fakecottheta/F");
161  tree_fake->Branch("fakephi",&fakephi,"fakephi/F");
162  tree_fake->Branch("faked0",&faked0,"faked0/F");
163  tree_fake->Branch("fakez0",&fakez0,"fakez0/F");
164  tree_fake->Branch("fakenhit",&fakenhit,"fakenhit/i");
165 
166  // RecTrack
167  tree_fake->Branch("fakerecpt",&fakerecpt,"fakerecpt/F");
168  tree_fake->Branch("fakereceta",&fakereceta,"fakereceta/F");
169  tree_fake->Branch("fakeCotRecTheta",&fakereccottheta,"fakereccottheta/F");
170  tree_fake->Branch("fakerecphi",&fakerecphi,"fakerecphi/F");
171  tree_fake->Branch("fakerecd0",& fakerecd0,"fakerecd0/F");
172  tree_fake->Branch("fakerecz0",& fakerecz0,"fakerecz0/F");
173  tree_fake->Branch("fakenAssoc",&fakenAssoc,"fakenAssoc/i");
174  tree_fake->Branch("fakerecnhit",&fakerecnhit,"fakerecnhit/i");
175  tree_fake->Branch("fakeCHISQ",&fakerecchiq,"fakerecchiq/F");
176 
177  tree_fake->Branch("fakereseta",&fakereseta,"fakereseta/F");
178  tree_fake->Branch("fakerespt",&fakerespt,"fakerespt/F");
179  tree_fake->Branch("fakeresd0",&fakeresd0,"fakeresd0/F");
180  tree_fake->Branch("fakeresz0",&fakeresz0,"fakeresz0/F");
181  tree_fake->Branch("fakeresphi",&fakeresphi,"fakeresphi/F");
182  tree_fake->Branch("fakerescottheta",&fakerescottheta,"fakerescottheta/F");
183  tree_fake->Branch("fake",&fake,"fake/F");
184 
185  // Invariant masses, pt of Z
186  tree_fake->Branch("fakemzmu",&fakemzmu,"fakemzmu/F");
187  tree_fake->Branch("fakeptzmu",&fakeptzmu,"fakeptzmu/F");
188  tree_fake->Branch("fakepLzmu",&fakepLzmu,"fakepLzmu/F");
189  tree_fake->Branch("fakeenezmu",&fakeenezmu,"fakeenezmu/F");
190  tree_fake->Branch("fakeetazmu",&fakeetazmu,"fakeetazmu/F");
191  tree_fake->Branch("fakethetazmu",&fakethetazmu,"fakethetazmu/F");
192  tree_fake->Branch("fakephizmu",&fakephizmu,"fakephizmu/F");
193  tree_fake->Branch("fakeyzmu",&fakeyzmu,"fakeyzmu/F");
194  tree_fake->Branch("fakemxptmu",&fakemxptmu,"fakemxptmu/F");
195  tree_fake->Branch("fakeminptmu",&fakeminptmu,"fakeminptmu/F");
196 
197  tree_fake->Branch("fakerecmzmu",&fakerecmzmu,"fakerecmzmu/F");
198  tree_fake->Branch("fakerecptzmu",&fakerecptzmu,"fakerecptzmu/F");
199  tree_fake->Branch("fakerecpLzmu",&fakerecpLzmu,"fakerecpLzmu/F");
200  tree_fake->Branch("fakerecenezmu",&fakerecenezmu,"fakerecenezmu/F");
201  tree_fake->Branch("fakerecetazmu",&fakerecetazmu,"fakerecetazmu/F");
202  tree_fake->Branch("fakerecthetazmu",&fakerecthetazmu,"fakerecthetazmu/F");
203  tree_fake->Branch("fakerecphizmu",&fakerecphizmu,"fakerecphizmu/F");
204  tree_fake->Branch("fakerecyzmu",&fakerecyzmu,"fakerecyzmu/F");
205  tree_fake->Branch("fakerecmxptmu",&fakerecmxptmu,"fakerecmxptmu/F");
206  tree_fake->Branch("fakerecminptmu",&fakerecminptmu,"fakerecminptmu/F");
207 
208  tree_fake->Branch("fakechi2Associator",&fakerecchiq,"fakerecchiq/F");
209 
210 }
211 
212 
214 {
215 
216 
217  std::cout << "ValidationMisalignedTracker::endJob Processed " << eventCount_
218  << " events" << std::endl;
219 
220  // store the tree in the output file
221  file_->Write();
222 
223 
224  // Closing the file deletes the tree.
225  file_->Close();
226  tree_eff=0;
227  tree_fake=0;
228 }
229 
230 
231 //
232 // member functions
233 //
234 
235 // ------------ method called to for each event ------------
236 void
238 {
239  if (watchTrackAssociatorRecord_.check(iSetup)) {
240  associatore.clear();
242  for (unsigned int w=0;w<associators.size();w++) {
243  iSetup.get<TrackAssociatorRecord>().get(associators[w], theAssociator);
244  associatore.push_back( theAssociator.product() );
245  }
246  }
247 
248  edm::LogInfo("Tracker Misalignment Validation") << "\n Starting!";
249 
250  // Monte Carlo Z selection
251  skip=false;
252  std::vector<int> indmu;
253 
254  if ( selection_eff && ZmassSelection_){
256  iEvent.getByLabel("source", evt);
257  bool accepted = false;
258  bool skip=false;
259  bool foundmuons=false;
260  HepMC::GenEvent * myGenEvent = new HepMC::GenEvent(*(evt->GetEvent()));
261 
262  for ( HepMC::GenEvent::particle_iterator p = myGenEvent->particles_begin(); p != myGenEvent->particles_end(); ++p ) {
263  if ( !accepted && ( (*p)->pdg_id() == 23 ) && (*p)->status() == 3 ) {
264  accepted=true;
265  for( HepMC::GenVertex::particle_iterator aDaughter=(*p)->end_vertex()->particles_begin(HepMC::descendants); aDaughter !=(*p)->end_vertex()->particles_end(HepMC::descendants);aDaughter++){
266  if ( abs((*aDaughter)->pdg_id())==13) {
267  foundmuons=true;
268  if ((*aDaughter)->status()!=1 ) {
269  for( HepMC::GenVertex::particle_iterator byaDaughter=(*aDaughter)->end_vertex()->particles_begin(HepMC::descendants); byaDaughter !=(*aDaughter)->end_vertex()->particles_end(HepMC::descendants);byaDaughter++){
270  if ((*byaDaughter)->status()==1 && abs((*byaDaughter)->pdg_id())==13) {
271  indmu.push_back((*byaDaughter)->barcode());
272  std::cout << "Stable muon from Z with charge " << (*byaDaughter)->pdg_id() << " and index "<< (*byaDaughter)->barcode() << std::endl;
273  }
274  }
275  }
276  else {
277  indmu.push_back((*aDaughter)->barcode());
278  std::cout << "Stable muon from Z with charge " << (*aDaughter)->pdg_id() << " and index "<< (*aDaughter)->barcode() << std::endl;
279  }
280  }
281  }
282  if (!foundmuons){
283  std::cout << "No muons from Z ...skip event" << std::endl;
284  skip=true;
285  }
286  }
287  }
288  if ( !accepted) {
289  std::cout << "No Z particles in the event ...skip event" << std::endl;
290  skip=true;
291  }
292  }
293  else {
294  skip=false;
295  }
296 
297  //
298  // Retrieve tracker geometry from event setup
299  //
300  edm::ESHandle<TrackerGeometry> trackerGeometry;
301  iSetup.get<TrackerDigiGeometryRecord>().get( trackerGeometry );
302  GeomDet* testGeomDet = trackerGeometry->detsTOB().front();
303  std::cout << testGeomDet->position() << std::endl;
304 
305 
306  //Dump Run and Event
307  irun=iEvent.id().run();
308  ievt=iEvent.id().event();
309 
310  // Reset tree variables
311  int countpart[2]={0,0},countpartrec[2]={0,0},flag=0,flagrec=0,count=0,countrec=0;
312  //int countsim=0;
313  float ene[2][2],p[2][2],px[2][2],py[2][2],pz[2][2],ptmu[2][2];
314  float recene[2][2],recp[2][2],recpx[2][2],recpy[2][2],recpz[2][2],recptmu[2][2];
315 
316  for (int i=0;i<2;i++){
317  for (int j=0;j<2;j++){
318  ene[i][j]=0.;
319  p[i][j]=0.;
320  px[i][j]=0.;
321  py[i][j]=0.;
322  pz[i][j]=0.;
323  ptmu[i][j]=0.;
324  recene[i][j]=0.;
325  recp[i][j]=0.;
326  recpx[i][j]=0.;
327  recpy[i][j]=0.;
328  recpz[i][j]=0.;
329  recptmu[i][j]=0.;
330  }
331  }
332 
333 
334  edm::Handle<TrackingParticleCollection> TPCollectionHeff ;
335  iEvent.getByLabel(label_tp_effic,TPCollectionHeff);
336  const TrackingParticleCollection tPCeff = *(TPCollectionHeff.product());
337 
338  edm::Handle<TrackingParticleCollection> TPCollectionHfake ;
339  iEvent.getByLabel(label_tp_fake,TPCollectionHfake);
340  const TrackingParticleCollection tPCfake = *(TPCollectionHfake.product());
341 
342 
343  int w=0;
344  for (unsigned int ww=0;ww<associators.size();ww++){
345  //
346  //get collections from the event
347  //
348 
349  edm::InputTag algo = label[0];
350 
352  iEvent.getByLabel(algo, trackCollection);
353  const edm::View<reco::Track> tC = *(trackCollection.product());
354 
355 
356  //associate tracks
357  LogTrace("TrackValidator") << "Calling associateRecoToSim method" << "\n";
358  reco::RecoToSimCollection recSimColl=associatore[ww]->associateRecoToSim(trackCollection,
359  TPCollectionHfake,
360  &iEvent);
361 
362  LogTrace("TrackValidator") << "Calling associateSimToReco method" << "\n";
363  reco::SimToRecoCollection simRecColl=associatore[ww]->associateSimToReco(trackCollection,
364  TPCollectionHeff,
365  &iEvent);
366 
367 
368 
369  //
370  //compute number of tracks per eta interval
371  //
372 
373  if (selection_eff && !skip ) {
374  std::cout << "Computing Efficiency" << std::endl;
375 
376  edm::LogVerbatim("TrackValidator") << "\n# of TrackingParticles (before cuts): " << tPCeff.size() << "\n";
377  int ats = 0;
378  int st=0;
379  for (TrackingParticleCollection::size_type i=0; i<tPCeff.size(); i++){
380 
381  // Initialize variables
382  eta = 0.,theta=0.,phi=0.,pt=0.,cottheta=0.,costheta=0.;
383  d0=0.,z0=0.;
384  nhit=0;
385  receta = 0.,rectheta = 0.,recphi = 0.,recpt = 0.,reccottheta=0.,recd0=0.,recz0=0.;
386  respt = 0.,resd0 = 0.,resz0 = 0.,reseta = 0.,resphi=0.,rescottheta=0.;
387  recchiq = 0.;
388  recnhit = 0;
389  trackType = 0;
390  eff=0;
391 
392  // typedef edm::Ref<TrackingParticleCollection> TrackingParticleRef;
393  TrackingParticleRef tp(TPCollectionHeff, i);
394  if (tp->charge()==0) continue;
395  st++;
396  //pt=sqrt(tp->momentum().perp2());
397  //eta=tp->momentum().eta();
398  //vpos=tp->vertex().perp2()));
399 
400  const SimTrack * simulatedTrack = &(*tp->g4Track_begin());
401 
403  iSetup.get<IdealMagneticFieldRecord>().get(theMF);
405  ftsAtProduction(GlobalPoint(tp->vertex().x(),tp->vertex().y(),tp->vertex().z()),
406  GlobalVector(simulatedTrack->momentum().x(),simulatedTrack->momentum().y(),simulatedTrack->momentum().z()),
407  TrackCharge(tp->charge()),
408  theMF.product());
409  TSCPBuilderNoMaterial tscpBuilder;
410  TrajectoryStateClosestToPoint tsAtClosestApproach
411  = tscpBuilder(ftsAtProduction,GlobalPoint(0,0,0));//as in TrackProducerAlgorithm
412  GlobalPoint v = tsAtClosestApproach.theState().position();
413  GlobalVector p = tsAtClosestApproach.theState().momentum();
414 
415  // double qoverpSim = tsAtClosestApproach.charge()/p.mag();
416  // double lambdaSim = M_PI/2-p.theta();
417  // double phiSim = p.phi();
418  double dxySim = (-v.x()*sin(p.phi())+v.y()*cos(p.phi()));
419  double dszSim = v.z()*p.perp()/p.mag() - (v.x()*p.x()+v.y()*p.y())/p.perp() * p.z()/p.mag();
420  d0 = float(-dxySim);
421  z0 = float(dszSim*p.mag()/p.perp());
422 
423 
424  if (abs(simulatedTrack->type())==13 && simulatedTrack->genpartIndex() != -1 ) {
425  std::cout << " TRACCIA SIM DI MUONI " << std::endl;
426  std::cout << "Gen part " << simulatedTrack->genpartIndex()<< std::endl;
427  trackType=simulatedTrack->type();
428  theta=simulatedTrack->momentum().theta();
429  costheta=cos(theta);
430  cottheta=1./tan(theta);
431 
432  eta=simulatedTrack->momentum().eta();
433  phi=simulatedTrack->momentum().phi();
434  pt=simulatedTrack->momentum().pt();
435  nhit=tp->matchedHit();
436 
437 
438  std::cout << "3) Before assoc: SimTrack of type = " << simulatedTrack->type()
439  << " ,at eta = " << eta
440  << " ,with pt at vertex = " << simulatedTrack->momentum().pt() << " GeV/c"
441  << " ,d0 =" << d0
442  << " ,z0 =" << z0
443  << " ,nhit=" << nhit
444  << std::endl;
445 
446  if ( ZmassSelection_ ){
447  if (abs(trackType)==13 && (simulatedTrack->genpartIndex()==indmu[0] || simulatedTrack->genpartIndex()==indmu[1] )) {
448  std::cout << " TRACK sim of muons from Z " << std::endl;
449  flag=0;
450  count=countpart[0];
451  countpart[0]++;
452  }
453  else if (abs(trackType)==11) {
454  //std::cout << " TRACCIA SIM DI ELETTRONI " << std::endl;
455  flag=1;
456  count=countpart[1];
457  countpart[1]++;
458  }
459 
460 
461  px[flag][count]=simulatedTrack->momentum().x();
462  py[flag][count]=simulatedTrack->momentum().y();
463  pz[flag][count]=simulatedTrack->momentum().z();
464  ptmu[flag][count]=simulatedTrack->momentum().pt();
465  ene[flag][count]=simulatedTrack->momentum().e();
466  }
467 
468 
469  std::vector<std::pair<edm::RefToBase<reco::Track>, double> > rt;
470  if(simRecColl.find(tp) != simRecColl.end()){
471 
472  rt = simRecColl[tp];
473  if (rt.size()!=0) {
474 
475  edm::RefToBase<reco::Track> t = rt.begin()->first;
476  ats++;
477 
478  bool flagptused=false;
479  for (unsigned int j=0;j<ptused.size();j++){
480  if (fabs(t->pt()-ptused[j])<0.001) {
481  flagptused=true;
482  }
483  }
484 
485  edm::LogVerbatim("TrackValidator") << "TrackingParticle #" << st << " with pt=" << t->pt()
486  << " associated with quality:" << rt.begin()->second <<"\n";
487  std::cout << "Reconstructed Track:" << t->pt()<< std::endl;
488  std::cout << "\tpT: " << t->pt()<< std::endl;
489  std::cout << "\timpact parameter:d0: " << t->d0()<< std::endl;
490  std::cout << "\timpact parameter:z0: " << t->dz()<< std::endl;
491  std::cout << "\tAzimuthal angle of point of closest approach:" << t->phi()<< std::endl;
492  std::cout << "\tcharge: " << t->charge()<< std::endl;
493  std::cout << "\teta: " << t->eta()<< std::endl;
494  std::cout << "\tnormalizedChi2: " << t->normalizedChi2()<< std::endl;
495 
497  recchiq=t->normalizedChi2();
498  rectheta=t->theta();
500  //receta=-log(tan(rectheta/2.));
501  receta=t->momentum().eta();
502  // reccostheta=cos(matchedrectrack->momentum().theta());
503  recphi=t->phi();
504  recpt=t->pt();
505  ptused.push_back(recpt);
506  recd0=t->d0();
507  recz0=t->dz();
508 
509  std::cout << "5) After call to associator: the best match has "
510  << recnhit << " hits, Chi2 = "
511  << recchiq << ", pt at vertex = "
512  << recpt << " GeV/c, "
513  << ", recd0 = " << recd0
514  << ", recz0= " << recz0
515  << std::endl;
516 
517 
518  respt=recpt - pt;
519  resd0=recd0-d0;
520  resz0=recz0-z0;
521  reseta=receta-eta;
522  resphi=recphi-phi;
524  eff=1;
525 
526  std::cout << "6) Transverse momentum residual=" << respt
527  << " ,d0 residual=" << resd0
528  << " ,z0 residual=" << resz0
529  << " with eff=" << eff << std::endl;
530 
531  if ( ZmassSelection_ ){
532 
533  if (abs(trackType)==13) {
534  std::cout << " TRACCIA RECO DI MUONI " << std::endl;
535  flagrec=0;
537  countpartrec[0]++;
538  }
539  else if (abs(trackType)==11) {
540  std::cout << " TRACCIA RECO DI ELETTRONI " << std::endl;
541  flagrec=1;
543  countpartrec[1]++;
544  }
545 
546  recp[flagrec][countrec]=sqrt(t->momentum().mag2());
547  recpx[flagrec][countrec]=t->momentum().x();
548  recpy[flagrec][countrec]=t->momentum().y();
549  recpz[flagrec][countrec]=t->momentum().z();
550  recptmu[flagrec][countrec]=sqrt( (t->momentum().x()*t->momentum().x()) + (t->momentum().y()*t->momentum().y()) );
551  if (abs(trackType)==13) recene[flagrec][countrec]=sqrt(recp[flagrec][countrec]*recp[flagrec][countrec]+0.105*0.105);
552  if (abs(trackType)==11) recene[flagrec][countrec]=sqrt(recp[flagrec][countrec]*recp[flagrec][countrec]+0.0005*0.0005);
553  }
554 
555  std::cout << "7) Transverse momentum reconstructed =" << recpt
556  << " at eta= " << receta
557  << " and phi= " << recphi
558  << std::endl;
559 
560  }
561  }
562  else{
563  edm::LogVerbatim("TrackValidator") << "TrackingParticle #" << st
564  << " with pt=" << sqrt(tp->momentum().perp2())
565  << " NOT associated to any reco::Track" << "\n";
566  receta =-100.;
567  recphi =-100.;
568  recpt =-100.;
569  recd0 =-100.;
570  recz0 =-100;
571  respt =-100.;
572  resd0 =-100.;
573  resz0 =-100.;
574  resphi =-100.;
575  reseta =-100.;
576  rescottheta=-100.;
577  recnhit=100;
578  recchiq=-100;
579  eff=0;
580  flagrec=100;
581  }
582 
583  std::cout << "Eff=" << eff << std::endl;
584 
585  // simulated muons
586 
587  std::cout <<"Flag is" << flag << std::endl;
588  std::cout <<"RecFlag is" << flagrec << std::endl;
589 
590  if (countpart[0]==2 && flag==0) {
591  mzmu=sqrt(
592  (ene[0][0]+ene[0][1])*(ene[0][0]+ene[0][1])-
593  (px[0][0]+px[0][1])*(px[0][0]+px[0][1])-
594  (py[0][0]+py[0][1])*(py[0][0]+py[0][1])-
595  (pz[0][0]+pz[0][1])*(pz[0][0]+pz[0][1])
596  );
597  std::cout << "Mzmu " << mzmu << std::endl;
598  ptzmu=sqrt(
599  (px[0][0]+px[0][1])*(px[0][0]+px[0][1])+
600  (py[0][0]+py[0][1])*(py[0][0]+py[0][1])
601  );
602 
603  pLzmu=pz[0][0]+pz[0][1];
604  enezmu=ene[0][0]+ene[0][1];
605  phizmu=atan2((py[0][0]+py[0][1]),(px[0][0]+px[0][1]));
606  thetazmu=atan2(ptzmu,(pz[0][0]+pz[0][1]));
607  etazmu=-log(tan(thetazmu*3.14/360.));
608  yzmu=0.5*log((enezmu+pLzmu)/(enezmu-pLzmu));
609  mxptmu=std::max( ptmu[0][0], ptmu[0][1]);
610  minptmu=std::min( ptmu[0][0], ptmu[0][1]);
611  }
612  else {
613  mzmu=-100.;
614  ptzmu=-100.;
615  pLzmu=-100.;
616  enezmu=-100.;
617  etazmu=-100.;
618  phizmu=-100.;
619  thetazmu=-100.;
620  yzmu=-100.;
621  mxptmu=-100.;
622  minptmu=-100.;
623  }
624 
625  // reconstructed muons
626  if (countpartrec[0]==2 && flagrec==0 ){
627  recmzmu=sqrt(
628  (recene[0][0]+recene[0][1])*(recene[0][0]+recene[0][1])-
629  (recpx[0][0]+recpx[0][1])*(recpx[0][0]+recpx[0][1])-
630  (recpy[0][0]+recpy[0][1])*(recpy[0][0]+recpy[0][1])-
631  (recpz[0][0]+recpz[0][1])*(recpz[0][0]+recpz[0][1])
632  );
633  std::cout << "RecMzmu " << recmzmu << std::endl;
634  recptzmu=sqrt(
635  (recpx[0][0]+recpx[0][1])*(recpx[0][0]+recpx[0][1])+
636  (recpy[0][0]+recpy[0][1])*(recpy[0][0]+recpy[0][1])
637  );
638 
639  recpLzmu=recpz[0][0]+recpz[0][1];
640  recenezmu=recene[0][0]+recene[0][1];
641  recphizmu=atan2((recpy[0][0]+recpy[0][1]),(recpx[0][0]+recpx[0][1]));
642  recthetazmu=atan2(recptzmu,(recpz[0][0]+recpz[0][1]));
643  recetazmu=-log(tan(recthetazmu*3.14/360.));
645  recmxptmu=std::max(recptmu[0][0], recptmu[0][1]);
646  recminptmu=std::min( recptmu[0][0], recptmu[0][1]);
647  }
648  else {
649  recmzmu=-100.;
650  recptzmu=-100.;
651  recpLzmu=-100.;
652  recenezmu=-100.;
653  recetazmu=-100.;
654  recphizmu=-100.;
655  recthetazmu=-100.;
656  recyzmu=-100.;
657  recmxptmu=-100;
658  recminptmu=-100.;
659  }
660 
661  tree_eff->Fill();
662 
663  } // end of loop on muons
664  } // end of loop for tracking particle
665  } // end of loop for efficiency
666 
667  //
668  // Fake Rate
669  //
670  if (selection_fake ) {
671  std::cout << "Computing Fake Rate" << std::endl;
672 
674  faked0=0.,fakez0=0.;
675  fakenhit=0;
678  fakerecchiq = 0.;
679  fakerecnhit = 0;
680  faketrackType = 0;
681  fake=0;
682 
683 
684  // int at=0;
685  int rT=0;
686  for(reco::TrackCollection::size_type i=0; i<tC.size(); ++i){
687  edm::RefToBase<reco::Track> track(trackCollection, i);
688  rT++;
689 
691  faked0=0.,fakez0=0.;
692  fakenhit=0;
695  fakerecchiq = 0.;
696  fakerecnhit = 0;
697  faketrackType = 0;
698  fake=0;
699 
701  fakerecchiq=track->normalizedChi2();
702  fakerectheta=track->theta();
704  //fakereceta=-log(tan(rectheta/2.));
705  fakereceta=track->momentum().eta();
706  // fakereccostheta=cos(track->momentum().theta());
707  fakerecphi=track->phi();
708  fakerecpt=track->pt();
709  fakerecd0=track->d0();
710  fakerecz0=track->dz();
711 
712  std::cout << "1) Before assoc: TkRecTrack at eta = " << fakereceta << std::endl;
713  std::cout << "Track number "<< i << std::endl ;
714  std::cout << "\tPT: " << track->pt()<< std::endl;
715  std::cout << "\timpact parameter:d0: " << track->d0()<< std::endl;
716  std::cout << "\timpact parameter:z0: " << track->dz()<< std::endl;
717  std::cout << "\tAzimuthal angle of point of closest approach:" << track->phi()<< std::endl;
718  std::cout << "\tcharge: " << track->charge()<< std::endl;
719  std::cout << "\teta: " << track->eta()<< std::endl;
720  std::cout << "\tnormalizedChi2: " << track->normalizedChi2()<< std::endl;
721 
722 
723  std::vector<std::pair<TrackingParticleRef, double> > tp;
724 
725  //Compute fake rate vs eta
726  if(recSimColl.find(track) != recSimColl.end()){
727  tp = recSimColl[track];
728  if (tp.size()!=0) {
729  edm::LogVerbatim("TrackValidator") << "reco::Track #" << rT << " with pt=" << track->pt()
730  << " associated with quality:" << tp.begin()->second <<"\n";
731 
732 
733  TrackingParticleRef tpr = tp.begin()->first;
734  const SimTrack * fakeassocTrack = &(*tpr->g4Track_begin());
735 
737  iSetup.get<IdealMagneticFieldRecord>().get(theMF);
739  ftsAtProduction(GlobalPoint(tpr->vertex().x(),tpr->vertex().y(),tpr->vertex().z()),
740  GlobalVector(fakeassocTrack->momentum().x(),fakeassocTrack->momentum().y(),fakeassocTrack->momentum().z()),
741  TrackCharge(tpr->charge()),
742  theMF.product());
743  TSCPBuilderNoMaterial tscpBuilder;
744  TrajectoryStateClosestToPoint tsAtClosestApproach
745  = tscpBuilder(ftsAtProduction,GlobalPoint(0,0,0));//as in TrackProducerAlgorithm
746  GlobalPoint v = tsAtClosestApproach.theState().position();
747  GlobalVector p = tsAtClosestApproach.theState().momentum();
748 
749  // double qoverpSim = tsAtClosestApproach.charge()/p.mag();
750  // double lambdaSim = M_PI/2-p.theta();
751  // double phiSim = p.phi();
752  double dxySim = (-v.x()*sin(p.phi())+v.y()*cos(p.phi()));
753  double dszSim = v.z()*p.perp()/p.mag() - (v.x()*p.x()+v.y()*p.y())/p.perp() * p.z()/p.mag();
754  faked0 = float(-dxySim);
755  fakez0 = float(dszSim*p.mag()/p.perp());
756 
757 
758  faketrackType=fakeassocTrack->type();
759  faketheta=fakeassocTrack->momentum().theta();
761  fakeeta=fakeassocTrack->momentum().eta();
762  fakephi=fakeassocTrack->momentum().phi();
763  fakept=fakeassocTrack->momentum().pt();
764  fakenhit=tpr->matchedHit();
765 
766  std::cout << "4) After call to associator: the best SimTrack match is of type" << fakeassocTrack->type()
767  << " ,at eta = " << fakeeta
768  << " and phi = " << fakephi
769  << " ,with pt at vertex = " << fakept << " GeV/c"
770  << " ,d0 global = " << faked0
771  << " ,z0 = " << fakez0
772  << std::endl;
773  fake=1;
774 
781 
782  }
783  }
784  else{
785  edm::LogVerbatim("TrackValidator") << "reco::Track #" << rT << " with pt=" << track->pt()
786  << " NOT associated to any TrackingParticle" << "\n";
787 
788  fakeeta =-100.;
789  faketheta=-100;
790  fakephi =-100.;
791  fakept =-100.;
792  faked0 =-100.;
793  fakez0 =-100;
794  fakerespt =-100.;
795  fakeresd0 =-100.;
796  fakeresz0 =-100.;
797  fakeresphi =-100.;
798  fakereseta =-100.;
799  fakerescottheta=-100.;
800  fakenhit=100;
801  fake=0;
802  }
803 
804  tree_fake->Fill();
805  }
806 
807  } // End of loop on fakerate
808 
809  w++;
810 
811  } // End of loop on associators
812 }
813 
814 // ------------ method called once each job just after ending the event loop ------------
816 
817  std::cout << "\t Misalignment analysis completed \n" << std::endl;
818 
819 }
820 
RunNumber_t run() const
Definition: EventID.h:42
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:44
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
long int flag
Definition: mlp_lapack.h:47
T perp() const
Definition: PV3DBase.h:66
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:149
double d0() const
dxy parameter in perigee convention (d0 = - dxy)
Definition: TrackBase.h:122
const_iterator end() const
last iterator over the map (read only)
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
Definition: TrackBase.h:110
const FreeTrajectoryState & theState() const
double theta() const
polar angle
Definition: TrackBase.h:116
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
virtual void analyze(const edm::Event &, const edm::EventSetup &)
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
const_iterator find(const key_type &k) const
find element with specified reference key
Geom::Phi< T > phi() const
Definition: PV3DBase.h:63
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:57
#define abs(x)
Definition: mlp_lapack.h:159
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:138
#define min(a, b)
Definition: mlp_lapack.h:161
uint16_t size_type
ValidationMisalignedTracker(const edm::ParameterSet &)
int TrackCharge
Definition: TrackCharge.h:4
int iEvent
Definition: GenABIO.cc:243
T mag() const
Definition: PV3DBase.h:61
const Surface::PositionType & position() const
The position (origin of the R.F.)
Definition: GeomDet.h:43
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:140
const T & max(const T &a, const T &b)
T sqrt(T t)
Definition: SSEVec.h:28
double pt() const
track transverse momentum
Definition: TrackBase.h:130
T z() const
Definition: PV3DBase.h:58
int genpartIndex() const
index of the corresponding Generator particle in the Event container (-1 if no Genpart) ...
Definition: SimTrack.h:33
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
int j
Definition: DBlmapReader.cc:9
unsigned short numberOfValidHits() const
number of valid hits found
Definition: TrackBase.h:225
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:359
GlobalVector momentum() const
#define LogTrace(id)
std::vector< std::string > associators
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
Definition: TrackBase.h:126
std::vector< edm::InputTag > label
GlobalPoint position() const
Log< T >::type log(const T &t)
Definition: Log.h:22
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:62
size_type size() const
T const * product() const
Definition: Handle.h:74
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:59
edm::EventID id() const
Definition: EventBase.h:56
int type() const
particle type (HEP PDT convension)
Definition: CoreSimTrack.h:40
const math::XYZTLorentzVectorD & momentum() const
particle info...
Definition: CoreSimTrack.h:36
tuple cout
Definition: gather_cfg.py:41
int charge() const
track electric charge
Definition: TrackBase.h:112
std::vector< TrackingParticle > TrackingParticleCollection
T x() const
Definition: PV3DBase.h:56
mathSSE::Vec4< T > v
edm::ESHandle< MagneticField > theMF
edm::ESWatcher< TrackAssociatorRecord > watchTrackAssociatorRecord_
Global3DVector GlobalVector
Definition: GlobalVector.h:10
std::vector< const TrackAssociatorBase * > associatore