CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PrimaryVertexAnalyzer.cc
Go to the documentation of this file.
2 
9 
10 // reco track and vertex
14 
15 //generator level + CLHEP
16 #include "HepMC/GenEvent.h"
17 #include "HepMC/GenVertex.h"
18 #include "HepMC/GenParticle.h"
19 
21 
22 // Root
23 #include <TDirectory.h>
24 #include <TH1.h>
25 #include <TH2.h>
26 #include <TFile.h>
27 #include <TProfile.h>
28 
29 #include <cmath>
30 #include <gsl/gsl_math.h>
31 #include <gsl/gsl_eigen.h>
32 
33 
34 //
35 // constants, enums and typedefs
36 //
37 
38 //
39 // static data member definitions
40 //
41 
42 //
43 // constructors and destructor
44 //
46  : verbose_( iConfig.getUntrackedParameter<bool>( "verbose", false ) )
47  , simUnit_( 1.0 ) // starting with CMSSW_1_2_x ??
48  , recoTrackCollectionToken_( consumes< reco::TrackCollection >( edm::InputTag( iConfig.getUntrackedParameter<std::string>( "recoTrackProducer" ) ) ) )
49  , edmSimVertexContainerToken_( consumes< edm::SimVertexContainer>( iConfig.getParameter<edm::InputTag>( "simG4" ) ) )
50  , edmSimTrackContainerToken_( consumes< edm::SimTrackContainer >( iConfig.getParameter<edm::InputTag>( "simG4" ) ) )
51  , edmHepMCProductToken_( consumes< edm::HepMCProduct >( edm::InputTag( std::string( "generator" ) ) ) )
52 {
53  //now do what ever initialization is needed
54  // open output file to store histograms
55  outputFile_ = iConfig.getUntrackedParameter<std::string>("outputFile");
56  TString tversion(edm::getReleaseVersion());
57  tversion = tversion.Remove(0,1);
58  tversion = tversion.Remove(tversion.Length()-1,tversion.Length());
59  outputFile_ = std::string(tversion)+"_"+outputFile_;
60 
61  std::vector<std::string> vtxSample = iConfig.getUntrackedParameter<std::vector< std::string > >("vtxSample");
62  recoVertexCollectionTokens_.reserve( vtxSample.size() );
63  suffixSample_.reserve( vtxSample.size() );
64  auto vtxSampleBegin = vtxSample.begin();
65  auto vtxSampleEnd = vtxSample.end();
66  for( auto isample = vtxSampleBegin; isample != vtxSampleEnd; ++isample ) {
67  recoVertexCollectionTokens_.push_back( consumes< reco::VertexCollection >( edm::InputTag( *isample ) ) );
68  if ( *isample == "offlinePrimaryVertices" ) suffixSample_.push_back("AVF");
69  if ( *isample == "offlinePrimaryVerticesWithBS" ) suffixSample_.push_back("wBS");
70  }
71  if ( suffixSample_.size() == 0 ) throw cms::Exception("NoVertexSamples") << " no known vertex samples given";
72 
73  rootFile_ = new TFile(outputFile_.c_str(),"RECREATE");
74  if ( (edm::getReleaseVersion()).find("CMSSW_1_1_",0)!=std::string::npos){
75  simUnit_=0.1; // for use in CMSSW_1_1_1 tutorial
76  }
77 }
78 
79 
81 {
82  // do anything here that needs to be done at desctruction time
83  // (e.g. close files, deallocate resources etc.)
84  delete rootFile_;
85 }
86 
87 
88 //
89 // member functions
90 //
92  std::cout << " PrimaryVertexAnalyzer::beginJob conversion from sim units to rec units is " << simUnit_ << std::endl;
93 
94 
95  rootFile_->cd();
96  // release validation histograms used in DoCompare.C
97  for (std::vector<std::string>::iterator isuffix= suffixSample_.begin(); isuffix!=suffixSample_.end(); isuffix++) {
98 
99  hdir[*isuffix] = rootFile_->mkdir(TString(*isuffix));
100  hdir[*isuffix]->cd();
101  h["nbvtx"+ *isuffix] = new TH1F(TString("nbvtx"+ *isuffix),"Reconstructed Vertices in Event",20,-0.5,19.5);
102  h["nbtksinvtx"+ *isuffix] = new TH1F(TString("nbtksinvtx"+ *isuffix),"Reconstructed Tracks in Vertex",200,-0.5,199.5);
103  h["resx"+ *isuffix] = new TH1F(TString("resx"+ *isuffix),"Residual X",100,-0.04,0.04);
104  h["resy"+ *isuffix] = new TH1F(TString("resy"+ *isuffix),"Residual Y",100,-0.04,0.04);
105  h["resz"+ *isuffix] = new TH1F(TString("resz"+ *isuffix),"Residual Z",100,-0.1,0.1);
106  h["pullx"+ *isuffix] = new TH1F(TString("pullx"+ *isuffix),"Pull X",100,-25.,25.);
107  h["pully"+ *isuffix] = new TH1F(TString("pully"+ *isuffix),"Pull Y",100,-25.,25.);
108  h["pullz"+ *isuffix] = new TH1F(TString("pullz"+ *isuffix),"Pull Z",100,-25.,25.);
109  h["vtxchi2"+ *isuffix] = new TH1F(TString("vtxchi2"+ *isuffix),"#chi^{2}",100,0.,100.);
110  h["vtxndf"+ *isuffix] = new TH1F(TString("vtxndf"+ *isuffix),"ndof",100,0.,100.);
111  h["tklinks"+ *isuffix] = new TH1F(TString("tklinks"+ *isuffix),"Usable track links",2,-0.5,1.5);
112  h["nans"+ *isuffix] = new TH1F(TString("nans"+ *isuffix),"Illegal values for x,y,z,xx,xy,xz,yy,yz,zz",9,0.5,9.5);
113  // more histograms
114  h["vtxprob"+ *isuffix] = new TH1F(TString("vtxprob"+ *isuffix),"#chi^{2} probability",100,0.,1.);
115  h["eff"+ *isuffix] = new TH1F(TString("eff"+ *isuffix),"efficiency",2, -0.5, 1.5);
116  h["efftag"+ *isuffix] = new TH1F(TString("efftag"+ *isuffix),"efficiency tagged vertex",2, -0.5, 1.5);
117  h["effvseta"+ *isuffix] = new TProfile(TString("effvseta"+ *isuffix),"efficiency vs eta",20, -2.5, 2.5, 0, 1.);
118  h["effvsptsq"+ *isuffix] = new TProfile(TString("effvsptsq"+ *isuffix),"efficiency vs ptsq",20, 0., 10000., 0, 1.);
119  h["effvsntrk"+ *isuffix] = new TProfile(TString("effvsntrk"+ *isuffix),"efficiency vs # simtracks",200, 0., 200., 0, 1.);
120  h["effvsnrectrk"+ *isuffix] = new TProfile(TString("effvsnrectrk"+ *isuffix),"efficiency vs # rectracks",200, 0., 200., 0, 1.);
121  h["effvsz"+ *isuffix] = new TProfile(TString("effvsz"+ *isuffix),"efficiency vs z",40, -20., 20., 0, 1.);
122  h["nbsimtksinvtx"+ *isuffix]= new TH1F(TString("nbsimtksinvtx"+ *isuffix),"simulated tracks in vertex",100,-0.5,99.5);
123  h["xrec"+ *isuffix] = new TH1F(TString("xrec"+ *isuffix),"reconstructed x",100,-0.1,0.1);
124  h["yrec"+ *isuffix] = new TH1F(TString("yrec"+ *isuffix),"reconstructed y",100,-0.1,0.1);
125  h["zrec"+ *isuffix] = new TH1F(TString("zrec"+ *isuffix),"reconstructed z",100,-20.,20.);
126  h["xsim"+ *isuffix] = new TH1F(TString("xsim"+ *isuffix),"simulated x",100,-0.1,0.1);
127  h["ysim"+ *isuffix] = new TH1F(TString("ysim"+ *isuffix),"simulated y",100,-0.1,0.1);
128  h["zsim"+ *isuffix] = new TH1F(TString("zsim"+ *isuffix),"simulated z",100,-20.,20.);
129  h["nrecvtx"+ *isuffix] = new TH1F(TString("nrecvtx"+ *isuffix),"# of reconstructed vertices", 50, -0.5, 49.5);
130  h["nsimvtx"+ *isuffix] = new TH1F(TString("nsimvtx"+ *isuffix),"# of simulated vertices", 50, -0.5, 49.5);
131  h["nrectrk"+ *isuffix] = new TH1F(TString("nrectrk"+ *isuffix),"# of reconstructed tracks", 200, -0.5, 199.5);
132  h["nsimtrk"+ *isuffix] = new TH1F(TString("nsimtrk"+ *isuffix),"# of simulated tracks", 200, -0.5, 199.5);
133  h["xrectag"+ *isuffix] = new TH1F(TString("xrectag"+ *isuffix),"reconstructed x, signal vtx",100,-0.1,0.1);
134  h["yrectag"+ *isuffix] = new TH1F(TString("yrectag"+ *isuffix),"reconstructed y, signal vtx",100,-0.1,0.1);
135  h["zrectag"+ *isuffix] = new TH1F(TString("zrectag"+ *isuffix),"reconstructed z, signal vtx",100,-20.,20.);
136  h["rapidity"+ *isuffix] = new TH1F(TString("rapidity"+ *isuffix),"rapidity ",100,-10., 10.);
137  h["pt"+ *isuffix] = new TH1F(TString("pt"+ *isuffix),"pt ",100,0., 20.);
138  h["nrectrk0vtx"+ *isuffix] = new TH1F(TString("nrectrk0vtx"+ *isuffix),"# rec tracks no vertex ",200,0., 200.);
139  h["zdistancetag"+ *isuffix] = new TH1F(TString("zdistancetag"+ *isuffix),"z-distance between tagged and generated",100, -0.1, 0.1);
140  h["puritytag"+ *isuffix] = new TH1F(TString("puritytag"+ *isuffix),"purity of primary vertex tags",2, -0.5, 1.5);
141  }
142 }
143 
144 
146  rootFile_->cd();
147  // save all histograms created in beginJob()
148  for (std::map<std::string, TDirectory*>::const_iterator idir=hdir.begin(); idir!=hdir.end(); idir++){
149  idir->second->cd();
150  for(std::map<std::string,TH1*>::const_iterator hist=h.begin(); hist!=h.end(); hist++){
151  if (TString(hist->first).Contains(idir->first)) hist->second->Write();
152  }
153  }
154 }
155 
156 
157 // helper functions
159  const reco::Vertex &vrec){
160  return (fabs(vsim.z*simUnit_-vrec.z())<0.0500); // =500um
161 }
162 
164  double ctau=(pdt->particle( abs(p->pdg_id()) ))->lifetime();
165  if(verbose_) std::cout << "isResonance " << p->pdg_id() << " " << ctau << std::endl;
166  return ctau >0 && ctau <1e-6;
167 }
168 
170  return ( !p->end_vertex() && p->status()==1 );
171 }
172 
174  const ParticleData * part = pdt->particle( p->pdg_id() );
175  if (part){
176  return part->charge()!=0;
177  }else{
178  // the new/improved particle table doesn't know anti-particles
179  return pdt->particle( -p->pdg_id() )!=0;
180  }
181 }
182 
184  int ivtx=0;
185  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
186  v!=recVtxs->end(); ++v){
187  std::cout << "Recvtx "<< std::setw(3) << std::setfill(' ')<<ivtx++
188  << "#trk " << std::setw(3) << v->tracksSize()
189  << " chi2 " << std::setw(4) << v->chi2()
190  << " ndof " << std::setw(3) << v->ndof() << std::endl
191  << " x " << std::setw(8) <<std::fixed << std::setprecision(4) << v->x()
192  << " dx " << std::setw(8) << v->xError()<< std::endl
193  << " y " << std::setw(8) << v->y()
194  << " dy " << std::setw(8) << v->yError()<< std::endl
195  << " z " << std::setw(8) << v->z()
196  << " dz " << std::setw(8) << v->zError()
197  << std::endl;
198  }
199 }
200 
201 
203  int i=0;
204  for(edm::SimVertexContainer::const_iterator vsim=simVtxs->begin();
205  vsim!=simVtxs->end(); ++vsim){
206  std::cout << i++ << ")" << std::scientific
207  << " evtid=" << vsim->eventId().event()
208  << " sim x=" << vsim->position().x()*simUnit_
209  << " sim y=" << vsim->position().y()*simUnit_
210  << " sim z=" << vsim->position().z()*simUnit_
211  << " sim t=" << vsim->position().t()
212  << " parent=" << vsim->parentIndex()
213  << std::endl;
214  }
215 }
216 
217 
219  std::cout << " simTrks type, (momentum), vertIndex, genpartIndex" << std::endl;
220  int i=1;
221  for(edm::SimTrackContainer::const_iterator t=simTrks->begin();
222  t!=simTrks->end(); ++t){
223  //HepMC::GenParticle* gp=evtMC->GetEvent()->particle( (*t).genpartIndex() );
224  std::cout << i++ << ")"
225  << (*t)
226  << " index="
227  << (*t).genpartIndex();
228  //if (gp) {
229  // HepMC::GenVertex *gv=gp->production_vertex();
230  // std::cout << " genvertex =" << (*gv);
231  //}
232  std::cout << std::endl;
233  }
234 }
235 
236 
237 std::vector<PrimaryVertexAnalyzer::simPrimaryVertex> PrimaryVertexAnalyzer::getSimPVs( const edm::Handle<edm::HepMCProduct> & evtMC
238  , const std::string & suffix
239  )
240 {
241  std::vector<PrimaryVertexAnalyzer::simPrimaryVertex> simpv;
242  const HepMC::GenEvent* evt=evtMC->GetEvent();
243  if (evt) {
244  if(verbose_) std::cout << "process id " <<evt->signal_process_id()<<std::endl;
245  if(verbose_) std::cout <<"signal process vertex "<< ( evt->signal_process_vertex() ?
246  evt->signal_process_vertex()->barcode() : 0 ) <<std::endl;
247  if(verbose_) std::cout <<"number of vertices " << evt->vertices_size() << std::endl;
248 
249 
250  int idx=0;
251  for(HepMC::GenEvent::vertex_const_iterator vitr= evt->vertices_begin();
252  vitr != evt->vertices_end(); ++vitr )
253  { // loop for vertex ...
254  HepMC::FourVector pos = (*vitr)->position();
255  //HepLorentzVector pos = (*vitr)->position();
256 
257  bool hasMotherVertex=false;
258  if(verbose_) std::cout << "mothers of vertex[" << ++idx << "]: " << std::endl;
259  for ( HepMC::GenVertex::particle_iterator
260  mother = (*vitr)->particles_begin(HepMC::parents);
261  mother != (*vitr)->particles_end(HepMC::parents);
262  ++mother ) {
263  HepMC::GenVertex * mv=(*mother)->production_vertex();
264  if (mv) {
265  hasMotherVertex=true;
266  if(!verbose_) break; //if verbose_, print all particles of gen vertices
267  }
268  if(verbose_)std::cout << "\t";
269  if(verbose_)(*mother)->print();
270  }
271 
272  if(hasMotherVertex) {continue;}
273 
274  // could be a new vertex, check all primaries found so far to avoid multiple entries
275  const double mm=0.1;
276  simPrimaryVertex sv(pos.x()*mm,pos.y()*mm,pos.z()*mm);
277  simPrimaryVertex *vp=NULL; // will become non-NULL if a vertex is found and then point to it
278  for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
279  v0!=simpv.end(); v0++){
280  if( (fabs(sv.x-v0->x)<1e-5) && (fabs(sv.y-v0->y)<1e-5) && (fabs(sv.z-v0->z)<1e-5)){
281  vp=&(*v0);
282  break;
283  }
284  }
285 
286  if(!vp){
287  // this is a new vertex
288  if(verbose_)std::cout << "this is a new vertex " << sv.x << " " << sv.y << " " << sv.z << std::endl;
289  simpv.push_back(sv);
290  vp=&simpv.back();
291  }else{
292  if(verbose_)std::cout << "this is not new vertex " << sv.x << " " << sv.y << " " << sv.z << std::endl;
293  }
294  vp->genVertex.push_back((*vitr)->barcode());
295  // collect final state descendants
296  for ( HepMC::GenVertex::particle_iterator
297  daughter = (*vitr)->particles_begin(HepMC::descendants);
298  daughter != (*vitr)->particles_end(HepMC::descendants);
299  ++daughter ) {
300  if (isFinalstateParticle(*daughter)){
301  if ( find(vp->finalstateParticles.begin(), vp->finalstateParticles.end(),(*daughter)->barcode())
302  == vp->finalstateParticles.end()){
303  vp->finalstateParticles.push_back((*daughter)->barcode());
304  HepMC::FourVector m=(*daughter)->momentum();
305  // the next four lines used to be "vp->ptot+=m;" in the days of CLHEP::HepLorentzVector
306  // but adding FourVectors seems not to be foreseen
307  vp->ptot.setPx(vp->ptot.px()+m.px());
308  vp->ptot.setPy(vp->ptot.py()+m.py());
309  vp->ptot.setPz(vp->ptot.pz()+m.pz());
310  vp->ptot.setE(vp->ptot.e()+m.e());
311  vp->ptsq+=(m.perp())*(m.perp());
312  if ( (m.perp()>0.8) && (fabs(m.pseudoRapidity())<2.5) && isCharged( *daughter ) ){
313  vp->nGenTrk++;
314  }
315 
316  h["rapidity"+suffix]->Fill(m.pseudoRapidity());
317  h["pt"+suffix]->Fill(m.perp());
318  }
319  }
320  }
321  }
322  }
323  return simpv;
324 }
325 
326 
327 
328 std::vector<PrimaryVertexAnalyzer::simPrimaryVertex> PrimaryVertexAnalyzer::getSimPVs( const edm::Handle<edm::HepMCProduct> & evtMC
329  , const edm::Handle<edm::SimVertexContainer> & simVtxs
330  , const edm::Handle<edm::SimTrackContainer> & simTrks
331  )
332 {
333  // simvertices don't have enough information to decide,
334  // genVertices don't have the simulated coordinates ( with VtxSmeared they might)
335  // go through simtracks to get the link between simulated and generated vertices
336  std::vector<PrimaryVertexAnalyzer::simPrimaryVertex> simpv;
337  int idx=0;
338  for(edm::SimTrackContainer::const_iterator t=simTrks->begin();
339  t!=simTrks->end(); ++t){
340  if ( !(t->noVertex()) && !(t->type()==-99) ){
341  double ptsq=0;
342  bool primary=false; // something coming directly from the primary vertex
343  bool resonance=false; // resonance
344  bool track=false; // undecayed, charged particle
345  HepMC::GenParticle* gp=evtMC->GetEvent()->barcode_to_particle( (*t).genpartIndex() );
346  if (gp) {
347  HepMC::GenVertex * gv=gp->production_vertex();
348  if (gv) {
349  for ( HepMC::GenVertex::particle_iterator
350  daughter = gv->particles_begin(HepMC::descendants);
351  daughter != gv->particles_end(HepMC::descendants);
352  ++daughter ) {
353  if (isFinalstateParticle(*daughter)){
354  ptsq+=(*daughter)->momentum().perp()*(*daughter)->momentum().perp();
355  }
356  }
357  primary = ( gv->position().t()==0);
358  //resonance= ( gp->mother() && isResonance(gp->mother())); // in CLHEP/HepMC days
359  // no more mother pointer in the improved HepMC GenParticle
360  resonance= ( isResonance(*(gp->production_vertex()->particles_in_const_begin())));
361  if (gp->status()==1){
362  //track=((pdt->particle(gp->pdg_id()))->charge() != 0);
363  track=not isCharged(gp);
364  }
365  }
366  }
367 
368  const HepMC::FourVector & v=(*simVtxs)[t->vertIndex()].position();
369  //const HepLorentzVector & v=(*simVtxs)[t->vertIndex()].position();
370  if(primary or resonance){
371  {
372  // check all primaries found so far to avoid multiple entries
373  bool newVertex=true;
374  for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
375  v0!=simpv.end(); v0++){
376  if( (fabs(v0->x-v.x())<0.001) && (fabs(v0->y-v.y())<0.001) && (fabs(v0->z-v.z())<0.001) ){
377  if (track) {
378  v0->simTrackIndex.push_back(idx);
379  if (ptsq>(*v0).ptsq){(*v0).ptsq=ptsq;}
380  }
381  newVertex=false;
382  }
383  }
384  if(newVertex && !resonance){
385  simPrimaryVertex anotherVertex(v.x(),v.y(),v.z());
386  if (track) anotherVertex.simTrackIndex.push_back(idx);
387  anotherVertex.ptsq=ptsq;
388  simpv.push_back(anotherVertex);
389  }
390  }//
391  }
392 
393  }// simtrack has vertex and valid type
394  idx++;
395  }//simTrack loop
396  return simpv;
397 }
398 
399 
400 // ------------ method called to produce the data ------------
401 void
403 {
404 
406  iEvent.getByToken( recoTrackCollectionToken_, recTrks );
407 
409  iEvent.getByToken( edmSimVertexContainerToken_, simVtxs );
410 
412  iEvent.getByToken( edmSimTrackContainerToken_, simTrks );
413 
414  for (int ivtxSample=0; ivtxSample!= (int)recoVertexCollectionTokens_.size(); ++ivtxSample) {
415  std::string isuffix = suffixSample_[ivtxSample];
416 
418  iEvent.getByToken( recoVertexCollectionTokens_[ ivtxSample ], recVtxs );
419 
420  try{
421  iSetup.getData(pdt);
422  }catch(const edm::Exception&){
423  std::cout << "Some problem occurred with the particle data table. This may not work !." <<std::endl;
424  }
425 
426  bool MC=false;
428  iEvent.getByToken( edmHepMCProductToken_, evtMC );
429  if (!evtMC.isValid()) {
430  MC=false;
431  if(verbose_){
432  std::cout << "no HepMCProduct found"<< std::endl;
433  }
434  } else {
435  if(verbose_){
436  std::cout << "generator HepMCProduct found"<< std::endl;
437  }
438  MC=true;
439  }
440 
441 
442  if(verbose_){
443  //evtMC->GetEvent()->print();
444  printRecVtxs(recVtxs);
445  //printSimVtxs(simVtxs);
446  //printSimTrks(simTrks);
447  }
448 
449  if(MC){
450  // make a list of primary vertices:
451  std::vector<simPrimaryVertex> simpv;
452  //simpv=getSimPVs(evtMC, simVtxs, simTrks);
453  simpv=getSimPVs(evtMC,isuffix);
454 
455 
456  // vertex matching and efficiency bookkeeping
457  h["nsimvtx"+isuffix]->Fill(simpv.size());
458  int nsimtrk=0;
459  for(std::vector<simPrimaryVertex>::iterator vsim=simpv.begin();
460  vsim!=simpv.end(); vsim++){
461 
462  hdir[isuffix]->cd();
463 
464  h["nbsimtksinvtx"+isuffix]->Fill(vsim->nGenTrk);
465  h["xsim"+isuffix]->Fill(vsim->x*simUnit_);
466  h["ysim"+isuffix]->Fill(vsim->y*simUnit_);
467  h["zsim"+isuffix]->Fill(vsim->z*simUnit_);
468  nsimtrk+=vsim->nGenTrk;
469  // look for a matching reconstructed vertex
470  vsim->recVtx=NULL;
471  for(reco::VertexCollection::const_iterator vrec=recVtxs->begin();
472  vrec!=recVtxs->end(); ++vrec){
473  if ( matchVertex(*vsim,*vrec) ){
474  // if the matching critera are fulfilled, accept the rec-vertex that is closest in z
475  if( ((vsim->recVtx) && (fabs(vsim->recVtx->position().z()-vsim->z)>fabs(vrec->z()-vsim->z)))
476  || (!vsim->recVtx) )
477  {
478  vsim->recVtx=&(*vrec);
479  }
480  }
481  }
482  h["nsimtrk"+isuffix]->Fill(float(nsimtrk));
483 
484 
485  // histogram properties of matched vertices
486  if (vsim->recVtx){
487 
488  if(verbose_){std::cout <<"primary matched " << vsim->x << " " << vsim->y << " " << vsim->z << std:: endl;}
489 
490  h["resx"+isuffix]->Fill( vsim->recVtx->x()-vsim->x*simUnit_ );
491  h["resy"+isuffix]->Fill( vsim->recVtx->y()-vsim->y*simUnit_ );
492  h["resz"+isuffix]->Fill( vsim->recVtx->z()-vsim->z*simUnit_ );
493  h["pullx"+isuffix]->Fill( (vsim->recVtx->x()-vsim->x*simUnit_)/vsim->recVtx->xError() );
494  h["pully"+isuffix]->Fill( (vsim->recVtx->y()-vsim->y*simUnit_)/vsim->recVtx->yError() );
495  h["pullz"+isuffix]->Fill( (vsim->recVtx->z()-vsim->z*simUnit_)/vsim->recVtx->zError() );
496  h["eff"+isuffix]->Fill( 1.);
497  if(simpv.size()==1){
498  if (vsim->recVtx==&(*recVtxs->begin())){
499  h["efftag"+isuffix]->Fill( 1.);
500  }else{
501  h["efftag"+isuffix]->Fill( 0.);
502  }
503  }
504  h["effvseta"+isuffix]->Fill(vsim->ptot.pseudoRapidity(),1.);
505  h["effvsptsq"+isuffix]->Fill(vsim->ptsq,1.);
506  h["effvsntrk"+isuffix]->Fill(vsim->nGenTrk,1.);
507  h["effvsnrectrk"+isuffix]->Fill(recTrks->size(),1.);
508  h["effvsz"+isuffix]->Fill(vsim->z*simUnit_,1.);
509 
510  }else{ // no rec vertex found for this simvertex
511 
512  if(verbose_){std::cout <<"primary not found " << vsim->x << " " << vsim->y << " " << vsim->z << " nGenTrk=" << vsim->nGenTrk << std::endl;}
513 
514  h["eff"+isuffix]->Fill( 0.);
515  if(simpv.size()==1){ h["efftag"+isuffix]->Fill( 0.); }
516  h["effvseta"+isuffix]->Fill(vsim->ptot.pseudoRapidity(),0.);
517  h["effvsptsq"+isuffix]->Fill(vsim->ptsq,0.);
518  h["effvsntrk"+isuffix]->Fill(float(vsim->nGenTrk),0.);
519  h["effvsnrectrk"+isuffix]->Fill(recTrks->size(),0.);
520  h["effvsz"+isuffix]->Fill(vsim->z*simUnit_,0.);
521  } // no recvertex for this simvertex
522  }//found MC event
523  // end of sim/rec matching
524 
525 
526  // purity of event vertex tags
527  if (recVtxs->size()>0 && simpv.size()>0){
528  Double_t dz=(*recVtxs->begin()).z() - (*simpv.begin()).z*simUnit_;
529  h["zdistancetag"+isuffix]->Fill(dz);
530  if( fabs(dz)<0.0500){
531  h["puritytag"+isuffix]->Fill(1.);
532  }else{
533  // bad tag: the true primary was more than 500 um away from the tagged primary
534  h["puritytag"+isuffix]->Fill(0.);
535  }
536  }
537 
538 
539  }// MC event
540 
541  // test track links, use reconstructed vertices
542 
543  h["nrecvtx"+isuffix]->Fill(recVtxs->size());
544  h["nrectrk"+isuffix]->Fill(recTrks->size());
545  h["nbvtx"+isuffix]->Fill(recVtxs->size()*1.);
546  if((recVtxs->size()==0)||recVtxs->begin()->isFake()) {h["nrectrk0vtx"+isuffix]->Fill(recTrks->size());}
547 
548  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
549  v!=recVtxs->end(); ++v){
550 
551  if(v->isFake()) continue;
552 
553  try {
554  for(reco::Vertex::trackRef_iterator t = v->tracks_begin();
555  t!=v->tracks_end(); t++) {
556  // illegal charge
557  if ( (**t).charge() < -1 || (**t).charge() > 1 ) {
558  h["tklinks"+isuffix]->Fill(0.);
559  }
560  else {
561  h["tklinks"+isuffix]->Fill(1.);
562  }
563  }
564  }
565  catch (...) {
566  // exception thrown when trying to use linked track
567  h["tklinks"+isuffix]->Fill(0.);
568  }
569 
570  h["nbtksinvtx"+isuffix]->Fill(v->tracksSize());
571  h["vtxchi2"+isuffix]->Fill(v->chi2());
572  h["vtxndf"+isuffix]->Fill(v->ndof());
573  h["vtxprob"+isuffix]->Fill(ChiSquaredProbability(v->chi2() ,v->ndof()));
574  h["xrec"+isuffix]->Fill(v->position().x());
575  h["yrec"+isuffix]->Fill(v->position().y());
576  h["zrec"+isuffix]->Fill(v->position().z());
577  if (v==recVtxs->begin()){
578  h["xrectag"+isuffix]->Fill(v->position().x());
579  h["yrectag"+isuffix]->Fill(v->position().y());
580  h["zrectag"+isuffix]->Fill(v->position().z());
581  }
582 
583  bool problem = false;
584  h["nans"+isuffix]->Fill(1.,isnan(v->position().x())*1.);
585  h["nans"+isuffix]->Fill(2.,isnan(v->position().y())*1.);
586  h["nans"+isuffix]->Fill(3.,isnan(v->position().z())*1.);
587 
588  int index = 3;
589  for (int i = 0; i != 3; i++) {
590  for (int j = i; j != 3; j++) {
591  index++;
592  h["nans"+isuffix]->Fill(index*1., isnan(v->covariance(i, j))*1.);
593  if (isnan(v->covariance(i, j))) problem = true;
594  // in addition, diagonal element must be positive
595  if (j == i && v->covariance(i, j) < 0) {
596  h["nans"+isuffix]->Fill(index*1., 1.);
597  problem = true;
598  }
599  }
600  }
601 
602  if (problem) {
603  // analyze track parameter covariance definiteness
604  double data[25];
605  try {
606  int itk = 0;
607  for(reco::Vertex::trackRef_iterator t = v->tracks_begin();
608  t!=v->tracks_end(); t++) {
609  std::cout << "Track " << itk++ << std::endl;
610  int i2 = 0;
611  for (int i = 0; i != 5; i++) {
612  for (int j = 0; j != 5; j++) {
613  data[i2] = (**t).covariance(i, j);
614  std::cout << std:: scientific << data[i2] << " ";
615  i2++;
616  }
617  std::cout << std::endl;
618  }
619  gsl_matrix_view m
620  = gsl_matrix_view_array (data, 5, 5);
621 
622  gsl_vector *eval = gsl_vector_alloc (5);
623  gsl_matrix *evec = gsl_matrix_alloc (5, 5);
624 
625  gsl_eigen_symmv_workspace * w =
626  gsl_eigen_symmv_alloc (5);
627 
628  gsl_eigen_symmv (&m.matrix, eval, evec, w);
629 
630  gsl_eigen_symmv_free (w);
631 
632  gsl_eigen_symmv_sort (eval, evec,
633  GSL_EIGEN_SORT_ABS_ASC);
634 
635  // print sorted eigenvalues
636  {
637  int i;
638  for (i = 0; i < 5; i++) {
639  double eval_i
640  = gsl_vector_get (eval, i);
641  //gsl_vector_view evec_i
642  // = gsl_matrix_column (evec, i);
643 
644  printf ("eigenvalue = %g\n", eval_i);
645  // printf ("eigenvector = \n");
646  // gsl_vector_fprintf (stdout,
647  // &evec_i.vector, "%g");
648  }
649  }
650  }
651  }
652  catch (...) {
653  // exception thrown when trying to use linked track
654  break;
655  }
656  }// if (problem)
657  }
658  } // for vertex loop
659 }
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
TPRegexp parents
Definition: eve_filter.cc:24
void printRecVtxs(const edm::Handle< reco::VertexCollection > &recVtxs)
const double w
Definition: UKUtility.cc:23
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
bool isCharged(const HepMC::GenParticle *p)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:449
bool isFinalstateParticle(const HepMC::GenParticle *p)
edm::EDGetTokenT< edm::SimTrackContainer > edmSimTrackContainerToken_
std::map< std::string, TDirectory * > hdir
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:13
void printSimVtxs(const edm::Handle< edm::SimVertexContainer > &simVtxs)
#define NULL
Definition: scimark2.h:8
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
float float float z
void getData(T &iHolder) const
Definition: EventSetup.h:78
void printSimTrks(const edm::Handle< edm::SimTrackContainer > &simVtrks)
int iEvent
Definition: GenABIO.cc:230
edm::ESHandle< ParticleDataTable > pdt
bool isnan(float x)
Definition: math.h:13
virtual void analyze(const edm::Event &, const edm::EventSetup &)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
double z() const
y coordinate
Definition: Vertex.h:112
float ChiSquaredProbability(double chiSquared, double nrDOF)
bool isValid() const
Definition: HandleBase.h:75
HepPDT::ParticleData ParticleData
std::string getReleaseVersion()
edm::EDGetTokenT< edm::HepMCProduct > edmHepMCProductToken_
bool isResonance(const HepMC::GenParticle *p)
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
part
Definition: HCALResponse.h:20
std::map< std::string, TH1 * > h
std::vector< SimVertex > SimVertexContainer
std::vector< simPrimaryVertex > getSimPVs(const edm::Handle< edm::HepMCProduct > &evtMC, const std::string &suffix="")
std::vector< edm::EDGetTokenT< reco::VertexCollection > > recoVertexCollectionTokens_
edm::EDGetTokenT< reco::TrackCollection > recoTrackCollectionToken_
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
PrimaryVertexAnalyzer(const edm::ParameterSet &)
std::vector< TrackBaseRef >::const_iterator trackRef_iterator
The iteratator for the vector&lt;TrackRef&gt;
Definition: Vertex.h:37
tuple cout
Definition: gather_cfg.py:121
volatile std::atomic< bool > shutdown_flag false
std::vector< std::string > suffixSample_
bool matchVertex(const simPrimaryVertex &vsim, const reco::Vertex &vrec)
std::vector< SimTrack > SimTrackContainer
edm::EDGetTokenT< edm::SimVertexContainer > edmSimVertexContainerToken_