CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PrimaryVertexAnalyzer4PU.cc
Go to the documentation of this file.
2 
10 
11 //generator level + CLHEP
12 #include "HepMC/GenEvent.h"
13 #include "HepMC/GenVertex.h"
14 #include "HepMC/GenParticle.h"
15 
16 // reco track and vertex
19 
20 // simulated track
22 
23 // simulated vertex
25 
26 // crossing frame
31 
32 // TrackingParticle
35 
36 // tracking tools
38 
39 // clustering
42 
43 // associator
45 
46 // fit
49 
51 
52 // ROOT
53 #include <TH2.h>
54 #include <TFile.h>
55 #include <TProfile.h>
56 
57 #include <cmath>
58 #include <gsl/gsl_math.h>
59 #include <gsl/gsl_eigen.h>
60 
61 using namespace edm;
62 using namespace reco;
63 using namespace std;
64 //
65 // constants, enums and typedefs
66 //
68 //
69 // static data member definitions
70 //
71 
72 //
73 // constructors and destructor
74 //
76  : verbose_( iConfig.getUntrackedParameter<bool>( "verbose", false ) )
77  , doMatching_( iConfig.getUntrackedParameter<bool>( "matching", false ) )
78  , printXBS_( iConfig.getUntrackedParameter<bool>( "XBS", false ) )
79  , dumpThisEvent_( false )
80  , dumpPUcandidates_( iConfig.getUntrackedParameter<bool>( "dumpPUcandidates", false ) )
81  , DEBUG_( false )
82  , eventcounter_( 0 )
83  , dumpcounter_( 0 )
84  , ndump_( 10 )
85  , run_( 0 )
86  , luminosityBlock_( 0 )
87  , event_( 0 )
88  , bunchCrossing_( 0 )
89  , orbitNumber_( 0 )
90  , fBfield_( 0. )
91  , simUnit_( 1.0 ) // starting with CMSSW_1_2_x ??
92  , zmatch_( iConfig.getUntrackedParameter<double>( "zmatch", 0.0500 ) )
93  , wxy2_( 0. )
94  , theTrackFilter( iConfig.getParameter<edm::ParameterSet>( "TkFilterParameters" ) )
95  , recoTrackProducer_( iConfig.getUntrackedParameter<std::string>("recoTrackProducer") )
96  , outputFile_( iConfig.getUntrackedParameter<std::string>( "outputFile" ) )
97  , vecPileupSummaryInfoToken_( consumes< std::vector<PileupSummaryInfo> >( edm::InputTag( std::string( "addPileupInfo" ) ) ) )
98  , recoVertexCollectionToken_( consumes<reco::VertexCollection>( edm::InputTag( std::string( "offlinePrimaryVertices" ) ) ) )
99  , recoVertexCollection_BS_Token_( consumes<reco::VertexCollection>( edm::InputTag( std::string( "offlinePrimaryVerticesWithBS" ) ) ) )
100  , recoVertexCollection_DA_Token_( consumes<reco::VertexCollection>( edm::InputTag( std::string( "offlinePrimaryVerticesDA" ) ) ) )
101  , recoTrackCollectionToken_( consumes<reco::TrackCollection>( edm::InputTag( iConfig.getUntrackedParameter<std::string>( "recoTrackProducer" ) ) ) )
102  , recoBeamSpotToken_( consumes<reco::BeamSpot>( iConfig.getParameter<edm::InputTag>( "beamSpot" ) ) )
103  , edmView_recoTrack_Token_( consumes< edm::View<reco::Track> >( edm::InputTag( iConfig.getUntrackedParameter<std::string>( "recoTrackProducer" ) ) ) )
104  , edmSimVertexContainerToken_( consumes<edm::SimVertexContainer>( iConfig.getParameter<edm::InputTag>( "simG4" ) ) )
105  , edmSimTrackContainerToken_( consumes<edm::SimTrackContainer>( iConfig.getParameter<edm::InputTag>( "simG4" ) ) )
106  , trackingParticleCollectionToken_( consumes<TrackingParticleCollection>( edm::InputTag( std::string( "mix" )
107  , std::string( "MergedTrackTruth" )
108  )
109  )
110  )
111  , trackingVertexCollectionToken_( consumes<TrackingVertexCollection>( edm::InputTag( std::string( "mix" )
112  , std::string( "MergedTrackTruth" )
113  )
114  )
115  )
116  , edmHepMCProductToken_( consumes<edm::HepMCProduct>( edm::InputTag( std::string( "generator" ) ) ) ) // starting with 3_1_0 pre something
117 {
118  //now do what ever initialization is needed
119  // open output file to store histograms}
120  rootFile_ = TFile::Open(outputFile_.c_str(),"RECREATE");
121  if ( (edm::getReleaseVersion()).find("CMSSW_1_1_",0)!=std::string::npos){
122  simUnit_=0.1; // for use in CMSSW_1_1_1 tutorial
123  }
124  cout << "PrimaryVertexAnalyzer4PU: zmatch=" << zmatch_ << endl;
125  //DEBUG_=true;
126 }
127 
128 
130 {
131  // do anything here that needs to be done at desctruction time
132  // (e.g. close files, deallocate resources etc.)
133  delete rootFile_;
134 }
135 
136 
137 //
138 // member functions
139 //
140 
142  std::map<std::string, TH1*> h;
143 
144  // release validation histograms used in DoCompare.C
145  h["nbtksinvtx"] = new TH1F("nbtksinvtx","reconstructed tracks in vertex",40,-0.5,39.5);
146  h["nbtksinvtxPU"] = new TH1F("nbtksinvtxPU","reconstructed tracks in vertex",40,-0.5,39.5);
147  h["nbtksinvtxTag"]= new TH1F("nbtksinvtxTag","reconstructed tracks in vertex",40,-0.5,39.5);
148  h["resx"] = new TH1F("resx","residual x",100,-0.04,0.04);
149  h["resy"] = new TH1F("resy","residual y",100,-0.04,0.04);
150  h["resz"] = new TH1F("resz","residual z",100,-0.1,0.1);
151  h["resz10"] = new TH1F("resz10","residual z",100,-1.0,1.);
152  h["pullx"] = new TH1F("pullx","pull x",100,-25.,25.);
153  h["pully"] = new TH1F("pully","pull y",100,-25.,25.);
154  h["pullz"] = new TH1F("pullz","pull z",100,-25.,25.);
155  h["vtxchi2"] = new TH1F("vtxchi2","chi squared",100,0.,100.);
156  h["vtxndf"] = new TH1F("vtxndf","degrees of freedom",500,0.,100.);
157  h["vtxndfc"] = new TH1F("vtxndfc","expected 2nd highest ndof",500,0.,100.);
158 
159  h["vtxndfvsntk"] = new TH2F("vtxndfvsntk","ndof vs #tracks",20,0.,100, 20, 0., 200.);
160  h["vtxndfoverntk"]= new TH1F("vtxndfoverntk","ndof / #tracks",40,0.,2.);
161  h["vtxndf2overntk"]= new TH1F("vtxndf2overntk","(ndof+2) / #tracks",40,0.,2.);
162  h["tklinks"] = new TH1F("tklinks","Usable track links",2,-0.5,1.5);
163  h["nans"] = new TH1F("nans","Illegal values for x,y,z,xx,xy,xz,yy,yz,zz",9,0.5,9.5);
164 
165  // raw
166  add(h, new TH1F("szRecVtx","size of recvtx collection",20, -0.5, 19.5));
167  add(h, new TH1F("isFake","fake vertex",2, -0.5, 1.5));
168  add(h, new TH1F("isFake1","fake vertex or ndof<0",2, -0.5, 1.5));
169  add(h, new TH1F("bunchCrossing","bunchCrossing",4000, 0., 4000.));
170  add(h, new TH2F("bunchCrossingLogNtk","bunchCrossingLogNtk",4000, 0., 4000.,5,0., 5.));
171  add(h, new TH1F("highpurityTrackFraction","fraction of high purity tracks",20, 0., 1.));
172  add(h, new TH2F("trkchi2vsndof","vertices chi2 vs ndof",50, 0., 100., 50, 0., 200.));
173  add(h, new TH1F("trkchi2overndof","vertices chi2 / ndof",50, 0., 5.));
174  // two track vertices
175  add(h,new TH2F("2trkchi2vsndof","two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
176  add(h,new TH1F("2trkmassSS","two-track vertices mass (same sign)",100, 0., 2.));
177  add(h,new TH1F("2trkmassOS","two-track vertices mass (opposite sign)",100, 0., 2.));
178  add(h,new TH1F("2trkdphi","two-track vertices delta-phi",360, 0, 2*M_PI));
179  add(h,new TH1F("2trkseta","two-track vertices sum-eta",50, -2., 2.));
180  add(h,new TH1F("2trkdphicurl","two-track vertices delta-phi (sum eta<0.1)",360, 0, 2*M_PI));
181  add(h,new TH1F("2trksetacurl","two-track vertices sum-eta (delta-phi<0.1)",50, -2., 2.));
182  add(h,new TH1F("2trkdetaOS","two-track vertices delta-eta (same sign)",50, -0.5, 0.5));
183  add(h,new TH1F("2trkdetaSS","two-track vertices delta-eta (opposite sign)",50, -0.5, 0.5));
184  // two track PU vertices
185  add(h,new TH1F("2trkmassSSPU","two-track vertices mass (same sign)",100, 0., 2.));
186  add(h,new TH1F("2trkmassOSPU","two-track vertices mass (opposite sign)",100, 0., 2.));
187  add(h,new TH1F("2trkdphiPU","two-track vertices delta-phi",360, 0, 2*M_PI));
188  add(h,new TH1F("2trksetaPU","two-track vertices sum-eta",50, -2., 2.));
189  add(h,new TH1F("2trkdphicurlPU","two-track vertices delta-phi (sum eta<0.1)",360, 0, 2*M_PI));
190  add(h,new TH1F("2trksetacurlPU","two-track vertices sum-eta (delta-phi<0.1)",50, -2., 2.));
191  add(h,new TH1F("2trkdetaOSPU","two-track vertices delta-eta (same sign)",50, -0.5, 0.5));
192  add(h,new TH1F("2trkdetaSSPU","two-track vertices delta-eta (opposite sign)",50, -0.5, 0.5));
193  // three track vertices
194  add(h,new TH2F("2trkchi2vsndof","two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
195  add(h,new TH2F("3trkchi2vsndof","three-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
196  add(h,new TH2F("4trkchi2vsndof","four-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
197  add(h,new TH2F("5trkchi2vsndof","five-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
198  // same for fakes
199  add(h,new TH2F("fake2trkchi2vsndof","fake two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
200  add(h,new TH2F("fake3trkchi2vsndof","fake three-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
201  add(h,new TH2F("fake4trkchi2vsndof","fake four-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
202  add(h,new TH2F("fake5trkchi2vsndof","fake five-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
203  h["resxr"] = new TH1F("resxr","relative residual x",100,-0.04,0.04);
204  h["resyr"] = new TH1F("resyr","relative residual y",100,-0.04,0.04);
205  h["reszr"] = new TH1F("reszr","relative residual z",100,-0.1,0.1);
206  h["pullxr"] = new TH1F("pullxr","relative pull x",100,-25.,25.);
207  h["pullyr"] = new TH1F("pullyr","relative pull y",100,-25.,25.);
208  h["pullzr"] = new TH1F("pullzr","relative pull z",100,-25.,25.);
209  h["vtxprob"] = new TH1F("vtxprob","chisquared probability",100,0.,1.);
210  h["eff"] = new TH1F("eff","efficiency",2, -0.5, 1.5);
211  h["efftag"] = new TH1F("efftag","efficiency tagged vertex",2, -0.5, 1.5);
212  h["zdistancetag"] = new TH1F("zdistancetag","z-distance between tagged and generated",100, -0.1, 0.1);
213  h["abszdistancetag"] = new TH1F("abszdistancetag","z-distance between tagged and generated",1000, 0., 1.0);
214  h["abszdistancetagcum"] = new TH1F("abszdistancetagcum","z-distance between tagged and generated",1000, 0., 1.0);
215  h["puritytag"] = new TH1F("puritytag","purity of primary vertex tags",2, -0.5, 1.5);
216  h["effvsptsq"] = new TProfile("effvsptsq","efficiency vs ptsq",20, 0., 10000., 0, 1.);
217  h["effvsnsimtrk"] = new TProfile("effvsnsimtrk","efficiency vs # simtracks",50, 0., 50., 0, 1.);
218  h["effvsnrectrk"] = new TProfile("effvsnrectrk","efficiency vs # rectracks",50, 0., 50., 0, 1.);
219  h["effvsnseltrk"] = new TProfile("effvsnseltrk","efficiency vs # selected tracks",50, 0., 50., 0, 1.);
220  h["effvsz"] = new TProfile("effvsz","efficiency vs z",20, -20., 20., 0, 1.);
221  h["effvsz2"] = new TProfile("effvsz2","efficiency vs z (2mm)",20, -20., 20., 0, 1.);
222  h["effvsr"] = new TProfile("effvsr","efficiency vs r",20, 0., 1., 0, 1.);
223  h["xresvsntrk"] = new TProfile("xresvsntrk","xresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
224  h["yresvsntrk"] = new TProfile("yresvsntrk","yresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
225  h["zresvsntrk"] = new TProfile("zresvsntrk","zresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
226  h["cpuvsntrk"] = new TProfile("cpuvsntrk","cpu time vs # of fitted tracks",40, 0., 200., 0, 200.);
227  h["cpucluvsntrk"] = new TProfile("cpucluvsntrk","clustering cpu time # of tracks",40, 0., 200., 0, 10.);
228  h["cpufit"] = new TH1F("cpufit","cpu time for fitting",100, 0., 200.);
229  h["cpuclu"] = new TH1F("cpuclu","cpu time for clustering",100, 0., 200.);
230  h["nbtksinvtx2"] = new TH1F("nbtksinvtx2","reconstructed tracks in vertex",40,0.,200.);
231  h["nbtksinvtxPU2"] = new TH1F("nbtksinvtxPU2","reconstructed tracks in vertex",40,0.,200.);
232  h["nbtksinvtxTag2"] = new TH1F("nbtksinvtxTag2","reconstructed tracks in vertex",40,0.,200.);
233 
234  h["xrec"] = new TH1F("xrec","reconstructed x",100,-0.1,0.1);
235  h["yrec"] = new TH1F("yrec","reconstructed y",100,-0.1,0.1);
236  h["zrec"] = new TH1F("zrec","reconstructed z",100,-20.,20.);
237  h["err1"] = new TH1F("err1","error 1",100,0.,0.1);
238  h["err2"] = new TH1F("err2","error 2",100,0.,0.1);
239  h["errx"] = new TH1F("errx","error x",100,0.,0.1);
240  h["erry"] = new TH1F("erry","error y",100,0.,0.1);
241  h["errz"] = new TH1F("errz","error z",100,0.,2.0);
242  h["errz1"] = new TH1F("errz1","error z",100,0.,0.2);
243 
244  h["zrecNt100"] = new TH1F("zrecNt100","reconstructed z for high multiplicity events",80,-40.,40.);
245  add(h, new TH2F("zrecvsnt","reconstructed z vs number of tracks",100,-50., 50., 20, 0., 200.));
246  add(h, new TH2F("xyrec","reconstructed xy",100, -4., 4., 100, -4., 4.));
247  h["xrecBeam"] = new TH1F("xrecBeam","reconstructed x - beam x",100,-0.1,0.1);
248  h["yrecBeam"] = new TH1F("yrecBeam","reconstructed y - beam y",100,-0.1,0.1);
249  h["zrecBeam"] = new TH1F("zrecBeam","reconstructed z - beam z",100,-20.,20.);
250  h["xrecBeamvsz"] = new TH2F("xrecBeamvsz","reconstructed x - beam x vs z", 20, -20., 20.,100,-0.1,0.1);
251  h["yrecBeamvsz"] = new TH2F("yrecBeamvsz","reconstructed y - beam y vs z", 20, -20., 20.,100,-0.1,0.1);
252  h["xrecBeamvszprof"] = new TProfile("xrecBeamvszprof","reconstructed x - beam x vs z-z0", 20, -20., 20.,-0.1,0.1);
253  h["yrecBeamvszprof"] = new TProfile("yrecBeamvszprof","reconstructed y - beam y vs z-z0", 20, -20., 20.,-0.1,0.1);
254  add(h, new TH2F("xrecBeamvsdxXBS","reconstructed x - beam x vs resolution",10,0., 0.02, 100, -0.1,0.1)); // just a test
255  add(h, new TH2F("yrecBeamvsdyXBS","reconstructed z - beam z vs resolution",10,0., 0.02, 100, -0.1,0.1));
256  add(h, new TH2F("xrecBeamvsdx","reconstructed x - beam x vs resolution",10,0., 0.02, 100, -0.1,0.1));
257  add(h, new TH2F("yrecBeamvsdy","reconstructed z - beam z vs resolution",10,0., 0.02, 100, -0.1,0.1));
258  add(h, new TH2F("xrecBeamvsdxR2","reconstructed x - beam x vs resolution",20,0., 0.04, 100, -0.1,0.1));
259  add(h, new TH2F("yrecBeamvsdyR2","reconstructed z - beam z vs resolution",20,0., 0.04, 100, -0.1,0.1));
260  h["xrecBeamvsdxprof"] = new TProfile("xrecBeamvsdxprof","reconstructed x - beam x vs resolution",10, 0., 0.04,-0.1,0.1 );
261  h["yrecBeamvsdyprof"] = new TProfile("yrecBeamvsdyprof","reconstructed y - beam y vs resolution",10, 0., 0.04,-0.1,0.1 );
262  add(h, new TProfile("xrecBeam2vsdx2prof","reconstructed x - beam x vs resolution",10,0., 0.002, 0., 0.01));
263  add(h, new TProfile("yrecBeam2vsdy2prof","reconstructed y - beam y vs resolution",10,0., 0.002, 0., 0.01));
264  add(h,new TH2F("xrecBeamvsdx2","reconstructed x - beam x vs resolution",10,0., 0.002, 100, -0.01, 0.01));
265  add(h,new TH2F("yrecBeamvsdy2","reconstructed y - beam y vs resolution",10,0., 0.002, 100, -0.01, 0.01));
266  h["xrecb"] = new TH1F("xrecb","reconstructed x - beam x",100,-0.01,0.01);
267  h["yrecb"] = new TH1F("yrecb","reconstructed y - beam y",100,-0.01,0.01);
268  h["zrecb"] = new TH1F("zrecb","reconstructed z - beam z",100,-20.,20.);
269  h["xrec1"] = new TH1F("xrec1","reconstructed x",100,-4,4);
270  h["yrec1"] = new TH1F("yrec1","reconstructed y",100,-4,4); // should match the sim histos
271  h["zrec1"] = new TH1F("zrec1","reconstructed z",100,-80.,80.);
272  h["xrec2"] = new TH1F("xrec2","reconstructed x",100,-1,1);
273  h["yrec2"] = new TH1F("yrec2","reconstructed y",100,-1,1);
274  h["zrec2"] = new TH1F("zrec2","reconstructed z",100,-40.,40.);
275  h["xrec3"] = new TH1F("xrec3","reconstructed x",100,-0.1,0.1);
276  h["yrec3"] = new TH1F("yrec3","reconstructed y",100,-0.1,0.1);
277  h["zrec3"] = new TH1F("zrec3","reconstructed z",100,-20.,20.);
278  add(h, new TH1F("xrecBeamPull","normalized residuals reconstructed x - beam x",100,-20,20));
279  add(h, new TH1F("yrecBeamPull","normalized residuals reconstructed y - beam y",100,-20,20));
280  add(h, new TH1F("zdiffrec","z-distance between vertices",200,-20., 20.));
281  add(h, new TH1F("zdiffrec2","z-distance between ndof>2 vertices",200,-20., 20.));
282  add(h, new TH1F("zdiffrec4","z-distance between ndof>4 vertices",200,-20., 20.));
283  add(h, new TH1F("zdiffrec8","z-distance between ndof>8 vertices",200,-20., 20.));
284  add(h, new TH2F("zvszrec2","z positions of multiple vertices",200,-20., 20., 200,-20., 20.));
285  add(h, new TH2F("pzvspz2","prob(z) of multiple vertices",100, 0.,1.,100,0., 1.));
286  add(h, new TH2F("zvszrec4","z positions of multiple vertices",100,-20., 20., 100,-20., 20.));
287  add(h, new TH2F("pzvspz4","prob(z) of multiple vertices",100, 0.,1.,100,0., 1.));
288  add(h, new TH2F("zdiffvsz","z-distance vs z",100,-10.,10.,30,-15.,15.));
289  add(h, new TH2F("zdiffvsz4","z-distance vs z (ndof>4)",100,-10.,10.,30,-15.,15.));
290  add(h, new TProfile("eff0vsntrec","efficiency vs # reconstructed tracks",50, 0., 50., 0, 1.));
291  add(h, new TProfile("eff0vsntsel","efficiency vs # selected tracks",50, 0., 50., 0, 1.));
292  add(h, new TProfile("eff0ndof0vsntsel","efficiency (ndof>0) vs # selected tracks",50, 0., 50., 0, 1.));
293  add(h, new TProfile("eff0ndof8vsntsel","efficiency (ndof>8) vs # selected tracks",50, 0., 50., 0, 1.));
294  add(h, new TProfile("eff0ndof2vsntsel","efficiency (ndof>2) vs # selected tracks",50, 0., 50., 0, 1.));
295  add(h, new TProfile("eff0ndof4vsntsel","efficiency (ndof>4) vs # selected tracks",50, 0., 50., 0, 1.));
296  add(h, new TH1F("xbeamPUcand","x - beam of PU candidates (ndof>4)",100,-1., 1.));
297  add(h, new TH1F("ybeamPUcand","y - beam of PU candidates (ndof>4)",100,-1., 1.));
298  add(h, new TH1F("xbeamPullPUcand","x - beam pull of PU candidates (ndof>4)",100,-20., 20.));
299  add(h, new TH1F("ybeamPullPUcand","y - beam pull of PU candidates (ndof>4)",100,-20., 20.));
300  add(h, new TH1F("ndofOverNtk","ndof / ntk of ndidates (ndof>4)",100,0., 2.));
301  add(h, new TH1F("ndofOverNtkPUcand","ndof / ntk of ndidates (ndof>4)",100,0., 2.));
302  add(h, new TH1F("zPUcand","z positions of PU candidates (all)",100,-20., 20.));
303  add(h, new TH1F("zPUcand2","z positions of PU candidates (ndof>2)",100,-20., 20.));
304  add(h, new TH1F("zPUcand4","z positions of PU candidates (ndof>4)",100,-20., 20.));
305  add(h, new TH1F("ndofPUcand","ndof of PU candidates (all)",50,0., 100.));
306  add(h, new TH1F("ndofPUcand2","ndof of PU candidates (ndof>2)",50,0., 100.));
307  add(h, new TH1F("ndofPUcand4","ndof of PU candidates (ndof>4)",50,0., 100.));
308  add(h, new TH1F("ndofnr2","second highest ndof",500,0., 100.));
309  add(h, new TH1F("ndofnr2d1cm","second highest ndof (dz>1cm)",500,0., 100.));
310  add(h, new TH1F("ndofnr2d2cm","second highest ndof (dz>2cm)",500,0., 100.));
311 
312  h["nrecvtx"] = new TH1F("nrecvtx","# of reconstructed vertices", 50, -0.5, 49.5);
313  h["nrecvtx8"] = new TH1F("nrecvtx8","# of reconstructed vertices with ndof>8", 50, -0.5, 49.5);
314  h["nrecvtx2"] = new TH1F("nrecvtx2","# of reconstructed vertices with ndof>2", 50, -0.5, 49.5);
315  h["nrecvtx4"] = new TH1F("nrecvtx4","# of reconstructed vertices with ndof>4", 50, -0.5, 49.5);
316  h["nrectrk"] = new TH1F("nrectrk","# of reconstructed tracks", 100, -0.5, 99.5);
317  add(h, new TH1F("nsimtrk","# of simulated tracks", 100, -0.5, 99.5));
318  add(h, new TH1F("nsimtrkSignal","# of simulated tracks (Signal)", 100, -0.5, 99.5));
319  add(h, new TH1F("nsimtrkPU","# of simulated tracks (PU)", 100, -0.5, 99.5));
320  h["nsimtrk"]->StatOverflows(kTRUE);
321  h["nsimtrkPU"]->StatOverflows(kTRUE);
322  h["nsimtrkSignal"]->StatOverflows(kTRUE);
323  h["xrectag"] = new TH1F("xrectag","reconstructed x, signal vtx",100,-0.05,0.05);
324  h["yrectag"] = new TH1F("yrectag","reconstructed y, signal vtx",100,-0.05,0.05);
325  h["zrectag"] = new TH1F("zrectag","reconstructed z, signal vtx",100,-20.,20.);
326  h["nrectrk0vtx"] = new TH1F("nrectrk0vtx","# rec tracks no vertex ",100,-0.5, 99.5);
327  h["nseltrk0vtx"] = new TH1F("nseltrk0vtx","# rec tracks no vertex ",100,-0.5, 99.5);
328  h["nrecsimtrk"] = new TH1F("nrecsimtrk","# rec tracks matched to sim tracks in vertex",100,-0.5, 99.5);
329  h["nrecnosimtrk"] = new TH1F("nrecsimtrk","# rec tracks not matched to sim tracks in vertex",100,-0.5, 99.5);
330  h["trackAssEffvsPt"] = new TProfile("trackAssEffvsPt","track association efficiency vs pt",20, 0., 100., 0, 1.);
331 
332  // cluster stuff
333  h["nseltrk"] = new TH1F("nseltrk","# of reconstructed tracks selected for PV", 100, -0.5, 99.5);
334  h["nclutrkall"] = new TH1F("nclutrkall","# of reconstructed tracks in clusters", 100, -0.5, 99.5);
335  h["nclutrkvtx"] = new TH1F("nclutrkvtx","# of reconstructed tracks in clusters of reconstructed vertices", 100, -0.5, 99.5);
336  h["nclu"] = new TH1F("nclu","# of clusters", 100, -0.5, 99.5);
337  h["nclu0vtx"] = new TH1F("nclu0vtx","# of clusters in events with no PV", 100, -0.5, 99.5);
338  h["zlost1"] = new TH1F("zlost1","z of lost vertices (bad z)", 100, -20., 20.);
339  h["zlost2"] = new TH1F("zlost2","z of lost vertices (no matching cluster)", 100, -20., 20.);
340  h["zlost3"] = new TH1F("zlost3","z of lost vertices (vertex too far from beam)", 100, -20., 20.);
341  h["zlost4"] = new TH1F("zlost4","z of lost vertices (invalid vertex)", 100, -20., 20.);
342  h["selstat"] = new TH1F("selstat","selstat", 5, -2.5, 2.5);
343 
344  // properties of fake vertices (MC only)_
345  add(h, new TH1F("fakeVtxZNdofgt05","z of fake vertices with ndof>0.5", 100, -20., 20.));
346  add(h, new TH1F("fakeVtxZNdofgt2","z of fake vertices with ndof>2", 100, -20., 20.));
347  add(h, new TH1F("fakeVtxZ","z of fake vertices", 100, -20., 20.));
348  add(h, new TH1F("fakeVtxNdof","ndof of fake vertices", 500,0., 100.));
349  add(h,new TH1F("fakeVtxNtrk","number of tracks in fake vertex",20,-0.5, 19.5));
350  add(h,new TH1F("matchedVtxNdof","ndof of matched vertices", 500,0., 100.));
351 
352  // histograms of track quality (Data and MC)
353  string types[] = {"all","sel","bachelor","sellost","wgt05","wlt05","M","tagged","untagged","ndof4","PUcand","PUfake"};
354  for(int t=0; t<12; t++){
355  add(h, new TH1F(("rapidity_"+types[t]).c_str(),"rapidity ",100,-3., 3.));
356  h["z0_"+types[t]] = new TH1F(("z0_"+types[t]).c_str(),"z0 ",80,-40., 40.);
357  h["phi_"+types[t]] = new TH1F(("phi_"+types[t]).c_str(),"phi ",80,-3.14159, 3.14159);
358  h["eta_"+types[t]] = new TH1F(("eta_"+types[t]).c_str(),"eta ",80,-4., 4.);
359  h["pt_"+types[t]] = new TH1F(("pt_"+types[t]).c_str(),"pt ",100,0., 20.);
360  h["found_"+types[t]] = new TH1F(("found_"+types[t]).c_str(),"found hits",20, 0., 20.);
361  h["lost_"+types[t]] = new TH1F(("lost_"+types[t]).c_str(),"lost hits",20, 0., 20.);
362  h["nchi2_"+types[t]] = new TH1F(("nchi2_"+types[t]).c_str(),"normalized track chi2",100, 0., 20.);
363  h["rstart_"+types[t]] = new TH1F(("rstart_"+types[t]).c_str(),"start radius",100, 0., 20.);
364  h["tfom_"+types[t]] = new TH1F(("tfom_"+types[t]).c_str(),"track figure of merit",100, 0., 100.);
365  h["expectedInner_"+types[t]] = new TH1F(("expectedInner_"+types[t]).c_str(),"expected inner hits ",10, 0., 10.);
366  h["expectedOuter_"+types[t]] = new TH1F(("expectedOuter_"+types[t]).c_str(),"expected outer hits ",10, 0., 10.);
367  h["logtresxy_"+types[t]] = new TH1F(("logtresxy_"+types[t]).c_str(),"log10(track r-phi resolution/um)",100, 0., 5.);
368  h["logtresz_"+types[t]] = new TH1F(("logtresz_"+types[t]).c_str(),"log10(track z resolution/um)",100, 0., 5.);
369  h["tpullxy_"+types[t]] = new TH1F(("tpullxy_"+types[t]).c_str(),"track r-phi pull",100, -10., 10.);
370  add(h, new TH2F( ("lvseta_"+types[t]).c_str(),"cluster length vs eta",60,-3., 3., 20, 0., 20));
371  add(h, new TH2F( ("lvstanlambda_"+types[t]).c_str(),"cluster length vs tan lambda",60,-6., 6., 20, 0., 20));
372  add(h, new TH1F( ("restrkz_"+types[t]).c_str(),"z-residuals (track vs vertex)", 200, -5., 5.));
373  add(h, new TH2F( ("restrkzvsphi_"+types[t]).c_str(),"z-residuals (track - vertex)", 12,-3.14159,3.14159,100, -5., 5.));
374  add(h, new TH2F( ("restrkzvseta_"+types[t]).c_str(),"z-residuals (track - vertex)", 12,-3.,3.,200, -5., 5.));
375  add(h, new TH2F( ("pulltrkzvsphi_"+types[t]).c_str(),"normalized z-residuals (track - vertex)", 12,-3.14159,3.14159,100, -5., 5.));
376  add(h, new TH2F( ("pulltrkzvseta_"+types[t]).c_str(),"normalized z-residuals (track - vertex)", 12,-3.,3.,100, -5., 5.));
377  add(h, new TH1F( ("pulltrkz_"+types[t]).c_str(),"normalized z-residuals (track vs vertex)", 100, -5., 5.));
378  add(h, new TH1F( ("sigmatrkz0_"+types[t]).c_str(),"z-resolution (excluding beam)", 100, 0., 5.));
379  add(h, new TH1F( ("sigmatrkz_"+types[t]).c_str(),"z-resolution (including beam)", 100,0., 5.));
380  add(h, new TH1F( ("nbarrelhits_"+types[t]).c_str(),"number of pixel barrel hits", 10, 0., 10.));
381  add(h, new TH1F( ("nbarrelLayers_"+types[t]).c_str(),"number of pixel barrel layers", 10, 0., 10.));
382  add(h, new TH1F( ("nPxLayers_"+types[t]).c_str(),"number of pixel layers (barrel+endcap)", 10, 0., 10.));
383  add(h, new TH1F( ("nSiLayers_"+types[t]).c_str(),"number of Tracker layers ", 20, 0., 20.));
384  add(h, new TH1F( ("trackAlgo_"+types[t]).c_str(),"track algorithm ", 30, 0., 30.));
385  add(h, new TH1F( ("trackQuality_"+types[t]).c_str(),"track quality ", 7, -1., 6.));
386  }
387  add(h, new TH1F("trackWt","track weight in vertex",100,0., 1.));
388 
389  h["nrectrk"]->StatOverflows(kTRUE);
390  h["nrectrk"]->StatOverflows(kTRUE);
391  h["nrectrk0vtx"]->StatOverflows(kTRUE);
392  h["nseltrk0vtx"]->StatOverflows(kTRUE);
393  h["nrecsimtrk"]->StatOverflows(kTRUE);
394  h["nrecnosimtrk"]->StatOverflows(kTRUE);
395  h["nseltrk"]->StatOverflows(kTRUE);
396  h["nbtksinvtx"]->StatOverflows(kTRUE);
397  h["nbtksinvtxPU"]->StatOverflows(kTRUE);
398  h["nbtksinvtxTag"]->StatOverflows(kTRUE);
399  h["nbtksinvtx2"]->StatOverflows(kTRUE);
400  h["nbtksinvtxPU2"]->StatOverflows(kTRUE);
401  h["nbtksinvtxTag2"]->StatOverflows(kTRUE);
402 
403  // pile-up and track assignment related histograms (MC)
404  h["npu0"] =new TH1F("npu0","Number of simulated vertices",40,0.,40.);
405  h["npu1"] =new TH1F("npu1","Number of simulated vertices with >0 track",40,0.,40.);
406  h["npu2"] =new TH1F("npu2","Number of simulated vertices with >1 track",40,0.,40.);
407  h["nrecv"] =new TH1F("nrecv","# of reconstructed vertices", 40, 0, 40);
408  add(h,new TH2F("nrecvsnpu","#rec vertices vs number of sim vertices with >0 tracks", 40, 0., 40, 40, 0, 40));
409  add(h,new TH2F("nrecvsnpu2","#rec vertices vs number of sim vertices with >1 tracks", 40, 0., 40, 40, 0, 40));
410  add(h,new TH1F("sumpt","sumpt of simulated tracks",100,0.,100.));
411  add(h,new TH1F("sumptSignal","sumpt of simulated tracks in Signal events",100,0.,200.));
412  add(h,new TH1F("sumptPU","sumpt of simulated tracks in PU events",100,0.,200.));
413  add(h,new TH1F("sumpt2rec","sumpt2 of reconstructed and matched tracks",100,0.,100.));
414  add(h,new TH1F("sumpt2","sumpt2 of simulated tracks",100,0.,100.));
415  add(h,new TH1F("sumpt2Signal","sumpt2 of simulated tracks in Signal events",100,0.,200.));
416  add(h,new TH1F("sumpt2PU","sumpt2 of simulated tracks in PU events",100,0.,200.));
417  add(h,new TH1F("sumpt2rec","sumpt2 of reconstructed and matched tracks",100,0.,100.));
418  add(h,new TH1F("sumpt2recSignal","sumpt2 of reconstructed and matched tracks in Signal events",100,0.,200.));
419  add(h,new TH1F("sumpt2recPU","sumpt2 of reconstructed and matched tracks in PU events",100,0.,200.));
420  add(h,new TH1F("nRecTrkInSimVtx","number of reco tracks matched to sim-vertex", 101, 0., 100));
421  add(h,new TH1F("nRecTrkInSimVtxSignal","number of reco tracks matched to signal sim-vertex", 101, 0., 100));
422  add(h,new TH1F("nRecTrkInSimVtxPU","number of reco tracks matched to PU-vertex", 101, 0., 100));
423  add(h,new TH1F("nPrimRecTrkInSimVtx","number of reco primary tracks matched to sim-vertex", 101, 0., 100));
424  add(h,new TH1F("nPrimRecTrkInSimVtxSignal","number of reco primary tracks matched to signal sim-vertex", 101, 0., 100));
425  add(h,new TH1F("nPrimRecTrkInSimVtxPU","number of reco primary tracks matched to PU-vertex", 101, 0., 100));
426  // obsolete, scheduled for removal
427  add(h,new TH1F("recPurity","track purity of reconstructed vertices", 101, 0., 1.01));
428  add(h,new TH1F("recPuritySignal","track purity of reconstructed Signal vertices", 101, 0., 1.01));
429  add(h,new TH1F("recPurityPU","track purity of reconstructed PU vertices", 101, 0., 1.01));
430  // end of obsolete
431  add(h,new TH1F("recmatchPurity","track purity of all vertices", 101, 0., 1.01));
432  add(h,new TH1F("recmatchPurityTag","track purity of tagged vertices", 101, 0., 1.01));
433  add(h,new TH1F("recmatchPurityTagSignal","track purity of tagged Signal vertices", 101, 0., 1.01));
434  add(h,new TH1F("recmatchPurityTagPU","track purity of tagged PU vertices", 101, 0., 1.01));
435  add(h,new TH1F("recmatchPuritynoTag","track purity of untagged vertices", 101, 0., 1.01));
436  add(h,new TH1F("recmatchPuritynoTagSignal","track purity of untagged Signal vertices", 101, 0., 1.01));
437  add(h,new TH1F("recmatchPuritynoTagPU","track purity of untagged PU vertices", 101, 0., 1.01));
438  add(h,new TH1F("recmatchvtxs","number of sim vertices contributing to recvtx", 10, 0., 10.));
439  add(h,new TH1F("recmatchvtxsTag","number of sim vertices contributing to recvtx", 10, 0., 10.));
440  add(h,new TH1F("recmatchvtxsnoTag","number of sim vertices contributing to recvtx", 10, 0., 10.));
441 
442  add(h,new TH1F("trkAssignmentEfficiency", "track to vertex assignment efficiency", 101, 0., 1.01) );
443  add(h,new TH1F("trkAssignmentEfficiencySignal", "track to signal vertex assignment efficiency", 101, 0., 1.01) );
444  add(h,new TH1F("trkAssignmentEfficiencyPU", "track to PU vertex assignment efficiency", 101, 0., 1.01) );
445  add(h,new TH1F("primtrkAssignmentEfficiency", "track to vertex assignment efficiency", 101, 0., 1.01) );
446  add(h,new TH1F("primtrkAssignmentEfficiencySignal", "track to signal vertex assignment efficiency", 101, 0., 1.01) );
447  add(h,new TH1F("primtrkAssignmentEfficiencyPU", "track to PU vertex assignment efficiency", 101, 0., 1.01) );
448  add(h,new TH1F("vtxMultiplicity", "number of rec vertices containg tracks from one true vertex", 10, 0., 10.) );
449  add(h,new TH1F("vtxMultiplicitySignal", "number of rec vertices containg tracks from the Signal Vertex", 10, 0., 10.) );
450  add(h,new TH1F("vtxMultiplicityPU", "number of rec vertices containg tracks from a PU Vertex", 10, 0., 10.) );
451 
452  add(h,new TProfile("vtxFindingEfficiencyVsNtrk","finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
453  add(h,new TProfile("vtxFindingEfficiencyVsNtrkSignal","Signal vertex finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
454  add(h,new TProfile("vtxFindingEfficiencyVsNtrkPU","PU vertex finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
455 
456  add(h,new TH1F("TagVtxTrkPurity","TagVtxTrkPurity",100,0.,1.01));
457  add(h,new TH1F("TagVtxTrkEfficiency","TagVtxTrkEfficiency",100,0.,1.01));
458 
459  add(h,new TH1F("matchVtxFraction","fraction of sim vertex tracks found in a recvertex",101,0,1.01));
460  add(h,new TH1F("matchVtxFractionSignal","fraction of sim vertex tracks found in a recvertex",101,0,1.01));
461  add(h,new TH1F("matchVtxFractionPU","fraction of sim vertex tracks found in a recvertex",101,0,1.01));
462  add(h,new TH1F("matchVtxFractionCum","fraction of sim vertex tracks found in a recvertex",101,0,1.01));
463  add(h,new TH1F("matchVtxFractionCumSignal","fraction of sim vertexs track found in a recvertex",101,0,1.01));
464  add(h,new TH1F("matchVtxFractionCumPU","fraction of sim vertex tracks found in a recvertex",101,0,1.01));
465  add(h,new TH1F("matchVtxEfficiency","efficiency for finding matching rec vertex",2,-0.5,1.5));
466  add(h,new TH1F("matchVtxEfficiencySignal","efficiency for finding matching rec vertex",2,-0.5,1.5));
467  add(h,new TH1F("matchVtxEfficiencyPU","efficiency for finding matching rec vertex",2,-0.5,1.5));
468  add(h,new TH1F("matchVtxEfficiency2","efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
469  add(h,new TH1F("matchVtxEfficiency2Signal","efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
470  add(h,new TH1F("matchVtxEfficiency2PU","efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
471  add(h,new TH1F("matchVtxEfficiency5","efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
472  add(h,new TH1F("matchVtxEfficiency5Signal","efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
473  add(h,new TH1F("matchVtxEfficiency5PU","efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
474 
475  add(h,new TH1F("matchVtxEfficiencyZ","efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
476  add(h,new TH1F("matchVtxEfficiencyZSignal","efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
477  add(h,new TH1F("matchVtxEfficiencyZPU","efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
478 
479  add(h,new TH1F("matchVtxEfficiencyZ1","efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
480  add(h,new TH1F("matchVtxEfficiencyZ1Signal","efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
481  add(h,new TH1F("matchVtxEfficiencyZ1PU","efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
482 
483  add(h,new TH1F("matchVtxEfficiencyZ2","efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
484  add(h,new TH1F("matchVtxEfficiencyZ2Signal","efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
485  add(h,new TH1F("matchVtxEfficiencyZ2PU","efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
486 
487  add(h,new TH1F("matchVtxZ","z distance to matched recvtx",100, -0.1, 0.1));
488  add(h,new TH1F("matchVtxZPU","z distance to matched recvtx",100, -0.1, 0.1));
489  add(h,new TH1F("matchVtxZSignal","z distance to matched recvtx",100, -0.1, 0.1));
490 
491  add(h,new TH1F("matchVtxZCum","z distance to matched recvtx",1001,0, 1.01));
492  add(h,new TH1F("matchVtxZCumSignal","z distance to matched recvtx",1001,0, 1.01));
493  add(h,new TH1F("matchVtxZCumPU","z distance to matched recvtx",1001,0, 1.01));
494 
495  add(h,new TH1F("unmatchedVtx","number of unmatched rec vertices (fakes)",10,0.,10.));
496  add(h,new TH1F("unmatchedVtxFrac","fraction of unmatched rec vertices (fakes)",1000,0.,1.0));
497  add(h,new TH1F("unmatchedVtxZ","z of unmached rec vertices (fakes)",100,-20., 20.));
498  add(h,new TH1F("unmatchedVtxNdof","ndof of unmatched rec vertices (fakes)", 500,0., 100.));
499  add(h,new TH2F("correctlyassigned","pt and eta of correctly assigned tracks", 60, -3., 3., 100, 0, 10.));
500  add(h,new TH2F("misassigned","pt and eta of mis assigned tracks", 60, -3., 3., 100, 0, 10.));
501 
502  //efficiency plots based on mc-true information
503  add(h,new TProfile("effvszsep","efficiency vs true z-separation",500, 0., 10., 0, 1.));
504  add(h,new TProfile("effwodvszsep","efficiency w/o double-counting vs true z-separation",500, 0., 10., 0, 1.));
505  add(h,new TProfile("mergedvszsep","merge rate vs true z-separation",500, 0., 10., 0, 1.));
506  add(h,new TProfile("splitvszsep","split rate vs true z-separation",500, 0., 10., 0, 1.));
507  add(h,new TProfile("tveffvszsep","efficiency vs true z-separation",500, 0., 10., 0, 1.));
508  add(h,new TProfile("tveffwodvszsep","efficiency w/o double-counting vs true z-separation",500, 0., 10., 0, 1.));
509  add(h,new TProfile("tvmergedvszsep","merge rate vs true z-separation",500, 0., 10., 0, 1.));
510 
511  add(h,new TH1F("ptcat","pt of correctly assigned tracks", 100, 0, 10.));
512  add(h,new TH1F("etacat","eta of correctly assigned tracks", 60, -3., 3.));
513  add(h,new TH1F("phicat","phi of correctly assigned tracks", 100, -3.14159, 3.14159));
514  add(h,new TH1F("dzcat","dz of correctly assigned tracks", 100, 0., 1.));
515 
516  add(h,new TH1F("ptmis","pt of mis-assigned tracks", 100, 0, 10.));
517  add(h,new TH1F("etamis","eta of mis-assigned tracks", 60, -3., 3.));
518  add(h,new TH1F("phimis","phi of mis-assigned tracks",100, -3.14159, 3.14159));
519  add(h,new TH1F("dzmis","dz of mis-assigned tracks", 100, 0., 1.));
520 
521 
522  add(h,new TH1F("Tc","Tc computed with Truth matched Reco Tracks",100,0.,20.));
523  add(h,new TH1F("TcSignal","Tc of signal vertices computed with Truth matched Reco Tracks",100,0.,20.));
524  add(h,new TH1F("TcPU","Tc of PU vertices computed with Truth matched Reco Tracks",100,0.,20.));
525 
526  add(h,new TH1F("logTc","log Tc computed with Truth matched Reco Tracks",100,-2.,8.));
527  add(h,new TH1F("logTcSignal","log Tc of signal vertices computed with Truth matched Reco Tracks",100,-2.,8.));
528  add(h,new TH1F("logTcPU","log Tc of PU vertices computed with Truth matched Reco Tracks",100,-2.,8.));
529 
530  add(h,new TH1F("xTc","Tc of merged clusters",100,0.,20.));
531  add(h,new TH1F("xTcSignal","Tc of signal vertices merged with PU",100,0.,20.));
532  add(h,new TH1F("xTcPU","Tc of merged PU vertices",100,0.,20.));
533 
534  add(h,new TH1F("logxTc","log Tc merged vertices",100,-2.,8.));
535  add(h,new TH1F("logxTcSignal","log Tc of signal vertices merged with PU",100,-2.,8.));
536  add(h,new TH1F("logxTcPU","log Tc of merged PU vertices ",100,-2.,8.));
537 
538  add(h,new TH1F("logChisq","Chisq/ntrk computed with Truth matched Reco Tracks",100,-2.,8.));
539  add(h,new TH1F("logChisqSignal","Chisq/ntrk of signal vertices computed with Truth matched Reco Tracks",100,-2.,8.));
540  add(h,new TH1F("logChisqPU","Chisq/ntrk of PU vertices computed with Truth matched Reco Tracks",100,-2.,8.));
541 
542  add(h,new TH1F("logxChisq","Chisq/ntrk of merged clusters",100,-2.,8.));
543  add(h,new TH1F("logxChisqSignal","Chisq/ntrk of signal vertices merged with PU",100,-2.,8.));
544  add(h,new TH1F("logxChisqPU","Chisq/ntrk of merged PU vertices",100,-2.,8.));
545 
546  add(h,new TH1F("Chisq","Chisq/ntrk computed with Truth matched Reco Tracks",100,0.,20.));
547  add(h,new TH1F("ChisqSignal","Chisq/ntrk of signal vertices computed with Truth matched Reco Tracks",100,0.,20.));
548  add(h,new TH1F("ChisqPU","Chisq/ntrk of PU vertices computed with Truth matched Reco Tracks",100,0.,20.));
549 
550  add(h,new TH1F("xChisq","Chisq/ntrk of merged clusters",100,0.,20.));
551  add(h,new TH1F("xChisqSignal","Chisq/ntrk of signal vertices merged with PU",100,0.,20.));
552  add(h,new TH1F("xChisqPU","Chisq/ntrk of merged PU vertices",100,0.,20.));
553 
554  add(h,new TH1F("dzmax","dzmax computed with Truth matched Reco Tracks",100,0.,2.));
555  add(h,new TH1F("dzmaxSignal","dzmax of signal vertices computed with Truth matched Reco Tracks",100,0.,2.));
556  add(h,new TH1F("dzmaxPU","dzmax of PU vertices computed with Truth matched Reco Tracks",100,0.,2.));
557 
558  add(h,new TH1F("xdzmax","dzmax of merged clusters",100,0.,2.));
559  add(h,new TH1F("xdzmaxSignal","dzmax of signal vertices merged with PU",100,0.,2.));
560  add(h,new TH1F("xdzmaxPU","dzmax of merged PU vertices",100,0.,2.));
561 
562  add(h,new TH1F("dztrim","dzmax computed with Truth matched Reco Tracks",100,0.,2.));
563  add(h,new TH1F("dztrimSignal","dzmax of signal vertices computed with Truth matched Reco Tracks",100,0.,2.));
564  add(h,new TH1F("dztrimPU","dzmax of PU vertices computed with Truth matched Reco Tracks",100,0.,2.));
565 
566  add(h,new TH1F("xdztrim","dzmax of merged clusters",100,0.,2.));
567  add(h,new TH1F("xdztrimSignal","dzmax of signal vertices merged with PU",100,0.,2.));
568  add(h,new TH1F("xdztrimPU","dzmax of merged PU vertices",100,0.,2.));
569 
570  add(h,new TH1F("m4m2","m4m2 computed with Truth matched Reco Tracks",100,0.,100.));
571  add(h,new TH1F("m4m2Signal","m4m2 of signal vertices computed with Truth matched Reco Tracks",100,0.,100.));
572  add(h,new TH1F("m4m2PU","m4m2 of PU vertices computed with Truth matched Reco Tracks",100,0.,100.));
573 
574  add(h,new TH1F("xm4m2","m4m2 of merged clusters",100,0.,100.));
575  add(h,new TH1F("xm4m2Signal","m4m2 of signal vertices merged with PU",100,0.,100.));
576  add(h,new TH1F("xm4m2PU","m4m2 of merged PU vertices",100,0.,100.));
577 
578  return h;
579 }
580 
581 
582 //
583 // member functions
584 //
586  std::cout << " PrimaryVertexAnalyzer4PU::beginJob conversion from sim units to rec units is " << simUnit_ << std::endl;
587 
588  rootFile_->cd();
589 
590  TDirectory *noBS = rootFile_->mkdir("noBS");
591  noBS->cd();
593  for(std::map<std::string,TH1*>::const_iterator hist=hnoBS.begin(); hist!=hnoBS.end(); hist++){
594  hist->second->SetDirectory(noBS);
595  }
596 
597  TDirectory *withBS = rootFile_->mkdir("BS");
598  withBS->cd();
600  for(std::map<std::string,TH1*>::const_iterator hist=hBS.begin(); hist!=hBS.end(); hist++){
601  hist->second->SetDirectory(withBS);
602  }
603 
604  TDirectory *DA = rootFile_->mkdir("DA");
605  DA->cd();
607  for(std::map<std::string,TH1*>::const_iterator hist=hDA.begin(); hist!=hDA.end(); hist++){
608  hist->second->SetDirectory(DA);
609  }
610 
611  rootFile_->cd();
612  hsimPV["rapidity"] = new TH1F("rapidity","rapidity ",100,-10., 10.);
613  hsimPV["chRapidity"] = new TH1F("chRapidity","charged rapidity ",100,-10., 10.);
614  hsimPV["recRapidity"] = new TH1F("recRapidity","reconstructed rapidity ",100,-10., 10.);
615  hsimPV["pt"] = new TH1F("pt","pt ",100,0., 20.);
616 
617  hsimPV["xsim"] = new TH1F("xsim","simulated x",100,-0.01,0.01); // 0.01cm = 100 um
618  hsimPV["ysim"] = new TH1F("ysim","simulated y",100,-0.01,0.01);
619  hsimPV["zsim"] = new TH1F("zsim","simulated z",100,-20.,20.);
620 
621  hsimPV["xsim1"] = new TH1F("xsim1","simulated x",100,-4.,4.);
622  hsimPV["ysim1"] = new TH1F("ysim1","simulated y",100,-4.,4.);
623  hsimPV["zsim1"] = new TH1F("zsim1","simulated z",100,-40.,40.);
624 
625  add(hsimPV, new TH1F("xsim2PU","simulated x (Pile-up)",100,-1.,1.));
626  add(hsimPV, new TH1F("ysim2PU","simulated y (Pile-up)",100,-1.,1.));
627  add(hsimPV, new TH1F("zsim2PU","simulated z (Pile-up)",100,-20.,20.));
628  add(hsimPV, new TH1F("xsim2Signal","simulated x (Signal)",100,-1.,1.));
629  add(hsimPV, new TH1F("ysim2Signal","simulated y (Signal)",100,-1.,1.));
630  add(hsimPV, new TH1F("zsim2Signal","simulated z (Signal)",100,-20.,20.));
631 
632  hsimPV["xsim2"] = new TH1F("xsim2","simulated x",100,-1,1); // 0.01cm = 100 um
633  hsimPV["ysim2"] = new TH1F("ysim2","simulated y",100,-1,1);
634  hsimPV["zsim2"] = new TH1F("zsim2","simulated z",100,-20.,20.);
635  hsimPV["xsim3"] = new TH1F("xsim3","simulated x",100,-0.1,0.1); // 0.01cm = 100 um
636  hsimPV["ysim3"] = new TH1F("ysim3","simulated y",100,-0.1,0.1);
637  hsimPV["zsim3"] = new TH1F("zsim3","simulated z",100,-20.,20.);
638  hsimPV["xsimb"] = new TH1F("xsimb","simulated x",100,-0.01,0.01); // 0.01cm = 100 um
639  hsimPV["ysimb"] = new TH1F("ysimb","simulated y",100,-0.01,0.01);
640  hsimPV["zsimb"] = new TH1F("zsimb","simulated z",100,-20.,20.);
641  hsimPV["xsimb1"] = new TH1F("xsimb1","simulated x",100,-0.1,0.1); // 0.01cm = 100 um
642  hsimPV["ysimb1"] = new TH1F("ysimb1","simulated y",100,-0.1,0.1);
643  hsimPV["zsimb1"] = new TH1F("zsimb1","simulated z",100,-20.,20.);
644  add(hsimPV, new TH1F("xbeam","beamspot x",100,-1.,1.));
645  add(hsimPV, new TH1F("ybeam","beamspot y",100,-1.,1.));
646  add(hsimPV, new TH1F("zbeam","beamspot z",100,-1.,1.));
647  add(hsimPV, new TH1F("wxbeam","beamspot sigma x",100,-1.,1.));
648  add(hsimPV, new TH1F("wybeam","beamspot sigma y",100,-1.,1.));
649  add(hsimPV, new TH1F("wzbeam","beamspot sigma z",100,-1.,1.));
650  hsimPV["xsim2"]->StatOverflows(kTRUE);
651  hsimPV["ysim2"]->StatOverflows(kTRUE);
652  hsimPV["zsim2"]->StatOverflows(kTRUE);
653  hsimPV["xsimb"]->StatOverflows(kTRUE);
654  hsimPV["ysimb"]->StatOverflows(kTRUE);
655  hsimPV["zsimb"]->StatOverflows(kTRUE);
656  hsimPV["nsimvtx"] = new TH1F("nsimvtx","# of simulated vertices", 50, -0.5, 49.5);
657  hsimPV["nbsimtksinvtx"]= new TH1F("nbsimtksinvtx","simulated tracks in vertex",100,-0.5,99.5);
658  hsimPV["nbsimtksinvtx"]->StatOverflows(kTRUE);
659 }
660 
662  std::cout << "this is void PrimaryVertexAnalyzer4PU::endJob() " << std::endl;
663  //cumulate some histos
664  double sumDA=0,sumBS=0,sumnoBS=0;
665  for(int i=101; i>0; i--){
666  sumDA+=hDA["matchVtxFractionSignal"]->GetBinContent(i)/hDA["matchVtxFractionSignal"]->Integral();
667  hDA["matchVtxFractionCumSignal"]->SetBinContent(i,sumDA);
668  sumBS+=hBS["matchVtxFractionSignal"]->GetBinContent(i)/hBS["matchVtxFractionSignal"]->Integral();
669  hBS["matchVtxFractionCumSignal"]->SetBinContent(i,sumBS);
670  sumnoBS+=hnoBS["matchVtxFractionSignal"]->GetBinContent(i)/hnoBS["matchVtxFractionSignal"]->Integral();
671  hnoBS["matchVtxFractionCumSignal"]->SetBinContent(i,sumnoBS);
672  }
673  sumDA=0,sumBS=0,sumnoBS=0;
674  for(int i=1; i<1001; i++){
675  sumDA+=hDA["abszdistancetag"]->GetBinContent(i);
676  hDA["abszdistancetagcum"]->SetBinContent(i,sumDA/float(hDA["abszdistancetag"]->GetEntries()));
677  sumBS+=hBS["abszdistancetag"]->GetBinContent(i);
678  hBS["abszdistancetagcum"]->SetBinContent(i,sumBS/float(hBS["abszdistancetag"]->GetEntries()));
679  sumnoBS+=hnoBS["abszdistancetag"]->GetBinContent(i);
680  hnoBS["abszdistancetagcum"]->SetBinContent(i,sumnoBS/float(hnoBS["abszdistancetag"]->GetEntries()));
681  }
682 
683  Cumulate(hBS["matchVtxZCum"]); Cumulate(hBS["matchVtxZCumSignal"]); Cumulate(hBS["matchVtxZCumPU"]);
684  Cumulate(hnoBS["matchVtxZCum"]); Cumulate(hnoBS["matchVtxZCumSignal"]); Cumulate(hnoBS["matchVtxZCumPU"]);
685  Cumulate(hDA["matchVtxZCum"]); Cumulate(hDA["matchVtxZCumSignal"]); Cumulate(hDA["matchVtxZCumPU"]);
686 
687  // make a reference for ndofnr2
688  double p;
689  for(int i=1; i<501; i++){
690  if(hDA["vtxndf"]->GetEntries()>0){
691  p= hDA["vtxndf"]->Integral(i,501)/hDA["vtxndf"]->GetEntries(); hDA["vtxndfc"]->SetBinContent(i,p*hDA["vtxndf"]->GetBinContent(i));
692  }
693  if(hBS["vtxndf"]->GetEntries()>0){
694  p= hBS["vtxndf"]->Integral(i,501)/hBS["vtxndf"]->GetEntries(); hBS["vtxndfc"]->SetBinContent(i,p*hBS["vtxndf"]->GetBinContent(i));
695  }
696  if(hnoBS["vtxndf"]->GetEntries()>0){
697  p=hnoBS["vtxndf"]->Integral(i,501)/hnoBS["vtxndf"]->GetEntries(); hnoBS["vtxndfc"]->SetBinContent(i,p*hnoBS["vtxndf"]->GetBinContent(i));
698  }
699  }
700 
701  rootFile_->cd();
702  for(std::map<std::string,TH1*>::const_iterator hist=hsimPV.begin(); hist!=hsimPV.end(); hist++){
703  std::cout << "writing " << hist->first << std::endl;
704  hist->second->Write();
705  }
706  rootFile_->Write();
707  std::cout << "PrimaryVertexAnalyzer4PU::endJob: done" << std::endl;
708 }
709 
710 
711 // helper functions
712 std::vector<PrimaryVertexAnalyzer4PU::SimPart> PrimaryVertexAnalyzer4PU::getSimTrkParameters(
715  double simUnit)
716 {
717  std::vector<SimPart > tsim;
718  if(simVtcs->begin()==simVtcs->end()){
719  if(verbose_){
720  cout << " PrimaryVertexAnalyzer4PU::getSimTrkParameters no simvtcs" << endl;
721  }
722  return tsim;
723  }
724  if(verbose_){
725  cout << " PrimaryVertexAnalyzer4PU::getSimTrkParameters simVtcs n=" << simVtcs->size() << endl;
726  cout << " PrimaryVertexAnalyzer4PU::getSimTrkParameters 1st position" << setw(8) << setprecision(4) << simVtcs->begin()->position() << endl;
727  }
728  double t0=simVtcs->begin()->position().e();
729 
730  for(edm::SimTrackContainer::const_iterator t=simTrks->begin();
731  t!=simTrks->end(); ++t){
732  if (t->noVertex()){
733  std::cout << "simtrk has no vertex" << std::endl;
734  }else{
735  // get the vertex position
736  math::XYZTLorentzVectorD v((*simVtcs)[t->vertIndex()].position().x(),
737  (*simVtcs)[t->vertIndex()].position().y(),
738  (*simVtcs)[t->vertIndex()].position().z(),
739  (*simVtcs)[t->vertIndex()].position().e());
740  int pdgCode=t->type();
741 
742  if( pdgCode==-99 ){
743  // such entries cause crashes, no idea what they are
744  std::cout << "funny particle skipped , code=" << pdgCode << std::endl;
745  }else{
746  double Q=0;
747  if ((pdgCode==11)||(pdgCode==13)||(pdgCode==15)||(pdgCode==-211)||(pdgCode==-2212)||(pdgCode==-321)||(pdgCode==-3222)){Q=-1;}
748  else if((pdgCode==-11)||(pdgCode==-13)||(pdgCode==-15)||(pdgCode==211)||(pdgCode==2212)||(pdgCode==321)||(pdgCode==3222)){Q=1;}
749  else {
750  }
751  math::XYZTLorentzVectorD p(t->momentum().x(),t->momentum().y(),t->momentum().z(),t->momentum().e());
752  if ( (Q != 0) && (p.pt()>0.1) && (fabs(t->momentum().eta())<3.0)
753  && fabs(v.z()*simUnit<20) && (sqrt(v.x()*v.x()+v.y()*v.y())<10.)){
754  double x0=v.x()*simUnit;
755  double y0=v.y()*simUnit;
756  double z0=v.z()*simUnit;
757  double kappa=-Q*0.002998*fBfield_/p.pt();
758  double D0=x0*sin(p.phi())-y0*cos(p.phi())-0.5*kappa*(x0*x0+y0*y0);
759  double q=sqrt(1.-2.*kappa*D0);
760  double s0=(x0*cos(p.phi())+y0*sin(p.phi()))/q;
761  double s1;
762  if (fabs(kappa*s0)>0.001){
763  s1=asin(kappa*s0)/kappa;
764  }else{
765  double ks02=(kappa*s0)*(kappa*s0);
766  s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*pow(ks02,3));
767  }
768  SimPart sp;//ParameterVector par;
769  sp.par[reco::TrackBase::i_qoverp] = Q/p.P();
770  sp.par[reco::TrackBase::i_lambda] = M_PI/2.-p.theta();
771  sp.par[reco::TrackBase::i_phi] = p.phi()-asin(kappa*s0);
772  sp.par[reco::TrackBase::i_dxy] = -2.*D0/(1.+q);
773  sp.par[reco::TrackBase::i_dsz] = z0*sin(p.theta())-s1*cos(p.theta());
774 
775  sp.pdg=pdgCode;
776  if (v.t()-t0<1e-15){
777  sp.type=0; // primary
778  }else{
779  sp.type=1; //secondary
780  }
781 
782  // now get zpca (get perigee wrt beam)
783  double x1=x0-0.033; double y1=y0-0.; // FIXME how do we get the simulated beam position?
784  D0=x1*sin(p.phi())-y1*cos(p.phi())-0.5*kappa*(x1*x1+y1*y1);
785  q=sqrt(1.-2.*kappa*D0);
786  s0=(x1*cos(p.phi())+y1*sin(p.phi()))/q;
787  if (fabs(kappa*s0)>0.001){
788  s1=asin(kappa*s0)/kappa;
789  }else{
790  double ks02=(kappa*s0)*(kappa*s0);
791  s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*pow(ks02,3));
792  }
793  sp.ddcap=-2.*D0/(1.+q);
794  sp.zdcap=z0-s1/tan(p.theta());
795  sp.zvtx=z0;
796  sp.xvtx=x0;
797  sp.yvtx=y0;
798 
799  tsim.push_back(sp);
800  }
801  }
802  }// has vertex
803  }//for loop
804  return tsim;
805 }
806 
807 namespace {
808  struct Array2D {
809  Array2D(size_t iN, size_t iM):
810  m_step(iM),m_array(new double[iN*iM]) {}
811 
812  double& operator()(size_t iN, size_t iM) {
813  return m_array[iN*m_step+iM];
814  }
815 
816  double operator()(size_t iN, size_t iM) const {
817  return m_array[iN*m_step+iM];
818  }
819 
820  size_t m_step;
821  std::unique_ptr<double[]> m_array;
822  };
823 }
824 
825 std::vector<int> PrimaryVertexAnalyzer4PU::supf(std::vector<SimPart>& simtrks, const reco::TrackCollection & trks){
826  const unsigned int nsim=simtrks.size();
827  const unsigned int nrec=trks.size();
828  std::vector<int> rectosim(nrec); // pointer to associated simtrk
829  Array2D pij(nrec,nsim);
830  double mu=100.; // initial chi^2 cut-off (5 dofs !)
831  int nmatch=0;
832  int i=0;
833  for(reco::TrackCollection::const_iterator t=trks.begin(); t!=trks.end(); ++t){
834  rectosim[i]=-1;
835  ParameterVector par = t->parameters();
836  reco::TrackBase::CovarianceMatrix S = t->covariance();
837  S.Invert();
838  for(unsigned int j=0; j<nsim; j++){
839  simtrks[j].rec=-1;
840  SimPart s=simtrks[j];
841  double c=0;
842  for(unsigned int k=0; k<5; k++){
843  for(unsigned int l=0; l<5; l++){
844  c+=(par(k)-s.par[k])*(par(l)-s.par[l])*S(k,l);
845  }
846  }
847  pij(i,j)=exp(-0.5*c);
848  }
849  i++;
850  }
851 
852  for(unsigned int k=0; k<nrec; k++){
853  int imatch=-1; int jmatch=-1;
854  double pmatch=0;
855  for(unsigned int j=0; j<nsim; j++){
856  if ((simtrks[j].rec)<0){
857  double psum=exp(-0.5*mu); //cutoff
858  for(unsigned int i=0; i<nrec; i++){
859  if (rectosim[i]<0){ psum+=pij(i,j);}
860  }
861  for(unsigned int i=0; i<nrec; i++){
862  if ((rectosim[i]<0)&&(pij(i,j)/psum>pmatch)){
863  pmatch=pij(i,j)/psum;
864  imatch=i; jmatch=j;
865  }
866  }
867  }
868  }// sim loop
869  if((jmatch>=0)||(imatch>=0)){
870  if (pmatch>0.01){
871  rectosim[imatch]=jmatch;
872  simtrks[jmatch].rec=imatch;
873  nmatch++;
874  }else if (match(simtrks[jmatch].par, trks.at(imatch).parameters())){
875  // accept it anyway if it matches crudely and relax the cut-off
876  rectosim[imatch]=jmatch;
877  simtrks[jmatch].rec=imatch;
878  nmatch++;
879  mu=mu*2;
880  }
881  }
882  }
883 
884  std::cout << "unmatched sim " << std::endl;
885  for(unsigned int j=0; j<nsim; j++){
886  if(simtrks[j].rec<0){
887  double pt= 1./simtrks[j].par[0]/tan(simtrks[j].par[1]);
888  if((fabs(pt))>1.){
889  std::cout << setw(3) << j << setw(8) << simtrks[j].pdg
890  << setw(8) << setprecision(4) << " (" << simtrks[j].xvtx << "," << simtrks[j].yvtx << "," << simtrks[j].zvtx << ")"
891  << " pt= " << pt
892  << " phi=" << simtrks[j].par[2]
893  << " eta= " << -log(tan(0.5*(M_PI/2-simtrks[j].par[1])))
894  << std::endl;
895  }
896  }
897  }
898  return rectosim;
899 }
900 
902  const ParameterVector &b){
903  double dqoverp =a(0)-b(0);
904  double dlambda =a(1)-b(1);
905  double dphi =a(2)-b(2);
906  double dsz =a(4)-b(4);
907  if (dphi>M_PI){ dphi-=M_2_PI; }else if(dphi<-M_PI){dphi+=M_2_PI;}
908  return ( (fabs(dqoverp)<0.2) && (fabs(dlambda)<0.02) && (fabs(dphi)<0.04) && (fabs(dsz)<1.0) );
909 }
910 
912  const reco::Vertex &vrec){
913  return (fabs(vsim.z*simUnit_-vrec.z())<zmatch_);
914 }
915 
917  double ctau=(pdt_->particle( abs(p->pdg_id()) ))->lifetime();
918  return ctau >0 && ctau <1e-6;
919 }
920 
922  return ( !p->end_vertex() && p->status()==1 );
923 }
924 
925 
927  const ParticleData * part = pdt_->particle( p->pdg_id() );
928  if (part){
929  return part->charge()!=0;
930  }else{
931  // the new/improved particle table doesn't know anti-particles
932  return pdt_->particle( -p->pdg_id() )!=0;
933  }
934 }
935 
936 void PrimaryVertexAnalyzer4PU::fillTrackHistos(std::map<std::string, TH1*> & h, const std::string & ttype, const reco::Track & t, const reco::Vertex * v){
937  Fill(h,"rapidity_"+ttype,t.eta());
938  Fill(h,"z0_"+ttype,t.vz());
939  Fill(h,"phi_"+ttype,t.phi());
940  Fill(h,"eta_"+ttype,t.eta());
941  Fill(h,"pt_"+ttype,t.pt());
942  Fill(h,"found_"+ttype,t.found());
943  Fill(h,"lost_"+ttype,t.lost());
944  Fill(h,"nchi2_"+ttype,t.normalizedChi2());
945  Fill(h,"rstart_"+ttype,(t.innerPosition()).Rho());
946 
947  double d0Error=t.d0Error();
948  double d0=t.dxy(vertexBeamSpot_.position());
949  if (d0Error>0){
950  Fill(h,"logtresxy_"+ttype,log(d0Error/0.0001)/log(10.));
951  Fill(h,"tpullxy_"+ttype,d0/d0Error);
952  }
953  double dzError=t.dzError();
954  if(dzError>0){
955  Fill(h,"logtresz_"+ttype,log(dzError/0.0001)/log(10.));
956  }
957 
958  Fill(h,"sigmatrkz_"+ttype,sqrt(pow(t.dzError(),2)+wxy2_/pow(tan(t.theta()),2)));
959  Fill(h,"sigmatrkz0_"+ttype,t.dzError());
960 
961  // track vs vertex
962  if((! (v==NULL)) && (v->ndof()>10.)) {
963  // emulate clusterizer input
964  TransientTrack tt = theB_->build(&t); tt.setBeamSpot(vertexBeamSpot_); // need the setBeamSpot !
965  double z=(tt.stateAtBeamLine().trackStateAtPCA()).position().z();
966  double tantheta=tan((tt.stateAtBeamLine().trackStateAtPCA()).momentum().theta());
967  double dz2= pow(tt.track().dzError(),2)+wxy2_/pow(tantheta,2);
968 
969  Fill(h,"restrkz_"+ttype,z-v->position().z());
970  Fill(h,"restrkzvsphi_"+ttype,t.phi(), z-v->position().z());
971  Fill(h,"restrkzvseta_"+ttype,t.eta(), z-v->position().z());
972  Fill(h,"pulltrkzvsphi_"+ttype,t.phi(), (z-v->position().z())/sqrt(dz2));
973  Fill(h,"pulltrkzvseta_"+ttype,t.eta(), (z-v->position().z())/sqrt(dz2));
974 
975  Fill(h,"pulltrkz_"+ttype,(z-v->position().z())/sqrt(dz2));
976  }
977 
978  // collect some info on hits and clusters
979  Fill(h, "nbarrelLayers_" + ttype, t.hitPattern().pixelBarrelLayersWithMeasurement());
980  Fill(h, "nPxLayers_" + ttype, t.hitPattern().pixelLayersWithMeasurement());
981  Fill(h, "nSiLayers_" + ttype ,t.hitPattern().trackerLayersWithMeasurement());
982  Fill(h, "expectedInner_" + ttype, t.hitPattern().numberOfHits(HitPattern::MISSING_INNER_HITS));
983  Fill(h, "expectedOuter_" + ttype, t.hitPattern().numberOfHits(HitPattern::MISSING_OUTER_HITS));
984  Fill(h, "trackAlgo_" + ttype, t.algo());
985  Fill(h, "trackQuality_" + ttype, t.qualityMask());
986 
987  int longesthit=0, nbarrel=0;
989  if ((**hit).isValid() && (**hit).geographicalId().det() == DetId::Tracker ){
990  bool barrel = DetId((**hit).geographicalId()).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel);
991  if (barrel){
992  const SiPixelRecHit *pixhit = dynamic_cast<const SiPixelRecHit*>( &(**hit));
993  edm::Ref<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster> const& clust = (*pixhit).cluster();
994  if (clust.isNonnull()) {
995  nbarrel++;
996  if (clust->sizeY()-longesthit>0) longesthit=clust->sizeY();
997  if (clust->sizeY()>20.){
998  Fill(h,"lvseta_"+ttype,t.eta(), 19.9);
999  Fill(h,"lvstanlambda_"+ttype,tan(t.lambda()), 19.9);
1000  }else{
1001  Fill(h,"lvseta_"+ttype,t.eta(), float(clust->sizeY()));
1002  Fill(h,"lvstanlambda_"+ttype,tan(t.lambda()), float(clust->sizeY()));
1003  }
1004  }
1005  }
1006  }
1007  }
1008  Fill(h,"nbarrelhits_"+ttype,float(nbarrel));
1009  //-------------------------------------------------------------------
1010 }
1011 
1013  // collect some info on hits and clusters
1014  int longesthit=0, nbarrel=0;
1015  cout << Form("%5.2f %5.2f : ",t.pt(),t.eta());
1017  if ((**hit).isValid() && (**hit).geographicalId().det() == DetId::Tracker ){
1018  bool barrel = DetId((**hit).geographicalId()).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel);
1019  if (barrel){
1020  nbarrel++;
1021  const SiPixelRecHit *pixhit = dynamic_cast<const SiPixelRecHit*>( &(**hit));
1022  edm::Ref<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster> const& clust = (*pixhit).cluster();
1023  if (clust.isNonnull()) {
1024  cout << Form("%4d",clust->sizeY());
1025  if (clust->sizeY()-longesthit>0) longesthit=clust->sizeY();
1026  }
1027  }
1028  }
1029  }
1030 }
1031 
1033  int ivtx=0;
1034  std::cout << std::endl << title << std::endl;
1035  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
1036  v!=recVtxs->end(); ++v){
1037  string vtype=" recvtx ";
1038  if( v->isFake()){
1039  vtype=" fake ";
1040  }else if (v->ndof()==-5){
1041  vtype=" cluster "; // pos=selector[iclu],cputime[iclu],clusterz[iclu]
1042  }else if(v->ndof()==-3){
1043  vtype=" event ";
1044  }
1045  std::cout << "vtx "<< std::setw(3) << std::setfill(' ')<<ivtx++
1046  << vtype
1047  << " #trk " << std::fixed << std::setprecision(4) << std::setw(3) << v->tracksSize()
1048  << " chi2 " << std::fixed << std::setw(4) << std::setprecision(1) << v->chi2()
1049  << " ndof " << std::fixed << std::setw(5) << std::setprecision(2) << v->ndof()
1050  << " x " << std::setw(8) <<std::fixed << std::setprecision(4) << v->x()
1051  << " dx " << std::setw(8) << v->xError()
1052  << " y " << std::setw(8) << v->y()
1053  << " dy " << std::setw(8) << v->yError()
1054  << " z " << std::setw(8) << v->z()
1055  << " dz " << std::setw(8) << v->zError()
1056  << std::endl;
1057  }
1058 }
1059 
1061  int i=0;
1062  for(SimVertexContainer::const_iterator vsim=simVtxs->begin();
1063  vsim!=simVtxs->end(); ++vsim){
1064  if ( vsim->position().x()*vsim->position().x()+vsim->position().y()*vsim->position().y() < 1.){
1065  std::cout << i++ << ")" << std::scientific
1066  << " evtid=" << vsim->eventId().event() << "," << vsim->eventId().bunchCrossing()
1067  << " sim x=" << vsim->position().x()*simUnit_
1068  << " sim y=" << vsim->position().y()*simUnit_
1069  << " sim z=" << vsim->position().z()*simUnit_
1070  << " sim t=" << vsim->position().t()
1071  << " parent=" << vsim->parentIndex()
1072  << std::endl;
1073  }
1074  }
1075 }
1076 
1077 
1079  std::cout << " simTrks type, (momentum), vertIndex, genpartIndex" << std::endl;
1080  int i=1;
1081  for(SimTrackContainer::const_iterator t=simTrks->begin();
1082  t!=simTrks->end(); ++t){
1083  std::cout << i++ << ")"
1084  << t->eventId().event() << "," << t->eventId().bunchCrossing()
1085  << (*t)
1086  << " index="
1087  << (*t).genpartIndex();
1088  std::cout << std::endl;
1089  }
1090 }
1091 
1093 
1094  cout << "printRecTrks" << endl;
1095  int i =1;
1096  for(reco::TrackCollection::const_iterator t=recTrks->begin(); t!=recTrks->end(); ++t){
1097  cout << endl;
1098  cout << "Track "<<i << " " ; i++;
1099  if( t->quality(reco::TrackBase::loose)){ cout << "loose ";};
1100  if( t->quality(reco::TrackBase::tight)){ cout << "tight ";};
1101  if( t->quality(reco::TrackBase::highPurity)){ cout << "highPurity ";};
1102  if( t->quality(reco::TrackBase::confirmed)){ cout << "confirmed ";};
1103  if( t->quality(reco::TrackBase::goodIterative)){ cout << "goodIterative ";};
1104  cout << endl;
1105 
1106  TransientTrack tk = theB_->build(&(*t)); tk.setBeamSpot(vertexBeamSpot_);
1107  double ipsig=0;
1108  if (tk.stateAtBeamLine().isValid()){
1110  }else{
1111  ipsig=-1;
1112  }
1113 
1114  cout << Form("pt=%8.3f phi=%6.3f eta=%6.3f z=%8.4f dz=%6.4f, ipsig=%6.1f",t->pt(), t->phi(), t->eta(), t->vz(), t->dzError(),ipsig) << endl;
1115 
1116 
1117  cout << Form(" found=%6d lost=%6d chi2/ndof=%10.3f ",t->found(), t->lost(),t->normalizedChi2())<<endl;
1118  const reco::HitPattern &p = t->hitPattern();
1119 
1120  cout << "subdet layers valid lost" << endl;
1121  cout << Form(" barrel %2d %2d %2d",
1122  p.pixelBarrelLayersWithMeasurement(),
1123  p.numberOfValidPixelBarrelHits(),
1124  p.numberOfLostPixelBarrelHits(HitPattern::TRACK_HITS))
1125  << endl;
1126 
1127  cout << Form(" fwd %2d %2d %2d",
1128  p.pixelEndcapLayersWithMeasurement(),
1129  p.numberOfValidPixelEndcapHits(),
1130  p.numberOfLostPixelEndcapHits(HitPattern::TRACK_HITS))
1131  << endl;
1132  cout << Form(" pixel %2d %2d %2d",
1133  p.pixelLayersWithMeasurement(),
1134  p.numberOfValidPixelHits(),
1135  p.numberOfLostPixelHits(HitPattern::TRACK_HITS))
1136  << endl;
1137  cout << Form(" tracker %2d %2d %2d",
1138  p.trackerLayersWithMeasurement(),
1139  p.numberOfValidTrackerHits(),
1140  p.numberOfLostTrackerHits(HitPattern::TRACK_HITS))
1141  << endl;
1142  cout << endl;
1143 
1144  for(trackingRecHit_iterator hit=t->recHitsBegin(); hit!=t->recHitsEnd(); hit++){
1145  if ((**hit).isValid() && (**hit).geographicalId().det() == DetId::Tracker ){
1146  bool barrel = DetId((**hit).geographicalId()).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel);
1147  bool endcap = DetId((**hit).geographicalId()).subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap);
1148  if (barrel){
1149  const SiPixelRecHit *pixhit = dynamic_cast<const SiPixelRecHit*>( &(**hit));
1150  edm::Ref<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster> const& clust = (*pixhit).cluster();
1151  if (clust.isNonnull()) {
1152  cout << Form(" barrel cluster size=%2d charge=%6.1f wx=%2d wy=%2d, expected=%3.1f",clust->size(),clust->charge(),clust->sizeX(),clust->sizeY(),1.+2./fabs(tan(t->theta()))) << endl;
1153  }
1154  }else if(endcap){
1155  const SiPixelRecHit *pixhit = dynamic_cast<const SiPixelRecHit*>( &(**hit));
1156  edm::Ref<edmNew::DetSetVector<SiPixelCluster>, SiPixelCluster> const& clust = (*pixhit).cluster();
1157  if (clust.isNonnull()) {
1158  cout << Form(" endcap cluster size=%2d charge=%6.1f wx=%2d wy=%2d",clust->size(),clust->charge(),clust->sizeX(),clust->sizeY()) << endl;
1159  }
1160  }
1161  }
1162  }
1163 
1164  cout << "hitpattern" << endl;
1165  for(int i = 0; i < p.numberOfHits(HitPattern::TRACK_HITS); i++){
1166  p.printHitPattern(HitPattern::TRACK_HITS, i, std::cout);
1167  }
1168 
1169  cout << "expected inner " << p.numberOfHits(HitPattern::MISSING_INNER_HITS) << endl;
1170  for(int i = 0; i < p.numberOfHits(HitPattern::MISSING_INNER_HITS); i++){
1171  p.printHitPattern(HitPattern::MISSING_INNER_HITS, i, std::cout);
1172  }
1173 
1174  cout << "expected outer " << p.numberOfHits(HitPattern::MISSING_OUTER_HITS) << endl;
1175  for(int i = 0; i < p.numberOfHits(HitPattern::MISSING_OUTER_HITS); i++){
1176  p.printHitPattern(HitPattern::MISSING_OUTER_HITS, i, std::cout);
1177  }
1178  }
1179 }
1180 
1181 namespace {
1182  bool recTrackLessZ(const reco::TransientTrack & tk1,
1183  const reco::TransientTrack & tk2)
1184  {
1186  }
1187 }
1188 
1189 
1191  const Handle<reco::VertexCollection> &recVtxs,
1192  std::vector<SimPart>& tsim,
1193  std::vector<SimEvent>& simEvt,
1194  bool selectedOnly){
1195  // make a printout of the tracks selected for PV reconstructions, show matching MC tracks, too
1196  vector<TransientTrack> selTrks;
1197  for(reco::TrackCollection::const_iterator t=recTrks->begin();
1198  t!=recTrks->end(); ++t){
1199  TransientTrack tt = theB_->build(&(*t)); tt.setBeamSpot(vertexBeamSpot_);
1200  if( (!selectedOnly) || (selectedOnly && theTrackFilter(tt))){ selTrks.push_back(tt); }
1201  }
1202  if (selTrks.size()==0) return;
1203  stable_sort(selTrks.begin(), selTrks.end(), recTrackLessZ);
1204 
1205  // select tracks like for PV reconstruction and match them to sim tracks
1206  reco::TrackCollection selRecTrks;
1207 
1208  for(unsigned int i=0; i<selTrks.size(); i++){ selRecTrks.push_back(selTrks[i].track());}
1209  std::vector<int> rectosim=supf(tsim, selRecTrks);
1210 
1211  // now dump in a format similar to the clusterizer
1212  cout << "printPVTrks" << endl;
1213  cout << "---- z +/- dz 1bet-m ip +/-dip pt phi eta";
1214  if((tsim.size()>0)||(simEvt.size()>0)) {cout << " type pdg zvtx zdca dca zvtx zdca dsz";}
1215  cout << endl;
1216 
1217  cout.precision(4);
1218  int isel=0;
1219  for(unsigned int i=0; i<selTrks.size(); i++){
1220  if (selectedOnly || (theTrackFilter(selTrks[i]))) {
1221  cout << setw (3)<< isel;
1222  isel++;
1223  }else{
1224  cout << " ";
1225  }
1226 
1227  // is this track in the tracklist of a recvtx ?
1228  int vmatch=-1;
1229  int iv=0;
1230  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
1231  v!=recVtxs->end(); ++v){
1232  if ( (v->ndof()<-1) || (v->chi2()<=0) ) continue; // skip clusters
1233  for(trackit_t tv=v->tracks_begin(); tv!=v->tracks_end(); tv++){
1234  const reco::Track & RTv=*(tv->get());
1235  if(selTrks[i].track().vz()==RTv.vz()) {vmatch=iv;}
1236  }
1237  iv++;
1238  }
1239 
1240  double tz=(selTrks[i].stateAtBeamLine().trackStateAtPCA()).position().z();
1241  double tantheta=tan((selTrks[i].stateAtBeamLine().trackStateAtPCA()).momentum().theta());
1242  double tdz0= selTrks[i].track().dzError();
1243  double tdz2= pow(selTrks[i].track().dzError(),2)+ (pow(vertexBeamSpot_.BeamWidthX(),2)+pow(vertexBeamSpot_.BeamWidthY(),2))/pow(tantheta,2);
1244 
1245  if(vmatch>-1){
1246  cout << "["<<setw(2)<<vmatch<<"]";
1247  }else{
1248  int status=0;
1249  if(status==0){
1250  cout <<" ";
1251  }else{
1252  if(status&0x1){cout << "i";}else{cout << ".";};
1253  if(status&0x2){cout << "c";}else{cout << ".";};
1254  if(status&0x4){cout << "h";}else{cout << ".";};
1255  if(status&0x8){cout << "q";}else{cout << ".";};
1256  }
1257  }
1258  cout << setw (8) << fixed << setprecision(4)<< tz << " +/-" << setw (6)<< sqrt(tdz2);
1259 
1260  // track quality and hit information, see DataFormats/TrackReco/interface/HitPattern.h
1261  if(selTrks[i].track().quality(reco::TrackBase::highPurity)){ cout << " *";}else{cout <<" ";}
1262  if(selTrks[i].track().hitPattern().hasValidHitInFirstPixelBarrel()){ cout << "+"; } else { cout << "-"; }
1263  cout << setw(1) << selTrks[i].track().hitPattern().pixelBarrelLayersWithMeasurement();
1264  cout << setw(1) << selTrks[i].track().hitPattern().pixelEndcapLayersWithMeasurement();
1265  cout << setw(1) << hex << selTrks[i].track().hitPattern().trackerLayersWithMeasurement()
1266  - selTrks[i].track().hitPattern().pixelLayersWithMeasurement() << dec;
1267  cout << "-" << setw(1) << hex << selTrks[i].track().hitPattern().numberOfHits(HitPattern::MISSING_OUTER_HITS) << dec;
1268 
1269 
1270  Measurement1D IP=selTrks[i].stateAtBeamLine().transverseImpactParameter();
1271  cout << setw (8) << IP.value() << "+/-" << setw (6) << IP.error();
1272  if(selTrks[i].track().ptError()<1){
1273  cout << " " << setw(8) << setprecision(2) << selTrks[i].track().pt()*selTrks[i].track().charge();
1274  }else{
1275  cout << " " << setw(7) << setprecision(1) << selTrks[i].track().pt()*selTrks[i].track().charge() << "*";
1276  }
1277  cout << " " << setw(5) << setprecision(2) << selTrks[i].track().phi()
1278  << " " << setw(5) << setprecision(2) << selTrks[i].track().eta() ;
1279 
1280  // print MC info, if available
1281  if(simEvt.size()>0){
1282  reco::Track t=selTrks[i].track();
1283  try{
1284  TrackingParticleRef tpr = z2tp_[t.vz()];
1285  const TrackingVertex *parentVertex= tpr->parentVertex().get();
1286  double vz=parentVertex->position().z();
1287  cout << " " << tpr->eventId().event();
1288  cout << " " << setw(5) << tpr->pdgId();
1289  cout << " " << setw(8) << setprecision(4) << vz;
1290  }catch (...){
1291  cout << " not matched";
1292  }
1293  }else{
1294  if(rectosim[i]>0){
1295  if(tsim[rectosim[i]].type==0){ cout << " prim " ;}else{cout << " sec ";}
1296  cout << " " << setw(5) << tsim[rectosim[i]].pdg;
1297  cout << " " << setw(8) << setprecision(4) << tsim[rectosim[i]].zvtx;
1298  cout << " " << setw(8) << setprecision(4) << tsim[rectosim[i]].zdcap;
1299  cout << " " << setw(8) << setprecision(4) << tsim[rectosim[i]].ddcap;
1300  double zvtxpull=(tz-tsim[rectosim[i]].zvtx)/sqrt(tdz2);
1301  cout << setw(6) << setprecision(1) << zvtxpull;
1302  double zdcapull=(tz-tsim[rectosim[i]].zdcap)/tdz0;
1303  cout << setw(6) << setprecision(1) << zdcapull;
1304  double dszpull=(selTrks[i].track().dsz()-tsim[rectosim[i]].par[4])/selTrks[i].track().dszError();
1305  cout << setw(6) << setprecision(1) << dszpull;
1306  }
1307  }
1308  cout << endl;
1309  }
1310 }
1311 
1312 
1314  const std::vector<SimPart > & tsim,
1315  const edm::Handle<reco::TrackCollection> & recTrks)
1316 {
1317  // find all recTracks that belong to this simulated vertex (not just the ones that are used in
1318  // matching recVertex)
1319  std::cout << "dump rec tracks: " << std::endl;
1320  int irec=0;
1321  for(reco::TrackCollection::const_iterator t=recTrks->begin();
1322  t!=recTrks->end(); ++t){
1323  reco::TrackBase::ParameterVector p = t->parameters();
1324  std::cout << irec++ << ") " << p << std::endl;
1325  }
1326 
1327  std::cout << "match sim tracks: " << std::endl;
1328  pv.matchedRecTrackIndex.clear();
1329  pv.nMatchedTracks=0;
1330  int isim=0;
1331  for(std::vector<SimPart>::const_iterator s=tsim.begin();
1332  s!=tsim.end(); ++s){
1333  std::cout << isim++ << " " << s->par;// << std::endl;
1334  int imatch=-1;
1335  int irec=0;
1336  for(reco::TrackCollection::const_iterator t=recTrks->begin();
1337  t!=recTrks->end(); ++t){
1338  reco::TrackBase::ParameterVector p = t->parameters();
1339  if (match(s->par,p)){ imatch=irec; }
1340  irec++;
1341  }
1342  pv.matchedRecTrackIndex.push_back(imatch);
1343  if(imatch>-1){
1344  pv.nMatchedTracks++;
1345  std::cout << " matched to rec trk" << imatch << std::endl;
1346  }else{
1347  std::cout << " not matched" << std::endl;
1348  }
1349  }
1350 }
1351 /********************************************************************************************************/
1352 
1353 void PrimaryVertexAnalyzer4PU::getTc(const std::vector<reco::TransientTrack>& tracks,
1354  double & Tc, double & chsq, double & dzmax, double & dztrim, double & m4m2){
1355  if (tracks.size()<2){ Tc=-1; chsq=-1; dzmax=-1; dztrim=-1; m4m2=-1; return;}
1356 
1357  double sumw=0, sumwz=0, sumww=0,sumwwz=0,sumwwzz=0;
1358  double zmin=1e10, zmin1=1e10, zmax1=-1e10, zmax=-1e10;
1359  double m4=0,m3=0,m2=0,m1=0,m0=0;
1360  for(vector<reco::TransientTrack>::const_iterator it=tracks.begin(); it!=tracks.end(); it++){
1361  double tantheta=tan(((*it).stateAtBeamLine().trackStateAtPCA()).momentum().theta());
1362  reco::BeamSpot beamspot=(it->stateAtBeamLine()).beamSpot();
1363  double z=((*it).stateAtBeamLine().trackStateAtPCA()).position().z();
1364  double dz2= pow((*it).track().dzError(),2)+pow(beamspot.BeamWidthX()/tantheta,2);
1365  double w=1./dz2; // take p=1
1366  sumw += w;
1367  sumwz += w*z;
1368  sumwwz += w*w*z;;
1369  sumwwzz += w*w*z*z;
1370  sumww += w*w;
1371  m0 += w;
1372  m1 += w*z;
1373  m2 += w*z*z;
1374  m3 += w*z*z*z;
1375  m4 += w*z*z*z*z;
1376  if(dz2<pow(0.1,2)){
1377  if(z<zmin1){zmin1=z;} if(z<zmin){zmin1=zmin; zmin=z;}
1378  if(z>zmax1){zmax1=z;} if(z>zmax){zmax1=zmax; zmax=z;}
1379  }
1380  }
1381  double z=sumwz/sumw;
1382  double a=sumwwzz-2*z*sumwwz+z*z*sumww;
1383  double b=sumw;
1384  if(tracks.size()>1){
1385  chsq=(m2-m0*z*z)/(tracks.size()-1);
1386  Tc=2.*a/b;
1387  m4m2=sqrt((m4-4*m3*z+6*m2*z*z-3*m1*z*z*z+m0*z*z*z*z)/(m2-2*m1*z+z*z*m0));
1388  }else{
1389  chsq=0;
1390  Tc=0;
1391  m4m2=0;
1392  }
1393  dzmax=zmax-zmin;
1394  dztrim=zmax1-zmin1;// truncated
1395 }
1396 /********************************************************************************************************/
1397 
1399 
1400 /********************************************************************************************************/
1401 // for a reco track select the matching tracking particle, always use this function to make sure we
1402 // are consistent
1403 // to get the TrackingParticle form the TrackingParticleRef, use ->get();
1404 {
1405  double f=0;
1406  try{
1407  std::vector<std::pair<TrackingParticleRef, double> > tp = r2s_[track];
1408  for (std::vector<std::pair<TrackingParticleRef, double> >::const_iterator it = tp.begin();
1409  it != tp.end(); ++it) {
1410 
1411  if (it->second>f){
1412  tpr=it->first;
1413  f=it->second;
1414  }
1415  }
1416  } catch (Exception event) {
1417  // silly way of testing whether track is in r2s_
1418  }
1419 
1420  // sanity check on track parameters?
1421 
1422  return (f>0.5);
1423 }
1424 /********************************************************************************************************/
1425 
1426 std::vector< edm::RefToBase<reco::Track> > PrimaryVertexAnalyzer4PU::getTruthMatchedVertexTracks(
1427  const reco::Vertex& v
1428  )
1429 // for vertex v get a list of tracks for which truth matching is available
1430 /********************************************************************************************************/
1431 {
1432  std::vector< edm::RefToBase<reco::Track> > b;
1433  TrackingParticleRef tpr;
1434 
1435  for(trackit_t tv=v.tracks_begin(); tv!=v.tracks_end(); tv++){
1436  edm::RefToBase<reco::Track> track=*tv;
1437  if (truthMatchedTrack(track, tpr)){
1438  b.push_back(*tv);
1439  }
1440  }
1441 
1442 
1443  return b;
1444 }
1445 /********************************************************************************************************/
1446 
1447 std::vector<PrimaryVertexAnalyzer4PU::SimEvent> PrimaryVertexAnalyzer4PU::getSimEvents
1451  edm::Handle<View<Track> > trackCollectionH
1452  ){
1453 
1454  const TrackingParticleCollection* simTracks = TPCollectionH.product();
1455  const View<Track> tC = *(trackCollectionH.product());
1456 
1457 
1458  vector<SimEvent> simEvt;
1459  map<EncodedEventId, unsigned int> eventIdToEventMap;
1460  map<EncodedEventId, unsigned int>::iterator id;
1461  bool dumpTP=false;
1462  for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1463 
1464  if( fabs(it->parentVertex().get()->position().z())>100.) continue; // skip funny entries @ -13900
1465 
1466  unsigned int event=0; //note, this is no longer the same as eventId().event()
1467  id=eventIdToEventMap.find(it->eventId());
1468  if (id==eventIdToEventMap.end()){
1469 
1470  // new event here
1471  SimEvent e;
1472  e.eventId=it->eventId();
1473  event=simEvt.size();
1474  const TrackingVertex *parentVertex= it->parentVertex().get();
1475  if(DEBUG_){
1476  cout << "getSimEvents: ";
1477  cout << it->eventId().bunchCrossing() << "," << it->eventId().event()
1478  << " z="<< it->vz() << " "
1479  << parentVertex->eventId().bunchCrossing() << "," <<parentVertex->eventId().event()
1480  << " z=" << parentVertex->position().z() << endl;
1481  }
1482  if (it->eventId()==parentVertex->eventId()){
1483  e.x=parentVertex->position().x();
1484  e.y=parentVertex->position().y();
1485  e.z=parentVertex->position().z();
1486  if(e.z<-100){
1487  dumpTP=true;
1488  }
1489  }else{
1490  e.x=0; e.y=0; e.z=-88.;
1491  }
1492  simEvt.push_back(e);
1493  eventIdToEventMap[e.eventId]=event;
1494  }else{
1495  event=id->second;
1496  }
1497 
1498 
1499  simEvt[event].tp.push_back(&(*it));
1500  if( (abs(it->eta())<2.5) && (it->charge()!=0) ){
1501  simEvt[event].sumpt2+=pow(it->pt(),2); // should keep track of decays ?
1502  simEvt[event].sumpt+=it->pt();
1503  }
1504  }
1505 
1506  if(dumpTP){
1507  for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1508  std::cout << *it << std::endl;
1509  }
1510  }
1511 
1512 
1513  for(View<Track>::size_type i=0; i<tC.size(); ++i) {
1514  RefToBase<Track> track(trackCollectionH, i);
1515  TrackingParticleRef tpr;
1516  if( truthMatchedTrack(track,tpr)){
1517 
1518  if( eventIdToEventMap.find(tpr->eventId())==eventIdToEventMap.end() ){ cout << "Bug in getSimEvents" << endl; break; }
1519 
1520  z2tp_[track.get()->vz()]=tpr;
1521 
1522  unsigned int event=eventIdToEventMap[tpr->eventId()];
1523  double ipsig=0,ipdist=0;
1524  const TrackingVertex *parentVertex= tpr->parentVertex().get();
1525  double vx=parentVertex->position().x(); // problems with tpr->vz()
1526  double vy=parentVertex->position().y();
1527  double vz=parentVertex->position().z();
1528  double d=sqrt(pow(simEvt[event].x-vx,2)+pow(simEvt[event].y-vy,2)+pow(simEvt[event].z-vz,2))*1.e4;
1529  ipdist=d;
1530  double dxy=track->dxy(vertexBeamSpot_.position());
1531  ipsig=dxy/track->dxyError();
1532 
1533 
1534  TransientTrack t = theB_->build(tC[i]);
1535  t.setBeamSpot(vertexBeamSpot_);
1536  if (theTrackFilter(t)){
1537  simEvt[event].tk.push_back(t);
1538  if(ipdist<5){simEvt[event].tkprim.push_back(t);}
1539  if(ipsig<5){simEvt[event].tkprimsel.push_back(t);}
1540  }
1541 
1542  }
1543  }
1544 
1545  AdaptiveVertexFitter theFitter;
1546  cout << "SimEvents " << simEvt.size() << endl;
1547  for(unsigned int i=0; i<simEvt.size(); i++){
1548 
1549  if(simEvt[i].tkprim.size()>0){
1550 
1551  getTc(simEvt[i].tkprimsel, simEvt[i].Tc, simEvt[i].chisq, simEvt[i].dzmax, simEvt[i].dztrim, simEvt[i].m4m2);
1552  TransientVertex v = theFitter.vertex(simEvt[i].tkprim, vertexBeamSpot_);
1553  if (v.isValid()){
1554  simEvt[i].xfit=v.position().x();
1555  simEvt[i].yfit=v.position().y();
1556  simEvt[i].zfit=v.position().z();
1557  // if (simEvt[i].z<-80.){simEvt[i].z=v.position().z();} // for now
1558  }
1559  }
1560 
1561  if(DEBUG_){
1562  cout << i <<" ) nTP=" << simEvt[i].tp.size()
1563  << " z=" << simEvt[i].z
1564  << " recTrks=" << simEvt[i].tk.size()
1565  << " recTrksPrim=" << simEvt[i].tkprim.size()
1566  << " zfit=" << simEvt[i].zfit
1567  << endl;
1568  }
1569  }
1570 
1571  return simEvt;
1572 }
1573 
1574 
1575 std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> PrimaryVertexAnalyzer4PU::getSimPVs(
1576  const Handle<HepMCProduct> evtMC)
1577 {
1578  if(DEBUG_){std::cout << "getSimPVs HepMC " << std::endl;}
1579 
1580  std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> simpv;
1581  const HepMC::GenEvent* evt=evtMC->GetEvent();
1582  if (evt) {
1583  for(HepMC::GenEvent::vertex_const_iterator vitr= evt->vertices_begin();
1584  vitr != evt->vertices_end(); ++vitr )
1585  { // loop for vertex ...
1586 
1587  HepMC::FourVector pos = (*vitr)->position();
1588  if (fabs(pos.z())>1000) continue; // skip funny junk vertices
1589 
1590  bool hasMotherVertex=false;
1591  for ( HepMC::GenVertex::particle_iterator
1592  mother = (*vitr)->particles_begin(HepMC::parents);
1593  mother != (*vitr)->particles_end(HepMC::parents);
1594  ++mother ) {
1595  HepMC::GenVertex * mv=(*mother)->production_vertex();
1596  if (mv) {hasMotherVertex=true;}
1597  }
1598  if(hasMotherVertex) {continue;}
1599 
1600  // could be a new vertex, check all primaries found so far to avoid multiple entries
1601  const double mm=0.1;
1602  simPrimaryVertex sv(pos.x()*mm,pos.y()*mm,pos.z()*mm);
1603  simPrimaryVertex *vp=NULL; // will become non-NULL if a vertex is found and then point to it
1604  for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1605  v0!=simpv.end(); v0++){
1606  if( (fabs(sv.x-v0->x)<1e-5) && (fabs(sv.y-v0->y)<1e-5) && (fabs(sv.z-v0->z)<1e-5)){
1607  vp=&(*v0);
1608  break;
1609  }
1610  }
1611  if(!vp){
1612  // this is a new vertex
1613  simpv.push_back(sv);
1614  vp=&simpv.back();
1615  }
1616 
1617  // store the gen vertex barcode with this simpv
1618  vp->genVertex.push_back((*vitr)->barcode());
1619 
1620  // collect final state descendants and sum up momenta etc
1621  for ( HepMC::GenVertex::particle_iterator
1622  daughter = (*vitr)->particles_begin(HepMC::descendants);
1623  daughter != (*vitr)->particles_end(HepMC::descendants);
1624  ++daughter ) {
1625  if (isFinalstateParticle(*daughter)){
1626  if ( find(vp->finalstateParticles.begin(), vp->finalstateParticles.end(),(*daughter)->barcode())
1627  == vp->finalstateParticles.end()){
1628  vp->finalstateParticles.push_back((*daughter)->barcode());
1629  HepMC::FourVector m=(*daughter)->momentum();
1630  vp->ptot.setPx(vp->ptot.px()+m.px());
1631  vp->ptot.setPy(vp->ptot.py()+m.py());
1632  vp->ptot.setPz(vp->ptot.pz()+m.pz());
1633  vp->ptot.setE(vp->ptot.e()+m.e());
1634  vp->ptsq+=(m.perp())*(m.perp());
1635  // count relevant particles
1636  if ( (m.perp()>0.2) && (fabs(m.pseudoRapidity())<2.5) && isCharged( *daughter ) ){
1637  vp->nGenTrk++;
1638  }
1639 
1640  hsimPV["rapidity"]->Fill(m.pseudoRapidity());
1641  if( (m.perp()>0.8) && isCharged( *daughter ) ){
1642  hsimPV["chRapidity"]->Fill(m.pseudoRapidity());
1643  }
1644  hsimPV["pt"]->Fill(m.perp());
1645  }//new final state particle for this vertex
1646  }//daughter is a final state particle
1647  }
1648  }
1649  }
1650  if(verbose_){
1651  cout << "------- PrimaryVertexAnalyzer4PU simPVs -------" << endl;
1652  for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1653  v0!=simpv.end(); v0++){
1654  cout << "z=" << v0->z
1655  << " px=" << v0->ptot.px()
1656  << " py=" << v0->ptot.py()
1657  << " pz=" << v0->ptot.pz()
1658  << " pt2="<< v0->ptsq
1659  << endl;
1660  }
1661  cout << "-----------------------------------------------" << endl;
1662  }
1663  return simpv;
1664 }
1665 
1666 
1667 double
1668 PrimaryVertexAnalyzer4PU::getTrueSeparation(float in_z, const vector<float> & simpv)
1669 {
1670 
1671  double sepL_min = 50.;
1672 
1673  //loop over all sim vertices
1674  for(unsigned sv_idx=0; sv_idx<simpv.size(); ++sv_idx){
1675 
1676  float comp_z = simpv[sv_idx];
1677  double dist_z = fabs(comp_z - in_z);
1678 
1679  if ( dist_z==0. ) continue;
1680  if ( dist_z<sepL_min ) sepL_min = dist_z;
1681  }
1682  return sepL_min;
1683 }
1684 
1685 
1686 double
1688 {
1689 
1690  EncodedEventId in_ev = inEv.eventId;
1691  double in_z = inEv.z;
1692 
1693  int lastEvent = -1;
1694 
1695  double sepL_min = 50.;
1696 
1697  //loop over all sim vertices
1698  for(unsigned se_idx=0; se_idx<simEv.size(); ++se_idx){
1699 
1700  SimEvent compEv = simEv[se_idx];
1701  EncodedEventId comp_ev = compEv.eventId;
1702 
1703  if ( comp_ev.event()==lastEvent ) continue;
1704  lastEvent = comp_ev.event();
1705 
1706  float comp_z = compEv.z;
1707 
1708  if ( ( fabs(comp_z)>24. ) || ( comp_ev.bunchCrossing()!=0 ) || ( in_ev.event()==comp_ev.event() ) ) continue;
1709 
1710  double dist_z = fabs(comp_z - in_z);
1711 
1712  if ( dist_z<sepL_min ) sepL_min = dist_z;
1713 
1714  }
1715 
1716  return sepL_min;
1717 
1718 }
1719 
1720 vector<int>*
1722 {
1723 
1724  double zmatch_ = 3.;
1725 
1726  vector<int>* matchs = new vector<int>();
1727 
1728  for(unsigned vtx_idx=0; vtx_idx<vCH->size(); ++vtx_idx){
1729 
1730  VertexRef comp_vtxref(vCH, vtx_idx);
1731 
1732  double comp_z = comp_vtxref->z();
1733  double comp_z_err = comp_vtxref->zError();
1734 
1735  double z_dist = comp_z - in_z;
1736  double z_rel = z_dist / comp_z_err;
1737 
1738  if ( fabs(z_rel)<zmatch_ ) {
1739  matchs->push_back(vtx_idx);
1740  }
1741 
1742  }
1743 
1744  return matchs;
1745 }
1746 
1747 
1748 /* get sim pv from TrackingParticles/TrackingVertex */
1749 std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> PrimaryVertexAnalyzer4PU::getSimPVs(
1751  )
1752 {
1753  std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> simpv;
1754 
1755  if(DEBUG_){std::cout << "getSimPVs TrackingVertexCollection " << std::endl;}
1756 
1757  for (TrackingVertexCollection::const_iterator v = tVC -> begin(); v != tVC -> end(); ++v) {
1758 
1759  if(DEBUG_){
1760  std::cout << (v->eventId()).event() << v -> position() << v->g4Vertices().size() <<" " <<v->genVertices().size() << " t=" <<v->position().t()*1.e12 <<" ==0:" <<(v->position().t()>0) << std::endl;
1761  for( TrackingVertex::g4v_iterator gv=v->g4Vertices_begin(); gv!=v->g4Vertices_end(); gv++){
1762  std::cout << *gv << std::endl;
1763  }
1764  std::cout << "----------" << std::endl;
1765  }
1766 
1767  if ((unsigned int) v->eventId().event()<simpv.size()) continue;
1768  if (fabs(v->position().z())>1000) continue; // skip funny junk vertices
1769 
1770  // could be a new vertex, check all primaries found so far to avoid multiple entries
1771  const double mm=1.0; // for tracking vertices
1772  simPrimaryVertex sv(v->position().x()*mm,v->position().y()*mm,v->position().z()*mm);
1773 
1774  sv.eventId=v->eventId();
1775 
1776  for (TrackingParticleRefVector::iterator iTrack = v->daughterTracks_begin(); iTrack != v->daughterTracks_end(); ++iTrack){
1777  sv.eventId=(**iTrack).eventId();
1778  }
1779  simPrimaryVertex *vp=NULL; // will become non-NULL if a vertex is found and then point to it
1780  for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1781  v0!=simpv.end(); v0++){
1782  if( (sv.eventId==v0->eventId) && (fabs(sv.x-v0->x)<1e-5) && (fabs(sv.y-v0->y)<1e-5) && (fabs(sv.z-v0->z)<1e-5)){
1783  vp=&(*v0);
1784  break;
1785  }
1786  }
1787  if(!vp){
1788  // this is a new vertex
1789  if(DEBUG_){std::cout << "this is a new vertex " << sv.eventId.event() << " " << sv.x << " " << sv.y << " " << sv.z <<std::endl;}
1790  simpv.push_back(sv);
1791  vp=&simpv.back();
1792  }else{
1793  if(DEBUG_){std::cout << "this is not a new vertex" << sv.x << " " << sv.y << " " << sv.z <<std::endl;}
1794  }
1795 
1796  // Loop over daughter track(s)
1797  if(DEBUG_){
1798  for (TrackingVertex::tp_iterator iTP = v -> daughterTracks_begin(); iTP != v -> daughterTracks_end(); ++iTP) {
1799  std::cout << " Daughter momentum: " << (*(*iTP)).momentum();
1800  std::cout << " Daughter type " << (*(*iTP)).pdgId();
1801  std::cout << std::endl;
1802  }
1803  }
1804  }
1805  if(DEBUG_){
1806  cout << "------- PrimaryVertexAnalyzer4PU simPVs from TrackingVertices -------" << endl;
1807  for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1808  v0!=simpv.end(); v0++){
1809  cout << "z=" << v0->z << " event=" << v0->eventId.event() << endl;
1810  }
1811  cout << "-----------------------------------------------" << endl;
1812  }
1813  return simpv;
1814 }
1815 
1816 
1817 // ------------ method called to produce the data ------------
1818 void
1820 {
1821  std::vector<simPrimaryVertex> simpv; // a list of primary MC vertices
1822  std::vector<float> pui_z;
1823  std::vector<SimPart> tsim;
1824 
1825  eventcounter_++;
1826  run_ = iEvent.id().run();
1827  luminosityBlock_ = iEvent.luminosityBlock();
1828  event_ = iEvent.id().event();
1829  bunchCrossing_ = iEvent.bunchCrossing();
1830  orbitNumber_ = iEvent.orbitNumber();
1831 
1832  if(verbose_){
1833  std::cout << endl
1834  << "PrimaryVertexAnalyzer4PU::analyze event counter=" << eventcounter_
1835  << " Run=" << run_ << " LumiBlock " << luminosityBlock_ << " event " << event_
1836  << " bx=" << bunchCrossing_ << " orbit=" << orbitNumber_
1837  << std::endl;
1838  }
1839 
1840  try{
1841  iSetup.getData(pdt_);
1842  }catch(const Exception&){
1843  std::cout << "Some problem occurred with the particle data table. This may not work !" <<std::endl;
1844  }
1845 
1846  try{
1847 
1848  //get the pileup information
1850  iEvent.getByToken( vecPileupSummaryInfoToken_, puinfoH );
1851  PileupSummaryInfo puinfo;
1852 
1853  for (unsigned int puinfo_ite=0;puinfo_ite<(*puinfoH).size();++puinfo_ite){
1854  if ((*puinfoH)[puinfo_ite].getBunchCrossing()==0){
1855  puinfo=(*puinfoH)[puinfo_ite];
1856  break;
1857  }
1858  }
1859 
1860  pui_z = puinfo.getPU_zpositions();
1861 
1862  } catch( edm::Exception const & ex ) {
1863  if ( !ex.alreadyPrinted() ) {
1864  std::cout << ex.what() << " Maybe data?" << std::endl;
1865  }
1866  }
1867 
1869  bool bnoBS = iEvent.getByToken( recoVertexCollectionToken_, recVtxs );
1870 
1872  bool bBS = iEvent.getByToken( recoVertexCollection_BS_Token_, recVtxsBS );
1873 
1875  bool bDA = iEvent.getByToken( recoVertexCollection_DA_Token_, recVtxsDA );
1876 
1878  iEvent.getByToken( recoTrackCollectionToken_, recTrks );
1879 
1880  int nhighpurity=0, ntot=0;
1881  for(reco::TrackCollection::const_iterator t=recTrks->begin(); t!=recTrks->end(); ++t){
1882  ntot++;
1883  if(t->quality(reco::TrackBase::highPurity)) nhighpurity++;
1884  }
1885  if(ntot>10) hnoBS["highpurityTrackFraction"]->Fill(float(nhighpurity)/float(ntot));
1886  if((recoTrackProducer_=="generalTracks")&&(nhighpurity<0.25*ntot)){
1887  if(verbose_){ cout << "rejected, " << nhighpurity << " highpurity out of " << ntot << " total tracks "<< endl<< endl;}
1888  return;
1889  }
1890 
1894  Fill(hsimPV, "xbeam",vertexBeamSpot_.x0()); Fill(hsimPV, "wxbeam",vertexBeamSpot_.BeamWidthX());
1895  Fill(hsimPV, "ybeam",vertexBeamSpot_.y0()); Fill(hsimPV, "wybeam",vertexBeamSpot_.BeamWidthY());
1896  Fill(hsimPV, "zbeam",vertexBeamSpot_.z0());// Fill("wzbeam",vertexBeamSpot_.BeamWidthZ());
1897  }else{
1898  cout << " beamspot not found, using dummy " << endl;
1899  vertexBeamSpot_=reco::BeamSpot();// dummy
1900  }
1901 
1902  if(bnoBS){
1903  if((recVtxs->begin()->isValid())&&(recVtxs->begin()->ndof()>1)&&(recVtxs->begin()->ndof()>(0.0*recVtxs->begin()->tracksSize()))){ // was 5 and 0.2
1904  Fill(hnoBS,"xrecBeamvsdxXBS",recVtxs->begin()->xError(),recVtxs->begin()->x()-vertexBeamSpot_.x0());
1905  Fill(hnoBS,"yrecBeamvsdyXBS",recVtxs->begin()->yError(),recVtxs->begin()->y()-vertexBeamSpot_.y0());
1906 
1907  if(printXBS_) {
1908  cout << Form("XBS %10d %5d %14llu %4d %lu %5.2f %8f %8f %8f %8f %8f %8f",
1910  (unsigned long)(recVtxs->begin()->tracksSize()), recVtxs->begin()->ndof(),
1911  recVtxs->begin()->x(), recVtxs->begin()->xError(),
1912  recVtxs->begin()->y(), recVtxs->begin()->yError(),
1913  recVtxs->begin()->z(), recVtxs->begin()->zError()
1914  ) << endl;
1915  }
1916 
1917  }
1918  }
1919 
1920  // for the associator
1921  Handle<View<Track> > trackCollectionH;
1922  iEvent.getByToken( edmView_recoTrack_Token_, trackCollectionH );
1923 
1924  Handle<HepMCProduct> evtMC;
1925 
1927  iEvent.getByToken( edmSimVertexContainerToken_, simVtxs );
1928 
1929  Handle<SimTrackContainer> simTrks;
1930  iEvent.getByToken( edmSimTrackContainerToken_, simTrks );
1931 
1934  bool gotTP = iEvent.getByToken( trackingParticleCollectionToken_, TPCollectionH );
1935  bool gotTV = iEvent.getByToken( trackingVertexCollectionToken_, TVCollectionH );
1936 
1937  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",theB_);
1938  fBfield_=((*theB_).field()->inTesla(GlobalPoint(0.,0.,0.))).z();
1939 
1940  vector<SimEvent> simEvt;
1941  if (gotTP && gotTV ){
1942 
1943  edm::ESHandle<TrackAssociatorBase> theHitsAssociator;
1944  iSetup.get<TrackAssociatorRecord>().get("TrackAssociatorByHits",theHitsAssociator);
1945  associatorByHits_ = (TrackAssociatorBase *) theHitsAssociator.product();
1946  r2s_ = associatorByHits_->associateRecoToSim (trackCollectionH,TPCollectionH, &iEvent, &iSetup );
1947  simEvt=getSimEvents(TPCollectionH, TVCollectionH, trackCollectionH);
1948 
1949  if (simEvt.size()==0){
1950  cout << " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
1951  cout << " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
1952  cout << " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
1953  cout << " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
1954  cout << " !!!!!!!!!!!!!!!!!!!!!! got TrackingParticles but no simEvt !!!!!!!!!!!!!!!!!" << endl;
1955  cout << " dumping Tracking particles " << endl;
1956  const TrackingParticleCollection* simTracks = TPCollectionH.product();
1957  for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1958  cout << *it << endl;
1959  }
1960  cout << " dumping Tracking Vertices " << endl;
1961  const TrackingVertexCollection* tpVtxs = TVCollectionH.product();
1962  for(TrackingVertexCollection::const_iterator iv=tpVtxs->begin(); iv!=tpVtxs->end(); iv++){
1963  cout << *iv << endl;
1964  }
1965  if( iEvent.getByToken( edmHepMCProductToken_, evtMC ) ){
1966  cout << "dumping simTracks" << endl;
1967  for(SimTrackContainer::const_iterator t=simTrks->begin(); t!=simTrks->end(); ++t){
1968  cout << *t << endl;
1969  }
1970  cout << "dumping simVertexes" << endl;
1971  for(SimVertexContainer::const_iterator vv=simVtxs->begin();
1972  vv!=simVtxs->end();
1973  ++vv){
1974  cout << *vv << endl;
1975  }
1976  }else{
1977  cout << "no hepMC" << endl;
1978  }
1979  cout << " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
1980 
1981  const HepMC::GenEvent* evt=evtMC->GetEvent();
1982  if(evt){
1983  std::cout << "process id " <<evt->signal_process_id()<<std::endl;
1984  std::cout <<"signal process vertex "<< ( evt->signal_process_vertex() ?
1985  evt->signal_process_vertex()->barcode() : 0 ) <<std::endl;
1986  std::cout <<"number of vertices " << evt->vertices_size() << std::endl;
1987  evt->print();
1988  }else{
1989  cout << "no event in HepMC" << endl;
1990  }
1991  cout << " !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
1992 
1993  }
1994  }
1995 
1996  if(gotTV){
1997 
1998  if(verbose_){
1999  cout << "Found Tracking Vertices " << endl;
2000  }
2001  simpv=getSimPVs(TVCollectionH);
2002 
2003 
2004  }else if( iEvent.getByToken( edmHepMCProductToken_, evtMC ) ) {
2005 
2006  simpv=getSimPVs(evtMC);
2007 
2008  if(verbose_){
2009  cout << "Using HepMCProduct " << endl;
2010  std::cout << "simtrks " << simTrks->size() << std::endl;
2011  }
2012  tsim = PrimaryVertexAnalyzer4PU::getSimTrkParameters(simTrks, simVtxs, simUnit_);
2013 
2014  }else{
2015  // if(verbose_({cout << "No MC info at all" << endl;}
2016  }
2017 
2018  // get the beam spot from the appropriate dummy vertex, if available
2019  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2020  v!=recVtxs->end(); ++v){
2021  if ((v->ndof()==-3) && (v->chi2()==0) ){
2022  myBeamSpot=math::XYZPoint(v->x(), v->y(), v->z());
2023  }
2024  }
2025 
2026  hsimPV["nsimvtx"]->Fill(simpv.size());
2027  for(std::vector<simPrimaryVertex>::iterator vsim=simpv.begin();
2028  vsim!=simpv.end(); vsim++){
2029  if(doMatching_){
2030  matchRecTracksToVertex(*vsim, tsim, recTrks); // hepmc, based on track parameters
2031  }
2032 
2033  hsimPV["nbsimtksinvtx"]->Fill(vsim->nGenTrk);
2034  hsimPV["xsim"]->Fill(vsim->x*simUnit_);
2035  hsimPV["ysim"]->Fill(vsim->y*simUnit_);
2036  hsimPV["zsim"]->Fill(vsim->z*simUnit_);
2037  hsimPV["xsim1"]->Fill(vsim->x*simUnit_);
2038  hsimPV["ysim1"]->Fill(vsim->y*simUnit_);
2039  hsimPV["zsim1"]->Fill(vsim->z*simUnit_);
2040  Fill(hsimPV,"xsim2",vsim->x*simUnit_,vsim==simpv.begin());
2041  Fill(hsimPV,"ysim2",vsim->y*simUnit_,vsim==simpv.begin());
2042  Fill(hsimPV,"zsim2",vsim->z*simUnit_,vsim==simpv.begin());
2043  hsimPV["xsim2"]->Fill(vsim->x*simUnit_);
2044  hsimPV["ysim2"]->Fill(vsim->y*simUnit_);
2045  hsimPV["zsim2"]->Fill(vsim->z*simUnit_);
2046  hsimPV["xsim3"]->Fill(vsim->x*simUnit_);
2047  hsimPV["ysim3"]->Fill(vsim->y*simUnit_);
2048  hsimPV["zsim3"]->Fill(vsim->z*simUnit_);
2049  hsimPV["xsimb"]->Fill(vsim->x*simUnit_-vertexBeamSpot_.x0());
2050  hsimPV["ysimb"]->Fill(vsim->y*simUnit_-vertexBeamSpot_.y0());
2051  hsimPV["zsimb"]->Fill(vsim->z*simUnit_-vertexBeamSpot_.z0());
2052  hsimPV["xsimb1"]->Fill(vsim->x*simUnit_-vertexBeamSpot_.x0());
2053  hsimPV["ysimb1"]->Fill(vsim->y*simUnit_-vertexBeamSpot_.y0());
2054  hsimPV["zsimb1"]->Fill(vsim->z*simUnit_-vertexBeamSpot_.z0());
2055  }
2056 
2057  if(bnoBS){
2058  analyzeVertexCollection(hnoBS, recVtxs, recTrks, simpv, pui_z, "noBS");
2059  analyzeVertexCollectionTP(hnoBS, recVtxs, recTrks, simEvt, r2s_,"noBS");
2060  }
2061  if(bBS){
2062  analyzeVertexCollection(hBS, recVtxsBS, recTrks, simpv, pui_z, "BS");
2063  analyzeVertexCollectionTP(hBS, recVtxsBS, recTrks, simEvt, r2s_,"BS");
2064  }
2065  if(bDA){
2066  analyzeVertexCollection(hDA, recVtxsDA, recTrks, simpv, pui_z, "DA");
2067  analyzeVertexCollectionTP(hDA, recVtxsDA, recTrks, simEvt, r2s_,"DA");
2068  }
2069 
2070  if((dumpThisEvent_&& (dumpcounter_<100)) ||(verbose_ && (eventcounter_<ndump_))){
2071  cout << endl << "Event dump" << endl
2072  << "event counter=" << eventcounter_
2073  << " Run=" << run_ << " LumiBlock " << luminosityBlock_ << " event " << event_
2074  << " bx=" << bunchCrossing_ << " orbit=" << orbitNumber_
2075  << std::endl;
2076  dumpcounter_++;
2077 
2078  if (bnoBS) {printRecVtxs(recVtxs,"Offline without Beamspot");}
2079  if (bnoBS && (!bDA)){ printPVTrks(recTrks, recVtxs, tsim, simEvt, false);}
2080  if (bBS) printRecVtxs(recVtxsBS,"Offline with Beamspot");
2081  if (bDA) {
2082  printRecVtxs(recVtxsDA,"Offline DA");
2083  printPVTrks(recTrks, recVtxsDA, tsim, simEvt, false);
2084  }
2085  if (dumpcounter_<2){cout << "beamspot " << vertexBeamSpot_ << endl;}
2086  }
2087 
2088  if(verbose_){
2089  std::cout << std::endl;
2090  }
2091 }
2092 
2093 namespace {
2094 bool lt(const std::pair<double,unsigned int>& a,const std::pair<double,unsigned int>& b ){
2095  return a.first<b.first;
2096 }
2097 }
2098 
2099 /***************************************************************************************/
2100 void PrimaryVertexAnalyzer4PU::printEventSummary(std::map<std::string, TH1*> & h,
2102  const edm::Handle<reco::TrackCollection> recTrks,
2103  vector<SimEvent> & simEvt,
2104  const string message){
2105  // make a readable summary of the vertex finding if the TrackingParticles are availabe
2106  if (simEvt.size()==0){return;}
2107 
2108 
2109  // sort vertices in z ... for nicer printout
2110 
2111  vector< pair<double,unsigned int> > zrecv;
2112  for(unsigned int idx=0; idx<recVtxs->size(); idx++){
2113  if ( (recVtxs->at(idx).ndof()<0) || (recVtxs->at(idx).chi2()<=0) ) continue; // skip clusters
2114  zrecv.push_back( make_pair(recVtxs->at(idx).z(),idx) );
2115  }
2116  stable_sort(zrecv.begin(),zrecv.end(),lt);
2117 
2118  // same for simulated vertices
2119  vector< pair<double,unsigned int> > zsimv;
2120  for(unsigned int idx=0; idx<simEvt.size(); idx++){
2121  zsimv.push_back(make_pair(simEvt[idx].z, idx));
2122  }
2123  stable_sort(zsimv.begin(), zsimv.end(),lt);
2124 
2125  cout << "---------------------------" << endl;
2126  cout << "event counter = " << eventcounter_ << " " << message << endl;
2127  cout << "---------------------------" << endl;
2128  cout << " z[cm] rec --> ";
2129  cout.precision(4);
2130  for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2131  cout << setw(7) << fixed << itrec->first;
2132  if (itrec->second==0){cout << "*" ;}else{cout << " " ;}
2133  }
2134  cout << endl;
2135  cout << " ";
2136  for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2137  cout << setw(7) << fixed << recVtxs->at(itrec->second).tracksSize();
2138  if (itrec->second==0){cout << "*" ;}else{cout << " " ;}
2139  }
2140  cout << " rec tracks" << endl;
2141  cout << " ";
2142  map<unsigned int, int> truthMatchedVertexTracks;
2143  for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2144  truthMatchedVertexTracks[itrec->second]=getTruthMatchedVertexTracks(recVtxs->at(itrec->second)).size();
2145  cout << setw(7) << fixed << truthMatchedVertexTracks[itrec->second];
2146  if (itrec->second==0){cout << "*" ;}else{cout << " " ;}
2147  }
2148  cout << " truth matched " << endl;
2149 
2150  cout << "sim ------- trk prim ----" << endl;
2151 
2152  map<unsigned int, unsigned int> rvmatch; // reco vertex matched to sim vertex (sim to rec)
2153  map<unsigned int, double > nmatch; // highest number of truth-matched tracks of ev found in a recvtx
2154  map<unsigned int, double > purity; // highest purity of a rec vtx (i.e. highest number of tracks from the same simvtx)
2155  map<unsigned int, double > wpurity; // same for the sum of weights
2156 
2157  for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2158  purity[itrec->second]=0.;
2159  wpurity[itrec->second]=0.;
2160  }
2161 
2162  for(vector< pair<double,unsigned int> >::iterator itsim=zsimv.begin(); itsim!=zsimv.end(); itsim++){
2163  SimEvent* ev =&(simEvt[itsim->second]);
2164 
2165  cout.precision(4);
2166  if (itsim->second==0){
2167  cout << setw(8) << fixed << ev->z << ")*" << setw(5) << ev->tk.size() << setw(5) << ev->tkprim.size() << " | ";
2168  }else{
2169  cout << setw(8) << fixed << ev->z << ") " << setw(5) << ev->tk.size() << setw(5) << ev->tkprim.size() << " | ";
2170  }
2171 
2172  nmatch[itsim->second]=0; // highest number of truth-matched tracks of ev found in a recvtx
2173  double matchpurity=0,matchwpurity=0;
2174 
2175  for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2176  const reco::Vertex *v = &(recVtxs->at(itrec->second));
2177 
2178  // count tracks found in both, sim and rec
2179  double n=0,wt=0;
2180  for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2181  const reco::Track& RTe=te->track();
2182  for(trackit_t tv=v->tracks_begin(); tv!=v->tracks_end(); tv++){
2183  const reco::Track & RTv=*(tv->get());
2184  if(RTe.vz()==RTv.vz()) {n++; wt+=v->trackWeight(*tv);}
2185  }
2186  }
2187  cout << setw(7) << int(n)<< " ";
2188 
2189  if (n > nmatch[itsim->second]){
2190  nmatch[itsim->second]=n;
2191  rvmatch[itsim->second]=itrec->second;
2192  matchpurity=n/truthMatchedVertexTracks[itrec->second];
2193  matchwpurity=wt/truthMatchedVertexTracks[itrec->second];
2194  }
2195 
2196  if(n > purity[itrec->second]){
2197  purity[itrec->second]=n;
2198  }
2199 
2200  if(wt > wpurity[itrec->second]){
2201  wpurity[itrec->second]=wt;
2202  }
2203 
2204  }// end of reco vertex loop
2205 
2206  cout << " | ";
2207  if (nmatch[itsim->second]>0 ){
2208  if(matchpurity>0.5){
2209  cout << "found ";
2210  }else{
2211  cout << "merged ";
2212  }
2213  cout << " max eff. = " << setw(8) << nmatch[itsim->second]/ev->tk.size() << " p=" << matchpurity << " w=" << matchwpurity << endl;
2214  }else{
2215  if(ev->tk.size()==0){
2216  cout << " invisible" << endl;
2217  }else if (ev->tk.size()==1){
2218  cout << "single track " << endl;
2219  }else{
2220  cout << "lost " << endl;
2221  }
2222  }
2223  }
2224  cout << "---------------------------" << endl;
2225 
2226  // the purity of the reconstructed vertex
2227  cout << " purity ";
2228  for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2229  cout << setw(7) << fixed << purity[itrec->second]/truthMatchedVertexTracks[itrec->second];
2230  if (itrec->second==0){cout << "*" ;}else{cout << " " ;}
2231  }
2232  cout << endl;
2233 
2234  cout << "---------------------------" << endl;
2235 
2236  // list problematic tracks
2237  for(vector< pair<double,unsigned int> >::iterator itsim=zsimv.begin(); itsim!=zsimv.end(); itsim++){
2238  SimEvent* ev =&(simEvt[itsim->second]);
2239 
2240  for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2241  const reco::Track& RTe=te->track();
2242 
2243  int ivassign=-1; // will become the index of the vertex to which a track was assigned
2244 
2245  for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2246  const reco::Vertex *v = &(recVtxs->at(itrec->second));
2247 
2248  for(trackit_t tv=v->tracks_begin(); tv!=v->tracks_end(); tv++){
2249  const reco::Track & RTv=*(tv->get());
2250  if(RTe.vz()==RTv.vz()) {ivassign=itrec->second;}
2251  }
2252  }
2253  double tantheta=tan((te->stateAtBeamLine().trackStateAtPCA()).momentum().theta());
2254  reco::BeamSpot beamspot=(te->stateAtBeamLine()).beamSpot();
2255  double dz2= pow(RTe.dzError(),2)+pow(beamspot.BeamWidthX()/tantheta,2);
2256 
2257  if(ivassign==(int)rvmatch[itsim->second]){
2258  Fill(h,"correctlyassigned",RTe.eta(),RTe.pt());
2259  Fill(h,"ptcat",RTe.pt());
2260  Fill(h,"etacat",RTe.eta());
2261  Fill(h,"phicat",RTe.phi());
2262  Fill(h,"dzcat",sqrt(dz2));
2263  }else{
2264  Fill(h,"misassigned",RTe.eta(),RTe.pt());
2265  Fill(h,"ptmis",RTe.pt());
2266  Fill(h,"etamis",RTe.eta());
2267  Fill(h,"phimis",RTe.phi());
2268  Fill(h,"dzmis",sqrt(dz2));
2269  cout << "vertex " << setw(8) << fixed << ev->z;
2270 
2271  if (ivassign<0){
2272  cout << " track lost ";
2273  // for some clusterizers there shouldn't be any lost tracks,
2274  // are there differences in the track selection?
2275  }else{
2276  cout << " track misassigned " << setw(8) << fixed << recVtxs->at(ivassign).z();
2277  }
2278 
2279  cout << " track z=" << setw(8) << fixed << RTe.vz() << "+/-" << RTe.dzError() << " pt=" << setw(8) << fixed<< RTe.pt() << " eta=" << setw(8) << fixed << RTe.eta()<< " sel=" <<theTrackFilter(*te);
2280 
2281  //
2282  //cout << " ztrack=" << te->track().vz();
2283  TrackingParticleRef tpr = z2tp_[te->track().vz()];
2284  double zparent=tpr->parentVertex().get()->position().z();
2285  if(zparent==ev->z) {
2286  cout << " prim";
2287  }else{
2288  cout << " sec ";
2289  }
2290  cout << " id=" << tpr->pdgId();
2291  cout << endl;
2292 
2293  //
2294  }
2295  }// next simvertex-track
2296 
2297  }//next simvertex
2298 
2299  cout << "---------------------------" << endl;
2300 
2301 }
2302 /***************************************************************************************/
2303 
2304 void PrimaryVertexAnalyzer4PU::analyzeVertexCollectionTP(std::map<std::string, TH1*> & h,
2306  const edm::Handle<reco::TrackCollection> recTrks,
2307  vector<SimEvent> & simEvt,
2309  const string message){
2310  if(simEvt.size()==0)return;
2311 
2312  printEventSummary(h, recVtxs,recTrks,simEvt,message);
2313 
2314  //const int iSignal=0;
2315  EncodedEventId iSignal=simEvt[0].eventId;
2316  Fill(h,"npu0",simEvt.size());
2317 
2318  for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2319  Fill(h,"Tc", ev->Tc, ev==simEvt.begin());
2320  Fill(h,"Chisq", ev->chisq, ev==simEvt.begin());
2321  if(ev->chisq>0)Fill(h,"logChisq", log(ev->chisq), ev==simEvt.begin());
2322  Fill(h,"dzmax", ev->dzmax, ev==simEvt.begin());
2323  Fill(h,"dztrim",ev->dztrim,ev==simEvt.begin());
2324  Fill(h,"m4m2", ev->m4m2, ev==simEvt.begin());
2325  if(ev->Tc>0){ Fill(h,"logTc",log(ev->Tc)/log(10.),ev==simEvt.begin());}
2326 
2327  for(vector<SimEvent>::iterator ev2=ev+1; ev2!=simEvt.end(); ev2++){
2328  vector<TransientTrack> xt;
2329  if((ev->tkprimsel.size()>0)&&(ev2->tkprimsel.size()>0)&&(ev->tkprimsel.size()+ev2->tkprimsel.size())>1){
2330  xt.insert (xt.end() ,ev->tkprimsel.begin(),ev->tkprimsel.end());
2331  xt.insert (xt.end() ,ev2->tkprimsel.begin(),ev2->tkprimsel.end());
2332  double xTc,xChsq,xDzmax,xDztrim,xm4m2;
2333  getTc(xt, xTc, xChsq, xDzmax, xDztrim,xm4m2);
2334  if(xTc>0){
2335  Fill(h,"xTc",xTc,ev==simEvt.begin());
2336  Fill(h,"logxTc", log(xTc)/log(10),ev==simEvt.begin());
2337  Fill(h,"xChisq", xChsq,ev==simEvt.begin());
2338  if(xChsq>0){Fill(h,"logxChisq", log(xChsq),ev==simEvt.begin());};
2339  Fill(h,"xdzmax", xDzmax,ev==simEvt.begin());
2340  Fill(h,"xdztrim", xDztrim,ev==simEvt.begin());
2341  Fill(h,"xm4m2", xm4m2,ev==simEvt.begin());
2342 
2343  }
2344  }
2345  }
2346  }
2347 
2348  // --------------------------------------- count actual rec vtxs ----------------------
2349  int nrecvtxs=0;//, nrecvtxs1=0, nrecvtxs2=0;
2350  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2351  v!=recVtxs->end(); ++v){
2352  if ( (v->isFake()) || (v->ndof()<0) || (v->chi2()<=0) ) continue; // skip clusters
2353  nrecvtxs++;
2354  }
2355 
2356  // --------------------------------------- fill the track assignment matrix ----------------------
2357  for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2358  ev->ntInRecVz.clear(); // just in case
2359  ev->zmatch=-99.;
2360  ev->nmatch=0;
2361  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2362  v!=recVtxs->end(); ++v){
2363  double n=0, wt=0;
2364  for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2365  const reco::Track& RTe=te->track();
2366  for(trackit_t tv=v->tracks_begin(); tv!=v->tracks_end(); tv++){
2367  const reco::Track & RTv=*(tv->get());
2368  if(RTe.vz()==RTv.vz()) {n++; wt+=v->trackWeight(*tv);}
2369  }
2370  }
2371  ev->ntInRecVz[v->z()]=n;
2372  if (n > ev->nmatch){ ev->nmatch=n; ev->zmatch=v->z(); ev->zmatch=v->z(); }
2373  }
2374  }
2375 
2376  // call a vertex a fake if for every sim vertex there is another recvertex containing more tracks
2377  // from that sim vertex than the current recvertex
2378  double nfake=0;
2379  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2380  v!=recVtxs->end(); ++v){
2381  bool matched=false;
2382  for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2383  if ((ev->nmatch>0)&&(ev->zmatch==v->z())){
2384  matched=true;
2385  }
2386  }
2387  if(!matched && !v->isFake()) {
2388  nfake++;
2389  cout << " fake rec vertex at z=" << v->z() << endl;
2390  // some histograms of fake vertex properties here
2391  Fill(h,"unmatchedVtxZ",v->z());
2392  Fill(h,"unmatchedVtxNdof",v->ndof());
2393  }
2394  }
2395  if(nrecvtxs>0){
2396  Fill(h,"unmatchedVtx",nfake);
2397  Fill(h,"unmatchedVtxFrac",nfake/nrecvtxs);
2398  }
2399 
2400  // --------------------------------------- match rec to sim ---------------------------------------
2401  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2402  v!=recVtxs->end(); ++v){
2403 
2404  if ( (v->ndof()<0) || (v->chi2()<=0) ) continue; // skip clusters
2405  double nmatch=-1; // highest number of tracks in recvtx v found in any event
2406  EncodedEventId evmatch;
2407  bool matchFound=false;
2408  double nmatchvtx=0; // number of simvtcs contributing to recvtx v
2409 
2410  for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2411 
2412  double n=0; // number of tracks that are in both, the recvtx v and the event ev
2413  for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2414 
2415  const reco::Track& RTe=te->track();
2416  for(trackit_t tv=v->tracks_begin(); tv!=v->tracks_end(); tv++){
2417  const reco::Track & RTv=*(tv->get());
2418  if(RTe.vz()==RTv.vz()){ n++;}
2419  }
2420  }
2421 
2422  // find the best match in terms of the highest number of tracks
2423  // from a simvertex in this rec vertex
2424  if (n > nmatch){
2425  nmatch=n;
2426  evmatch=ev->eventId;
2427  matchFound=true;
2428  }
2429  if(n>0){
2430  nmatchvtx++;
2431  }
2432  }
2433 
2434  double nmatchany=getTruthMatchedVertexTracks(*v).size();
2435  if (matchFound && (nmatchany>0)){
2436  // highest number of tracks in recvtx matched to (the same) sim vertex
2437  // purity := -----------------------------------------------------------------
2438  // number of truth matched tracks in this recvtx
2439  double purity =nmatch/nmatchany;
2440  Fill(h,"recmatchPurity",purity);
2441  if(v==recVtxs->begin()){
2442  Fill(h,"recmatchPurityTag",purity, (bool)(evmatch==iSignal));
2443  }else{
2444  Fill(h,"recmatchPuritynoTag",purity,(bool)(evmatch==iSignal));
2445  }
2446  }
2447  Fill(h,"recmatchvtxs",nmatchvtx);
2448  if(v==recVtxs->begin()){
2449  Fill(h,"recmatchvtxsTag",nmatchvtx);
2450  }else{
2451  Fill(h,"recmatchvtxsnoTag",nmatchvtx);
2452  }
2453 
2454  } // recvtx loop
2455  Fill(h,"nrecv",nrecvtxs);
2456 
2457 
2458  // --------------------------------------- match sim to rec ---------------------------------------
2459  int npu1=0, npu2=0;
2460 
2461  vector<int> used_indizesV;
2462  int lastEvent = 999;
2463 
2464  for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2465 
2466  if(ev->tk.size()>0) npu1++;
2467  if(ev->tk.size()>1) npu2++;
2468 
2469  double sep = getTrueSeparation(*ev, simEvt);
2470 
2471  bool isSignal= ev->eventId==iSignal;
2472 
2473  Fill(h,"nRecTrkInSimVtx",(double) ev->tk.size(),isSignal);
2474  Fill(h,"nPrimRecTrkInSimVtx",(double) ev->tkprim.size(),isSignal);
2475  Fill(h,"sumpt2rec",sqrt(ev->sumpt2rec),isSignal);
2476  Fill(h,"sumpt2",sqrt(ev->sumpt2),isSignal);
2477  Fill(h,"sumpt",sqrt(ev->sumpt),isSignal);
2478 
2479  double nRecVWithTrk=0; // vertices with tracks from this simvertex
2480  double nmatch=0, ntmatch=0, zmatch=-99;
2481 
2482  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2483  v!=recVtxs->end(); ++v){
2484  if ( (v->ndof()<-1) || (v->chi2()<=0) ) continue; // skip clusters
2485  // count tracks found in both, sim and rec
2486  double n=0, wt=0;
2487  for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2488  const reco::Track& RTe=te->track();
2489  for(trackit_t tv=v->tracks_begin(); tv!=v->tracks_end(); tv++){
2490  const reco::Track & RTv=*(tv->get());
2491  if(RTe.vz()==RTv.vz()) {n++; wt+=v->trackWeight(*tv);}
2492  }
2493  }
2494 
2495  if(n>0){ nRecVWithTrk++; }
2496  if (n > nmatch){
2497  nmatch=n; ntmatch=v->tracksSize(); zmatch=v->position().z();
2498  }
2499 
2500  }// end of reco vertex loop
2501 
2502  // nmatch is the highest number of tracks from this sim vertex found in a single reco-vertex
2503  if(ev->tk.size()>0){ Fill(h,"trkAssignmentEfficiency", nmatch/ev->tk.size(), isSignal); };
2504  if(ev->tkprim.size()>0){ Fill(h,"primtrkAssignmentEfficiency", nmatch/ev->tkprim.size(), isSignal); };
2505 
2506  // matched efficiency = efficiency for finding a reco vertex with > 50% of the simvertexs reconstructed tracks
2507 
2508  double ntsim=ev->tk.size(); // may be better to use the number of primary tracks here ?
2509  double matchpurity=nmatch/ntmatch;
2510 
2511  if(ntsim>0){
2512 
2513  Fill(h,"matchVtxFraction",nmatch/ntsim,isSignal);
2514  if(nmatch/ntsim>=0.5){
2515  Fill(h,"matchVtxEfficiency",1.,isSignal);
2516  if(ntsim>1){Fill(h,"matchVtxEfficiency2",1.,isSignal);}
2517  if(matchpurity>0.5){Fill(h,"matchVtxEfficiency5",1.,isSignal);}
2518  }else{
2519  Fill(h,"matchVtxEfficiency",0.,isSignal);
2520  if(ntsim>1){Fill(h,"matchVtxEfficiency2",0.,isSignal);}
2521  Fill(h,"matchVtxEfficiency5",0.,isSignal); // no (matchpurity>5) here !!
2522  if(isSignal){
2523  cout << "Signal vertex not matched " << message << " event=" << eventcounter_ << " nmatch=" << nmatch << " ntsim=" << ntsim << endl;
2524  }
2525  }
2526  } // ntsim >0
2527 
2528  if(zmatch>-99){
2529  Fill(h,"matchVtxZ",zmatch-ev->z);
2530  Fill(h,"matchVtxZ",zmatch-ev->z,isSignal);
2531  Fill(h,"matchVtxZCum",fabs(zmatch-ev->z));
2532  Fill(h,"matchVtxZCum",fabs(zmatch-ev->z),isSignal);
2533 
2534  }else{
2535  Fill(h,"matchVtxZCum",1.0);
2536  Fill(h,"matchVtxZCum",1.0,isSignal);
2537 
2538  }
2539  if(fabs(zmatch-ev->z)<zmatch_){
2540  Fill(h,"matchVtxEfficiencyZ",1.,isSignal);
2541  }else{
2542  Fill(h,"matchVtxEfficiencyZ",0.,isSignal);
2543  }
2544 
2545  if(ntsim>0) Fill(h, "matchVtxEfficiencyZ1", fabs(zmatch-ev->z)<zmatch_ , isSignal);
2546  if(ntsim>1) Fill(h, "matchVtxEfficiencyZ2", fabs(zmatch-ev->z)<zmatch_ , isSignal);
2547 
2548 
2549  Fill(h,"vtxMultiplicity",nRecVWithTrk,isSignal);
2550 
2551  // efficiency vs number of tracks, use your favorite definition of efficiency here
2552  if(fabs(zmatch-ev->z)<zmatch_){ // zmatch
2553  Fill(h,"vtxFindingEfficiencyVsNtrk",(double) ev->tk.size(),1.);
2554  if(isSignal){
2555  Fill(h,"vtxFindingEfficiencyVsNtrkSignal",ev->tk.size(),1.);
2556  }else{
2557  Fill(h,"vtxFindingEfficiencyVsNtrkPU",(double) ev->tk.size(),1.);
2558  }
2559 
2560  }else{
2561  Fill(h,"vtxFindingEfficiencyVsNtrk",(double) ev->tk.size(),0.);
2562  if(isSignal){
2563  Fill(h,"vtxFindingEfficiencyVsNtrkSignal",(double) ev->tk.size(),1.);
2564  }else{
2565  Fill(h,"vtxFindingEfficiencyVsNtrkPU",(double) ev->tk.size(),1.);
2566  }
2567  }
2568 
2569  //part of the separation efficiency profiles
2570 
2571  if ( ev->eventId.event()==lastEvent ) continue;
2572  lastEvent = ev->eventId.event();
2573 
2574  if ( ( fabs(ev->z)>24. ) || ( ev->eventId.bunchCrossing()!=0 ) ) continue;
2575 
2576  int max_match = 0;
2577  int best_match = 999;
2578 
2579  for ( unsigned rv_idx=0; rv_idx<recVtxs->size(); rv_idx++ ) {
2580 
2581  VertexRef vtx_ref(recVtxs, rv_idx);
2582 
2583  int match = 0;
2584 
2585  for ( vector<TrackBaseRef>::const_iterator rv_trk_ite=vtx_ref->tracks_begin(); rv_trk_ite!=vtx_ref->tracks_end(); rv_trk_ite++ ) {
2586 
2587  vector<pair<TrackingParticleRef, double> > tp;
2588  if ( rsC.find(*rv_trk_ite)!=rsC.end() ) tp = rsC[*rv_trk_ite];
2589 
2590  for ( unsigned matched_tp_idx=0; matched_tp_idx<tp.size(); matched_tp_idx++ ) {
2591 
2592  TrackingParticle trackpart = *(tp[matched_tp_idx].first);
2593  EncodedEventId tp_ev = trackpart.eventId();
2594 
2595  if ( ( tp_ev.bunchCrossing()==ev->eventId.bunchCrossing() ) && ( tp_ev.event()==ev->eventId.event() ) ) {
2596  match++;
2597  break;
2598  }
2599 
2600  }
2601 
2602  }
2603 
2604 
2605  if ( match > max_match ) {
2606 
2607  max_match = match;
2608  best_match = rv_idx;
2609 
2610  }
2611 
2612  }
2613 
2614  double eff = 0.;
2615  double effwod = 0.;
2616  double dsimed = 0.;
2617 
2618  bool dsflag = false;
2619 
2620  for (unsigned i=0;i<used_indizesV.size(); i++) {
2621  if ( used_indizesV.at(i)==best_match ) {
2622  dsflag = true;
2623  break;
2624  }
2625  }
2626 
2627  if ( best_match!=999 ) eff = 1.;
2628  if ( dsflag ) dsimed = 1.;
2629  if ( ( best_match!=999 ) && ( !dsflag ) ) effwod = 1.;
2630 
2631  if ( best_match!=999 ) {
2632  used_indizesV.push_back(best_match);
2633  }
2634 
2635  Fill(h,"tveffvszsep", sep, eff);
2636  Fill(h,"tveffwodvszsep", sep, effwod);
2637  Fill(h,"tvmergedvszsep", sep, dsimed);
2638 
2639 
2640  }
2641 
2642  Fill(h,"npu1",npu1);
2643  Fill(h,"npu2",npu2);
2644 
2645  Fill(h,"nrecvsnpu",npu1,float(nrecvtxs));
2646  Fill(h,"nrecvsnpu2",npu2,float(nrecvtxs));
2647 
2648  // --------------------------------------- sim-signal vs rec-tag ---------------------------------------
2649  SimEvent* ev=&(simEvt[0]);
2650  const reco::Vertex* v=&(*recVtxs->begin());
2651 
2652  double n=0;
2653  for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2654  const reco::Track& RTe=te->track();
2655  for(trackit_t tv=v->tracks_begin(); tv!=v->tracks_end(); tv++){
2656  const reco::Track & RTv=*(tv->get());
2657  if(RTe.vz()==RTv.vz()) {n++;}
2658  }
2659  }
2660 
2661  cout << "Number of tracks in reco tagvtx " << v->tracksSize() << endl;
2662  cout << "Number of selected tracks in sim event vtx " << ev->tk.size() << " (prim=" << ev->tkprim.size() << ")"<<endl;
2663  cout << "Number of tracks in both " << n << endl;
2664  double ntruthmatched=getTruthMatchedVertexTracks(*v).size();
2665  if (ntruthmatched>0){
2666  cout << "TrackPurity = "<< n/ntruthmatched <<endl;
2667  Fill(h,"TagVtxTrkPurity",n/ntruthmatched);
2668  }
2669  if (ev->tk.size()>0){
2670  cout << "TrackEfficiency = "<< n/ev->tk.size() <<endl;
2671  Fill(h,"TagVtxTrkEfficiency",n/ev->tk.size());
2672  }
2673 }
2674 
2675 /***************************************************************************************/
2676 
2677 void PrimaryVertexAnalyzer4PU::analyzeVertexCollection(std::map<std::string, TH1*> & h,
2678  const Handle<reco::VertexCollection> recVtxs,
2679  const Handle<reco::TrackCollection> recTrks,
2680  std::vector<simPrimaryVertex> & simpv,
2681  const std::vector<float> & pui_z,
2682  const std::string message)
2683 {
2684  int nrectrks=recTrks->size();
2685  int nrecvtxs=recVtxs->size();
2686  int nseltrks=-1;
2687  reco::TrackCollection selTrks; // selected tracks
2688  reco::TrackCollection lostTrks; // selected but lost tracks (part of dropped clusters)
2689 
2690  // extract dummy vertices representing clusters
2691  reco::VertexCollection clusters;
2692  reco::Vertex allSelected;
2693  double cpufit=0;
2694  double cpuclu=0;
2695  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2696  v!=recVtxs->end(); ++v){
2697  if ( (fabs(v->ndof()+3.)<0.0001) && (v->chi2()<=0) ){
2698  // this dummy vertex is for the full event
2699  allSelected=(*v);
2700  nseltrks=(allSelected.tracksSize());
2701  nrecvtxs--;
2702  cpuclu=-v->chi2();
2703  continue;
2704  }else if( (fabs(v->ndof()+2.)<0.0001) && (v->chi2()==0) ){
2705  // this is a cluster, not a vertex
2706  clusters.push_back(*v);
2707  Fill(h,"cpuvsntrk",(double) v->tracksSize(),fabs(v->y()));
2708  cpufit+=fabs(v->y());
2709  Fill(h,"nclutrkall",(double) v->tracksSize());
2710  Fill(h,"selstat",v->x());
2711  nrecvtxs--;
2712  }
2713  }
2714  Fill(h,"cpuclu",cpuclu);
2715  Fill(h,"cpufit",cpufit);
2716  Fill(h,"cpucluvsntrk",nrectrks, cpuclu);
2717 
2718  if(simpv.size()>0){//this is mc
2719  double dsimrecx=0.;
2720  double dsimrecy=0.;//0.0011;
2721  double dsimrecz=0.;//0.0012;
2722 
2723  // vertex matching and efficiency bookkeeping
2724  int nsimtrk=0;
2725  for(std::vector<simPrimaryVertex>::iterator vsim=simpv.begin();
2726  vsim!=simpv.end(); vsim++){
2727 
2728  nsimtrk+=vsim->nGenTrk;
2729  // look for a matching reconstructed vertex
2730  vsim->recVtx=NULL;
2731  vsim->cluster=-1;
2732 
2733  for(reco::VertexCollection::const_iterator vrec=recVtxs->begin(); vrec!=recVtxs->end(); ++vrec){
2734 
2735  if( vrec->isFake() ) {
2736  continue; // skip fake vertices (=beamspot)
2737  cout << "fake vertex" << endl;
2738  }
2739 
2740  if( vrec->ndof()<0. )continue; // skip dummy clusters, if any
2741  // if ( matchVertex(*vsim,*vrec) ){
2742 
2743  // if the matching critera are fulfilled, accept the rec-vertex that is closest in z
2744  if( ((vsim->recVtx) && (fabs(vsim->recVtx->position().z()-vsim->z-dsimrecz)>fabs(vrec->z()-vsim->z-dsimrecz)))
2745  || (!vsim->recVtx) )
2746  {
2747  vsim->recVtx=&(*vrec);
2748 
2749  // find the corresponding cluster
2750  for(unsigned int iclu=0; iclu<clusters.size(); iclu++){
2751  if( fabs(clusters[iclu].position().z()-vrec->position().z()) < 0.001 ){
2752  vsim->cluster=iclu;
2753  vsim->nclutrk=clusters[iclu].position().y();
2754  }
2755  }
2756  }
2757 
2758  // the following only works in MC samples without pile-up
2759  if ((simpv.size()==1) && ( fabs(vsim->recVtx->position().z()-vsim->z-dsimrecz)>zmatch_ )){
2760 
2761  // now we have a recvertex without a matching simvertex, I would call this fake
2762  // however, the G4 info does not contain pile-up
2763  Fill(h,"fakeVtxZ",vrec->z());
2764  if (vrec->ndof()>=0.5) Fill(h,"fakeVtxZNdofgt05",vrec->z());
2765  if (vrec->ndof()>=2.0) Fill(h,"fakeVtxZNdofgt2",vrec->z());
2766  Fill(h,"fakeVtxNdof",vrec->ndof());
2767  Fill(h,"fakeVtxNtrk",vrec->tracksSize());
2768  if(vrec->tracksSize()==2){ Fill(h,"fake2trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2769  if(vrec->tracksSize()==3){ Fill(h,"fake3trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2770  if(vrec->tracksSize()==4){ Fill(h,"fake4trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2771  if(vrec->tracksSize()==5){ Fill(h,"fake5trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2772  }
2773  }
2774 
2775  Fill(h,"nsimtrk",float(nsimtrk));
2776  Fill(h,"nsimtrk",float(nsimtrk),vsim==simpv.begin());
2777  Fill(h,"nrecsimtrk",float(vsim->nMatchedTracks));
2778  Fill(h,"nrecnosimtrk",float(nsimtrk-vsim->nMatchedTracks));
2779 
2780  // histogram properties of matched vertices
2781  if (vsim->recVtx && ( fabs(vsim->recVtx->z()-vsim->z*simUnit_)<zmatch_ )){
2782 
2783  if(verbose_){std::cout <<"primary matched " << message << " " << setw(8) << setprecision(4) << vsim->x << " " << vsim->y << " " << vsim->z << std:: endl;}
2784  Fill(h,"matchedVtxNdof", vsim->recVtx->ndof());
2785  // residuals an pulls with respect to simulated vertex
2786  Fill(h,"resx", vsim->recVtx->x()-vsim->x*simUnit_ );
2787  Fill(h,"resy", vsim->recVtx->y()-vsim->y*simUnit_ );
2788  Fill(h,"resz", vsim->recVtx->z()-vsim->z*simUnit_ );
2789  Fill(h,"resz10", vsim->recVtx->z()-vsim->z*simUnit_ );
2790  Fill(h,"pullx", (vsim->recVtx->x()-vsim->x*simUnit_)/vsim->recVtx->xError() );
2791  Fill(h,"pully", (vsim->recVtx->y()-vsim->y*simUnit_)/vsim->recVtx->yError() );
2792  Fill(h,"pullz", (vsim->recVtx->z()-vsim->z*simUnit_)/vsim->recVtx->zError() );
2793  Fill(h,"resxr", vsim->recVtx->x()-vsim->x*simUnit_-dsimrecx);
2794  Fill(h,"resyr", vsim->recVtx->y()-vsim->y*simUnit_-dsimrecy );
2795  Fill(h,"reszr", vsim->recVtx->z()-vsim->z*simUnit_-dsimrecz);
2796  Fill(h,"pullxr", (vsim->recVtx->x()-vsim->x*simUnit_-dsimrecx)/vsim->recVtx->xError() );
2797  Fill(h,"pullyr", (vsim->recVtx->y()-vsim->y*simUnit_-dsimrecy)/vsim->recVtx->yError() );
2798  Fill(h,"pullzr", (vsim->recVtx->z()-vsim->z*simUnit_-dsimrecz)/vsim->recVtx->zError() );
2799 
2800  // efficiency with zmatch within 500 um (or whatever zmatch is)
2801  Fill(h,"eff", 1.);
2802  if(simpv.size()==1){
2803  if (vsim->recVtx==&(*recVtxs->begin())){
2804  Fill(h,"efftag", 1.);
2805  }else{
2806  Fill(h,"efftag", 0.);
2807  cout << "signal vertex not tagged " << message << " " << eventcounter_ << endl;
2808  // call XXClusterizerInZ.vertices(seltrks,3)
2809  }
2810  }
2811 
2812  Fill(h,"effvsptsq",vsim->ptsq,1.);
2813  Fill(h,"effvsnsimtrk",vsim->nGenTrk,1.);
2814  Fill(h,"effvsnrectrk",nrectrks,1.);
2815  Fill(h,"effvsnseltrk",nseltrks,1.);
2816  Fill(h,"effvsz",vsim->z*simUnit_,1.);
2817  Fill(h,"effvsz2",vsim->z*simUnit_,1.);
2818  Fill(h,"effvsr",sqrt(vsim->x*vsim->x+vsim->y*vsim->y)*simUnit_,1.);
2819 
2820  }else{ // no matching rec vertex found for this simvertex
2821 
2822  bool plapper=verbose_ && vsim->nGenTrk;
2823  if(plapper){
2824  // be quiet about invisble vertices
2825  std::cout << "primary not found " << message << " " << eventcounter_ << " x=" <<vsim->x*simUnit_ << " y=" << vsim->y*simUnit_ << " z=" << vsim->z*simUnit_ << " nGenTrk=" << vsim->nGenTrk << std::endl;
2826  }
2827  int mistype=0;
2828  if (vsim->recVtx){
2829  if(plapper){
2830  std::cout << "nearest recvertex at " << vsim->recVtx->z() << " dz=" << vsim->recVtx->z()-vsim->z*simUnit_ << std::endl;
2831  }
2832 
2833  if (fabs(vsim->recVtx->z()-vsim->z*simUnit_)<0.2 ){
2834  Fill(h,"effvsz2",vsim->z*simUnit_,1.);
2835  }
2836 
2837  if (fabs(vsim->recVtx->z()-vsim->z*simUnit_)<0.5 ){
2838  if(verbose_){std::cout << "type 1, lousy z vertex" << std::endl;}
2839  Fill(h,"zlost1", vsim->z*simUnit_,1.);
2840  mistype=1;
2841  }else{
2842  if(plapper){std::cout << "type 2a no vertex anywhere near" << std::endl;}
2843  mistype=2;
2844  }
2845  }else{// no recVtx at all
2846  mistype=2;
2847  if(plapper){std::cout << "type 2b, no vertex at all" << std::endl;}
2848  }
2849 
2850  if(mistype==2){
2851  int selstat=-3;
2852  // no matching vertex found, is there a cluster?
2853  for(unsigned int iclu=0; iclu<clusters.size(); iclu++){
2854  if( fabs(clusters[iclu].position().z()-vsim->z*simUnit_) < 0.1 ){
2855  selstat=int(clusters[iclu].position().x()+0.1);
2856  if(verbose_){std::cout << "matching cluster found with selstat=" << clusters[iclu].position().x() << std::endl;}
2857  }
2858  }
2859  if (selstat==0){
2860  if(plapper){std::cout << "vertex rejected (distance to beam)" << std::endl;}
2861  Fill(h,"zlost3", vsim->z*simUnit_,1.);
2862  }else if(selstat==-1){
2863  if(plapper) {std::cout << "vertex invalid" << std::endl;}
2864  Fill(h,"zlost4", vsim->z*simUnit_,1.);
2865  }else if(selstat==1){
2866  if(plapper){std::cout << "vertex accepted, this cannot be right!!!!!!!!!!" << std::endl;}
2867  }else if(selstat==-2){
2868  if(plapper){std::cout << "dont know what this means !!!!!!!!!!" << std::endl;}
2869  }else if(selstat==-3){
2870  if(plapper){std::cout << "no matching cluster found " << std::endl;}
2871  Fill(h,"zlost2", vsim->z*simUnit_,1.);
2872  }else{
2873  if(plapper){std::cout << "dont know what this means either !!!!!!!!!!" << selstat << std::endl;}
2874  }
2875  }//mistype==2
2876 
2877 
2878  Fill(h,"eff", 0.);
2879  if(simpv.size()==1){ Fill(h,"efftag", 0.); }
2880 
2881  Fill(h,"effvsptsq",vsim->ptsq,0.);
2882  Fill(h,"effvsnsimtrk",float(vsim->nGenTrk),0.);
2883  Fill(h,"effvsnrectrk",nrectrks,0.);
2884  Fill(h,"effvsnseltrk",nseltrks,0.);
2885  Fill(h,"effvsz",vsim->z*simUnit_,0.);
2886  Fill(h,"effvsr",sqrt(vsim->x*vsim->x+vsim->y*vsim->y)*simUnit_,0.);
2887 
2888  //part of the efficiency vs separation
2889 
2890  } // no recvertex for this simvertex
2891 
2892  }// end of sim/rec matching
2893 
2894  // purity of event vertex tags
2895  if (recVtxs->size()>0){
2896  Double_t dz=(*recVtxs->begin()).z() - (*simpv.begin()).z*simUnit_;
2897  Fill(h,"zdistancetag",dz);
2898  Fill(h,"abszdistancetag",fabs(dz));
2899  if( fabs(dz)<zmatch_){
2900  Fill(h,"puritytag",1.);
2901  }else{
2902  // bad tag: the true primary was more than 500 um (or zmatch) away from the tagged primary
2903  Fill(h,"puritytag",0.);
2904  }
2905  }
2906 
2907  }else{
2908  //if(verbose_) cout << "PrimaryVertexAnalyzer4PU::analyzeVertexCollection: simPV is empty!" << endl;
2909  }
2910 
2911 
2912  //******* the following code does not require MC and will/should work for data **********
2913 
2914  Fill(h,"bunchCrossing",bunchCrossing_);
2915  if(recTrks->size()>0) Fill(h,"bunchCrossingLogNtk",bunchCrossing_,log(recTrks->size())/log(10.));
2916 
2917  // ----------------- reconstructed tracks ------------------------
2918  // the list of selected tracks can only be correct if the selection parameterset and track collection
2919  // is the same that was used for the reconstruction
2920 
2921  int nt=0;
2922  for(reco::TrackCollection::const_iterator t=recTrks->begin();
2923  t!=recTrks->end(); ++t){
2924  if((recVtxs->size()>0) && (recVtxs->begin()->isValid())){
2925  fillTrackHistos(h,"all",*t,&(*recVtxs->begin()));
2926  }else{
2927  fillTrackHistos(h,"all",*t);
2928  }
2929  if(recTrks->size()>100) fillTrackHistos(h,"M",*t);
2930 
2931  TransientTrack tt = theB_->build(&(*t)); tt.setBeamSpot(vertexBeamSpot_);
2932  if (theTrackFilter(tt)){
2933  selTrks.push_back(*t);
2934  fillTrackHistos(h,"sel",*t);
2935  int foundinvtx=0;
2936  int nvtemp=-1;
2937  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2938  v!=recVtxs->end(); ++v){
2939  nvtemp++;
2940  if(( v->isFake()) || (v->ndof()<-2) ) break;
2941  for(trackit_t tv=v->tracks_begin(); tv!=v->tracks_end(); tv++ ){
2942  if( ((**tv).vz()==t->vz()&&((**tv).phi()==t->phi())) ) {
2943  foundinvtx++;
2944  }
2945  }
2946  }
2947  if(foundinvtx==0){
2948  fillTrackHistos(h,"sellost",*t);
2949  }else if(foundinvtx>1){
2950  cout << "hmmmm " << foundinvtx << endl;
2951  }
2952  }
2953  nt++;
2954  }
2955 
2956 
2957  if (nseltrks<0){
2958  nseltrks=selTrks.size();
2959  }else if( ! (nseltrks==(int)selTrks.size()) ){
2960  std::cout << "Warning: inconsistent track selection !" << std::endl;
2961  }
2962 
2963  // fill track histograms of vertex tracks
2964  int nrec=0, nrec0=0, nrec8=0, nrec2=0, nrec4=0;
2965  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
2966  v!=recVtxs->end(); ++v){
2967 
2968  if (! (v->isFake()) && v->ndof()>0 && v->chi2()>0 ){
2969  nrec++;
2970  if (v->ndof()>0) nrec0++;
2971  if (v->ndof()>8) nrec8++;
2972  if (v->ndof()>2) nrec2++;
2973  if (v->ndof()>4) nrec4++;
2974  for(trackit_t t=v->tracks_begin(); t!=v->tracks_end(); t++){
2975  if(v==recVtxs->begin()){
2976  fillTrackHistos(h,"tagged",**t, &(*v));
2977  }else{
2978  fillTrackHistos(h,"untagged",**t, &(*v));
2979  }
2980 
2981  Float_t wt=v->trackWeight(*t);
2982  //dumpHitInfo(**t); cout << " w=" << wt << endl;
2983  Fill(h,"trackWt",wt);
2984  if(wt>0.5){
2985  fillTrackHistos(h,"wgt05",**t, &(*v));
2986  if(v->ndof()>4) fillTrackHistos(h,"ndof4",**t, &(*v));
2987  }else{
2988  fillTrackHistos(h,"wlt05",**t, &(*v));
2989  }
2990  }
2991  }
2992  }
2993 
2994 
2995  // bachelor tracks (only available through clusters right now)
2996  for(unsigned int iclu=0; iclu<clusters.size(); iclu++){
2997  if (clusters[iclu].tracksSize()==1){
2998  for(trackit_t t = clusters[iclu].tracks_begin();
2999  t!=clusters[iclu].tracks_end(); t++){
3000  fillTrackHistos(h,"bachelor",**t);
3001  }
3002  }
3003  }
3004 
3005 
3006  // ----------------- reconstructed vertices ------------------------
3007 
3008  // event
3009  Fill(h,"szRecVtx",recVtxs->size());
3010  Fill(h,"nclu",clusters.size());
3011  Fill(h,"nseltrk",nseltrks);
3012  Fill(h,"nrectrk",nrectrks);
3013  Fill(h,"nrecvtx",nrec);
3014  Fill(h,"nrecvtx2",nrec2);
3015  Fill(h,"nrecvtx4",nrec4);
3016  Fill(h,"nrecvtx8",nrec8);
3017 
3018  if(nrec>0){
3019  Fill(h,"eff0vsntrec",nrectrks,1.);
3020  Fill(h,"eff0vsntsel",nseltrks,1.);
3021  }else{
3022  Fill(h,"eff0vsntrec",nrectrks,0.);
3023  Fill(h,"eff0vsntsel",nseltrks,0.);
3024  if((nseltrks>1)&&(verbose_)){
3025  cout << Form("PrimaryVertexAnalyzer4PU: %s may have lost a vertex %10d %14llu %4d / %4d ",message.c_str(),run_, event_, nrectrks,nseltrks) << endl;
3026  dumpThisEvent_=true;
3027  }
3028  }
3029  if(nrec0>0) { Fill(h,"eff0ndof0vsntsel",nseltrks,1.);}else{ Fill(h,"eff0ndof0vsntsel",nseltrks,0.);}
3030  if(nrec2>0) { Fill(h,"eff0ndof2vsntsel",nseltrks,1.);}else{ Fill(h,"eff0ndof2vsntsel",nseltrks,0.);}
3031  if(nrec4>0) { Fill(h,"eff0ndof4vsntsel",nseltrks,1.);}else{ Fill(h,"eff0ndof4vsntsel",nseltrks,0.);}
3032  if(nrec8>0) { Fill(h,"eff0ndof8vsntsel",nseltrks,1.);}else{ Fill(h,"eff0ndof8vsntsel",nseltrks,0.);}
3033 
3034  if((nrec>1)&&(DEBUG_)) {
3035  cout << "multivertex event" << endl;
3036  dumpThisEvent_=true;
3037  }
3038 
3039  if((nrectrks>10)&&(nseltrks<3)){
3040  cout << "small fraction of selected tracks " << endl;
3041  dumpThisEvent_=true;
3042  }
3043 
3044  // properties of events without a vertex
3045  if((nrec==0)||(recVtxs->begin()->isFake())){
3046  Fill(h,"nrectrk0vtx",nrectrks);
3047  Fill(h,"nseltrk0vtx",nseltrks);
3048  Fill(h,"nclu0vtx",clusters.size());
3049  }
3050 
3051 
3052  // properties of (valid) vertices
3053  double ndof2=-10,ndof1=-10, zndof1=0, zndof2=0;
3054  for(reco::VertexCollection::const_iterator v=recVtxs->begin();
3055  v!=recVtxs->end(); ++v){
3056  if(v->isFake()){ Fill(h,"isFake",1.);}else{ Fill(h,"isFake",0.);}
3057  if(v->isFake()||((v->ndof()<0)&&(v->ndof()>-3))){ Fill(h,"isFake1",1.);}else{ Fill(h,"isFake1",0.);}
3058 
3059  if((v->isFake())||(v->ndof()<0)) continue;
3060  if(v->ndof()>ndof1){ ndof2=ndof1; zndof2=zndof1; ndof1=v->ndof(); zndof1=v->position().z();}
3061  else if(v->ndof()>ndof2){ ndof2=v->ndof(); zndof2=v->position().z();}
3062 
3063 
3064  // some special histogram for two track vertices
3065  if(v->tracksSize()==2){
3066  const TrackBaseRef& t1= *(v->tracks_begin());
3067  const TrackBaseRef& t2=*(v->tracks_begin()+1);
3068  bool os=(t1->charge()*t2->charge()<0);
3069  double dphi=t1->phi()-t2->phi(); if (dphi<0) dphi+=2*M_PI;
3070  double m12=sqrt(pow( sqrt(pow(0.139,2)+pow( t1->p(),2)) +sqrt(pow(0.139,2)+pow( t2->p(),2)) ,2)
3071  -pow(t1->px()+t2->px(),2)
3072  -pow(t1->py()+t2->py(),2)
3073  -pow(t1->pz()+t2->pz(),2)
3074  );
3075  if(os){
3076  Fill(h,"2trkdetaOS",t1->eta()-t2->eta());
3077  Fill(h,"2trkmassOS",m12);
3078  }else{
3079  Fill(h,"2trkdetaSS",t1->eta()-t2->eta());
3080  Fill(h,"2trkmassSS",m12);
3081  }
3082  Fill(h,"2trkdphi",dphi);
3083  Fill(h,"2trkseta",t1->eta()+t2->eta());
3084  if(fabs(dphi-M_PI)<0.1) Fill(h,"2trksetacurl",t1->eta()+t2->eta());
3085  if(fabs(t1->eta()+t2->eta())<0.1) Fill(h,"2trkdphicurl",dphi);
3086  // fill separately for extra vertices
3087  if(v!=recVtxs->begin()){
3088  if(os){
3089  Fill(h,"2trkdetaOSPU",t1->eta()-t2->eta());
3090  Fill(h,"2trkmassOSPU",m12);
3091  }else{
3092  Fill(h,"2trkdetaSSPU",t1->eta()-t2->eta());
3093  Fill(h,"2trkmassSSPU",m12);
3094  }
3095  Fill(h,"2trkdphiPU",dphi);
3096  Fill(h,"2trksetaPU",t1->eta()+t2->eta());
3097  if(fabs(dphi-M_PI)<0.1) Fill(h,"2trksetacurlPU",t1->eta()+t2->eta());
3098  if(fabs(t1->eta()+t2->eta())<0.1) Fill(h,"2trkdphicurlPU",dphi);
3099  }
3100  }
3101 
3102 
3103  Fill(h,"trkchi2vsndof",v->ndof(),v->chi2());
3104  if(v->ndof()>0){ Fill(h,"trkchi2overndof",v->chi2()/v->ndof()); }
3105  if(v->tracksSize()==2){ Fill(h,"2trkchi2vsndof",v->ndof(),v->chi2()); }
3106  if(v->tracksSize()==3){ Fill(h,"3trkchi2vsndof",v->ndof(),v->chi2()); }
3107  if(v->tracksSize()==4){ Fill(h,"4trkchi2vsndof",v->ndof(),v->chi2()); }
3108  if(v->tracksSize()==5){ Fill(h,"5trkchi2vsndof",v->ndof(),v->chi2()); }
3109 
3110  Fill(h,"nbtksinvtx",v->tracksSize());
3111  Fill(h,"nbtksinvtx2",v->tracksSize());
3112  Fill(h,"vtxchi2",v->chi2());
3113  Fill(h,"vtxndf",v->ndof());
3114  Fill(h,"vtxprob",ChiSquaredProbability(v->chi2() ,v->ndof()));
3115  Fill(h,"vtxndfvsntk",v->tracksSize(), v->ndof());
3116  Fill(h,"vtxndfoverntk",v->ndof()/v->tracksSize());
3117  Fill(h,"vtxndf2overntk",(v->ndof()+2)/v->tracksSize());
3118  Fill(h,"zrecvsnt",v->position().z(),float(nrectrks));
3119  if(nrectrks>100){
3120  Fill(h,"zrecNt100",v->position().z());
3121  }
3122 
3123  if(v->ndof()>2.0){ // enter only vertices that really contain tracks
3124  Fill(h,"xrec",v->position().x());
3125  Fill(h,"yrec",v->position().y());
3126  Fill(h,"zrec",v->position().z());
3127  Fill(h,"xrec1",v->position().x());
3128  Fill(h,"yrec1",v->position().y());
3129  Fill(h,"zrec1",v->position().z());
3130  Fill(h,"xrec2",v->position().x());
3131  Fill(h,"yrec2",v->position().y());
3132  Fill(h,"zrec2",v->position().z());
3133  Fill(h,"xrec3",v->position().x());
3134  Fill(h,"yrec3",v->position().y());
3135  Fill(h,"zrec3",v->position().z());
3136  Fill(h,"xrecb",v->position().x()-vertexBeamSpot_.x0());
3137  Fill(h,"yrecb",v->position().y()-vertexBeamSpot_.y0());
3138  Fill(h,"zrecb",v->position().z()-vertexBeamSpot_.z0());
3139  Fill(h,"xrecBeam",v->position().x()-vertexBeamSpot_.x0());
3140  Fill(h,"yrecBeam",v->position().y()-vertexBeamSpot_.y0());
3141  Fill(h,"zrecBeam",v->position().z()-vertexBeamSpot_.z0());
3142  Fill(h,"xrecBeamPull",(v->position().x()-vertexBeamSpot_.x0())/sqrt(pow(v->xError(),2)+pow(vertexBeamSpot_.BeamWidthX(),2)));
3143  Fill(h,"yrecBeamPull",(v->position().y()-vertexBeamSpot_.y0())/sqrt(pow(v->yError(),2)+pow(vertexBeamSpot_.BeamWidthY(),2)));
3144 
3145  Fill(h,"xrecBeamvsdx",v->xError(),v->position().x()-vertexBeamSpot_.x0());
3146  Fill(h,"yrecBeamvsdy",v->yError(),v->position().y()-vertexBeamSpot_.y0());
3147  Fill(h,"xrecBeamvsdxR2",v->position().x()-vertexBeamSpot_.x0(),v->xError());
3148  Fill(h,"yrecBeamvsdyR2",v->position().y()-vertexBeamSpot_.y0(),v->yError());
3149  Fill(h,"xrecBeam2vsdx2prof",pow(v->xError(),2),pow(v->position().x()-vertexBeamSpot_.x0(),2));
3150  Fill(h,"yrecBeam2vsdy2prof",pow(v->yError(),2),pow(v->position().y()-vertexBeamSpot_.y0(),2));
3151  Fill(h,"xrecBeamvsdx2",pow(v->xError(),2),pow(v->position().x()-vertexBeamSpot_.x0(),2));
3152  Fill(h,"yrecBeamvsdy2",pow(v->yError(),2),pow(v->position().y()-vertexBeamSpot_.y0(),2));
3153  Fill(h,"xrecBeamvsz",v->position().z(),v->position().x()-vertexBeamSpot_.x0());
3154  Fill(h,"yrecBeamvsz",v->position().z(),v->position().y()-vertexBeamSpot_.y0());
3155  Fill(h,"xrecBeamvszprof",v->position().z(),v->position().x()-vertexBeamSpot_.x0());
3156  Fill(h,"yrecBeamvszprof",v->position().z(),v->position().y()-vertexBeamSpot_.y0());
3157  Fill(h,"xrecBeamvsdxprof",v->xError(),v->position().x()-vertexBeamSpot_.x0());
3158  Fill(h,"yrecBeamvsdyprof",v->yError(),v->position().y()-vertexBeamSpot_.y0());
3159 
3160 
3161  Fill(h,"errx",v->xError());
3162  Fill(h,"erry",v->yError());
3163  Fill(h,"errz",v->zError());
3164  double vxx=v->covariance(0,0);
3165  double vyy=v->covariance(1,1);
3166  double vxy=v->covariance(1,0);
3167  double dv=0.25*(vxx+vyy)*(vxx+vyy-(vxx*vyy-vxy*vxy));
3168  if(dv>0){
3169  double l1=0.5*(vxx+vyy)+sqrt(dv);
3170  Fill(h,"err1",sqrt(l1));
3171  double l2=sqrt(0.5*(vxx+vyy)-sqrt(dv));
3172  if(l2>0) Fill(h,"err2",sqrt(l2));
3173  }
3174 
3175 
3176  // look at the tagged vertex separately
3177  if (v==recVtxs->begin()){
3178  Fill(h,"nbtksinvtxTag",v->tracksSize());
3179  Fill(h,"nbtksinvtxTag2",v->tracksSize());
3180  Fill(h,"xrectag",v->position().x());
3181  Fill(h,"yrectag",v->position().y());
3182  Fill(h,"zrectag",v->position().z());
3183  }else{
3184  Fill(h,"nbtksinvtxPU",v->tracksSize());
3185  Fill(h,"nbtksinvtxPU2",v->tracksSize());
3186  }
3187 
3188  // vertex resolution vs number of tracks
3189  Fill(h,"xresvsntrk",v->tracksSize(),v->xError());
3190  Fill(h,"yresvsntrk",v->tracksSize(),v->yError());
3191  Fill(h,"zresvsntrk",v->tracksSize(),v->zError());
3192 
3193  }
3194 
3195  // cluster properties (if available)
3196  for(unsigned int iclu=0; iclu<clusters.size(); iclu++){
3197  if( fabs(clusters[iclu].position().z()-v->position().z()) < 0.0001 ){
3198  Fill(h,"nclutrkvtx",clusters[iclu].tracksSize());
3199  }
3200  }
3201 
3202  // properties of (valid) neighbour vertices
3203  reco::VertexCollection::const_iterator v1=v; v1++;
3204  for(; v1!=recVtxs->end(); ++v1){
3205  if((v1->isFake())||(v1->ndof()<0)) continue;
3206  Fill(h,"zdiffrec",v->position().z()-v1->position().z());
3207 
3208  double z0=v->position().z()-vertexBeamSpot_.z0();
3209  double z1=v1->position().z()-vertexBeamSpot_.z0();
3210  Fill(h,"zPUcand",z0); Fill(h,"zPUcand",z1);
3211  Fill(h,"ndofPUcand",v->ndof()); Fill(h,"ndofPUcand",v1->ndof());
3212 
3213  Fill(h,"zdiffvsz",z1-z0,0.5*(z1+z0));
3214 
3215  if ((v->ndof()>2) && (v1->ndof()>2)){
3216  Fill(h,"zdiffrec2",v->position().z()-v1->position().z());
3217  Fill(h,"zPUcand2",z0);
3218  Fill(h,"zPUcand2",z1);
3219  Fill(h,"ndofPUcand2",v->ndof());
3220  Fill(h,"ndofPUcand2",v1->ndof());
3221  Fill(h,"zvszrec2",z0, z1);
3222  Fill(h,"pzvspz2",TMath::Freq(z0/2.16),TMath::Freq(z1/2.16) );
3223  }
3224 
3225  if ((v->ndof()>4) && (v1->ndof()>4)){
3226  Fill(h,"zdiffvsz4",z1-z0,0.5*(z1+z0));
3227  Fill(h,"zdiffrec4",v->position().z()-v1->position().z());
3228  Fill(h,"zvszrec4",z0, z1);
3229  Fill(h,"pzvspz4",TMath::Freq(z0/2.16),TMath::Freq(z1/2.16) );
3230  if(fabs(z0-z1)>1.0){
3231  Fill(h,"xbeamPUcand",v->position().x()-vertexBeamSpot_.x0());
3232  Fill(h,"ybeamPUcand",v->position().y()-vertexBeamSpot_.y0());
3233  Fill(h,"xbeamPullPUcand",(v->position().x()-vertexBeamSpot_.x0())/v->xError());
3234  Fill(h,"ybeamPullPUcand",(v->position().y()-vertexBeamSpot_.y0())/v->yError());
3235  Fill(h,"ndofOverNtkPUcand",v->ndof()/v->tracksSize());
3236  Fill(h,"ndofOverNtkPUcand",v1->ndof()/v1->tracksSize());
3237  Fill(h,"xbeamPUcand",v1->position().x()-vertexBeamSpot_.x0());
3238  Fill(h,"ybeamPUcand",v1->position().y()-vertexBeamSpot_.y0());
3239  Fill(h,"xbeamPullPUcand",(v1->position().x()-vertexBeamSpot_.x0())/v1->xError());
3240  Fill(h,"ybeamPullPUcand",(v1->position().y()-vertexBeamSpot_.y0())/v1->yError());
3241  Fill(h,"zPUcand4",z0);
3242  Fill(h,"zPUcand4",z1);
3243  Fill(h,"ndofPUcand4",v->ndof());
3244  Fill(h,"ndofPUcand4",v1->ndof());
3245  for(trackit_t t=v->tracks_begin(); t!=v->tracks_end(); t++){ if(v->trackWeight(*t)>0.5) fillTrackHistos(h,"PUcand",**t, &(*v)); }
3246  for(trackit_t t=v1->tracks_begin(); t!=v1->tracks_end(); t++){ if(v1->trackWeight(*t)>0.5) fillTrackHistos(h,"PUcand",**t, &(*v1)); }
3247  }
3248  }
3249 
3250  if ((v->ndof()>4) && (v1->ndof()>2) && (v1->ndof()<4)){
3251  for(trackit_t t=v1->tracks_begin(); t!=v1->tracks_end(); t++){ if(v1->trackWeight(*t)>0.5) fillTrackHistos(h,"PUfake",**t, &(*v1)); }
3252  }
3253 
3254  if ((v->ndof()>8) && (v1->ndof()>8)){
3255  Fill(h,"zdiffrec8",v->position().z()-v1->position().z());
3256  if(dumpPUcandidates_ && fabs(z0-z1)>1.0){
3257  cout << "PU candidate " << run_ << " " << event_ << " " << message << " zdiff=" <<z0-z1 << endl;
3258  dumpThisEvent_=true;
3259  }
3260  }
3261 
3262  }
3263 
3264  // test track links, use reconstructed vertices
3265  bool problem = false;
3266  Fill(h,"nans",1.,std::isnan(v->position().x())*1.);
3267  Fill(h,"nans",2.,std::isnan(v->position().y())*1.);
3268  Fill(h,"nans",3.,std::isnan(v->position().z())*1.);
3269 
3270  int index = 3;
3271  for (int i = 0; i != 3; i++) {
3272  for (int j = i; j != 3; j++) {
3273  index++;
3274  Fill(h,"nans",index*1., std::isnan(v->covariance(i, j))*1.);
3275  if (std::isnan(v->covariance(i, j))) problem = true;
3276  // in addition, diagonal element must be positive
3277  if (j == i && v->covariance(i, j) < 0) {
3278  Fill(h,"nans",index*1., 1.);
3279  problem = true;
3280  }
3281  }
3282  }
3283 
3284  try {
3285  for(trackit_t t = v->tracks_begin();
3286  t!=v->tracks_end(); t++) {
3287  // illegal charge
3288  if ( (**t).charge() < -1 || (**t).charge() > 1 ) {
3289  Fill(h,"tklinks",0.);
3290  }
3291  else {
3292  Fill(h,"tklinks",1.);
3293  }
3294  }
3295  } catch (...) {
3296  // exception thrown when trying to use linked track
3297  Fill(h,"tklinks",0.);
3298  }
3299 
3300  if (problem) {
3301  // analyze track parameter covariance definiteness
3302  double data[25];
3303  try {
3304  int itk = 0;
3305  for(trackit_t t = v->tracks_begin();
3306  t!=v->tracks_end(); t++) {
3307  std::cout << "Track " << itk++ << std::endl;
3308  int i2 = 0;
3309  for (int i = 0; i != 5; i++) {
3310  for (int j = 0; j != 5; j++) {
3311  data[i2] = (**t).covariance(i, j);
3312  std::cout << std:: scientific << data[i2] << " ";
3313  i2++;
3314  }
3315  std::cout << std::endl;
3316  }
3317  gsl_matrix_view m
3318  = gsl_matrix_view_array (data, 5, 5);
3319 
3320  gsl_vector *eval = gsl_vector_alloc (5);
3321  gsl_matrix *evec = gsl_matrix_alloc (5, 5);
3322 
3323  gsl_eigen_symmv_workspace * w =
3324  gsl_eigen_symmv_alloc (5);
3325 
3326  gsl_eigen_symmv (&m.matrix, eval, evec, w);
3327 
3328  gsl_eigen_symmv_free (w);
3329 
3330  gsl_eigen_symmv_sort (eval, evec,
3331  GSL_EIGEN_SORT_ABS_ASC);
3332 
3333  // print sorted eigenvalues
3334  {
3335  int i;
3336  for (i = 0; i < 5; i++) {
3337  double eval_i
3338  = gsl_vector_get (eval, i);
3339  //gsl_vector_view evec_i
3340  // = gsl_matrix_column (evec, i);
3341 
3342  printf ("eigenvalue = %g\n", eval_i);
3343  // printf ("eigenvector = \n");
3344  // gsl_vector_fprintf (stdout,
3345  // &evec_i.vector, "%g");
3346  }
3347  }
3348  }
3349  }
3350  catch (...) {
3351  // exception thrown when trying to use linked track
3352  break;
3353  }// catch()
3354  }// if (problem)
3355 
3356  } // vertex loop (v)
3357 
3358  // 2nd highest ndof
3359  if (ndof2>0){
3360  Fill(h,"ndofnr2",ndof2);
3361  if(fabs(zndof1-zndof2)>1) Fill(h,"ndofnr2d1cm",ndof2);
3362  if(fabs(zndof1-zndof2)>2) Fill(h,"ndofnr2d2cm",ndof2);
3363  }
3364 
3365  //part of the separation efficiency profiles
3366 
3367  if ( pui_z.size()>0 ) {
3368 
3369  vector<int> used_indizesV;
3370 
3371  for (unsigned spv_idx=0; spv_idx<pui_z.size(); spv_idx++) {
3372 
3373  float sv = pui_z[spv_idx];
3374 
3375  if ( fabs(sv)>24. ) continue;
3376 
3377  double eff = 0.;
3378  double effwod = 0.;
3379  double dreco = 0.;
3380  double dsimed = 0.;
3381 
3382  vector<int>* matchedV = vertex_match(sv, recVtxs);
3383  unsigned numMatchs = matchedV->size();
3384 
3385  bool dsflag = false;
3386 
3387  for (unsigned i=0;i<used_indizesV.size(); i++) {
3388  for (unsigned j=0;j<numMatchs; j++) {
3389  if ( used_indizesV.at(i)==matchedV->at(j) ) {
3390  dsflag = true;
3391  break;
3392  }
3393  }
3394  }
3395 
3396  if ( numMatchs>0 ) eff = 1.;
3397  if ( numMatchs>1 ) dreco = 1.;
3398  if ( dsflag ) dsimed = 1.;
3399  if ( ( numMatchs>0 ) && ( !dsflag ) ) effwod = 1.;
3400 
3401  for (unsigned i=0;i<numMatchs; i++) {
3402  used_indizesV.push_back(matchedV->at(i));
3403  }
3404 
3405  float sep = getTrueSeparation(sv, pui_z);
3406 
3407  Fill(h,"effvszsep", sep, eff);
3408  Fill(h,"effwodvszsep", sep, effwod);
3409  Fill(h,"mergedvszsep", sep, dsimed);
3410  Fill(h,"splitvszsep", sep, dreco);
3411 
3412  }
3413 
3414  } else {
3415  std::cout << "Strange PileUpSummaryInfo in the event" << std::endl;
3416  }
3417 }
RunNumber_t run() const
Definition: EventID.h:39
virtual char const * what() const
Definition: Exception.cc:141
edm::EDGetTokenT< reco::TrackCollection > recoTrackCollectionToken_
double p() const
momentum vector magnitude
Definition: TrackBase.h:663
type
Definition: HCALResponse.h:21
TrackFilterForPVFinding theTrackFilter
value_type const * get() const
Definition: RefToBase.h:213
EventNumber_t event() const
Definition: EventID.h:41
unsigned int size_type
Definition: View.h:85
double z0() const
z coordinate
Definition: BeamSpot.h:68
int i
Definition: DBlmapReader.cc:9
edm::EDGetTokenT< reco::BeamSpot > recoBeamSpotToken_
double d0Error() const
error on d0
Definition: TrackBase.h:850
edm::EDGetTokenT< edm::SimTrackContainer > edmSimTrackContainerToken_
bool matchVertex(const simPrimaryVertex &vsim, const reco::Vertex &vrec)
std::vector< SimPart > getSimTrkParameters(edm::Handle< edm::SimTrackContainer > &simTrks, edm::Handle< edm::SimVertexContainer > &simVtcs, double simUnit=1.0)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:250
int event() const
get the contents of the subdetector field (should be protected?)
TPRegexp parents
Definition: eve_filter.cc:24
unsigned short lost() const
Number of lost (=invalid) hits on track.
Definition: Track.h:199
std::vector< PrimaryVertexAnalyzer4PU::SimEvent > getSimEvents(edm::Handle< TrackingParticleCollection >, edm::Handle< TrackingVertexCollection >, edm::Handle< edm::View< reco::Track > >)
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
void fillTrackHistos(std::map< std::string, TH1 * > &h, const std::string &ttype, const reco::Track &t, const reco::Vertex *v=NULL)
const double w
Definition: UKUtility.cc:23
std::vector< TrackingParticle > TrackingParticleCollection
trackRef_iterator tracks_end() const
last iterator over tracks
Definition: Vertex.cc:44
const_iterator end() const
last iterator over the map (read only)
void setBeamSpot(const reco::BeamSpot &beamSpot)
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:609
reco::TrackBase::ParameterVector ParameterVector
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
std::map< std::string, TH1 * > hsimPV
std::vector< SimVertex >::const_iterator g4v_iterator
edm::Handle< reco::BeamSpot > recoBeamSpotHandle_
std::vector< reco::TransientTrack > tk
double theta() const
polar angle
Definition: TrackBase.h:627
double dxyError() const
error on dxy
Definition: TrackBase.h:844
Divides< arg, void > D0
Definition: Factorize.h:143
std::vector< int > supf(std::vector< SimPart > &simtrks, const reco::TrackCollection &trks)
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
edm::EDGetTokenT< reco::VertexCollection > recoVertexCollectionToken_
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
std::vector< Track > TrackCollection
collection of Tracks
Definition: TrackFwd.h:13
Geom::Theta< T > theta() const
T y() const
Definition: PV3DBase.h:63
int bunchCrossing() const
Definition: EventBase.h:62
double error() const
Definition: Measurement1D.h:30
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:59
static bool match(const ParameterVector &a, const ParameterVector &b)
size_type size() const
edm::ESHandle< TransientTrackBuilder > theB_
edm::EDGetTokenT< TrackingParticleCollection > trackingParticleCollectionToken_
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:693
#define NULL
Definition: scimark2.h:8
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
bool ev
math::Vector< dimension >::type ParameterVector
parameter vector
Definition: TrackBase.h:73
double px() const
x coordinate of momentum vector
Definition: TrackBase.h:675
int pixelLayersWithMeasurement() const
Definition: HitPattern.cc:458
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
edm::EDGetTokenT< TrackingVertexCollection > trackingVertexCollectionToken_
edm::EDGetTokenT< edm::HepMCProduct > edmHepMCProductToken_
void analyzeVertexCollection(std::map< std::string, TH1 * > &h, const edm::Handle< reco::VertexCollection > recVtxs, const edm::Handle< reco::TrackCollection > recTrks, std::vector< simPrimaryVertex > &simpv, const std::vector< float > &pui_z, const std::string message="")
void printRecVtxs(const edm::Handle< reco::VertexCollection > recVtxs, std::string title="Reconstructed Vertices")
int trackerLayersWithMeasurement() const
Definition: HitPattern.cc:477
const Point & position() const
position
Definition: Vertex.h:106
bool alreadyPrinted() const
Definition: Exception.cc:251
TrajectoryStateClosestToBeamLine stateAtBeamLine() const
float float float z
void getData(T &iHolder) const
Definition: EventSetup.h:78
std::map< std::string, TH1 * > hnoBS
edm::LuminosityBlockNumber_t luminosityBlock_
const math::XYZPoint & innerPosition() const
position of the innermost hit
Definition: Track.h:55
TrackAlgorithm algo() const
Definition: TrackBase.h:423
void Fill(std::map< std::string, TH1 * > &h, std::string s, double x)
std::map< std::string, TH1 * > hDA
double getTrueSeparation(float, const std::vector< float > &)
bool isFinalstateParticle(const HepMC::GenParticle *p)
bool isCharged(const HepMC::GenParticle *p)
int iEvent
Definition: GenABIO.cc:230
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:699
const std::vector< float > & getPU_zpositions() const
bool truthMatchedTrack(edm::RefToBase< reco::Track >, TrackingParticleRef &)
bool isnan(float x)
Definition: math.h:13
float trackWeight(const TrackBaseRef &r) const
returns the weight with which a Track has contributed to the vertex-fit.
T sqrt(T t)
Definition: SSEVec.h:48
int bunchCrossing() const
get the detector field from this detid
GlobalPoint position() const
std::map< std::string, TH1 * > bookVertexHistograms()
double pt() const
track transverse momentum
Definition: TrackBase.h:669
void printPVTrks(const edm::Handle< reco::TrackCollection > &recTrks, const edm::Handle< reco::VertexCollection > &recVtxs, std::vector< SimPart > &tsim, std::vector< SimEvent > &simEvt, const bool selectedOnly=true)
T z() const
Definition: PV3DBase.h:64
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
tuple IP
Definition: listHistos.py:76
int qualityMask() const
Definition: TrackBase.h:904
virtual CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &) const
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
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
double lambda() const
Lambda angle.
Definition: TrackBase.h:633
std::vector< simPrimaryVertex > getSimPVs(const edm::Handle< edm::HepMCProduct > evtMC)
double f[11][100]
float ChiSquaredProbability(double chiSquared, double nrDOF)
double BeamWidthX() const
beam width X
Definition: BeamSpot.h:86
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
std::vector< int > * vertex_match(float, const edm::Handle< reco::VertexCollection >)
void printSimVtxs(const edm::Handle< edm::SimVertexContainer > simVtxs)
const int mu
Definition: Constants.h:22
#define end
Definition: vmac.h:37
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:242
int orbitNumber() const
Definition: EventBase.h:63
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:104
void printEventSummary(std::map< std::string, TH1 * > &h, const edm::Handle< reco::VertexCollection > recVtxs, const edm::Handle< reco::TrackCollection > recTrks, std::vector< SimEvent > &simEvt, const std::string message)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
bool isValid() const
Definition: HandleBase.h:76
HepPDT::ParticleData ParticleData
#define M_PI
virtual reco::RecoToSimCollection associateRecoToSim(edm::Handle< edm::View< reco::Track > > &tCH, edm::Handle< TrackingParticleCollection > &tPCH, const edm::Event *event, const edm::EventSetup *setup) const
compare reco to sim the handle of reco::Track and TrackingParticle collections
edm::EDGetTokenT< edm::View< reco::Track > > edmView_recoTrack_Token_
double ndof() const
Definition: Vertex.h:102
edm::EDGetTokenT< edm::SimVertexContainer > edmSimVertexContainerToken_
int nt
Definition: AMPTWrapper.h:32
double pz() const
z coordinate of momentum vector
Definition: TrackBase.h:687
std::map< std::string, TH1 * > hBS
std::vector< reco::TransientTrack > tkprim
double dzError() const
error on dz
Definition: TrackBase.h:862
reco::Vertex::trackRef_iterator trackit_t
std::string getReleaseVersion()
double vz() const
z coordinate of the reference point on track
Definition: TrackBase.h:717
TrackAssociatorBase * associatorByHits_
Definition: DetId.h:18
GlobalPoint position() const
void matchRecTracksToVertex(simPrimaryVertex &pv, const std::vector< SimPart > &tsim, const edm::Handle< reco::TrackCollection > &recTrks)
double significance() const
Definition: Measurement1D.h:32
bool isResonance(const HepMC::GenParticle *p)
T const * product() const
Definition: Handle.h:81
const Track & track() const
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:384
tuple tracks
Definition: testEve_cfg.py:39
void printRecTrks(const edm::Handle< reco::TrackCollection > &recTrks)
void getTc(const std::vector< reco::TransientTrack > &, double &, double &, double &, double &, double &)
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
part
Definition: HCALResponse.h:20
std::vector< TrackingVertex > TrackingVertexCollection
const T & get() const
Definition: EventSetup.h:55
std::vector< SimVertex > SimVertexContainer
reco::RecoToSimCollection r2s_
int pixelBarrelLayersWithMeasurement() const
Definition: HitPattern.cc:517
T const * product() const
Definition: ESHandle.h:86
double BeamWidthY() const
beam width Y
Definition: BeamSpot.h:88
double b
Definition: hdecay.h:120
double value() const
Definition: Measurement1D.h:28
double S(const TLorentzVector &, const TLorentzVector &)
Definition: Particle.cc:99
EncodedEventId eventId() const
Signal source, crossing number.
PrimaryVertexAnalyzer4PU(const edm::ParameterSet &)
edm::EventID id() const
Definition: EventBase.h:56
const EncodedEventId & eventId() const
Pixel cluster – collection of neighboring pixels above threshold.
void printSimTrks(const edm::Handle< edm::SimTrackContainer > simVtrks)
#define begin
Definition: vmac.h:30
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
double a
Definition: hdecay.h:121
< trclass="colgroup">< tdclass="colgroup"colspan=5 > DT local reconstruction</td ></tr >< tr >< td >< ahref="classDTRecHit1DPair.html"> DTRecHit1DPair</a ></td >< td >< ahref="DataFormats_DTRecHit.html"> edm::RangeMap & lt
static int position[264][3]
Definition: ReadPGInfo.cc:509
unsigned short found() const
Number of valid hits on track.
Definition: Track.h:194
void analyzeVertexCollectionTP(std::map< std::string, TH1 * > &h, const edm::Handle< reco::VertexCollection > recVtxs, const edm::Handle< reco::TrackCollection > recTrks, std::vector< SimEvent > &simEvt, reco::RecoToSimCollection rsC, const std::string message="")
void event_()
edm::EDGetTokenT< reco::VertexCollection > recoVertexCollection_DA_Token_
edm::EDGetTokenT< reco::VertexCollection > recoVertexCollection_BS_Token_
edm::EDGetTokenT< std::vector< PileupSummaryInfo > > vecPileupSummaryInfoToken_
std::vector< TrackBaseRef >::const_iterator trackRef_iterator
The iteratator for the vector&lt;TrackRef&gt;
Definition: Vertex.h:37
double y0() const
y coordinate
Definition: BeamSpot.h:66
Monte Carlo truth information used for tracking validation.
tuple cout
Definition: gather_cfg.py:121
int charge() const
track electric charge
Definition: TrackBase.h:615
const Point & position() const
position
Definition: BeamSpot.h:62
static const G4double kappa
volatile std::atomic< bool > shutdown_flag false
Definition: DDAxes.h:10
trackRef_iterator tracks_begin() const
first iterator over tracks
Definition: Vertex.cc:39
tuple status
Definition: ntuplemaker.py:245
void dumpHitInfo(const reco::Track &t)
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Definition: TrackBase.h:639
T x() const
Definition: PV3DBase.h:62
virtual void analyze(const edm::Event &, const edm::EventSetup &)
bool isValid() const
std::vector< SimTrack > SimTrackContainer
std::vector< edm::RefToBase< reco::Track > > getTruthMatchedVertexTracks(const reco::Vertex &)
edm::ESHandle< ParticleDataTable > pdt_
std::map< double, TrackingParticleRef > z2tp_
tuple size
Write out results.
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
size_t tracksSize() const
number of tracks
Definition: Vertex.cc:34
double py() const
y coordinate of momentum vector
Definition: TrackBase.h:681
TrackingRecHitCollection::base::const_iterator trackingRecHit_iterator
iterator over a vector of reference to TrackingRecHit in the same collection
math::Error< dimension >::type CovarianceMatrix
5 parameter covariance matrix
Definition: TrackBase.h:76
int numberOfHits(HitCategory category) const
Definition: HitPattern.h:718
Our base class.
Definition: SiPixelRecHit.h:23
const LorentzVector & position() const
double x0() const
x coordinate
Definition: BeamSpot.h:64
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:109