26 #include "HepMC/GenEvent.h"
27 #include "HepMC/GenVertex.h"
50 #include <gsl/gsl_math.h>
51 #include <gsl/gsl_eigen.h>
82 rootFile_ = TFile::Open(outputFile_.c_str(),
"RECREATE");
94 cout <<
"PrimaryVertexAnalyzer4PU: zmatch=" << zmatch_ << endl;
120 std::map<std::string, TH1*>
h;
123 h[
"nbtksinvtx"] =
new TH1F(
"nbtksinvtx",
"reconstructed tracks in vertex",40,-0.5,39.5);
124 h[
"nbtksinvtxPU"] =
new TH1F(
"nbtksinvtxPU",
"reconstructed tracks in vertex",40,-0.5,39.5);
125 h[
"nbtksinvtxTag"]=
new TH1F(
"nbtksinvtxTag",
"reconstructed tracks in vertex",40,-0.5,39.5);
126 h[
"resx"] =
new TH1F(
"resx",
"residual x",100,-0.04,0.04);
127 h[
"resy"] =
new TH1F(
"resy",
"residual y",100,-0.04,0.04);
128 h[
"resz"] =
new TH1F(
"resz",
"residual z",100,-0.1,0.1);
129 h[
"resz10"] =
new TH1F(
"resz10",
"residual z",100,-1.0,1.);
130 h[
"pullx"] =
new TH1F(
"pullx",
"pull x",100,-25.,25.);
131 h[
"pully"] =
new TH1F(
"pully",
"pull y",100,-25.,25.);
132 h[
"pullz"] =
new TH1F(
"pullz",
"pull z",100,-25.,25.);
133 h[
"vtxchi2"] =
new TH1F(
"vtxchi2",
"chi squared",100,0.,100.);
134 h[
"vtxndf"] =
new TH1F(
"vtxndf",
"degrees of freedom",500,0.,100.);
135 h[
"vtxndfc"] =
new TH1F(
"vtxndfc",
"expected 2nd highest ndof",500,0.,100.);
137 h[
"vtxndfvsntk"] =
new TH2F(
"vtxndfvsntk",
"ndof vs #tracks",20,0.,100, 20, 0., 200.);
138 h[
"vtxndfoverntk"]=
new TH1F(
"vtxndfoverntk",
"ndof / #tracks",40,0.,2.);
139 h[
"vtxndf2overntk"]=
new TH1F(
"vtxndf2overntk",
"(ndof+2) / #tracks",40,0.,2.);
140 h[
"tklinks"] =
new TH1F(
"tklinks",
"Usable track links",2,-0.5,1.5);
141 h[
"nans"] =
new TH1F(
"nans",
"Illegal values for x,y,z,xx,xy,xz,yy,yz,zz",9,0.5,9.5);
145 add(h,
new TH1F(
"szRecVtx",
"size of recvtx collection",20, -0.5, 19.5));
146 add(h,
new TH1F(
"isFake",
"fake vertex",2, -0.5, 1.5));
147 add(h,
new TH1F(
"isFake1",
"fake vertex or ndof<0",2, -0.5, 1.5));
148 add(h,
new TH1F(
"bunchCrossing",
"bunchCrossing",4000, 0., 4000.));
149 add(h,
new TH2F(
"bunchCrossingLogNtk",
"bunchCrossingLogNtk",4000, 0., 4000.,5,0., 5.));
150 add(h,
new TH1F(
"highpurityTrackFraction",
"fraction of high purity tracks",20, 0., 1.));
151 add(h,
new TH2F(
"trkchi2vsndof",
"vertices chi2 vs ndof",50, 0., 100., 50, 0., 200.));
152 add(h,
new TH1F(
"trkchi2overndof",
"vertices chi2 / ndof",50, 0., 5.));
154 add(h,
new TH2F(
"2trkchi2vsndof",
"two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
155 add(h,
new TH1F(
"2trkmassSS",
"two-track vertices mass (same sign)",100, 0., 2.));
156 add(h,
new TH1F(
"2trkmassOS",
"two-track vertices mass (opposite sign)",100, 0., 2.));
157 add(h,
new TH1F(
"2trkdphi",
"two-track vertices delta-phi",360, 0, 2*
M_PI));
158 add(h,
new TH1F(
"2trkseta",
"two-track vertices sum-eta",50, -2., 2.));
159 add(h,
new TH1F(
"2trkdphicurl",
"two-track vertices delta-phi (sum eta<0.1)",360, 0, 2*
M_PI));
160 add(h,
new TH1F(
"2trksetacurl",
"two-track vertices sum-eta (delta-phi<0.1)",50, -2., 2.));
161 add(h,
new TH1F(
"2trkdetaOS",
"two-track vertices delta-eta (same sign)",50, -0.5, 0.5));
162 add(h,
new TH1F(
"2trkdetaSS",
"two-track vertices delta-eta (opposite sign)",50, -0.5, 0.5));
164 add(h,
new TH1F(
"2trkmassSSPU",
"two-track vertices mass (same sign)",100, 0., 2.));
165 add(h,
new TH1F(
"2trkmassOSPU",
"two-track vertices mass (opposite sign)",100, 0., 2.));
166 add(h,
new TH1F(
"2trkdphiPU",
"two-track vertices delta-phi",360, 0, 2*
M_PI));
167 add(h,
new TH1F(
"2trksetaPU",
"two-track vertices sum-eta",50, -2., 2.));
168 add(h,
new TH1F(
"2trkdphicurlPU",
"two-track vertices delta-phi (sum eta<0.1)",360, 0, 2*
M_PI));
169 add(h,
new TH1F(
"2trksetacurlPU",
"two-track vertices sum-eta (delta-phi<0.1)",50, -2., 2.));
170 add(h,
new TH1F(
"2trkdetaOSPU",
"two-track vertices delta-eta (same sign)",50, -0.5, 0.5));
171 add(h,
new TH1F(
"2trkdetaSSPU",
"two-track vertices delta-eta (opposite sign)",50, -0.5, 0.5));
173 add(h,
new TH2F(
"2trkchi2vsndof",
"two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
174 add(h,
new TH2F(
"3trkchi2vsndof",
"three-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
175 add(h,
new TH2F(
"4trkchi2vsndof",
"four-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
176 add(h,
new TH2F(
"5trkchi2vsndof",
"five-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
178 add(h,
new TH2F(
"fake2trkchi2vsndof",
"fake two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
179 add(h,
new TH2F(
"fake3trkchi2vsndof",
"fake three-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
180 add(h,
new TH2F(
"fake4trkchi2vsndof",
"fake four-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
181 add(h,
new TH2F(
"fake5trkchi2vsndof",
"fake five-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
182 h[
"resxr"] =
new TH1F(
"resxr",
"relative residual x",100,-0.04,0.04);
183 h[
"resyr"] =
new TH1F(
"resyr",
"relative residual y",100,-0.04,0.04);
184 h[
"reszr"] =
new TH1F(
"reszr",
"relative residual z",100,-0.1,0.1);
185 h[
"pullxr"] =
new TH1F(
"pullxr",
"relative pull x",100,-25.,25.);
186 h[
"pullyr"] =
new TH1F(
"pullyr",
"relative pull y",100,-25.,25.);
187 h[
"pullzr"] =
new TH1F(
"pullzr",
"relative pull z",100,-25.,25.);
188 h[
"vtxprob"] =
new TH1F(
"vtxprob",
"chisquared probability",100,0.,1.);
189 h[
"eff"] =
new TH1F(
"eff",
"efficiency",2, -0.5, 1.5);
190 h[
"efftag"] =
new TH1F(
"efftag",
"efficiency tagged vertex",2, -0.5, 1.5);
191 h[
"zdistancetag"] =
new TH1F(
"zdistancetag",
"z-distance between tagged and generated",100, -0.1, 0.1);
192 h[
"abszdistancetag"] =
new TH1F(
"abszdistancetag",
"z-distance between tagged and generated",1000, 0., 1.0);
193 h[
"abszdistancetagcum"] =
new TH1F(
"abszdistancetagcum",
"z-distance between tagged and generated",1000, 0., 1.0);
194 h[
"puritytag"] =
new TH1F(
"puritytag",
"purity of primary vertex tags",2, -0.5, 1.5);
195 h[
"effvsptsq"] =
new TProfile(
"effvsptsq",
"efficiency vs ptsq",20, 0., 10000., 0, 1.);
196 h[
"effvsnsimtrk"] =
new TProfile(
"effvsnsimtrk",
"efficiency vs # simtracks",50, 0., 50., 0, 1.);
197 h[
"effvsnrectrk"] =
new TProfile(
"effvsnrectrk",
"efficiency vs # rectracks",50, 0., 50., 0, 1.);
198 h[
"effvsnseltrk"] =
new TProfile(
"effvsnseltrk",
"efficiency vs # selected tracks",50, 0., 50., 0, 1.);
199 h[
"effvsz"] =
new TProfile(
"effvsz",
"efficiency vs z",20, -20., 20., 0, 1.);
200 h[
"effvsz2"] =
new TProfile(
"effvsz2",
"efficiency vs z (2mm)",20, -20., 20., 0, 1.);
201 h[
"effvsr"] =
new TProfile(
"effvsr",
"efficiency vs r",20, 0., 1., 0, 1.);
202 h[
"xresvsntrk"] =
new TProfile(
"xresvsntrk",
"xresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
203 h[
"yresvsntrk"] =
new TProfile(
"yresvsntrk",
"yresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
204 h[
"zresvsntrk"] =
new TProfile(
"zresvsntrk",
"zresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
205 h[
"cpuvsntrk"] =
new TProfile(
"cpuvsntrk",
"cpu time vs # of fitted tracks",40, 0., 200., 0, 200.);
206 h[
"cpucluvsntrk"] =
new TProfile(
"cpucluvsntrk",
"clustering cpu time # of tracks",40, 0., 200., 0, 10.);
207 h[
"cpufit"] =
new TH1F(
"cpufit",
"cpu time for fitting",100, 0., 200.);
208 h[
"cpuclu"] =
new TH1F(
"cpuclu",
"cpu time for clustering",100, 0., 200.);
209 h[
"nbtksinvtx2"] =
new TH1F(
"nbtksinvtx2",
"reconstructed tracks in vertex",40,0.,200.);
210 h[
"nbtksinvtxPU2"] =
new TH1F(
"nbtksinvtxPU2",
"reconstructed tracks in vertex",40,0.,200.);
211 h[
"nbtksinvtxTag2"] =
new TH1F(
"nbtksinvtxTag2",
"reconstructed tracks in vertex",40,0.,200.);
213 h[
"xrec"] =
new TH1F(
"xrec",
"reconstructed x",100,-0.1,0.1);
214 h[
"yrec"] =
new TH1F(
"yrec",
"reconstructed y",100,-0.1,0.1);
215 h[
"zrec"] =
new TH1F(
"zrec",
"reconstructed z",100,-20.,20.);
216 h[
"err1"] =
new TH1F(
"err1",
"error 1",100,0.,0.1);
217 h[
"err2"] =
new TH1F(
"err2",
"error 2",100,0.,0.1);
218 h[
"errx"] =
new TH1F(
"errx",
"error x",100,0.,0.1);
219 h[
"erry"] =
new TH1F(
"erry",
"error y",100,0.,0.1);
220 h[
"errz"] =
new TH1F(
"errz",
"error z",100,0.,2.0);
221 h[
"errz1"] =
new TH1F(
"errz1",
"error z",100,0.,0.2);
223 h[
"zrecNt100"] =
new TH1F(
"zrecNt100",
"reconstructed z for high multiplicity events",80,-40.,40.);
224 add(h,
new TH2F(
"zrecvsnt",
"reconstructed z vs number of tracks",100,-50., 50., 20, 0., 200.));
225 add(h,
new TH2F(
"xyrec",
"reconstructed xy",100, -4., 4., 100, -4., 4.));
226 h[
"xrecBeam"] =
new TH1F(
"xrecBeam",
"reconstructed x - beam x",100,-0.1,0.1);
227 h[
"yrecBeam"] =
new TH1F(
"yrecBeam",
"reconstructed y - beam y",100,-0.1,0.1);
228 h[
"zrecBeam"] =
new TH1F(
"zrecBeam",
"reconstructed z - beam z",100,-20.,20.);
229 h[
"xrecBeamvsz"] =
new TH2F(
"xrecBeamvsz",
"reconstructed x - beam x vs z", 20, -20., 20.,100,-0.1,0.1);
230 h[
"yrecBeamvsz"] =
new TH2F(
"yrecBeamvsz",
"reconstructed y - beam y vs z", 20, -20., 20.,100,-0.1,0.1);
231 h[
"xrecBeamvszprof"] =
new TProfile(
"xrecBeamvszprof",
"reconstructed x - beam x vs z-z0", 20, -20., 20.,-0.1,0.1);
232 h[
"yrecBeamvszprof"] =
new TProfile(
"yrecBeamvszprof",
"reconstructed y - beam y vs z-z0", 20, -20., 20.,-0.1,0.1);
233 add(h,
new TH2F(
"xrecBeamvsdxXBS",
"reconstructed x - beam x vs resolution",10,0., 0.02, 100, -0.1,0.1));
234 add(h,
new TH2F(
"yrecBeamvsdyXBS",
"reconstructed z - beam z vs resolution",10,0., 0.02, 100, -0.1,0.1));
235 add(h,
new TH2F(
"xrecBeamvsdx",
"reconstructed x - beam x vs resolution",10,0., 0.02, 100, -0.1,0.1));
236 add(h,
new TH2F(
"yrecBeamvsdy",
"reconstructed z - beam z vs resolution",10,0., 0.02, 100, -0.1,0.1));
237 add(h,
new TH2F(
"xrecBeamvsdxR2",
"reconstructed x - beam x vs resolution",20,0., 0.04, 100, -0.1,0.1));
238 add(h,
new TH2F(
"yrecBeamvsdyR2",
"reconstructed z - beam z vs resolution",20,0., 0.04, 100, -0.1,0.1));
241 h[
"xrecBeamvsdxprof"] =
new TProfile(
"xrecBeamvsdxprof",
"reconstructed x - beam x vs resolution",10, 0., 0.04,-0.1,0.1 );
242 h[
"yrecBeamvsdyprof"] =
new TProfile(
"yrecBeamvsdyprof",
"reconstructed y - beam y vs resolution",10, 0., 0.04,-0.1,0.1 );
243 add(h,
new TProfile(
"xrecBeam2vsdx2prof",
"reconstructed x - beam x vs resolution",10,0., 0.002, 0., 0.01));
244 add(h,
new TProfile(
"yrecBeam2vsdy2prof",
"reconstructed y - beam y vs resolution",10,0., 0.002, 0., 0.01));
245 add(h,
new TH2F(
"xrecBeamvsdx2",
"reconstructed x - beam x vs resolution",10,0., 0.002, 100, -0.01, 0.01));
246 add(h,
new TH2F(
"yrecBeamvsdy2",
"reconstructed y - beam y vs resolution",10,0., 0.002, 100, -0.01, 0.01));
247 h[
"xrecb"] =
new TH1F(
"xrecb",
"reconstructed x - beam x",100,-0.01,0.01);
248 h[
"yrecb"] =
new TH1F(
"yrecb",
"reconstructed y - beam y",100,-0.01,0.01);
249 h[
"zrecb"] =
new TH1F(
"zrecb",
"reconstructed z - beam z",100,-20.,20.);
250 h[
"xrec1"] =
new TH1F(
"xrec1",
"reconstructed x",100,-4,4);
251 h[
"yrec1"] =
new TH1F(
"yrec1",
"reconstructed y",100,-4,4);
252 h[
"zrec1"] =
new TH1F(
"zrec1",
"reconstructed z",100,-80.,80.);
253 h[
"xrec2"] =
new TH1F(
"xrec2",
"reconstructed x",100,-1,1);
254 h[
"yrec2"] =
new TH1F(
"yrec2",
"reconstructed y",100,-1,1);
255 h[
"zrec2"] =
new TH1F(
"zrec2",
"reconstructed z",100,-40.,40.);
256 h[
"xrec3"] =
new TH1F(
"xrec3",
"reconstructed x",100,-0.1,0.1);
257 h[
"yrec3"] =
new TH1F(
"yrec3",
"reconstructed y",100,-0.1,0.1);
258 h[
"zrec3"] =
new TH1F(
"zrec3",
"reconstructed z",100,-20.,20.);
259 add(h,
new TH1F(
"xrecBeamPull",
"normalized residuals reconstructed x - beam x",100,-20,20));
260 add(h,
new TH1F(
"yrecBeamPull",
"normalized residuals reconstructed y - beam y",100,-20,20));
261 add(h,
new TH1F(
"zdiffrec",
"z-distance between vertices",200,-20., 20.));
262 add(h,
new TH1F(
"zdiffrec2",
"z-distance between ndof>2 vertices",200,-20., 20.));
263 add(h,
new TH1F(
"zdiffrec4",
"z-distance between ndof>4 vertices",200,-20., 20.));
264 add(h,
new TH1F(
"zdiffrec8",
"z-distance between ndof>8 vertices",200,-20., 20.));
265 add(h,
new TH2F(
"zvszrec2",
"z positions of multiple vertices",200,-20., 20., 200,-20., 20.));
266 add(h,
new TH2F(
"pzvspz2",
"prob(z) of multiple vertices",100, 0.,1.,100,0., 1.));
267 add(h,
new TH2F(
"zvszrec4",
"z positions of multiple vertices",100,-20., 20., 100,-20., 20.));
268 add(h,
new TH2F(
"pzvspz4",
"prob(z) of multiple vertices",100, 0.,1.,100,0., 1.));
269 add(h,
new TH2F(
"zdiffvsz",
"z-distance vs z",100,-10.,10.,30,-15.,15.));
270 add(h,
new TH2F(
"zdiffvsz4",
"z-distance vs z (ndof>4)",100,-10.,10.,30,-15.,15.));
271 add(h,
new TProfile(
"eff0vsntrec",
"efficiency vs # reconstructed tracks",50, 0., 50., 0, 1.));
272 add(h,
new TProfile(
"eff0vsntsel",
"efficiency vs # selected tracks",50, 0., 50., 0, 1.));
273 add(h,
new TProfile(
"eff0ndof0vsntsel",
"efficiency (ndof>0) vs # selected tracks",50, 0., 50., 0, 1.));
274 add(h,
new TProfile(
"eff0ndof8vsntsel",
"efficiency (ndof>8) vs # selected tracks",50, 0., 50., 0, 1.));
275 add(h,
new TProfile(
"eff0ndof2vsntsel",
"efficiency (ndof>2) vs # selected tracks",50, 0., 50., 0, 1.));
276 add(h,
new TProfile(
"eff0ndof4vsntsel",
"efficiency (ndof>4) vs # selected tracks",50, 0., 50., 0, 1.));
277 add(h,
new TH1F(
"xbeamPUcand",
"x - beam of PU candidates (ndof>4)",100,-1., 1.));
278 add(h,
new TH1F(
"ybeamPUcand",
"y - beam of PU candidates (ndof>4)",100,-1., 1.));
279 add(h,
new TH1F(
"xbeamPullPUcand",
"x - beam pull of PU candidates (ndof>4)",100,-20., 20.));
280 add(h,
new TH1F(
"ybeamPullPUcand",
"y - beam pull of PU candidates (ndof>4)",100,-20., 20.));
281 add(h,
new TH1F(
"ndofOverNtk",
"ndof / ntk of ndidates (ndof>4)",100,0., 2.));
283 add(h,
new TH1F(
"ndofOverNtkPUcand",
"ndof / ntk of ndidates (ndof>4)",100,0., 2.));
285 add(h,
new TH1F(
"zPUcand",
"z positions of PU candidates (all)",100,-20., 20.));
286 add(h,
new TH1F(
"zPUcand2",
"z positions of PU candidates (ndof>2)",100,-20., 20.));
287 add(h,
new TH1F(
"zPUcand4",
"z positions of PU candidates (ndof>4)",100,-20., 20.));
288 add(h,
new TH1F(
"ndofPUcand",
"ndof of PU candidates (all)",50,0., 100.));
289 add(h,
new TH1F(
"ndofPUcand2",
"ndof of PU candidates (ndof>2)",50,0., 100.));
290 add(h,
new TH1F(
"ndofPUcand4",
"ndof of PU candidates (ndof>4)",50,0., 100.));
291 add(h,
new TH1F(
"ndofnr2",
"second highest ndof",500,0., 100.));
292 add(h,
new TH1F(
"ndofnr2d1cm",
"second highest ndof (dz>1cm)",500,0., 100.));
293 add(h,
new TH1F(
"ndofnr2d2cm",
"second highest ndof (dz>2cm)",500,0., 100.));
295 h[
"nrecvtx"] =
new TH1F(
"nrecvtx",
"# of reconstructed vertices", 50, -0.5, 49.5);
296 h[
"nrecvtx8"] =
new TH1F(
"nrecvtx8",
"# of reconstructed vertices with ndof>8", 50, -0.5, 49.5);
297 h[
"nrecvtx2"] =
new TH1F(
"nrecvtx2",
"# of reconstructed vertices with ndof>2", 50, -0.5, 49.5);
298 h[
"nrecvtx4"] =
new TH1F(
"nrecvtx4",
"# of reconstructed vertices with ndof>4", 50, -0.5, 49.5);
300 h[
"nrectrk"] =
new TH1F(
"nrectrk",
"# of reconstructed tracks", 100, -0.5, 99.5);
301 add(h,
new TH1F(
"nsimtrk",
"# of simulated tracks", 100, -0.5, 99.5));
302 add(h,
new TH1F(
"nsimtrkSignal",
"# of simulated tracks (Signal)", 100, -0.5, 99.5));
303 add(h,
new TH1F(
"nsimtrkPU",
"# of simulated tracks (PU)", 100, -0.5, 99.5));
304 h[
"nsimtrk"]->StatOverflows(kTRUE);
305 h[
"nsimtrkPU"]->StatOverflows(kTRUE);
306 h[
"nsimtrkSignal"]->StatOverflows(kTRUE);
307 h[
"xrectag"] =
new TH1F(
"xrectag",
"reconstructed x, signal vtx",100,-0.05,0.05);
308 h[
"yrectag"] =
new TH1F(
"yrectag",
"reconstructed y, signal vtx",100,-0.05,0.05);
309 h[
"zrectag"] =
new TH1F(
"zrectag",
"reconstructed z, signal vtx",100,-20.,20.);
310 h[
"nrectrk0vtx"] =
new TH1F(
"nrectrk0vtx",
"# rec tracks no vertex ",100,-0.5, 99.5);
311 h[
"nseltrk0vtx"] =
new TH1F(
"nseltrk0vtx",
"# rec tracks no vertex ",100,-0.5, 99.5);
312 h[
"nrecsimtrk"] =
new TH1F(
"nrecsimtrk",
"# rec tracks matched to sim tracks in vertex",100,-0.5, 99.5);
313 h[
"nrecnosimtrk"] =
new TH1F(
"nrecsimtrk",
"# rec tracks not matched to sim tracks in vertex",100,-0.5, 99.5);
314 h[
"trackAssEffvsPt"] =
new TProfile(
"trackAssEffvsPt",
"track association efficiency vs pt",20, 0., 100., 0, 1.);
317 h[
"nseltrk"] =
new TH1F(
"nseltrk",
"# of reconstructed tracks selected for PV", 100, -0.5, 99.5);
318 h[
"nclutrkall"] =
new TH1F(
"nclutrkall",
"# of reconstructed tracks in clusters", 100, -0.5, 99.5);
319 h[
"nclutrkvtx"] =
new TH1F(
"nclutrkvtx",
"# of reconstructed tracks in clusters of reconstructed vertices", 100, -0.5, 99.5);
320 h[
"nclu"] =
new TH1F(
"nclu",
"# of clusters", 100, -0.5, 99.5);
321 h[
"nclu0vtx"] =
new TH1F(
"nclu0vtx",
"# of clusters in events with no PV", 100, -0.5, 99.5);
322 h[
"zlost1"] =
new TH1F(
"zlost1",
"z of lost vertices (bad z)", 100, -20., 20.);
323 h[
"zlost2"] =
new TH1F(
"zlost2",
"z of lost vertices (no matching cluster)", 100, -20., 20.);
324 h[
"zlost3"] =
new TH1F(
"zlost3",
"z of lost vertices (vertex too far from beam)", 100, -20., 20.);
325 h[
"zlost4"] =
new TH1F(
"zlost4",
"z of lost vertices (invalid vertex)", 100, -20., 20.);
326 h[
"selstat"] =
new TH1F(
"selstat",
"selstat", 5, -2.5, 2.5);
330 add(h,
new TH1F(
"fakeVtxZNdofgt05",
"z of fake vertices with ndof>0.5", 100, -20., 20.));
331 add(h,
new TH1F(
"fakeVtxZNdofgt2",
"z of fake vertices with ndof>2", 100, -20., 20.));
332 add(h,
new TH1F(
"fakeVtxZ",
"z of fake vertices", 100, -20., 20.));
333 add(h,
new TH1F(
"fakeVtxNdof",
"ndof of fake vertices", 500,0., 100.));
334 add(h,
new TH1F(
"fakeVtxNtrk",
"number of tracks in fake vertex",20,-0.5, 19.5));
335 add(h,
new TH1F(
"matchedVtxNdof",
"ndof of matched vertices", 500,0., 100.));
339 string types[] = {
"all",
"sel",
"bachelor",
"sellost",
"wgt05",
"wlt05",
"M",
"tagged",
"untagged",
"ndof4",
"PUcand",
"PUfake"};
340 for(
int t=0;
t<12;
t++){
341 add(h,
new TH1F((
"rapidity_"+types[
t]).c_str(),
"rapidity ",100,-3., 3.));
342 h[
"z0_"+types[
t]] =
new TH1F((
"z0_"+types[t]).c_str(),
"z0 ",80,-40., 40.);
343 h[
"phi_"+types[
t]] =
new TH1F((
"phi_"+types[t]).c_str(),
"phi ",80,-3.14159, 3.14159);
344 h[
"eta_"+types[
t]] =
new TH1F((
"eta_"+types[t]).c_str(),
"eta ",80,-4., 4.);
345 h[
"pt_"+types[
t]] =
new TH1F((
"pt_"+types[t]).c_str(),
"pt ",100,0., 20.);
346 h[
"found_"+types[
t]] =
new TH1F((
"found_"+types[t]).c_str(),
"found hits",20, 0., 20.);
347 h[
"lost_"+types[
t]] =
new TH1F((
"lost_"+types[t]).c_str(),
"lost hits",20, 0., 20.);
348 h[
"nchi2_"+types[
t]] =
new TH1F((
"nchi2_"+types[t]).c_str(),
"normalized track chi2",100, 0., 20.);
349 h[
"rstart_"+types[
t]] =
new TH1F((
"rstart_"+types[t]).c_str(),
"start radius",100, 0., 20.);
350 h[
"tfom_"+types[
t]] =
new TH1F((
"tfom_"+types[t]).c_str(),
"track figure of merit",100, 0., 100.);
351 h[
"expectedInner_"+types[
t]] =
new TH1F((
"expectedInner_"+types[t]).c_str(),
"expected inner hits ",10, 0., 10.);
352 h[
"expectedOuter_"+types[
t]] =
new TH1F((
"expectedOuter_"+types[t]).c_str(),
"expected outer hits ",10, 0., 10.);
353 h[
"logtresxy_"+types[
t]] =
new TH1F((
"logtresxy_"+types[t]).c_str(),
"log10(track r-phi resolution/um)",100, 0., 5.);
354 h[
"logtresz_"+types[
t]] =
new TH1F((
"logtresz_"+types[t]).c_str(),
"log10(track z resolution/um)",100, 0., 5.);
355 h[
"tpullxy_"+types[
t]] =
new TH1F((
"tpullxy_"+types[t]).c_str(),
"track r-phi pull",100, -10., 10.);
356 add(h,
new TH2F( (
"lvseta_"+types[t]).c_str(),
"cluster length vs eta",60,-3., 3., 20, 0., 20));
357 add(h,
new TH2F( (
"lvstanlambda_"+types[t]).c_str(),
"cluster length vs tan lambda",60,-6., 6., 20, 0., 20));
358 add(h,
new TH1F( (
"restrkz_"+types[t]).c_str(),
"z-residuals (track vs vertex)", 200, -5., 5.));
359 add(h,
new TH2F( (
"restrkzvsphi_"+types[t]).c_str(),
"z-residuals (track - vertex)", 12,-3.14159,3.14159,100, -5., 5.));
360 add(h,
new TH2F( (
"restrkzvseta_"+types[t]).c_str(),
"z-residuals (track - vertex)", 12,-3.,3.,200, -5., 5.));
361 add(h,
new TH2F( (
"pulltrkzvsphi_"+types[t]).c_str(),
"normalized z-residuals (track - vertex)", 12,-3.14159,3.14159,100, -5., 5.));
362 add(h,
new TH2F( (
"pulltrkzvseta_"+types[t]).c_str(),
"normalized z-residuals (track - vertex)", 12,-3.,3.,100, -5., 5.));
363 add(h,
new TH1F( (
"pulltrkz_"+types[t]).c_str(),
"normalized z-residuals (track vs vertex)", 100, -5., 5.));
364 add(h,
new TH1F( (
"sigmatrkz0_"+types[t]).c_str(),
"z-resolution (excluding beam)", 100, 0., 5.));
365 add(h,
new TH1F( (
"sigmatrkz_"+types[t]).c_str(),
"z-resolution (including beam)", 100,0., 5.));
366 add(h,
new TH1F( (
"nbarrelhits_"+types[t]).c_str(),
"number of pixel barrel hits", 10, 0., 10.));
367 add(h,
new TH1F( (
"nbarrelLayers_"+types[t]).c_str(),
"number of pixel barrel layers", 10, 0., 10.));
368 add(h,
new TH1F( (
"nPxLayers_"+types[t]).c_str(),
"number of pixel layers (barrel+endcap)", 10, 0., 10.));
369 add(h,
new TH1F( (
"nSiLayers_"+types[t]).c_str(),
"number of Tracker layers ", 20, 0., 20.));
370 add(h,
new TH1F( (
"trackAlgo_"+types[t]).c_str(),
"track algorithm ", 30, 0., 30.));
371 add(h,
new TH1F( (
"trackQuality_"+types[t]).c_str(),
"track quality ", 7, -1., 6.));
373 add(h,
new TH1F(
"trackWt",
"track weight in vertex",100,0., 1.));
376 h[
"nrectrk"]->StatOverflows(kTRUE);
377 h[
"nrectrk"]->StatOverflows(kTRUE);
378 h[
"nrectrk0vtx"]->StatOverflows(kTRUE);
379 h[
"nseltrk0vtx"]->StatOverflows(kTRUE);
380 h[
"nrecsimtrk"]->StatOverflows(kTRUE);
381 h[
"nrecnosimtrk"]->StatOverflows(kTRUE);
382 h[
"nseltrk"]->StatOverflows(kTRUE);
383 h[
"nbtksinvtx"]->StatOverflows(kTRUE);
384 h[
"nbtksinvtxPU"]->StatOverflows(kTRUE);
385 h[
"nbtksinvtxTag"]->StatOverflows(kTRUE);
386 h[
"nbtksinvtx2"]->StatOverflows(kTRUE);
387 h[
"nbtksinvtxPU2"]->StatOverflows(kTRUE);
388 h[
"nbtksinvtxTag2"]->StatOverflows(kTRUE);
391 h[
"npu0"] =
new TH1F(
"npu0",
"Number of simulated vertices",40,0.,40.);
392 h[
"npu1"] =
new TH1F(
"npu1",
"Number of simulated vertices with >0 track",40,0.,40.);
393 h[
"npu2"] =
new TH1F(
"npu2",
"Number of simulated vertices with >1 track",40,0.,40.);
394 h[
"nrecv"] =
new TH1F(
"nrecv",
"# of reconstructed vertices", 40, 0, 40);
395 add(h,
new TH2F(
"nrecvsnpu",
"#rec vertices vs number of sim vertices with >0 tracks", 40, 0., 40, 40, 0, 40));
396 add(h,
new TH2F(
"nrecvsnpu2",
"#rec vertices vs number of sim vertices with >1 tracks", 40, 0., 40, 40, 0, 40));
397 add(h,
new TH1F(
"sumpt",
"sumpt of simulated tracks",100,0.,100.));
398 add(h,
new TH1F(
"sumptSignal",
"sumpt of simulated tracks in Signal events",100,0.,200.));
399 add(h,
new TH1F(
"sumptPU",
"sumpt of simulated tracks in PU events",100,0.,200.));
400 add(h,
new TH1F(
"sumpt2rec",
"sumpt2 of reconstructed and matched tracks",100,0.,100.));
401 add(h,
new TH1F(
"sumpt2",
"sumpt2 of simulated tracks",100,0.,100.));
402 add(h,
new TH1F(
"sumpt2Signal",
"sumpt2 of simulated tracks in Signal events",100,0.,200.));
403 add(h,
new TH1F(
"sumpt2PU",
"sumpt2 of simulated tracks in PU events",100,0.,200.));
404 add(h,
new TH1F(
"sumpt2rec",
"sumpt2 of reconstructed and matched tracks",100,0.,100.));
405 add(h,
new TH1F(
"sumpt2recSignal",
"sumpt2 of reconstructed and matched tracks in Signal events",100,0.,200.));
406 add(h,
new TH1F(
"sumpt2recPU",
"sumpt2 of reconstructed and matched tracks in PU events",100,0.,200.));
407 add(h,
new TH1F(
"nRecTrkInSimVtx",
"number of reco tracks matched to sim-vertex", 101, 0., 100));
408 add(h,
new TH1F(
"nRecTrkInSimVtxSignal",
"number of reco tracks matched to signal sim-vertex", 101, 0., 100));
409 add(h,
new TH1F(
"nRecTrkInSimVtxPU",
"number of reco tracks matched to PU-vertex", 101, 0., 100));
410 add(h,
new TH1F(
"nPrimRecTrkInSimVtx",
"number of reco primary tracks matched to sim-vertex", 101, 0., 100));
411 add(h,
new TH1F(
"nPrimRecTrkInSimVtxSignal",
"number of reco primary tracks matched to signal sim-vertex", 101, 0., 100));
412 add(h,
new TH1F(
"nPrimRecTrkInSimVtxPU",
"number of reco primary tracks matched to PU-vertex", 101, 0., 100));
414 add(h,
new TH1F(
"recPurity",
"track purity of reconstructed vertices", 101, 0., 1.01));
415 add(h,
new TH1F(
"recPuritySignal",
"track purity of reconstructed Signal vertices", 101, 0., 1.01));
416 add(h,
new TH1F(
"recPurityPU",
"track purity of reconstructed PU vertices", 101, 0., 1.01));
418 add(h,
new TH1F(
"recmatchPurity",
"track purity of all vertices", 101, 0., 1.01));
419 add(h,
new TH1F(
"recmatchPurityTag",
"track purity of tagged vertices", 101, 0., 1.01));
420 add(h,
new TH1F(
"recmatchPurityTagSignal",
"track purity of tagged Signal vertices", 101, 0., 1.01));
421 add(h,
new TH1F(
"recmatchPurityTagPU",
"track purity of tagged PU vertices", 101, 0., 1.01));
422 add(h,
new TH1F(
"recmatchPuritynoTag",
"track purity of untagged vertices", 101, 0., 1.01));
423 add(h,
new TH1F(
"recmatchPuritynoTagSignal",
"track purity of untagged Signal vertices", 101, 0., 1.01));
424 add(h,
new TH1F(
"recmatchPuritynoTagPU",
"track purity of untagged PU vertices", 101, 0., 1.01));
425 add(h,
new TH1F(
"recmatchvtxs",
"number of sim vertices contributing to recvtx", 10, 0., 10.));
426 add(h,
new TH1F(
"recmatchvtxsTag",
"number of sim vertices contributing to recvtx", 10, 0., 10.));
427 add(h,
new TH1F(
"recmatchvtxsnoTag",
"number of sim vertices contributing to recvtx", 10, 0., 10.));
429 add(h,
new TH1F(
"trkAssignmentEfficiency",
"track to vertex assignment efficiency", 101, 0., 1.01) );
430 add(h,
new TH1F(
"trkAssignmentEfficiencySignal",
"track to signal vertex assignment efficiency", 101, 0., 1.01) );
431 add(h,
new TH1F(
"trkAssignmentEfficiencyPU",
"track to PU vertex assignment efficiency", 101, 0., 1.01) );
432 add(h,
new TH1F(
"primtrkAssignmentEfficiency",
"track to vertex assignment efficiency", 101, 0., 1.01) );
433 add(h,
new TH1F(
"primtrkAssignmentEfficiencySignal",
"track to signal vertex assignment efficiency", 101, 0., 1.01) );
434 add(h,
new TH1F(
"primtrkAssignmentEfficiencyPU",
"track to PU vertex assignment efficiency", 101, 0., 1.01) );
435 add(h,
new TH1F(
"vtxMultiplicity",
"number of rec vertices containg tracks from one true vertex", 10, 0., 10.) );
436 add(h,
new TH1F(
"vtxMultiplicitySignal",
"number of rec vertices containg tracks from the Signal Vertex", 10, 0., 10.) );
437 add(h,
new TH1F(
"vtxMultiplicityPU",
"number of rec vertices containg tracks from a PU Vertex", 10, 0., 10.) );
439 add(h,
new TProfile(
"vtxFindingEfficiencyVsNtrk",
"finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
440 add(h,
new TProfile(
"vtxFindingEfficiencyVsNtrkSignal",
"Signal vertex finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
441 add(h,
new TProfile(
"vtxFindingEfficiencyVsNtrkPU",
"PU vertex finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
443 add(h,
new TH1F(
"TagVtxTrkPurity",
"TagVtxTrkPurity",100,0.,1.01));
444 add(h,
new TH1F(
"TagVtxTrkEfficiency",
"TagVtxTrkEfficiency",100,0.,1.01));
446 add(h,
new TH1F(
"matchVtxFraction",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
447 add(h,
new TH1F(
"matchVtxFractionSignal",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
448 add(h,
new TH1F(
"matchVtxFractionPU",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
449 add(h,
new TH1F(
"matchVtxFractionCum",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
450 add(h,
new TH1F(
"matchVtxFractionCumSignal",
"fraction of sim vertexs track found in a recvertex",101,0,1.01));
451 add(h,
new TH1F(
"matchVtxFractionCumPU",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
452 add(h,
new TH1F(
"matchVtxEfficiency",
"efficiency for finding matching rec vertex",2,-0.5,1.5));
453 add(h,
new TH1F(
"matchVtxEfficiencySignal",
"efficiency for finding matching rec vertex",2,-0.5,1.5));
454 add(h,
new TH1F(
"matchVtxEfficiencyPU",
"efficiency for finding matching rec vertex",2,-0.5,1.5));
455 add(h,
new TH1F(
"matchVtxEfficiency2",
"efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
456 add(h,
new TH1F(
"matchVtxEfficiency2Signal",
"efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
457 add(h,
new TH1F(
"matchVtxEfficiency2PU",
"efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
458 add(h,
new TH1F(
"matchVtxEfficiency5",
"efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
459 add(h,
new TH1F(
"matchVtxEfficiency5Signal",
"efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
460 add(h,
new TH1F(
"matchVtxEfficiency5PU",
"efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
463 add(h,
new TH1F(
"matchVtxEfficiencyZ",
"efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
464 add(h,
new TH1F(
"matchVtxEfficiencyZSignal",
"efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
465 add(h,
new TH1F(
"matchVtxEfficiencyZPU",
"efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
467 add(h,
new TH1F(
"matchVtxEfficiencyZ1",
"efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
468 add(h,
new TH1F(
"matchVtxEfficiencyZ1Signal",
"efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
469 add(h,
new TH1F(
"matchVtxEfficiencyZ1PU",
"efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
471 add(h,
new TH1F(
"matchVtxEfficiencyZ2",
"efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
472 add(h,
new TH1F(
"matchVtxEfficiencyZ2Signal",
"efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
473 add(h,
new TH1F(
"matchVtxEfficiencyZ2PU",
"efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
475 add(h,
new TH1F(
"matchVtxZ",
"z distance to matched recvtx",100, -0.1, 0.1));
476 add(h,
new TH1F(
"matchVtxZPU",
"z distance to matched recvtx",100, -0.1, 0.1));
477 add(h,
new TH1F(
"matchVtxZSignal",
"z distance to matched recvtx",100, -0.1, 0.1));
479 add(h,
new TH1F(
"matchVtxZCum",
"z distance to matched recvtx",1001,0, 1.01));
480 add(h,
new TH1F(
"matchVtxZCumSignal",
"z distance to matched recvtx",1001,0, 1.01));
481 add(h,
new TH1F(
"matchVtxZCumPU",
"z distance to matched recvtx",1001,0, 1.01));
483 add(h,
new TH1F(
"unmatchedVtx",
"number of unmatched rec vertices (fakes)",10,0.,10.));
484 add(h,
new TH1F(
"unmatchedVtxFrac",
"fraction of unmatched rec vertices (fakes)",1000,0.,1.0));
485 add(h,
new TH1F(
"unmatchedVtxZ",
"z of unmached rec vertices (fakes)",100,-20., 20.));
486 add(h,
new TH1F(
"unmatchedVtxNdof",
"ndof of unmatched rec vertices (fakes)", 500,0., 100.));
487 add(h,
new TH2F(
"correctlyassigned",
"pt and eta of correctly assigned tracks", 60, -3., 3., 100, 0, 10.));
488 add(h,
new TH2F(
"misassigned",
"pt and eta of mis assigned tracks", 60, -3., 3., 100, 0, 10.));
490 add(h,
new TH1F(
"ptcat",
"pt of correctly assigned tracks", 100, 0, 10.));
491 add(h,
new TH1F(
"etacat",
"eta of correctly assigned tracks", 60, -3., 3.));
492 add(h,
new TH1F(
"phicat",
"phi of correctly assigned tracks", 100, -3.14159, 3.14159));
493 add(h,
new TH1F(
"dzcat",
"dz of correctly assigned tracks", 100, 0., 1.));
495 add(h,
new TH1F(
"ptmis",
"pt of mis-assigned tracks", 100, 0, 10.));
496 add(h,
new TH1F(
"etamis",
"eta of mis-assigned tracks", 60, -3., 3.));
497 add(h,
new TH1F(
"phimis",
"phi of mis-assigned tracks",100, -3.14159, 3.14159));
498 add(h,
new TH1F(
"dzmis",
"dz of mis-assigned tracks", 100, 0., 1.));
501 add(h,
new TH1F(
"Tc",
"Tc computed with Truth matched Reco Tracks",100,0.,20.));
502 add(h,
new TH1F(
"TcSignal",
"Tc of signal vertices computed with Truth matched Reco Tracks",100,0.,20.));
503 add(h,
new TH1F(
"TcPU",
"Tc of PU vertices computed with Truth matched Reco Tracks",100,0.,20.));
505 add(h,
new TH1F(
"logTc",
"log Tc computed with Truth matched Reco Tracks",100,-2.,8.));
506 add(h,
new TH1F(
"logTcSignal",
"log Tc of signal vertices computed with Truth matched Reco Tracks",100,-2.,8.));
507 add(h,
new TH1F(
"logTcPU",
"log Tc of PU vertices computed with Truth matched Reco Tracks",100,-2.,8.));
509 add(h,
new TH1F(
"xTc",
"Tc of merged clusters",100,0.,20.));
510 add(h,
new TH1F(
"xTcSignal",
"Tc of signal vertices merged with PU",100,0.,20.));
511 add(h,
new TH1F(
"xTcPU",
"Tc of merged PU vertices",100,0.,20.));
513 add(h,
new TH1F(
"logxTc",
"log Tc merged vertices",100,-2.,8.));
514 add(h,
new TH1F(
"logxTcSignal",
"log Tc of signal vertices merged with PU",100,-2.,8.));
515 add(h,
new TH1F(
"logxTcPU",
"log Tc of merged PU vertices ",100,-2.,8.));
517 add(h,
new TH1F(
"logChisq",
"Chisq/ntrk computed with Truth matched Reco Tracks",100,-2.,8.));
518 add(h,
new TH1F(
"logChisqSignal",
"Chisq/ntrk of signal vertices computed with Truth matched Reco Tracks",100,-2.,8.));
519 add(h,
new TH1F(
"logChisqPU",
"Chisq/ntrk of PU vertices computed with Truth matched Reco Tracks",100,-2.,8.));
521 add(h,
new TH1F(
"logxChisq",
"Chisq/ntrk of merged clusters",100,-2.,8.));
522 add(h,
new TH1F(
"logxChisqSignal",
"Chisq/ntrk of signal vertices merged with PU",100,-2.,8.));
523 add(h,
new TH1F(
"logxChisqPU",
"Chisq/ntrk of merged PU vertices",100,-2.,8.));
525 add(h,
new TH1F(
"Chisq",
"Chisq/ntrk computed with Truth matched Reco Tracks",100,0.,20.));
526 add(h,
new TH1F(
"ChisqSignal",
"Chisq/ntrk of signal vertices computed with Truth matched Reco Tracks",100,0.,20.));
527 add(h,
new TH1F(
"ChisqPU",
"Chisq/ntrk of PU vertices computed with Truth matched Reco Tracks",100,0.,20.));
529 add(h,
new TH1F(
"xChisq",
"Chisq/ntrk of merged clusters",100,0.,20.));
530 add(h,
new TH1F(
"xChisqSignal",
"Chisq/ntrk of signal vertices merged with PU",100,0.,20.));
531 add(h,
new TH1F(
"xChisqPU",
"Chisq/ntrk of merged PU vertices",100,0.,20.));
533 add(h,
new TH1F(
"dzmax",
"dzmax computed with Truth matched Reco Tracks",100,0.,2.));
534 add(h,
new TH1F(
"dzmaxSignal",
"dzmax of signal vertices computed with Truth matched Reco Tracks",100,0.,2.));
535 add(h,
new TH1F(
"dzmaxPU",
"dzmax of PU vertices computed with Truth matched Reco Tracks",100,0.,2.));
537 add(h,
new TH1F(
"xdzmax",
"dzmax of merged clusters",100,0.,2.));
538 add(h,
new TH1F(
"xdzmaxSignal",
"dzmax of signal vertices merged with PU",100,0.,2.));
539 add(h,
new TH1F(
"xdzmaxPU",
"dzmax of merged PU vertices",100,0.,2.));
541 add(h,
new TH1F(
"dztrim",
"dzmax computed with Truth matched Reco Tracks",100,0.,2.));
542 add(h,
new TH1F(
"dztrimSignal",
"dzmax of signal vertices computed with Truth matched Reco Tracks",100,0.,2.));
543 add(h,
new TH1F(
"dztrimPU",
"dzmax of PU vertices computed with Truth matched Reco Tracks",100,0.,2.));
545 add(h,
new TH1F(
"xdztrim",
"dzmax of merged clusters",100,0.,2.));
546 add(h,
new TH1F(
"xdztrimSignal",
"dzmax of signal vertices merged with PU",100,0.,2.));
547 add(h,
new TH1F(
"xdztrimPU",
"dzmax of merged PU vertices",100,0.,2.));
549 add(h,
new TH1F(
"m4m2",
"m4m2 computed with Truth matched Reco Tracks",100,0.,100.));
550 add(h,
new TH1F(
"m4m2Signal",
"m4m2 of signal vertices computed with Truth matched Reco Tracks",100,0.,100.));
551 add(h,
new TH1F(
"m4m2PU",
"m4m2 of PU vertices computed with Truth matched Reco Tracks",100,0.,100.));
553 add(h,
new TH1F(
"xm4m2",
"m4m2 of merged clusters",100,0.,100.));
554 add(h,
new TH1F(
"xm4m2Signal",
"m4m2 of signal vertices merged with PU",100,0.,100.));
555 add(h,
new TH1F(
"xm4m2PU",
"m4m2 of merged PU vertices",100,0.,100.));
565 std::cout <<
" PrimaryVertexAnalyzer4PU::beginJob conversion from sim units to rec units is " <<
simUnit_ << std::endl;
570 TDirectory *noBS =
rootFile_->mkdir(
"noBS");
574 hist->second->SetDirectory(noBS);
577 TDirectory *withBS =
rootFile_->mkdir(
"BS");
580 for(std::map<std::string,TH1*>::const_iterator
hist=
hBS.begin();
hist!=
hBS.end();
hist++){
581 hist->second->SetDirectory(withBS);
587 for(std::map<std::string,TH1*>::const_iterator
hist=
hDA.begin();
hist!=
hDA.end();
hist++){
588 hist->second->SetDirectory(DA);
606 hsimPV[
"rapidity"] =
new TH1F(
"rapidity",
"rapidity ",100,-10., 10.);
607 hsimPV[
"chRapidity"] =
new TH1F(
"chRapidity",
"charged rapidity ",100,-10., 10.);
608 hsimPV[
"recRapidity"] =
new TH1F(
"recRapidity",
"reconstructed rapidity ",100,-10., 10.);
609 hsimPV[
"pt"] =
new TH1F(
"pt",
"pt ",100,0., 20.);
611 hsimPV[
"xsim"] =
new TH1F(
"xsim",
"simulated x",100,-0.01,0.01);
612 hsimPV[
"ysim"] =
new TH1F(
"ysim",
"simulated y",100,-0.01,0.01);
613 hsimPV[
"zsim"] =
new TH1F(
"zsim",
"simulated z",100,-20.,20.);
615 hsimPV[
"xsim1"] =
new TH1F(
"xsim1",
"simulated x",100,-4.,4.);
616 hsimPV[
"ysim1"] =
new TH1F(
"ysim1",
"simulated y",100,-4.,4.);
617 hsimPV[
"zsim1"] =
new TH1F(
"zsim1",
"simulated z",100,-40.,40.);
619 add(
hsimPV,
new TH1F(
"xsim2PU",
"simulated x (Pile-up)",100,-1.,1.));
620 add(
hsimPV,
new TH1F(
"ysim2PU",
"simulated y (Pile-up)",100,-1.,1.));
621 add(
hsimPV,
new TH1F(
"zsim2PU",
"simulated z (Pile-up)",100,-20.,20.));
622 add(
hsimPV,
new TH1F(
"xsim2Signal",
"simulated x (Signal)",100,-1.,1.));
623 add(
hsimPV,
new TH1F(
"ysim2Signal",
"simulated y (Signal)",100,-1.,1.));
624 add(
hsimPV,
new TH1F(
"zsim2Signal",
"simulated z (Signal)",100,-20.,20.));
626 hsimPV[
"xsim2"] =
new TH1F(
"xsim2",
"simulated x",100,-1,1);
627 hsimPV[
"ysim2"] =
new TH1F(
"ysim2",
"simulated y",100,-1,1);
628 hsimPV[
"zsim2"] =
new TH1F(
"zsim2",
"simulated z",100,-20.,20.);
629 hsimPV[
"xsim3"] =
new TH1F(
"xsim3",
"simulated x",100,-0.1,0.1);
630 hsimPV[
"ysim3"] =
new TH1F(
"ysim3",
"simulated y",100,-0.1,0.1);
631 hsimPV[
"zsim3"] =
new TH1F(
"zsim3",
"simulated z",100,-20.,20.);
632 hsimPV[
"xsimb"] =
new TH1F(
"xsimb",
"simulated x",100,-0.01,0.01);
633 hsimPV[
"ysimb"] =
new TH1F(
"ysimb",
"simulated y",100,-0.01,0.01);
634 hsimPV[
"zsimb"] =
new TH1F(
"zsimb",
"simulated z",100,-20.,20.);
635 hsimPV[
"xsimb1"] =
new TH1F(
"xsimb1",
"simulated x",100,-0.1,0.1);
636 hsimPV[
"ysimb1"] =
new TH1F(
"ysimb1",
"simulated y",100,-0.1,0.1);
637 hsimPV[
"zsimb1"] =
new TH1F(
"zsimb1",
"simulated z",100,-20.,20.);
638 add(
hsimPV,
new TH1F(
"xbeam",
"beamspot x",100,-1.,1.));
639 add(
hsimPV,
new TH1F(
"ybeam",
"beamspot y",100,-1.,1.));
640 add(
hsimPV,
new TH1F(
"zbeam",
"beamspot z",100,-1.,1.));
641 add(
hsimPV,
new TH1F(
"wxbeam",
"beamspot sigma x",100,-1.,1.));
642 add(
hsimPV,
new TH1F(
"wybeam",
"beamspot sigma y",100,-1.,1.));
643 add(
hsimPV,
new TH1F(
"wzbeam",
"beamspot sigma z",100,-1.,1.));
644 hsimPV[
"xsim2"]->StatOverflows(kTRUE);
645 hsimPV[
"ysim2"]->StatOverflows(kTRUE);
646 hsimPV[
"zsim2"]->StatOverflows(kTRUE);
647 hsimPV[
"xsimb"]->StatOverflows(kTRUE);
648 hsimPV[
"ysimb"]->StatOverflows(kTRUE);
649 hsimPV[
"zsimb"]->StatOverflows(kTRUE);
650 hsimPV[
"nsimvtx"] =
new TH1F(
"nsimvtx",
"# of simulated vertices", 50, -0.5, 49.5);
653 hsimPV[
"nbsimtksinvtx"]=
new TH1F(
"nbsimtksinvtx",
"simulated tracks in vertex",100,-0.5,99.5);
654 hsimPV[
"nbsimtksinvtx"]->StatOverflows(kTRUE);
660 std::cout <<
"this is void PrimaryVertexAnalyzer4PU::endJob() " << std::endl;
662 double sumDA=0,sumBS=0,sumnoBS=0;
664 for(
int i=101;
i>0;
i--){
665 sumDA+=
hDA[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hDA[
"matchVtxFractionSignal"]->Integral();
666 hDA[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumDA);
667 sumBS+=
hBS[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hBS[
"matchVtxFractionSignal"]->Integral();
668 hBS[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumBS);
669 sumnoBS+=
hnoBS[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hnoBS[
"matchVtxFractionSignal"]->Integral();
670 hnoBS[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumnoBS);
676 sumDA=0,sumBS=0,sumnoBS=0;
678 for(
int i=1;
i<1001;
i++){
679 sumDA+=
hDA[
"abszdistancetag"]->GetBinContent(
i);
680 hDA[
"abszdistancetagcum"]->SetBinContent(
i,sumDA/
float(
hDA[
"abszdistancetag"]->GetEntries()));
681 sumBS+=
hBS[
"abszdistancetag"]->GetBinContent(
i);
682 hBS[
"abszdistancetagcum"]->SetBinContent(
i,sumBS/
float(
hBS[
"abszdistancetag"]->GetEntries()));
683 sumnoBS+=
hnoBS[
"abszdistancetag"]->GetBinContent(
i);
684 hnoBS[
"abszdistancetagcum"]->SetBinContent(
i,sumnoBS/
float(
hnoBS[
"abszdistancetag"]->GetEntries()));
705 for(
int i=1;
i<501;
i++){
706 if(
hDA[
"vtxndf"]->GetEntries()>0){
707 p=
hDA[
"vtxndf"]->Integral(
i,501)/
hDA[
"vtxndf"]->GetEntries();
hDA[
"vtxndfc"]->SetBinContent(
i,p*
hDA[
"vtxndf"]->GetBinContent(
i));
709 if(
hBS[
"vtxndf"]->GetEntries()>0){
710 p=
hBS[
"vtxndf"]->Integral(
i,501)/
hBS[
"vtxndf"]->GetEntries();
hBS[
"vtxndfc"]->SetBinContent(
i,p*
hBS[
"vtxndf"]->GetBinContent(
i));
712 if(
hnoBS[
"vtxndf"]->GetEntries()>0){
713 p=
hnoBS[
"vtxndf"]->Integral(
i,501)/
hnoBS[
"vtxndf"]->GetEntries();
hnoBS[
"vtxndfc"]->SetBinContent(
i,p*
hnoBS[
"vtxndf"]->GetBinContent(
i));
723 hist->second->Write();
726 std::cout <<
"PrimaryVertexAnalyzer4PU::endJob: done" << std::endl;
738 std::vector<SimPart > tsim;
739 if(simVtcs->begin()==simVtcs->end()){
741 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters no simvtcs" << endl;
746 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters simVtcs n=" << simVtcs->size() << endl;
747 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters 1st position" << setw(8) << setprecision(4) << simVtcs->begin()->position() << endl;
749 double t0=simVtcs->begin()->position().e();
751 for(edm::SimTrackContainer::const_iterator
t=simTrks->begin();
752 t!=simTrks->end(); ++
t){
754 std::cout <<
"simtrk has no vertex" << std::endl;
759 (*simVtcs)[
t->vertIndex()].position().y(),
760 (*simVtcs)[
t->vertIndex()].position().z(),
761 (*simVtcs)[
t->vertIndex()].position().e());
762 int pdgCode=
t->type();
766 std::cout <<
"funny particle skipped , code=" << pdgCode << std::endl;
769 if ((pdgCode==11)||(pdgCode==13)||(pdgCode==15)||(pdgCode==-211)||(pdgCode==-2212)||(pdgCode==-321)||(pdgCode==-3222)){Q=-1;}
770 else if((pdgCode==-11)||(pdgCode==-13)||(pdgCode==-15)||(pdgCode==211)||(pdgCode==2212)||(pdgCode==321)||(pdgCode==3222)){Q=1;}
775 if ( (Q != 0) && (
p.pt()>0.1) && (fabs(
t->momentum().eta())<3.0)
776 && fabs(
v.z()*simUnit<20) && (
sqrt(
v.x()*
v.x()+
v.y()*
v.y())<10.)){
777 double x0=
v.x()*simUnit;
778 double y0=
v.y()*simUnit;
779 double z0=
v.z()*simUnit;
780 double kappa=-Q*0.002998*
fBfield_/
p.pt();
781 double D0=x0*
sin(
p.phi())-y0*
cos(
p.phi())-0.5*kappa*(x0*x0+y0*y0);
782 double q=
sqrt(1.-2.*kappa*D0);
783 double s0=(x0*
cos(
p.phi())+y0*
sin(
p.phi()))/
q;
785 if (fabs(kappa*s0)>0.001){
786 s1=asin(kappa*s0)/kappa;
788 double ks02=(kappa*s0)*(kappa*s0);
789 s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*
pow(ks02,3));
806 double x1=x0-0.033;
double y1=y0-0.;
807 D0=x1*
sin(
p.phi())-y1*
cos(
p.phi())-0.5*kappa*(x1*x1+y1*y1);
808 q=
sqrt(1.-2.*kappa*D0);
810 if (fabs(kappa*s0)>0.001){
811 s1=asin(kappa*s0)/kappa;
813 double ks02=(kappa*s0)*(kappa*s0);
814 s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*
pow(ks02,3));
832 int nsim=simtrks.size();
833 int nrec=trks.size();
834 int *rectosim=
new int[nrec];
835 double** pij=
new double*[nrec];
839 for(reco::TrackCollection::const_iterator
t=trks.begin();
t!=trks.end(); ++
t){
840 pij[
i]=
new double[nsim];
846 for(
int j=0;
j<nsim;
j++){
850 for(
int k=0;
k<5;
k++){
851 for(
int l=0;
l<5;
l++){
855 pij[
i][
j]=
exp(-0.5*c);
888 for(
int k=0;
k<nrec;
k++){
889 int imatch=-1;
int jmatch=-1;
891 for(
int j=0;
j<nsim;
j++){
892 if ((simtrks[
j].rec)<0){
893 double psum=
exp(-0.5*mu);
894 for(
int i=0; i<nrec; i++){
895 if (rectosim[i]<0){ psum+=pij[
i][
j];}
897 for(
int i=0; i<nrec; i++){
898 if ((rectosim[i]<0)&&(pij[i][
j]/psum>pmatch)){
899 pmatch=pij[
i][
j]/psum;
905 if((jmatch>=0)||(imatch>=0)){
909 rectosim[imatch]=jmatch;
910 simtrks[jmatch].rec=imatch;
912 }
else if (
match(simtrks[jmatch].par, trks.at(imatch).parameters())){
914 rectosim[imatch]=jmatch;
915 simtrks[jmatch].rec=imatch;
933 std::cout <<
"unmatched sim " << std::endl;
934 for(
int j=0;
j<nsim;
j++){
935 if(simtrks[
j].rec<0){
936 double pt= 1./simtrks[
j].par[0]/
tan(simtrks[
j].par[1]);
938 std::cout << setw(3) <<
j << setw(8) << simtrks[
j].pdg
939 << setw(8) << setprecision(4) <<
" (" << simtrks[
j].xvtx <<
"," << simtrks[
j].yvtx <<
"," << simtrks[
j].zvtx <<
")"
941 <<
" phi=" << simtrks[
j].par[2]
942 <<
" eta= " << -
log(
tan(0.5*(
M_PI/2-simtrks[
j].par[1])))
950 for(
int i=0; i<nrec; i++){
delete pij[
i];}
964 double dqoverp =
a(0)-
b(0);
965 double dlambda =
a(1)-
b(1);
966 double dphi =
a(2)-
b(2);
967 double dsz =
a(4)-
b(4);
968 if (dphi>
M_PI){ dphi-=M_2_PI; }
else if(dphi<-
M_PI){dphi+=M_2_PI;}
970 return ( (fabs(dqoverp)<0.2) && (fabs(dlambda)<0.02) && (fabs(dphi)<0.04) && (fabs(dsz)<1.0) );
980 double ctau=(
pdt_->particle(
abs(p->pdg_id()) ))->lifetime();
982 return ctau >0 && ctau <1
e-6;
986 return ( !p->end_vertex() && p->status()==1 );
993 return part->charge()!=0;
996 return pdt_->particle( -p->pdg_id() )!=0;
1004 Fill(h,
"rapidity_"+ttype,t.
eta());
1005 Fill(h,
"z0_"+ttype,t.
vz());
1008 Fill(h,
"pt_"+ttype,t.
pt());
1017 Fill(h,
"logtresxy_"+ttype,
log(d0Error/0.0001)/
log(10.));
1018 Fill(h,
"tpullxy_"+ttype,d0/d0Error);
1023 Fill(h,
"logtresz_"+ttype,
log(dzError/0.0001)/
log(10.));
1031 if((! (v==
NULL)) && (v->
ndof()>10.)) {
1049 double D0=x1*
sin(t.
phi())-y1*
cos(t.
phi())-0.5*kappa*(x1*x1+y1*y1);
1050 double q=
sqrt(1.-2.*kappa*D0);
1053 if (fabs(kappa*s0)>0.001){
1071 Fill(h,
"trackAlgo_"+ttype,t.
algo());
1075 int longesthit=0, nbarrel=0;
1077 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1085 if (clust->sizeY()-longesthit>0) longesthit=clust->sizeY();
1086 if (clust->sizeY()>20.){
1087 Fill(h,
"lvseta_"+ttype,t.
eta(), 19.9);
1090 Fill(h,
"lvseta_"+ttype,t.
eta(), float(clust->sizeY()));
1091 Fill(h,
"lvstanlambda_"+ttype,
tan(t.
lambda()),
float(clust->sizeY()));
1097 Fill(h,
"nbarrelhits_"+ttype,
float(nbarrel));
1104 int longesthit=0, nbarrel=0;
1105 cout << Form(
"%5.2f %5.2f : ",t.
pt(),t.
eta());
1107 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1115 cout << Form(
"%4d",clust->sizeY());
1116 if (clust->sizeY()-longesthit>0) longesthit=clust->sizeY();
1126 std::cout << std::endl << title << std::endl;
1127 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
1128 v!=recVtxs->end(); ++
v){
1129 string vtype=
" recvtx ";
1132 }
else if (
v->ndof()==-5){
1134 }
else if(
v->ndof()==-3){
1137 std::cout <<
"vtx "<< std::setw(3) << std::setfill(
' ')<<ivtx++
1139 <<
" #trk " << std::fixed << std::setprecision(4) << std::setw(3) <<
v->tracksSize()
1140 <<
" chi2 " << std::fixed << std::setw(4) << std::setprecision(1) <<
v->chi2()
1141 <<
" ndof " << std::fixed << std::setw(5) << std::setprecision(2) <<
v->ndof()
1142 <<
" x " << std::setw(8) <<std::fixed << std::setprecision(4) <<
v->x()
1143 <<
" dx " << std::setw(8) <<
v->xError()
1144 <<
" y " << std::setw(8) <<
v->y()
1145 <<
" dy " << std::setw(8) <<
v->yError()
1146 <<
" z " << std::setw(8) <<
v->z()
1147 <<
" dz " << std::setw(8) <<
v->zError()
1155 for(SimVertexContainer::const_iterator vsim=simVtxs->begin();
1156 vsim!=simVtxs->end(); ++vsim){
1157 if ( vsim->position().x()*vsim->position().x()+vsim->position().y()*vsim->position().y() < 1.){
1158 std::cout << i++ <<
")" << std::scientific
1159 <<
" evtid=" << vsim->eventId().event() <<
"," << vsim->eventId().bunchCrossing()
1160 <<
" sim x=" << vsim->position().x()*
simUnit_
1161 <<
" sim y=" << vsim->position().y()*
simUnit_
1162 <<
" sim z=" << vsim->position().z()*
simUnit_
1163 <<
" sim t=" << vsim->position().t()
1164 <<
" parent=" << vsim->parentIndex()
1177 std::cout <<
" simTrks type, (momentum), vertIndex, genpartIndex" << std::endl;
1179 for(SimTrackContainer::const_iterator
t=simTrks->begin();
1180 t!=simTrks->end(); ++
t){
1183 <<
t->eventId().event() <<
"," <<
t->eventId().bunchCrossing()
1186 << (*t).genpartIndex();
1199 cout <<
"printRecTrks" << endl;
1201 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
t!=recTrks->end(); ++
t){
1205 cout <<
"Track "<<i <<
" " ; i++;
1222 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;
1225 cout << Form(
" found=%6d lost=%6d chi2/ndof=%10.3f ",
t->found(),
t->lost(),
t->normalizedChi2())<<endl;
1227 cout <<
"subdet layers valid lost" << endl;
1228 cout << Form(
" barrel %2d %2d %2d",p.pixelBarrelLayersWithMeasurement(),p.numberOfValidPixelBarrelHits(), p.numberOfLostPixelBarrelHits()) << endl;
1229 cout << Form(
" fwd %2d %2d %2d",p.pixelEndcapLayersWithMeasurement(),p.numberOfValidPixelEndcapHits(), p.numberOfLostPixelEndcapHits()) << endl;
1230 cout << Form(
" pixel %2d %2d %2d",p.pixelLayersWithMeasurement(), p.numberOfValidPixelHits(), p.numberOfLostPixelHits()) << endl;
1231 cout << Form(
" tracker %2d %2d %2d",p.trackerLayersWithMeasurement(), p.numberOfValidTrackerHits(), p.numberOfLostTrackerHits()) << endl;
1243 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1250 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;
1256 cout << Form(
" endcap cluster size=%2d charge=%6.1f wx=%2d wy=%2d",clust->size(),clust->charge(),clust->sizeX(),clust->sizeY()) << endl;
1261 cout <<
"hitpattern" << endl;
1262 for(
int i=0; i<p.numberOfHits(); i++){ p.printHitPattern(i,
std::cout); }
1263 cout <<
"expected inner " << ninner << endl;
1265 cout <<
"expected outer " << nouter << endl;
1285 std::vector<SimPart>& tsim,
1286 std::vector<SimEvent>& simEvt,
1290 vector<TransientTrack> selTrks;
1291 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1292 t!=recTrks->end(); ++
t){
1294 if( (!selectedOnly) || (selectedOnly &&
theTrackFilter(tt))){ selTrks.push_back(tt); }
1296 if (selTrks.size()==0)
return;
1297 stable_sort(selTrks.begin(), selTrks.end(), recTrackLessZ);
1302 for(
unsigned int i=0;
i<selTrks.size();
i++){ selRecTrks.push_back(selTrks[
i].track());}
1303 int* rectosim=
supf(tsim, selRecTrks);
1308 cout <<
"printPVTrks" << endl;
1309 cout <<
"---- z +/- dz 1bet-m ip +/-dip pt phi eta";
1310 if((tsim.size()>0)||(simEvt.size()>0)) {
cout <<
" type pdg zvtx zdca dca zvtx zdca dsz";}
1315 for(
unsigned int i=0;
i<selTrks.size();
i++){
1317 cout << setw (3)<< isel;
1327 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
1328 v!=recVtxs->end(); ++
v){
1329 if ( (
v->ndof()<-1) || (
v->chi2()<=0) )
continue;
1330 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
1332 if(selTrks[i].track().vz()==RTv.
vz()) {vmatch=iv;}
1337 double tz=(selTrks[
i].stateAtBeamLine().trackStateAtPCA()).
position().z();
1338 double tantheta=
tan((selTrks[i].stateAtBeamLine().trackStateAtPCA()).momentum().
theta());
1339 double tdz0= selTrks[
i].track().dzError();
1343 cout <<
"["<<setw(2)<<vmatch<<
"]";
1350 if(status&0x1){
cout <<
"i";}
else{
cout <<
".";};
1351 if(status&0x2){
cout <<
"c";}
else{
cout <<
".";};
1352 if(status&0x4){
cout <<
"h";}
else{
cout <<
".";};
1353 if(status&0x8){
cout <<
"q";}
else{
cout <<
".";};
1356 cout << setw (8) << fixed << setprecision(4)<< tz <<
" +/-" << setw (6)<<
sqrt(tdz2);
1361 if(selTrks[i].track().hitPattern().hasValidHitInFirstPixelBarrel()){
cout <<
"+";}
else{
cout <<
"-";}
1362 cout << setw(1) << selTrks[
i].track().hitPattern().pixelBarrelLayersWithMeasurement();
1363 cout << setw(1) << selTrks[
i].track().hitPattern().pixelEndcapLayersWithMeasurement();
1364 cout << setw(1) << hex << selTrks[
i].track().hitPattern().trackerLayersWithMeasurement()-selTrks[
i].track().hitPattern().pixelLayersWithMeasurement()<<dec;
1365 cout <<
"-" << setw(1)<<hex <<selTrks[
i].track().trackerExpectedHitsOuter().numberOfHits() << dec;
1368 Measurement1D IP=selTrks[
i].stateAtBeamLine().transverseImpactParameter();
1369 cout << setw (8) << IP.
value() <<
"+/-" << setw (6) << IP.
error();
1370 if(selTrks[i].track().ptError()<1){
1371 cout <<
" " << setw(8) << setprecision(2) << selTrks[
i].track().pt()*selTrks[
i].track().charge();
1373 cout <<
" " << setw(7) << setprecision(1) << selTrks[
i].track().pt()*selTrks[
i].track().charge() <<
"*";
1376 cout <<
" " << setw(5) << setprecision(2) << selTrks[
i].track().phi()
1377 <<
" " << setw(5) << setprecision(2) << selTrks[
i].track().eta() ;
1382 if(simEvt.size()>0){
1389 double vz=parentVertex->
position().z();
1390 cout <<
" " << tpr->eventId().event();
1391 cout <<
" " << setw(5) << tpr->pdgId();
1392 cout <<
" " << setw(8) << setprecision(4) << vz;
1394 cout <<
" not matched";
1399 if(tsim[rectosim[i]].
type==0){
cout <<
" prim " ;}
else{
cout <<
" sec ";}
1400 cout <<
" " << setw(5) << tsim[rectosim[
i]].pdg;
1401 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].zvtx;
1402 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].zdcap;
1403 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].ddcap;
1404 double zvtxpull=(tz-tsim[rectosim[
i]].zvtx)/
sqrt(tdz2);
1405 cout << setw(6) << setprecision(1) << zvtxpull;
1406 double zdcapull=(tz-tsim[rectosim[
i]].zdcap)/tdz0;
1407 cout << setw(6) << setprecision(1) << zdcapull;
1408 double dszpull=(selTrks[
i].track().dsz()-tsim[rectosim[
i]].par[4])/selTrks[i].track().dszError();
1409 cout << setw(6) << setprecision(1) << dszpull;
1419 const std::vector<SimPart > & tsim,
1425 std::cout <<
"dump rec tracks: " << std::endl;
1427 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1428 t!=recTrks->end(); ++
t){
1430 std::cout << irec++ <<
") " << p << std::endl;
1433 std::cout <<
"match sim tracks: " << std::endl;
1437 for(std::vector<SimPart>::const_iterator
s=tsim.begin();
1438 s!=tsim.end(); ++
s){
1442 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1443 t!=recTrks->end(); ++
t){
1445 if (
match(
s->par,p)){ imatch=irec; }
1451 std::cout <<
" matched to rec trk" << imatch << std::endl;
1453 std::cout <<
" not matched" << std::endl;
1467 double & Tc,
double & chsq,
double & dzmax,
double & dztrim,
double & m4m2){
1468 if (tracks.size()<2){ Tc=-1; chsq=-1; dzmax=-1; dztrim=-1; m4m2=-1;
return;}
1470 double sumw=0, sumwz=0, sumww=0,sumwwz=0,sumwwzz=0;
1471 double zmin=1e10, zmin1=1e10, zmax1=-1e10, zmax=-1e10;
1472 double m4=0,m3=0,m2=0,m1=0,m0=0;
1473 for(vector<reco::TransientTrack>::const_iterator it=tracks.begin(); it!=tracks.end(); it++){
1474 double tantheta=
tan(((*it).stateAtBeamLine().trackStateAtPCA()).momentum().theta());
1476 double z=((*it).stateAtBeamLine().trackStateAtPCA()).
position().z();
1477 double dz2=
pow((*it).track().dzError(),2)+
pow(beamspot.BeamWidthX()/tantheta,2);
1491 if(z<zmin1){zmin1=
z;}
if(z<zmin){zmin1=zmin; zmin=
z;}
1492 if(z>zmax1){zmax1=
z;}
if(z>zmax){zmax1=zmax; zmax=
z;}
1495 double z=sumwz/sumw;
1496 double a=sumwwzz-2*z*sumwwz+z*z*sumww;
1498 if(tracks.size()>1){
1499 chsq=(m2-m0*z*
z)/(tracks.size()-1);
1501 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));
1526 std::vector<std::pair<TrackingParticleRef, double> > tp =
r2s_[track];
1527 for (std::vector<std::pair<TrackingParticleRef, double> >::const_iterator it = tp.begin();
1528 it != tp.end(); ++it) {
1557 std::vector< edm::RefToBase<reco::Track> >
b;
1586 const View<Track> tC = *(trackCollectionH.product());
1589 vector<SimEvent> simEvt;
1590 map<EncodedEventId, unsigned int> eventIdToEventMap;
1591 map<EncodedEventId, unsigned int>::iterator
id;
1593 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1595 if( fabs(it->parentVertex().get()->position().z())>100.)
continue;
1597 unsigned int event=0;
1598 id=eventIdToEventMap.find(it->eventId());
1599 if (
id==eventIdToEventMap.end()){
1604 event=simEvt.size();
1607 cout <<
"getSimEvents: ";
1608 cout << it->eventId().bunchCrossing() <<
"," << it->eventId().event()
1609 <<
" z="<< it->vz() <<
" "
1611 <<
" z=" << parentVertex->
position().z() << endl;
1613 if (it->eventId()==parentVertex->
eventId()){
1622 e.
x=0; e.
y=0; e.
z=-88.;
1624 simEvt.push_back(e);
1631 simEvt[
event].tp.push_back(&(*it));
1632 if( (
abs(it->eta())<2.5) && (it->charge()!=0) ){
1633 simEvt[
event].sumpt2+=
pow(it->pt(),2);
1634 simEvt[
event].sumpt+=it->pt();
1639 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1648 if( truthMatchedTrack(track,tpr)){
1650 if( eventIdToEventMap.find(tpr->eventId())==eventIdToEventMap.end() ){
cout <<
"Bug in getSimEvents" << endl;
break; }
1652 z2tp_[track.
get()->
vz()]=tpr;
1654 unsigned int event=eventIdToEventMap[tpr->eventId()];
1655 double ipsig=0,ipdist=0;
1657 double vx=parentVertex->
position().x();
1658 double vy=parentVertex->
position().y();
1659 double vz=parentVertex->
position().z();
1662 double dxy=track->
dxy(vertexBeamSpot_.position());
1668 if (theTrackFilter(t)){
1669 simEvt[
event].tk.push_back(t);
1670 if(ipdist<5){simEvt[
event].tkprim.push_back(t);}
1671 if(ipsig<5){simEvt[
event].tkprimsel.push_back(t);}
1680 cout <<
"SimEvents " << simEvt.size() << endl;
1681 for(
unsigned int i=0;
i<simEvt.size();
i++){
1683 if(simEvt[
i].tkprim.size()>0){
1685 getTc(simEvt[
i].tkprimsel, simEvt[
i].Tc, simEvt[
i].chisq, simEvt[
i].dzmax, simEvt[
i].dztrim, simEvt[
i].m4m2);
1697 cout <<
i <<
" ) nTP=" << simEvt[
i].tp.size()
1698 <<
" z=" << simEvt[
i].z
1699 <<
" recTrks=" << simEvt[
i].tk.size()
1700 <<
" recTrksPrim=" << simEvt[
i].tkprim.size()
1701 <<
" zfit=" << simEvt[
i].zfit
1715 std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> simpv;
1716 const HepMC::GenEvent* evt=evtMC->GetEvent();
1725 for(HepMC::GenEvent::vertex_const_iterator vitr= evt->vertices_begin();
1726 vitr != evt->vertices_end(); ++vitr )
1729 HepMC::FourVector
pos = (*vitr)->position();
1732 if (fabs(pos.z())>1000)
continue;
1734 bool hasMotherVertex=
false;
1736 for ( HepMC::GenVertex::particle_iterator
1740 HepMC::GenVertex * mv=(*mother)->production_vertex();
1741 if (mv) {hasMotherVertex=
true;}
1744 if(hasMotherVertex) {
continue;}
1748 const double mm=0.1;
1751 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1752 v0!=simpv.end(); v0++){
1753 if( (fabs(sv.x-v0->x)<1
e-5) && (fabs(sv.y-v0->y)<1
e-5) && (fabs(sv.z-v0->z)<1
e-5)){
1761 simpv.push_back(sv);
1769 vp->genVertex.push_back((*vitr)->barcode());
1773 for ( HepMC::GenVertex::particle_iterator
1774 daughter = (*vitr)->particles_begin(HepMC::descendants);
1775 daughter != (*vitr)->particles_end(HepMC::descendants);
1779 if (
find(vp->finalstateParticles.begin(), vp->finalstateParticles.end(),(*daughter)->barcode())
1780 == vp->finalstateParticles.end()){
1781 vp->finalstateParticles.push_back((*daughter)->barcode());
1782 HepMC::FourVector
m=(*daughter)->momentum();
1784 vp->ptot.setPx(vp->ptot.px()+m.px());
1785 vp->ptot.setPy(vp->ptot.py()+m.py());
1786 vp->ptot.setPz(vp->ptot.pz()+m.pz());
1787 vp->ptot.setE(vp->ptot.e()+m.e());
1788 vp->ptsq+=(m.perp())*(m.perp());
1790 if ( (m.perp()>0.2) && (fabs(m.pseudoRapidity())<2.5) &&
isCharged( *daughter ) ){
1794 hsimPV[
"rapidity"]->Fill(m.pseudoRapidity());
1795 if( (m.perp()>0.8) &&
isCharged( *daughter ) ){
1796 hsimPV[
"chRapidity"]->Fill(m.pseudoRapidity());
1798 hsimPV[
"pt"]->Fill(m.perp());
1808 cout <<
"------- PrimaryVertexAnalyzer4PU simPVs -------" << endl;
1809 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1810 v0!=simpv.end(); v0++){
1811 cout <<
"z=" << v0->z
1812 <<
" px=" << v0->ptot.px()
1813 <<
" py=" << v0->ptot.py()
1814 <<
" pz=" << v0->ptot.pz()
1815 <<
" pt2="<< v0->ptsq
1818 cout <<
"-----------------------------------------------" << endl;
1835 std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> simpv;
1838 if(
DEBUG_){
std::cout <<
"getSimPVs TrackingVertexCollection " << std::endl;}
1840 for (TrackingVertexCollection::const_iterator
v = tVC ->
begin();
v != tVC ->
end(); ++
v) {
1843 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;
1851 if ((
unsigned int)
v->eventId().event()<simpv.size())
continue;
1853 if (fabs(
v->position().z())>1000)
continue;
1856 const double mm=1.0;
1864 sv.eventId=(**iTrack).eventId();
1868 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1869 v0!=simpv.end(); v0++){
1870 if( (sv.eventId==v0->eventId) && (fabs(sv.x-v0->x)<1
e-5) && (fabs(sv.y-v0->y)<1
e-5) && (fabs(sv.z-v0->z)<1
e-5)){
1877 if(
DEBUG_){
std::cout <<
"this is a new vertex " << sv.eventId.event() <<
" " << sv.x <<
" " << sv.y <<
" " << sv.z <<std::endl;}
1878 simpv.push_back(sv);
1881 if(
DEBUG_){
std::cout <<
"this is not a new vertex" << sv.x <<
" " << sv.y <<
" " << sv.z <<std::endl;}
1888 std::cout <<
" Daughter momentum: " << (*(*iTP)).momentum();
1895 cout <<
"------- PrimaryVertexAnalyzer4PU simPVs from TrackingVertices -------" << endl;
1896 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1897 v0!=simpv.end(); v0++){
1898 cout <<
"z=" << v0->z <<
" event=" << v0->eventId.event() << endl;
1900 cout <<
"-----------------------------------------------" << endl;
1915 std::vector<simPrimaryVertex> simpv;
1916 std::vector<SimPart> tsim;
1917 std::string mcproduct=
"generator";
1932 <<
"PrimaryVertexAnalyzer4PU::analyze event counter=" <<
eventcounter_
1943 std::cout <<
"Some problem occurred with the particle data table. This may not work !" <<std::endl;
1947 bool bnoBS=iEvent.
getByLabel(
"offlinePrimaryVertices", recVtxs);
1950 bool bBS=iEvent.
getByLabel(
"offlinePrimaryVerticesWithBS", recVtxsBS);
1953 bool bDA=iEvent.
getByLabel(
"offlinePrimaryVerticesDA", recVtxsDA);
1966 int nhighpurity=0, ntot=0;
1967 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
t!=recTrks->end(); ++
t){
1971 if(ntot>10)
hnoBS[
"highpurityTrackFraction"]->Fill(
float(nhighpurity)/
float(ntot));
1973 if(
verbose_){
cout <<
"rejected, " << nhighpurity <<
" highpurity out of " << ntot <<
" total tracks "<< endl<< endl;}
1988 cout <<
" beamspot not found, using dummy " << endl;
1994 if((recVtxs->begin()->
isValid())&&(recVtxs->begin()->ndof()>1)&&(recVtxs->begin()->ndof()>(0.0*recVtxs->begin()->tracksSize()))){
1999 cout << Form(
"XBS %10d %5d %10d %4d %lu %5.2f %8f %8f %8f %8f %8f %8f",
2001 (
unsigned long)(recVtxs->begin()->tracksSize()), recVtxs->begin()->ndof(),
2002 recVtxs->begin()->x(), recVtxs->begin()->xError(),
2003 recVtxs->begin()->y(), recVtxs->begin()->yError(),
2004 recVtxs->begin()->z(), recVtxs->begin()->zError()
2030 bool gotTP=iEvent.
getByLabel(
"mergedtruth",
"MergedTrackTruth",TPCollectionH);
2031 bool gotTV=iEvent.
getByLabel(
"mergedtruth",
"MergedTrackTruth",TVCollectionH);
2038 vector<SimEvent> simEvt;
2039 if (gotTP && gotTV ){
2046 simEvt=
getSimEvents(TPCollectionH, TVCollectionH, trackCollectionH);
2048 if (simEvt.size()==0){
2049 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2050 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2051 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2052 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2053 cout <<
" !!!!!!!!!!!!!!!!!!!!!! got TrackingParticles but no simEvt !!!!!!!!!!!!!!!!!" << endl;
2054 cout <<
" dumping Tracking particles " << endl;
2056 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
2057 cout << *it << endl;
2059 cout <<
" dumping Tracking Vertices " << endl;
2061 for(TrackingVertexCollection::const_iterator iv=tpVtxs->begin(); iv!=tpVtxs->end(); iv++){
2062 cout << *iv << endl;
2065 cout <<
"dumping simTracks" << endl;
2066 for(SimTrackContainer::const_iterator
t=simTrks->begin();
t!=simTrks->end(); ++
t){
2069 cout <<
"dumping simVertexes" << endl;
2070 for(SimVertexContainer::const_iterator vv=simVtxs->begin();
2073 cout << *vv << endl;
2076 cout <<
"no hepMC" << endl;
2078 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2080 const HepMC::GenEvent* evt=evtMC->GetEvent();
2082 std::cout <<
"process id " <<evt->signal_process_id()<<std::endl;
2083 std::cout <<
"signal process vertex "<< ( evt->signal_process_vertex() ?
2084 evt->signal_process_vertex()->barcode() : 0 ) <<std::endl;
2085 std::cout <<
"number of vertices " << evt->vertices_size() << std::endl;
2088 cout <<
"no event in HepMC" << endl;
2090 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2101 cout <<
"Found Tracking Vertices " << endl;
2106 }
else if(iEvent.
getByLabel(mcproduct,evtMC)){
2111 cout <<
"Using HepMCProduct " << endl;
2112 std::cout <<
"simtrks " << simTrks->size() << std::endl;
2124 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2125 v!=recVtxs->end(); ++
v){
2126 if ((
v->ndof()==-3) && (
v->chi2()==0) ){
2134 hsimPV[
"nsimvtx"]->Fill(simpv.size());
2135 for(std::vector<simPrimaryVertex>::iterator vsim=simpv.begin();
2136 vsim!=simpv.end(); vsim++){
2141 hsimPV[
"nbsimtksinvtx"]->Fill(vsim->nGenTrk);
2189 cout << endl <<
"Event dump" << endl
2200 if (bnoBS) {
printRecVtxs(recVtxs,
"Offline without Beamspot");}
2201 if (bnoBS && (!bDA)){
printPVTrks(recTrks, recVtxs, tsim, simEvt,
false);}
2202 if (bBS)
printRecVtxs(recVtxsBS,
"Offline with Beamspot");
2205 printPVTrks(recTrks, recVtxsDA, tsim, simEvt,
false);
2216 bool lt(
const std::pair<double,unsigned int>&
a,
const std::pair<double,unsigned int>&
b ){
2217 return a.first<b.first;
2225 vector<SimEvent> & simEvt,
2228 if (simEvt.size()==0){
return;}
2233 vector< pair<double,unsigned int> > zrecv;
2234 for(
unsigned int idx=0; idx<recVtxs->size(); idx++){
2235 if ( (recVtxs->at(idx).ndof()<0) || (recVtxs->at(idx).chi2()<=0) )
continue;
2236 zrecv.push_back( make_pair(recVtxs->at(idx).z(),idx) );
2238 stable_sort(zrecv.begin(),zrecv.end(),
lt);
2241 vector< pair<double,unsigned int> > zsimv;
2242 for(
unsigned int idx=0; idx<simEvt.size(); idx++){
2243 zsimv.push_back(make_pair(simEvt[idx].
z, idx));
2245 stable_sort(zsimv.begin(), zsimv.end(),
lt);
2250 cout <<
"---------------------------" << endl;
2252 cout <<
"---------------------------" << endl;
2253 cout <<
" z[cm] rec --> ";
2255 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2256 cout << setw(7) << fixed << itrec->first;
2257 if (itrec->second==0){
cout <<
"*" ;}
else{
cout <<
" " ;}
2261 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2262 cout << setw(7) << fixed << recVtxs->at(itrec->second).tracksSize();
2263 if (itrec->second==0){
cout <<
"*" ;}
else{
cout <<
" " ;}
2265 cout <<
" rec tracks" << endl;
2267 map<unsigned int, int> truthMatchedVertexTracks;
2268 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2270 cout << setw(7) << fixed << truthMatchedVertexTracks[itrec->second];
2271 if (itrec->second==0){
cout <<
"*" ;}
else{
cout <<
" " ;}
2273 cout <<
" truth matched " << endl;
2275 cout <<
"sim ------- trk prim ----" << endl;
2279 map<unsigned int, unsigned int> rvmatch;
2280 map<unsigned int, double > nmatch;
2281 map<unsigned int, double > purity;
2282 map<unsigned int, double > wpurity;
2284 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2285 purity[itrec->second]=0.;
2286 wpurity[itrec->second]=0.;
2289 for(vector< pair<double,unsigned int> >::iterator itsim=zsimv.begin(); itsim!=zsimv.end(); itsim++){
2290 SimEvent* ev =&(simEvt[itsim->second]);
2294 if (itsim->second==0){
2295 cout << setw(8) << fixed << ev->
z <<
")*" << setw(5) << ev->
tk.size() << setw(5) << ev->
tkprim.size() <<
" | ";
2297 cout << setw(8) << fixed << ev->
z <<
") " << setw(5) << ev->
tk.size() << setw(5) << ev->
tkprim.size() <<
" | ";
2300 nmatch[itsim->second]=0;
2301 double matchpurity=0,matchwpurity=0;
2303 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2308 for(vector<TransientTrack>::iterator te=ev->
tk.begin(); te!=ev->
tk.end(); te++){
2315 cout << setw(7) << int(n)<<
" ";
2317 if (n > nmatch[itsim->second]){
2318 nmatch[itsim->second]=
n;
2319 rvmatch[itsim->second]=itrec->second;
2320 matchpurity=n/truthMatchedVertexTracks[itrec->second];
2321 matchwpurity=wt/truthMatchedVertexTracks[itrec->second];
2324 if(n > purity[itrec->second]){
2325 purity[itrec->second]=
n;
2328 if(wt > wpurity[itrec->second]){
2329 wpurity[itrec->second]=wt;
2335 if (nmatch[itsim->second]>0 ){
2336 if(matchpurity>0.5){
2341 cout <<
" max eff. = " << setw(8) << nmatch[itsim->second]/ev->
tk.size() <<
" p=" << matchpurity <<
" w=" << matchwpurity << endl;
2343 if(ev->
tk.size()==0){
2344 cout <<
" invisible" << endl;
2345 }
else if (ev->
tk.size()==1){
2346 cout <<
"single track " << endl;
2348 cout <<
"lost " << endl;
2352 cout <<
"---------------------------" << endl;
2356 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2357 cout << setw(7) << fixed << purity[itrec->second]/truthMatchedVertexTracks[itrec->second];
2358 if (itrec->second==0){
cout <<
"*" ;}
else{
cout <<
" " ;}
2369 cout <<
"---------------------------" << endl;
2375 for(vector< pair<double,unsigned int> >::iterator itsim=zsimv.begin(); itsim!=zsimv.end(); itsim++){
2376 SimEvent* ev =&(simEvt[itsim->second]);
2378 for(vector<TransientTrack>::iterator te=ev->
tk.begin(); te!=ev->
tk.end(); te++){
2383 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2388 if(RTe.
vz()==RTv.
vz()) {ivassign=itrec->second;}
2391 double tantheta=
tan((te->stateAtBeamLine().trackStateAtPCA()).momentum().theta());
2394 double dz2=
pow(RTe.
dzError(),2)+
pow(beamspot.BeamWidthX()/tantheta,2);
2396 if(ivassign==(
int)rvmatch[itsim->second]){
2397 Fill(h,
"correctlyassigned",RTe.
eta(),RTe.
pt());
2398 Fill(h,
"ptcat",RTe.
pt());
2403 Fill(h,
"misassigned",RTe.
eta(),RTe.
pt());
2404 Fill(h,
"ptmis",RTe.
pt());
2408 cout <<
"vertex " << setw(8) << fixed << ev->
z;
2411 cout <<
" track lost ";
2415 cout <<
" track misassigned " << setw(8) << fixed << recVtxs->at(ivassign).z();
2418 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);
2423 double zparent=tpr->parentVertex().
get()->position().z();
2424 if(zparent==ev->
z) {
2429 cout <<
" id=" << tpr->pdgId();
2438 cout <<
"---------------------------" << endl;
2450 vector<SimEvent> & simEvt,
2454 if(simEvt.size()==0)
return;
2460 Fill(h,
"npu0",simEvt.size());
2463 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2464 Fill(h,
"Tc", ev->Tc, ev==simEvt.begin());
2465 Fill(h,
"Chisq", ev->chisq, ev==simEvt.begin());
2466 if(ev->chisq>0)
Fill(h,
"logChisq",
log(ev->chisq), ev==simEvt.begin());
2467 Fill(h,
"dzmax", ev->dzmax, ev==simEvt.begin());
2468 Fill(h,
"dztrim",ev->dztrim,ev==simEvt.begin());
2469 Fill(h,
"m4m2", ev->m4m2, ev==simEvt.begin());
2470 if(ev->Tc>0){
Fill(h,
"logTc",
log(ev->Tc)/
log(10.),ev==simEvt.begin());}
2473 for(vector<SimEvent>::iterator ev2=ev+1; ev2!=simEvt.end(); ev2++){
2474 vector<TransientTrack> xt;
2475 if((ev->tkprimsel.size()>0)&&(ev2->tkprimsel.size()>0)&&(ev->tkprimsel.size()+ev2->tkprimsel.size())>1){
2476 xt.insert (xt.end() ,ev->tkprimsel.begin(),ev->tkprimsel.end());
2477 xt.insert (xt.end() ,ev2->tkprimsel.begin(),ev2->tkprimsel.end());
2478 double xTc,xChsq,xDzmax,xDztrim,xm4m2;
2479 getTc(xt, xTc, xChsq, xDzmax, xDztrim,xm4m2);
2481 Fill(h,
"xTc",xTc,ev==simEvt.begin());
2482 Fill(h,
"logxTc",
log(xTc)/
log(10),ev==simEvt.begin());
2483 Fill(h,
"xChisq", xChsq,ev==simEvt.begin());
2484 if(xChsq>0){
Fill(h,
"logxChisq",
log(xChsq),ev==simEvt.begin());};
2485 Fill(h,
"xdzmax", xDzmax,ev==simEvt.begin());
2486 Fill(h,
"xdztrim", xDztrim,ev==simEvt.begin());
2487 Fill(h,
"xm4m2", xm4m2,ev==simEvt.begin());
2496 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2497 v!=recVtxs->end(); ++
v){
2498 if ( (
v->isFake()) || (
v->ndof()<0) || (
v->chi2()<=0) )
continue;
2503 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2504 ev->ntInRecVz.clear();
2507 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2508 v!=recVtxs->end(); ++
v){
2510 for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2512 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
2514 if(RTe.
vz()==RTv.
vz()) {n++; wt+=
v->trackWeight(*tv);}
2517 ev->ntInRecVz[
v->z()]=
n;
2518 if (n > ev->nmatch){ ev->nmatch=
n; ev->zmatch=
v->z(); ev->zmatch=
v->z(); }
2525 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2526 v!=recVtxs->end(); ++
v){
2528 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2529 if ((ev->nmatch>0)&&(ev->zmatch==
v->z())){
2533 if(!matched && !
v->isFake()) {
2535 cout <<
" fake rec vertex at z=" <<
v->z() << endl;
2537 Fill(h,
"unmatchedVtxZ",
v->z());
2538 Fill(h,
"unmatchedVtxNdof",
v->ndof());
2542 Fill(h,
"unmatchedVtx",nfake);
2543 Fill(h,
"unmatchedVtxFrac",nfake/nrecvtxs);
2547 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2548 v!=recVtxs->end(); ++
v){
2550 if ( (
v->ndof()<0) || (
v->chi2()<=0) )
continue;
2553 bool matchFound=
false;
2556 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2559 for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2562 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
2564 if(RTe.
vz()==RTv.
vz()){ n++;}
2572 evmatch=ev->eventId;
2581 if (matchFound && (nmatchany>0)){
2585 double purity =nmatch/nmatchany;
2586 Fill(h,
"recmatchPurity",purity);
2587 if(
v==recVtxs->begin()){
2588 Fill(h,
"recmatchPurityTag",purity, (
bool)(evmatch==iSignal));
2590 Fill(h,
"recmatchPuritynoTag",purity,(
bool)(evmatch==iSignal));
2593 Fill(h,
"recmatchvtxs",nmatchvtx);
2594 if(
v==recVtxs->begin()){
2595 Fill(h,
"recmatchvtxsTag",nmatchvtx);
2597 Fill(h,
"recmatchvtxsnoTag",nmatchvtx);
2603 Fill(h,
"nrecv",nrecvtxs);
2610 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2612 if(ev->tk.size()>0) npu1++;
2613 if(ev->tk.size()>1) npu2++;
2615 bool isSignal= ev->eventId==iSignal;
2617 Fill(h,
"nRecTrkInSimVtx",(
double) ev->tk.size(),isSignal);
2618 Fill(h,
"nPrimRecTrkInSimVtx",(
double) ev->tkprim.size(),isSignal);
2619 Fill(h,
"sumpt2rec",
sqrt(ev->sumpt2rec),isSignal);
2620 Fill(h,
"sumpt2",
sqrt(ev->sumpt2),isSignal);
2621 Fill(h,
"sumpt",
sqrt(ev->sumpt),isSignal);
2623 double nRecVWithTrk=0;
2624 double nmatch=0, ntmatch=0, zmatch=-99;
2626 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2627 v!=recVtxs->end(); ++
v){
2628 if ( (
v->ndof()<-1) || (
v->chi2()<=0) )
continue;
2631 for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2633 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
2635 if(RTe.
vz()==RTv.
vz()) {n++; wt+=
v->trackWeight(*tv);}
2639 if(n>0){ nRecVWithTrk++; }
2641 nmatch=
n; ntmatch=
v->tracksSize(); zmatch=
v->position().z();
2648 if(ev->tk.size()>0){
Fill(h,
"trkAssignmentEfficiency", nmatch/ev->tk.size(), isSignal); };
2649 if(ev->tkprim.size()>0){
Fill(h,
"primtrkAssignmentEfficiency", nmatch/ev->tkprim.size(), isSignal); };
2653 double ntsim=ev->tk.size();
2654 double matchpurity=nmatch/ntmatch;
2658 Fill(h,
"matchVtxFraction",nmatch/ntsim,isSignal);
2659 if(nmatch/ntsim>=0.5){
2660 Fill(h,
"matchVtxEfficiency",1.,isSignal);
2661 if(ntsim>1){
Fill(h,
"matchVtxEfficiency2",1.,isSignal);}
2662 if(matchpurity>0.5){
Fill(h,
"matchVtxEfficiency5",1.,isSignal);}
2664 Fill(h,
"matchVtxEfficiency",0.,isSignal);
2665 if(ntsim>1){
Fill(h,
"matchVtxEfficiency2",0.,isSignal);}
2666 Fill(h,
"matchVtxEfficiency5",0.,isSignal);
2668 cout <<
"Signal vertex not matched " << message <<
" event=" <<
eventcounter_ <<
" nmatch=" << nmatch <<
" ntsim=" << ntsim << endl;
2675 Fill(h,
"matchVtxZ",zmatch-ev->z);
2676 Fill(h,
"matchVtxZ",zmatch-ev->z,isSignal);
2677 Fill(h,
"matchVtxZCum",fabs(zmatch-ev->z));
2678 Fill(h,
"matchVtxZCum",fabs(zmatch-ev->z),isSignal);
2680 Fill(h,
"matchVtxZCum",1.0);
2681 Fill(h,
"matchVtxZCum",1.0,isSignal);
2683 if(fabs(zmatch-ev->z)<
zmatch_){
2684 Fill(h,
"matchVtxEfficiencyZ",1.,isSignal);
2686 Fill(h,
"matchVtxEfficiencyZ",0.,isSignal);
2689 if(ntsim>0)
Fill(h,
"matchVtxEfficiencyZ1", fabs(zmatch-ev->z)<
zmatch_ , isSignal);
2690 if(ntsim>1)
Fill(h,
"matchVtxEfficiencyZ2", fabs(zmatch-ev->z)<
zmatch_ , isSignal);
2693 Fill(h,
"vtxMultiplicity",nRecVWithTrk,isSignal);
2697 if(fabs(zmatch-ev->z)<
zmatch_){
2698 Fill(h,
"vtxFindingEfficiencyVsNtrk",(
double) ev->tk.size(),1.);
2700 Fill(h,
"vtxFindingEfficiencyVsNtrkSignal",ev->tk.size(),1.);
2702 Fill(h,
"vtxFindingEfficiencyVsNtrkPU",(
double) ev->tk.size(),1.);
2705 Fill(h,
"vtxFindingEfficiencyVsNtrk",(
double) ev->tk.size(),0.);
2707 Fill(h,
"vtxFindingEfficiencyVsNtrkSignal",(
double) ev->tk.size(),1.);
2709 Fill(h,
"vtxFindingEfficiencyVsNtrkPU",(
double) ev->tk.size(),1.);
2716 Fill(h,
"npu1",npu1);
2717 Fill(h,
"npu2",npu2);
2719 Fill(h,
"nrecvsnpu",npu1,
float(nrecvtxs));
2720 Fill(h,
"nrecvsnpu2",npu2,
float(nrecvtxs));
2727 for(vector<TransientTrack>::iterator te=ev->
tk.begin(); te!=ev->
tk.end(); te++){
2731 if(RTe.
vz()==RTv.
vz()) {n++;}
2735 cout <<
"Number of tracks in reco tagvtx " << v->
tracksSize() << endl;
2736 cout <<
"Number of selected tracks in sim event vtx " << ev->
tk.size() <<
" (prim=" << ev->
tkprim.size() <<
")"<<endl;
2737 cout <<
"Number of tracks in both " << n << endl;
2739 if (ntruthmatched>0){
2740 cout <<
"TrackPurity = "<< n/ntruthmatched <<endl;
2741 Fill(h,
"TagVtxTrkPurity",n/ntruthmatched);
2743 if (ev->
tk.size()>0){
2744 cout <<
"TrackEfficiency = "<< n/ev->
tk.size() <<endl;
2745 Fill(h,
"TagVtxTrkEfficiency",n/ev->
tk.size());
2761 std::vector<simPrimaryVertex> & simpv,
2765 int nrectrks=recTrks->size();
2766 int nrecvtxs=recVtxs->size();
2776 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2777 v!=recVtxs->end(); ++
v){
2778 if ( (fabs(
v->ndof()+3.)<0.0001) && (
v->chi2()<=0) ){
2785 }
else if( (fabs(
v->ndof()+2.)<0.0001) && (
v->chi2()==0) ){
2787 clusters.push_back(*
v);
2788 Fill(h,
"cpuvsntrk",(
double)
v->tracksSize(),fabs(
v->y()));
2789 cpufit+=fabs(
v->y());
2790 Fill(h,
"nclutrkall",(
double)
v->tracksSize());
2791 Fill(h,
"selstat",
v->x());
2796 Fill(h,
"cpuclu",cpuclu);
2797 Fill(h,
"cpufit",cpufit);
2798 Fill(h,
"cpucluvsntrk",nrectrks, cpuclu);
2809 for(std::vector<simPrimaryVertex>::iterator vsim=simpv.begin();
2810 vsim!=simpv.end(); vsim++){
2813 nsimtrk+=vsim->nGenTrk;
2818 for(reco::VertexCollection::const_iterator vrec=recVtxs->begin(); vrec!=recVtxs->end(); ++vrec){
2820 if( vrec->isFake() ) {
2822 cout <<
"fake vertex" << endl;
2825 if( vrec->ndof()<0. )
continue;
2829 if( ((vsim->recVtx) && (fabs(vsim->recVtx->position().z()-vsim->z-dsimrecz)>fabs(vrec->z()-vsim->z-dsimrecz)))
2830 || (!vsim->recVtx) )
2832 vsim->recVtx=&(*vrec);
2835 for(
unsigned int iclu=0; iclu<clusters.size(); iclu++){
2836 if( fabs(clusters[iclu].
position().
z()-vrec->position().z()) < 0.001 ){
2838 vsim->nclutrk=clusters[iclu].position().y();
2844 if ((simpv.size()==1) && ( fabs(vsim->recVtx->position().z()-vsim->z-dsimrecz)>
zmatch_ )){
2847 Fill(h,
"fakeVtxZ",vrec->z());
2848 if (vrec->ndof()>=0.5)
Fill(h,
"fakeVtxZNdofgt05",vrec->z());
2849 if (vrec->ndof()>=2.0)
Fill(h,
"fakeVtxZNdofgt2",vrec->z());
2850 Fill(h,
"fakeVtxNdof",vrec->ndof());
2852 Fill(h,
"fakeVtxNtrk",vrec->tracksSize());
2853 if(vrec->tracksSize()==2){
Fill(h,
"fake2trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2854 if(vrec->tracksSize()==3){
Fill(h,
"fake3trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2855 if(vrec->tracksSize()==4){
Fill(h,
"fake4trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2856 if(vrec->tracksSize()==5){
Fill(h,
"fake5trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2861 Fill(h,
"nsimtrk",
float(nsimtrk));
2862 Fill(h,
"nsimtrk",
float(nsimtrk),vsim==simpv.begin());
2863 Fill(h,
"nrecsimtrk",
float(vsim->nMatchedTracks));
2864 Fill(h,
"nrecnosimtrk",
float(nsimtrk-vsim->nMatchedTracks));
2867 if (vsim->recVtx && ( fabs(vsim->recVtx->z()-vsim->z*
simUnit_)<
zmatch_ )){
2869 if(
verbose_){
std::cout <<
"primary matched " << message <<
" " << setw(8) << setprecision(4) << vsim->x <<
" " << vsim->y <<
" " << vsim->z << std:: endl;}
2870 Fill(h,
"matchedVtxNdof", vsim->recVtx->ndof());
2876 Fill(h,
"pullx", (vsim->recVtx->x()-vsim->x*
simUnit_)/vsim->recVtx->xError() );
2877 Fill(h,
"pully", (vsim->recVtx->y()-vsim->y*
simUnit_)/vsim->recVtx->yError() );
2878 Fill(h,
"pullz", (vsim->recVtx->z()-vsim->z*
simUnit_)/vsim->recVtx->zError() );
2879 Fill(h,
"resxr", vsim->recVtx->x()-vsim->x*
simUnit_-dsimrecx);
2880 Fill(h,
"resyr", vsim->recVtx->y()-vsim->y*
simUnit_-dsimrecy );
2881 Fill(h,
"reszr", vsim->recVtx->z()-vsim->z*
simUnit_-dsimrecz);
2882 Fill(h,
"pullxr", (vsim->recVtx->x()-vsim->x*
simUnit_-dsimrecx)/vsim->recVtx->xError() );
2883 Fill(h,
"pullyr", (vsim->recVtx->y()-vsim->y*
simUnit_-dsimrecy)/vsim->recVtx->yError() );
2884 Fill(h,
"pullzr", (vsim->recVtx->z()-vsim->z*
simUnit_-dsimrecz)/vsim->recVtx->zError() );
2890 if(simpv.size()==1){
2891 if (vsim->recVtx==&(*recVtxs->begin())){
2892 Fill(h,
"efftag", 1.);
2894 Fill(h,
"efftag", 0.);
2901 Fill(h,
"effvsptsq",vsim->ptsq,1.);
2902 Fill(h,
"effvsnsimtrk",vsim->nGenTrk,1.);
2903 Fill(h,
"effvsnrectrk",nrectrks,1.);
2904 Fill(h,
"effvsnseltrk",nseltrks,1.);
2912 bool plapper=
verbose_ && vsim->nGenTrk;
2920 std::cout <<
"nearest recvertex at " << vsim->recVtx->z() <<
" dz=" << vsim->recVtx->z()-vsim->z*
simUnit_ << std::endl;
2923 if (fabs(vsim->recVtx->z()-vsim->z*
simUnit_)<0.2 ){
2927 if (fabs(vsim->recVtx->z()-vsim->z*
simUnit_)<0.5 ){
2932 if(plapper){
std::cout <<
"type 2a no vertex anywhere near" << std::endl;}
2937 if(plapper){
std::cout <<
"type 2b, no vertex at all" << std::endl;}
2943 for(
unsigned int iclu=0; iclu<clusters.size(); iclu++){
2945 selstat=int(clusters[iclu].
position().
x()+0.1);
2946 if(
verbose_){
std::cout <<
"matching cluster found with selstat=" << clusters[iclu].position().x() << std::endl;}
2950 if(plapper){
std::cout <<
"vertex rejected (distance to beam)" << std::endl;}
2952 }
else if(selstat==-1){
2953 if(plapper) {
std::cout <<
"vertex invalid" << std::endl;}
2955 }
else if(selstat==1){
2956 if(plapper){
std::cout <<
"vertex accepted, this cannot be right!!!!!!!!!!" << std::endl;}
2957 }
else if(selstat==-2){
2958 if(plapper){
std::cout <<
"dont know what this means !!!!!!!!!!" << std::endl;}
2959 }
else if(selstat==-3){
2960 if(plapper){
std::cout <<
"no matching cluster found " << std::endl;}
2963 if(plapper){
std::cout <<
"dont know what this means either !!!!!!!!!!" << selstat << std::endl;}
2969 if(simpv.size()==1){
Fill(h,
"efftag", 0.); }
2971 Fill(h,
"effvsptsq",vsim->ptsq,0.);
2972 Fill(h,
"effvsnsimtrk",
float(vsim->nGenTrk),0.);
2973 Fill(h,
"effvsnrectrk",nrectrks,0.);
2974 Fill(h,
"effvsnseltrk",nseltrks,0.);
2986 if (recVtxs->size()>0){
2987 Double_t dz=(*recVtxs->begin()).
z() - (*simpv.begin()).
z*
simUnit_;
2988 Fill(h,
"zdistancetag",dz);
2989 Fill(h,
"abszdistancetag",fabs(dz));
2991 Fill(h,
"puritytag",1.);
2994 Fill(h,
"puritytag",0.);
3014 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
3015 t!=recTrks->end(); ++
t){
3016 if((recVtxs->size()>0) && (recVtxs->begin()->
isValid())){
3027 selTrks.push_back(*
t);
3031 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
3032 v!=recVtxs->end(); ++
v){
3034 if((
v->isFake()) || (
v->ndof()<-2) )
break;
3035 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++ ){
3036 if( ((**tv).vz()==
t->vz()&&((**tv).phi()==
t->phi())) ) {
3044 }
else if(foundinvtx>1){
3045 cout <<
"hmmmm " << foundinvtx << endl;
3053 nseltrks=selTrks.size();
3054 }
else if( ! (nseltrks==(
int)selTrks.size()) ){
3055 std::cout <<
"Warning: inconsistent track selection !" << std::endl;
3061 int nrec=0, nrec0=0, nrec8=0, nrec2=0, nrec4=0;
3062 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
3063 v!=recVtxs->end(); ++
v){
3065 if (! (
v->isFake()) &&
v->ndof()>0 &&
v->chi2()>0 ){
3067 if (
v->ndof()>0) nrec0++;
3068 if (
v->ndof()>8) nrec8++;
3069 if (
v->ndof()>2) nrec2++;
3070 if (
v->ndof()>4) nrec4++;
3072 if(
v==recVtxs->begin()){
3078 Float_t wt=
v->trackWeight(*
t);
3080 Fill(h,
"trackWt",wt);
3093 for(
unsigned int iclu=0; iclu<clusters.size(); iclu++){
3094 if (clusters[iclu].tracksSize()==1){
3095 for(
trackit_t t = clusters[iclu].tracks_begin();
3096 t!=clusters[iclu].tracks_end();
t++){
3106 Fill(h,
"szRecVtx",recVtxs->size());
3107 Fill(h,
"nclu",clusters.size());
3108 Fill(h,
"nseltrk",nseltrks);
3109 Fill(h,
"nrectrk",nrectrks);
3110 Fill(h,
"nrecvtx",nrec);
3111 Fill(h,
"nrecvtx2",nrec2);
3112 Fill(h,
"nrecvtx4",nrec4);
3113 Fill(h,
"nrecvtx8",nrec8);
3116 Fill(h,
"eff0vsntrec",nrectrks,1.);
3117 Fill(h,
"eff0vsntsel",nseltrks,1.);
3119 Fill(h,
"eff0vsntrec",nrectrks,0.);
3120 Fill(h,
"eff0vsntsel",nseltrks,0.);
3122 cout << Form(
"PrimaryVertexAnalyzer4PU: %s may have lost a vertex %10d %10d %4d / %4d ",message.c_str(),
run_,
event_, nrectrks,nseltrks) << endl;
3126 if(nrec0>0) {
Fill(h,
"eff0ndof0vsntsel",nseltrks,1.);}
else{
Fill(h,
"eff0ndof0vsntsel",nseltrks,0.);}
3127 if(nrec2>0) {
Fill(h,
"eff0ndof2vsntsel",nseltrks,1.);}
else{
Fill(h,
"eff0ndof2vsntsel",nseltrks,0.);}
3128 if(nrec4>0) {
Fill(h,
"eff0ndof4vsntsel",nseltrks,1.);}
else{
Fill(h,
"eff0ndof4vsntsel",nseltrks,0.);}
3129 if(nrec8>0) {
Fill(h,
"eff0ndof8vsntsel",nseltrks,1.);}
else{
Fill(h,
"eff0ndof8vsntsel",nseltrks,0.);}
3132 cout <<
"multivertex event" << endl;
3136 if((nrectrks>10)&&(nseltrks<3)){
3137 cout <<
"small fraction of selected tracks " << endl;
3142 if((nrec==0)||(recVtxs->begin()->isFake())){
3143 Fill(h,
"nrectrk0vtx",nrectrks);
3144 Fill(h,
"nseltrk0vtx",nseltrks);
3145 Fill(h,
"nclu0vtx",clusters.size());
3150 double ndof2=-10,ndof1=-10, zndof1=0, zndof2=0;
3151 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
3152 v!=recVtxs->end(); ++
v){
3153 if(
v->isFake()){
Fill(h,
"isFake",1.);}
else{
Fill(h,
"isFake",0.);}
3154 if(
v->isFake()||((
v->ndof()<0)&&(
v->ndof()>-3))){
Fill(h,
"isFake1",1.);}
else{
Fill(h,
"isFake1",0.);}
3156 if((
v->isFake())||(
v->ndof()<0))
continue;
3157 if(
v->ndof()>ndof1){ ndof2=ndof1; zndof2=zndof1; ndof1=
v->ndof(); zndof1=
v->position().z();}
3158 else if(
v->ndof()>ndof2){ ndof2=
v->ndof(); zndof2=
v->position().z();}
3162 if(
v->tracksSize()==2){
3166 double dphi=t1->
phi()-t2->
phi();
if (dphi<0) dphi+=2*
M_PI;
3174 Fill(h,
"2trkmassOS",m12);
3177 Fill(h,
"2trkmassSS",m12);
3179 Fill(h,
"2trkdphi",dphi);
3181 if(fabs(dphi-
M_PI)<0.1)
Fill(h,
"2trksetacurl",t1->
eta()+t2->
eta());
3182 if(fabs(t1->
eta()+t2->
eta())<0.1)
Fill(h,
"2trkdphicurl",dphi);
3184 if(
v!=recVtxs->begin()){
3187 Fill(h,
"2trkmassOSPU",m12);
3190 Fill(h,
"2trkmassSSPU",m12);
3192 Fill(h,
"2trkdphiPU",dphi);
3194 if(fabs(dphi-
M_PI)<0.1)
Fill(h,
"2trksetacurlPU",t1->
eta()+t2->
eta());
3195 if(fabs(t1->
eta()+t2->
eta())<0.1)
Fill(h,
"2trkdphicurlPU",dphi);
3200 Fill(h,
"trkchi2vsndof",
v->ndof(),
v->chi2());
3201 if(
v->ndof()>0){
Fill(h,
"trkchi2overndof",
v->chi2()/
v->ndof()); }
3202 if(
v->tracksSize()==2){
Fill(h,
"2trkchi2vsndof",
v->ndof(),
v->chi2()); }
3203 if(
v->tracksSize()==3){
Fill(h,
"3trkchi2vsndof",
v->ndof(),
v->chi2()); }
3204 if(
v->tracksSize()==4){
Fill(h,
"4trkchi2vsndof",
v->ndof(),
v->chi2()); }
3205 if(
v->tracksSize()==5){
Fill(h,
"5trkchi2vsndof",
v->ndof(),
v->chi2()); }
3207 Fill(h,
"nbtksinvtx",
v->tracksSize());
3208 Fill(h,
"nbtksinvtx2",
v->tracksSize());
3209 Fill(h,
"vtxchi2",
v->chi2());
3210 Fill(h,
"vtxndf",
v->ndof());
3212 Fill(h,
"vtxndfvsntk",
v->tracksSize(),
v->ndof());
3213 Fill(h,
"vtxndfoverntk",
v->ndof()/
v->tracksSize());
3214 Fill(h,
"vtxndf2overntk",(
v->ndof()+2)/
v->tracksSize());
3215 Fill(h,
"zrecvsnt",
v->position().z(),float(nrectrks));
3217 Fill(h,
"zrecNt100",
v->position().z());
3221 Fill(h,
"xrec",
v->position().x());
3222 Fill(h,
"yrec",
v->position().y());
3223 Fill(h,
"zrec",
v->position().z());
3224 Fill(h,
"xrec1",
v->position().x());
3225 Fill(h,
"yrec1",
v->position().y());
3226 Fill(h,
"zrec1",
v->position().z());
3227 Fill(h,
"xrec2",
v->position().x());
3228 Fill(h,
"yrec2",
v->position().y());
3229 Fill(h,
"zrec2",
v->position().z());
3230 Fill(h,
"xrec3",
v->position().x());
3231 Fill(h,
"yrec3",
v->position().y());
3232 Fill(h,
"zrec3",
v->position().z());
3258 Fill(h,
"errx",
v->xError());
3259 Fill(h,
"erry",
v->yError());
3260 Fill(h,
"errz",
v->zError());
3261 double vxx=
v->covariance(0,0);
3262 double vyy=
v->covariance(1,1);
3263 double vxy=
v->covariance(1,0);
3264 double dv=0.25*(vxx+vyy)*(vxx+vyy-(vxx*vyy-vxy*vxy));
3266 double l1=0.5*(vxx+vyy)+
sqrt(dv);
3268 double l2=
sqrt(0.5*(vxx+vyy)-
sqrt(dv));
3274 if (
v==recVtxs->begin()){
3275 Fill(h,
"nbtksinvtxTag",
v->tracksSize());
3276 Fill(h,
"nbtksinvtxTag2",
v->tracksSize());
3277 Fill(h,
"xrectag",
v->position().x());
3278 Fill(h,
"yrectag",
v->position().y());
3279 Fill(h,
"zrectag",
v->position().z());
3281 Fill(h,
"nbtksinvtxPU",
v->tracksSize());
3282 Fill(h,
"nbtksinvtxPU2",
v->tracksSize());
3286 Fill(h,
"xresvsntrk",
v->tracksSize(),
v->xError());
3287 Fill(h,
"yresvsntrk",
v->tracksSize(),
v->yError());
3288 Fill(h,
"zresvsntrk",
v->tracksSize(),
v->zError());
3293 for(
unsigned int iclu=0; iclu<clusters.size(); iclu++){
3294 if( fabs(clusters[iclu].
position().
z()-
v->position().z()) < 0.0001 ){
3295 Fill(h,
"nclutrkvtx",clusters[iclu].tracksSize());
3302 reco::VertexCollection::const_iterator v1=
v; v1++;
3303 for(; v1!=recVtxs->end(); ++v1){
3304 if((v1->isFake())||(v1->ndof()<0))
continue;
3305 Fill(h,
"zdiffrec",
v->position().z()-v1->position().z());
3313 Fill(h,
"zPUcand",z0);
Fill(h,
"zPUcand",z1);
3314 Fill(h,
"ndofPUcand",
v->ndof());
Fill(h,
"ndofPUcand",v1->ndof());
3316 Fill(h,
"zdiffvsz",z1-z0,0.5*(z1+z0));
3318 if ((
v->ndof()>2) && (v1->ndof()>2)){
3319 Fill(h,
"zdiffrec2",
v->position().z()-v1->position().z());
3320 Fill(h,
"zPUcand2",z0);
3321 Fill(h,
"zPUcand2",z1);
3322 Fill(h,
"ndofPUcand2",
v->ndof());
3323 Fill(h,
"ndofPUcand2",v1->ndof());
3324 Fill(h,
"zvszrec2",z0, z1);
3325 Fill(h,
"pzvspz2",TMath::Freq(z0/2.16),TMath::Freq(z1/2.16) );
3328 if ((
v->ndof()>4) && (v1->ndof()>4)){
3329 Fill(h,
"zdiffvsz4",z1-z0,0.5*(z1+z0));
3330 Fill(h,
"zdiffrec4",
v->position().z()-v1->position().z());
3331 Fill(h,
"zvszrec4",z0, z1);
3332 Fill(h,
"pzvspz4",TMath::Freq(z0/2.16),TMath::Freq(z1/2.16) );
3334 if(fabs(z0-z1)>1.0){
3341 Fill(h,
"ndofOverNtkPUcand",
v->ndof()/
v->tracksSize());
3342 Fill(h,
"ndofOverNtkPUcand",v1->ndof()/v1->tracksSize());
3347 Fill(h,
"zPUcand4",z0);
3348 Fill(h,
"zPUcand4",z1);
3349 Fill(h,
"ndofPUcand4",
v->ndof());
3350 Fill(h,
"ndofPUcand4",v1->ndof());
3356 if ((
v->ndof()>4) && (v1->ndof()>2) && (v1->ndof()<4)){
3360 if ((
v->ndof()>8) && (v1->ndof()>8)){
3361 Fill(h,
"zdiffrec8",
v->position().z()-v1->position().z());
3363 cout <<
"PU candidate " <<
run_ <<
" " <<
event_ <<
" " << message <<
" zdiff=" <<z0-z1 << endl;
3372 bool problem =
false;
3378 for (
int i = 0;
i != 3;
i++) {
3379 for (
int j =
i;
j != 3;
j++) {
3384 if (
j ==
i &&
v->covariance(
i,
j) < 0) {
3385 Fill(h,
"nans",index*1., 1.);
3393 t!=
v->tracks_end();
t++) {
3395 if ( (**t).charge() < -1 || (**t).charge() > 1 ) {
3396 Fill(h,
"tklinks",0.);
3399 Fill(h,
"tklinks",1.);
3404 Fill(h,
"tklinks",0.);
3413 t!=
v->tracks_end();
t++) {
3414 std::cout <<
"Track " << itk++ << std::endl;
3416 for (
int i = 0;
i != 5;
i++) {
3417 for (
int j = 0;
j != 5;
j++) {
3418 data[i2] = (**t).covariance(
i,
j);
3419 std::cout << std:: scientific << data[i2] <<
" ";
3425 = gsl_matrix_view_array (data, 5, 5);
3427 gsl_vector *eval = gsl_vector_alloc (5);
3428 gsl_matrix *evec = gsl_matrix_alloc (5, 5);
3430 gsl_eigen_symmv_workspace *
w =
3431 gsl_eigen_symmv_alloc (5);
3433 gsl_eigen_symmv (&m.matrix, eval, evec, w);
3435 gsl_eigen_symmv_free (w);
3437 gsl_eigen_symmv_sort (eval, evec,
3438 GSL_EIGEN_SORT_ABS_ASC);
3443 for (i = 0; i < 5; i++) {
3445 = gsl_vector_get (eval, i);
3449 printf (
"eigenvalue = %g\n", eval_i);
3470 Fill(h,
"ndofnr2",ndof2);
3471 if(fabs(zndof1-zndof2)>1)
Fill(h,
"ndofnr2d1cm",ndof2);
3472 if(fabs(zndof1-zndof2)>2)
Fill(h,
"ndofnr2d2cm",ndof2);
math::XYZPoint myBeamSpot
~PrimaryVertexAnalyzer4PU()
double qoverp() const
q/p
double p() const
momentum vector magnitude
TrackFilterForPVFinding theTrackFilter
T getParameter(std::string const &) const
EventNumber_t event() const
double z0() const
z coordinate
T getUntrackedParameter(std::string const &, T const &) const
double d0Error() const
error on d0
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)
int event() const
get the contents of the subdetector field (should be protected?)
unsigned short lost() const
Number of lost (=invalid) hits on track.
Measurement1D transverseImpactParameter() const
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.
void fillTrackHistos(std::map< std::string, TH1 * > &h, const std::string &ttype, const reco::Track &t, const reco::Vertex *v=NULL)
std::vector< TrackingParticle > TrackingParticleCollection
trackRef_iterator tracks_end() const
last iterator over tracks
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)
reco::TrackBase::ParameterVector ParameterVector
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
double dxyError() const
error on dxy
Sin< T >::type sin(const T &t)
Global3DPoint GlobalPoint
std::vector< Track > TrackCollection
collection of Tracks
Geom::Theta< T > theta() const
int pixelLayersWithMeasurement() const
int bunchCrossing() const
edm::LuminosityBlockNumber_t luminosityBlock() const
static bool match(const ParameterVector &a, const ParameterVector &b)
edm::ESHandle< TransientTrackBuilder > theB_
double phi() const
azimuthal angle of momentum vector
std::vector< Vertex > VertexCollection
collection of Vertex objects
bool getByType(Handle< PROD > &result) const
math::Vector< dimension >::type ParameterVector
parameter vector
double px() const
x coordinate of momentum vector
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void printRecVtxs(const edm::Handle< reco::VertexCollection > recVtxs, std::string title="Reconstructed Vertices")
reco::BeamSpot vertexBeamSpot_
const Point & position() const
position
TrajectoryStateClosestToBeamLine stateAtBeamLine() const
void getData(T &iHolder) const
std::map< std::string, TH1 * > hnoBS
const math::XYZPoint & innerPosition() const
position of the innermost hit
TrackAlgorithm algo() const
void Fill(std::map< std::string, TH1 * > &h, std::string s, double x)
std::map< std::string, TH1 * > hDA
void analyzeVertexCollectionTP(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="")
bool isNonnull() const
Checks for non-null.
bool isFinalstateParticle(const HepMC::GenParticle *p)
bool isCharged(const HepMC::GenParticle *p)
const HitPattern & trackerExpectedHitsOuter() const
Access the hit pattern counting (in the Tracker) the number of expected crossed layers after the last...
double eta() const
pseudorapidity of momentum vector
bool truthMatchedTrack(edm::RefToBase< reco::Track >, TrackingParticleRef &)
float trackWeight(const TrackBaseRef &r) const
returns the weight with which a Track has contributed to the vertex-fit.
int trackerLayersWithMeasurement() const
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
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)
Cos< T >::type cos(const T &t)
std::vector< int > matchedRecTrackIndex
virtual CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &) const
Tan< T >::type tan(const T &t)
double z() const
y coordinate
double lambda() const
Lambda angle.
std::vector< simPrimaryVertex > getSimPVs(const edm::Handle< edm::HepMCProduct > evtMC)
float ChiSquaredProbability(double chiSquared, double nrDOF)
double BeamWidthX() const
beam width X
const HitPattern & trackerExpectedHitsInner() const
Access the hit pattern counting (in the Tracker) the number of expected crossed layers before the fir...
void printSimVtxs(const edm::Handle< edm::SimVertexContainer > simVtxs)
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
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
HepPDT::ParticleData ParticleData
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
FTS const & trackStateAtPCA() const
virtual reco::RecoToSimCollection associateRecoToSim(edm::Handle< edm::View< reco::Track > > &tCH, edm::Handle< TrackingParticleCollection > &tPCH, const edm::Event *event=0, const edm::EventSetup *setup=0) const
compare reco to sim the handle of reco::Track and TrackingParticle collections
double pz() const
z coordinate of momentum vector
std::map< std::string, TH1 * > hBS
std::vector< reco::TransientTrack > tkprim
double dzError() const
error on dz
reco::Vertex::trackRef_iterator trackit_t
std::string getReleaseVersion()
double vz() const
z coordinate of the reference point on track
TrackAssociatorBase * associatorByHits_
GlobalPoint position() const
void matchRecTracksToVertex(simPrimaryVertex &pv, const std::vector< SimPart > &tsim, const edm::Handle< reco::TrackCollection > &recTrks)
double significance() const
bool isResonance(const HepMC::GenParticle *p)
const Track & track() const
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
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
std::vector< TrackingVertex > TrackingVertexCollection
reco::RecoToSimCollection r2s_
int pixelBarrelLayersWithMeasurement() const
T const * product() const
double BeamWidthY() const
beam width Y
int * supf(std::vector< SimPart > &simtrks, const reco::TrackCollection &trks)
T const * product() const
PrimaryVertexAnalyzer4PU(const edm::ParameterSet &)
const EncodedEventId & eventId() const
Pixel cluster – collection of neighboring pixels above threshold.
double vy() const
y coordinate of the reference point on track
void printSimTrks(const edm::Handle< edm::SimTrackContainer > simVtrks)
char data[epos_bytes_allocation]
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
< 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]
unsigned short found() const
Number of valid hits on track.
std::string recoTrackProducer_
std::vector< TrackBaseRef >::const_iterator trackRef_iterator
The iteratator for the vector<TrackRef>
double y0() const
y coordinate
int charge() const
track electric charge
const Point & position() const
position
void printHitPattern(int position, std::ostream &stream) const
trackRef_iterator tracks_begin() const
first iterator over tracks
void dumpHitInfo(const reco::Track &t)
T const * get() const
Returns C++ pointer to the item.
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
virtual void analyze(const edm::Event &, const edm::EventSetup &)
std::vector< edm::RefToBase< reco::Track > > getTruthMatchedVertexTracks(const reco::Vertex &)
value_type const * get() const
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)
size_t tracksSize() const
number of tracks
double py() const
y coordinate of momentum vector
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::string message="")
double vx() const
x coordinate of the reference point on track
math::Error< dimension >::type CovarianceMatrix
5 parameter covariance matrix
const LorentzVector & position() const
double x0() const
x coordinate
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.