16 #include "HepMC/GenEvent.h"
17 #include "HepMC/GenVertex.h"
18 #include "HepMC/GenParticle.h"
23 #include <TDirectory.h>
30 #include <gsl/gsl_math.h>
31 #include <gsl/gsl_eigen.h>
46 : verbose_( iConfig.getUntrackedParameter<bool>(
"verbose",
false ) )
57 tversion = tversion.Remove(0,1);
58 tversion = tversion.Remove(tversion.Length()-1,tversion.Length());
61 std::vector<std::string> vtxSample = iConfig.
getUntrackedParameter<std::vector< std::string > >(
"vtxSample");
64 auto vtxSampleBegin = vtxSample.begin();
65 auto vtxSampleEnd = vtxSample.end();
66 for(
auto isample = vtxSampleBegin; isample != vtxSampleEnd; ++isample ) {
68 if ( *isample ==
"offlinePrimaryVertices" )
suffixSample_.push_back(
"AVF");
69 if ( *isample ==
"offlinePrimaryVerticesWithBS" )
suffixSample_.push_back(
"wBS");
92 std::cout <<
" PrimaryVertexAnalyzer::beginJob conversion from sim units to rec units is " <<
simUnit_ << std::endl;
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);
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);
148 for (std::map<std::string, TDirectory*>::const_iterator idir=
hdir.begin(); idir!=
hdir.end(); idir++){
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();
160 return (fabs(vsim.
z*
simUnit_-vrec.
z())<0.0500);
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 <1
e-6;
170 return ( !p->end_vertex() && p->status()==1 );
176 return part->charge()!=0;
179 return pdt->particle( -p->pdg_id() )!=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()
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()
219 std::cout <<
" simTrks type, (momentum), vertIndex, genpartIndex" << std::endl;
221 for(edm::SimTrackContainer::const_iterator
t=simTrks->begin();
222 t!=simTrks->end(); ++
t){
227 << (*t).genpartIndex();
241 std::vector<PrimaryVertexAnalyzer::simPrimaryVertex> simpv;
242 const HepMC::GenEvent* evt=evtMC->GetEvent();
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;
251 for(HepMC::GenEvent::vertex_const_iterator vitr= evt->vertices_begin();
252 vitr != evt->vertices_end(); ++vitr )
254 HepMC::FourVector pos = (*vitr)->position();
257 bool hasMotherVertex=
false;
259 for ( HepMC::GenVertex::particle_iterator
263 HepMC::GenVertex * mv=(*mother)->production_vertex();
265 hasMotherVertex=
true;
272 if(hasMotherVertex) {
continue;}
278 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
279 v0!=simpv.end(); v0++){
280 if( (fabs(sv.x-v0->x)<1
e-5) && (fabs(sv.y-v0->y)<1
e-5) && (fabs(sv.z-v0->z)<1
e-5)){
288 if(
verbose_)
std::cout <<
"this is a new vertex " << sv.x <<
" " << sv.y <<
" " << sv.z << std::endl;
292 if(
verbose_)
std::cout <<
"this is not new vertex " << sv.x <<
" " << sv.y <<
" " << sv.z << std::endl;
294 vp->genVertex.push_back((*vitr)->barcode());
296 for ( HepMC::GenVertex::particle_iterator
297 daughter = (*vitr)->particles_begin(HepMC::descendants);
298 daughter != (*vitr)->particles_end(HepMC::descendants);
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();
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 ) ){
316 h[
"rapidity"+
suffix]->Fill(m.pseudoRapidity());
317 h[
"pt"+
suffix]->Fill(m.perp());
336 std::vector<PrimaryVertexAnalyzer::simPrimaryVertex> simpv;
338 for(edm::SimTrackContainer::const_iterator
t=simTrks->begin();
339 t!=simTrks->end(); ++
t){
340 if ( !(
t->noVertex()) && !(
t->type()==-99) ){
343 bool resonance=
false;
347 HepMC::GenVertex * gv=gp->production_vertex();
349 for ( HepMC::GenVertex::particle_iterator
350 daughter = gv->particles_begin(HepMC::descendants);
351 daughter != gv->particles_end(HepMC::descendants);
354 ptsq+=(*daughter)->momentum().perp()*(*daughter)->momentum().perp();
357 primary = ( gv->position().t()==0);
360 resonance= (
isResonance(*(gp->production_vertex()->particles_in_const_begin())));
361 if (gp->status()==1){
368 const HepMC::FourVector &
v=(*simVtxs)[
t->vertIndex()].position();
370 if(primary
or resonance){
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) ){
378 v0->simTrackIndex.push_back(idx);
379 if (ptsq>(*v0).ptsq){(*v0).ptsq=ptsq;}
384 if(newVertex && !resonance){
387 anotherVertex.ptsq=ptsq;
388 simpv.push_back(anotherVertex);
423 std::cout <<
"Some problem occurred with the particle data table. This may not work !." <<std::endl;
432 std::cout <<
"no HepMCProduct found"<< std::endl;
436 std::cout <<
"generator HepMCProduct found"<< std::endl;
451 std::vector<simPrimaryVertex> simpv;
457 h[
"nsimvtx"+isuffix]->Fill(simpv.size());
459 for(std::vector<simPrimaryVertex>::iterator vsim=simpv.begin();
460 vsim!=simpv.end(); vsim++){
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;
471 for(reco::VertexCollection::const_iterator vrec=recVtxs->begin();
472 vrec!=recVtxs->end(); ++vrec){
475 if( ((vsim->recVtx) && (fabs(vsim->recVtx->position().z()-vsim->z)>fabs(vrec->z()-vsim->z)))
478 vsim->recVtx=&(*vrec);
482 h[
"nsimtrk"+isuffix]->Fill(
float(nsimtrk));
488 if(
verbose_){
std::cout <<
"primary matched " << vsim->x <<
" " << vsim->y <<
" " << vsim->z << std:: endl;}
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.);
498 if (vsim->recVtx==&(*recVtxs->begin())){
499 h[
"efftag"+isuffix]->Fill( 1.);
501 h[
"efftag"+isuffix]->Fill( 0.);
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.);
512 if(
verbose_){
std::cout <<
"primary not found " << vsim->x <<
" " << vsim->y <<
" " << vsim->z <<
" nGenTrk=" << vsim->nGenTrk << std::endl;}
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.);
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.);
534 h[
"puritytag"+isuffix]->Fill(0.);
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());}
548 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
549 v!=recVtxs->end(); ++
v){
551 if(
v->isFake())
continue;
555 t!=
v->tracks_end();
t++) {
557 if ( (**t).charge() < -1 || (**t).charge() > 1 ) {
558 h[
"tklinks"+isuffix]->Fill(0.);
561 h[
"tklinks"+isuffix]->Fill(1.);
567 h[
"tklinks"+isuffix]->Fill(0.);
570 h[
"nbtksinvtx"+isuffix]->Fill(
v->tracksSize());
571 h[
"vtxchi2"+isuffix]->Fill(
v->chi2());
572 h[
"vtxndf"+isuffix]->Fill(
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());
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.);
589 for (
int i = 0;
i != 3;
i++) {
590 for (
int j =
i;
j != 3;
j++) {
592 h[
"nans"+isuffix]->Fill(index*1.,
isnan(
v->covariance(
i,
j))*1.);
593 if (
isnan(
v->covariance(
i,
j))) problem =
true;
595 if (
j ==
i &&
v->covariance(
i,
j) < 0) {
596 h[
"nans"+isuffix]->Fill(index*1., 1.);
608 t!=
v->tracks_end();
t++) {
609 std::cout <<
"Track " << itk++ << std::endl;
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] <<
" ";
620 = gsl_matrix_view_array (data, 5, 5);
622 gsl_vector *eval = gsl_vector_alloc (5);
623 gsl_matrix *evec = gsl_matrix_alloc (5, 5);
625 gsl_eigen_symmv_workspace *
w =
626 gsl_eigen_symmv_alloc (5);
628 gsl_eigen_symmv (&m.matrix, eval, evec, w);
630 gsl_eigen_symmv_free (w);
632 gsl_eigen_symmv_sort (eval, evec,
633 GSL_EIGEN_SORT_ABS_ASC);
638 for (i = 0; i < 5; i++) {
640 = gsl_vector_get (eval, i);
644 printf (
"eigenvalue = %g\n", eval_i);
T getUntrackedParameter(std::string const &, T const &) const
void printRecVtxs(const edm::Handle< reco::VertexCollection > &recVtxs)
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
bool isCharged(const HepMC::GenParticle *p)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
bool isFinalstateParticle(const HepMC::GenParticle *p)
edm::EDGetTokenT< edm::SimTrackContainer > edmSimTrackContainerToken_
std::map< std::string, TDirectory * > hdir
std::vector< Track > TrackCollection
collection of Tracks
void printSimVtxs(const edm::Handle< edm::SimVertexContainer > &simVtxs)
const reco::GenParticle * mother(const reco::GenParticle &p, unsigned int imoth=0)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void getData(T &iHolder) const
std::vector< int > simTrackIndex
void printSimTrks(const edm::Handle< edm::SimTrackContainer > &simVtrks)
edm::ESHandle< ParticleDataTable > pdt
virtual void analyze(const edm::Event &, const edm::EventSetup &)
const reco::GenParticle * daughter(const reco::GenParticle &p, unsigned int idau)
Abs< T >::type abs(const T &t)
double z() const
y coordinate
float ChiSquaredProbability(double chiSquared, double nrDOF)
HepPDT::ParticleData ParticleData
std::string getReleaseVersion()
edm::EDGetTokenT< edm::HepMCProduct > edmHepMCProductToken_
bool isResonance(const HepMC::GenParticle *p)
tuple idx
DEBUGGING if hasattr(process,"trackMonIterativeTracking2012"): print "trackMonIterativeTracking2012 D...
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]
PrimaryVertexAnalyzer(const edm::ParameterSet &)
std::vector< TrackBaseRef >::const_iterator trackRef_iterator
The iteratator for the vector<TrackRef>
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_