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, sumPIX=0,sumMVF=0;
663 for(
int i=101;
i>0;
i--){
664 sumDA+=
hDA[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hDA[
"matchVtxFractionSignal"]->Integral();
665 hDA[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumDA);
666 sumBS+=
hBS[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hBS[
"matchVtxFractionSignal"]->Integral();
667 hBS[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumBS);
668 sumnoBS+=
hnoBS[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hnoBS[
"matchVtxFractionSignal"]->Integral();
669 hnoBS[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumnoBS);
675 sumDA=0,sumBS=0,sumnoBS=0,sumPIX=0,sumMVF=0;
676 for(
int i=1;
i<1001;
i++){
677 sumDA+=
hDA[
"abszdistancetag"]->GetBinContent(
i);
678 hDA[
"abszdistancetagcum"]->SetBinContent(
i,sumDA/
float(
hDA[
"abszdistancetag"]->GetEntries()));
679 sumBS+=
hBS[
"abszdistancetag"]->GetBinContent(
i);
680 hBS[
"abszdistancetagcum"]->SetBinContent(
i,sumBS/
float(
hBS[
"abszdistancetag"]->GetEntries()));
681 sumnoBS+=
hnoBS[
"abszdistancetag"]->GetBinContent(
i);
682 hnoBS[
"abszdistancetagcum"]->SetBinContent(
i,sumnoBS/
float(
hnoBS[
"abszdistancetag"]->GetEntries()));
703 for(
int i=1;
i<501;
i++){
704 if(
hDA[
"vtxndf"]->GetEntries()>0){
705 p=
hDA[
"vtxndf"]->Integral(
i,501)/
hDA[
"vtxndf"]->GetEntries();
hDA[
"vtxndfc"]->SetBinContent(
i,p*
hDA[
"vtxndf"]->GetBinContent(
i));
707 if(
hBS[
"vtxndf"]->GetEntries()>0){
708 p=
hBS[
"vtxndf"]->Integral(
i,501)/
hBS[
"vtxndf"]->GetEntries();
hBS[
"vtxndfc"]->SetBinContent(
i,p*
hBS[
"vtxndf"]->GetBinContent(
i));
710 if(
hnoBS[
"vtxndf"]->GetEntries()>0){
711 p=
hnoBS[
"vtxndf"]->Integral(
i,501)/
hnoBS[
"vtxndf"]->GetEntries();
hnoBS[
"vtxndfc"]->SetBinContent(
i,p*
hnoBS[
"vtxndf"]->GetBinContent(
i));
721 hist->second->Write();
724 std::cout <<
"PrimaryVertexAnalyzer4PU::endJob: done" << std::endl;
736 std::vector<SimPart > tsim;
737 if(simVtcs->begin()==simVtcs->end()){
739 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters no simvtcs" << endl;
744 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters simVtcs n=" << simVtcs->size() << endl;
745 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters 1st position" << setw(8) << setprecision(4) << simVtcs->begin()->position() << endl;
747 double t0=simVtcs->begin()->position().e();
749 for(edm::SimTrackContainer::const_iterator
t=simTrks->begin();
750 t!=simTrks->end(); ++
t){
752 std::cout <<
"simtrk has no vertex" << std::endl;
757 (*simVtcs)[
t->vertIndex()].position().y(),
758 (*simVtcs)[
t->vertIndex()].position().z(),
759 (*simVtcs)[
t->vertIndex()].position().e());
760 int pdgCode=
t->type();
764 std::cout <<
"funny particle skipped , code=" << pdgCode << std::endl;
767 if ((pdgCode==11)||(pdgCode==13)||(pdgCode==15)||(pdgCode==-211)||(pdgCode==-2212)||(pdgCode==-321)||(pdgCode==-3222)){Q=-1;}
768 else if((pdgCode==-11)||(pdgCode==-13)||(pdgCode==-15)||(pdgCode==211)||(pdgCode==2212)||(pdgCode==321)||(pdgCode==3222)){Q=1;}
773 if ( (Q != 0) && (
p.pt()>0.1) && (fabs(
t->momentum().eta())<3.0)
774 && fabs(
v.z()*simUnit<20) && (
sqrt(
v.x()*
v.x()+
v.y()*
v.y())<10.)){
775 double x0=
v.x()*simUnit;
776 double y0=
v.y()*simUnit;
777 double z0=
v.z()*simUnit;
778 double kappa=-Q*0.002998*
fBfield_/
p.pt();
779 double D0=x0*
sin(
p.phi())-y0*
cos(
p.phi())-0.5*kappa*(x0*x0+y0*y0);
780 double q=
sqrt(1.-2.*kappa*D0);
781 double s0=(x0*
cos(
p.phi())+y0*
sin(
p.phi()))/
q;
783 if (fabs(kappa*s0)>0.001){
784 s1=asin(kappa*s0)/kappa;
786 double ks02=(kappa*s0)*(kappa*s0);
787 s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*
pow(ks02,3));
804 double x1=x0-0.033;
double y1=y0-0.;
805 D0=x1*
sin(
p.phi())-y1*
cos(
p.phi())-0.5*kappa*(x1*x1+y1*y1);
806 q=
sqrt(1.-2.*kappa*D0);
808 if (fabs(kappa*s0)>0.001){
809 s1=asin(kappa*s0)/kappa;
811 double ks02=(kappa*s0)*(kappa*s0);
812 s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*
pow(ks02,3));
830 int nsim=simtrks.size();
831 int nrec=trks.size();
832 int *rectosim=
new int[nrec];
833 double** pij=
new double*[nrec];
837 for(reco::TrackCollection::const_iterator
t=trks.begin();
t!=trks.end(); ++
t){
838 pij[
i]=
new double[nsim];
844 for(
int j=0;
j<nsim;
j++){
848 for(
int k=0;
k<5;
k++){
849 for(
int l=0;
l<5;
l++){
853 pij[
i][
j]=
exp(-0.5*c);
886 for(
int k=0;
k<nrec;
k++){
887 int imatch=-1;
int jmatch=-1;
889 for(
int j=0;
j<nsim;
j++){
890 if ((simtrks[
j].rec)<0){
891 double psum=
exp(-0.5*mu);
892 for(
int i=0; i<nrec; i++){
893 if (rectosim[i]<0){ psum+=pij[
i][
j];}
895 for(
int i=0; i<nrec; i++){
896 if ((rectosim[i]<0)&&(pij[i][
j]/psum>pmatch)){
897 pmatch=pij[
i][
j]/psum;
903 if((jmatch>=0)||(imatch>=0)){
907 rectosim[imatch]=jmatch;
908 simtrks[jmatch].rec=imatch;
910 }
else if (
match(simtrks[jmatch].
par, trks.at(imatch).parameters())){
912 rectosim[imatch]=jmatch;
913 simtrks[jmatch].rec=imatch;
931 std::cout <<
"unmatched sim " << std::endl;
932 for(
int j=0;
j<nsim;
j++){
933 if(simtrks[
j].rec<0){
934 double pt= 1./simtrks[
j].par[0]/
tan(simtrks[
j].
par[1]);
936 std::cout << setw(3) <<
j << setw(8) << simtrks[
j].pdg
937 << setw(8) << setprecision(4) <<
" (" << simtrks[
j].xvtx <<
"," << simtrks[
j].yvtx <<
"," << simtrks[
j].zvtx <<
")"
939 <<
" phi=" << simtrks[
j].par[2]
940 <<
" eta= " << -
log(
tan(0.5*(
M_PI/2-simtrks[
j].par[1])))
948 for(
int i=0; i<nrec; i++){
delete pij[
i];}
962 double dqoverp =
a(0)-
b(0);
963 double dlambda =
a(1)-
b(1);
964 double dphi =
a(2)-
b(2);
965 double dsz =
a(4)-
b(4);
966 if (dphi>
M_PI){ dphi-=M_2_PI; }
else if(dphi<-
M_PI){dphi+=M_2_PI;}
968 return ( (fabs(dqoverp)<0.2) && (fabs(dlambda)<0.02) && (fabs(dphi)<0.04) && (fabs(dsz)<1.0) );
978 double ctau=(
pdt_->particle(
abs(p->pdg_id()) ))->lifetime();
980 return ctau >0 && ctau <1
e-6;
984 return ( !p->end_vertex() && p->status()==1 );
991 return part->charge()!=0;
994 return pdt_->particle( -p->pdg_id() )!=0;
1002 Fill(h,
"rapidity_"+ttype,t.
eta());
1003 Fill(h,
"z0_"+ttype,t.
vz());
1006 Fill(h,
"pt_"+ttype,t.
pt());
1015 Fill(h,
"logtresxy_"+ttype,
log(d0Error/0.0001)/
log(10.));
1016 Fill(h,
"tpullxy_"+ttype,d0/d0Error);
1021 Fill(h,
"logtresz_"+ttype,
log(dzError/0.0001)/
log(10.));
1029 if((! (v==
NULL)) && (v->
ndof()>10.)) {
1047 double D0=x1*
sin(t.
phi())-y1*
cos(t.
phi())-0.5*kappa*(x1*x1+y1*y1);
1048 double q=
sqrt(1.-2.*kappa*D0);
1051 if (fabs(kappa*s0)>0.001){
1052 s1=asin(kappa*s0)/kappa;
1054 double ks02=(kappa*s0)*(kappa*s0);
1055 s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*
pow(ks02,3));
1069 Fill(h,
"trackAlgo_"+ttype,t.
algo());
1073 int longesthit=0, nbarrel=0;
1075 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1083 if (clust->sizeY()>longesthit) longesthit=clust->sizeY();
1084 if (clust->sizeY()>20.){
1085 Fill(h,
"lvseta_"+ttype,t.
eta(), 19.9);
1088 Fill(h,
"lvseta_"+ttype,t.
eta(), float(clust->sizeY()));
1089 Fill(h,
"lvstanlambda_"+ttype,
tan(t.
lambda()),
float(clust->sizeY()));
1095 Fill(h,
"nbarrelhits_"+ttype,
float(nbarrel));
1102 int longesthit=0, nbarrel=0;
1103 cout << Form(
"%5.2f %5.2f : ",t.
pt(),t.
eta());
1105 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1113 cout << Form(
"%4d",clust->sizeY());
1114 if (clust->sizeY()>longesthit) longesthit=clust->sizeY();
1124 std::cout << std::endl << title << std::endl;
1125 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
1126 v!=recVtxs->end(); ++
v){
1127 string vtype=
" recvtx ";
1130 }
else if (
v->ndof()==-5){
1132 }
else if(
v->ndof()==-3){
1135 std::cout <<
"vtx "<< std::setw(3) << std::setfill(
' ')<<ivtx++
1137 <<
" #trk " << std::fixed << std::setprecision(4) << std::setw(3) <<
v->tracksSize()
1138 <<
" chi2 " << std::fixed << std::setw(4) << std::setprecision(1) <<
v->chi2()
1139 <<
" ndof " << std::fixed << std::setw(5) << std::setprecision(2) <<
v->ndof()
1140 <<
" x " << std::setw(8) <<std::fixed << std::setprecision(4) <<
v->x()
1141 <<
" dx " << std::setw(8) <<
v->xError()
1142 <<
" y " << std::setw(8) <<
v->y()
1143 <<
" dy " << std::setw(8) <<
v->yError()
1144 <<
" z " << std::setw(8) <<
v->z()
1145 <<
" dz " << std::setw(8) <<
v->zError()
1153 for(SimVertexContainer::const_iterator vsim=simVtxs->begin();
1154 vsim!=simVtxs->end(); ++vsim){
1155 if ( vsim->position().x()*vsim->position().x()+vsim->position().y()*vsim->position().y() < 1.){
1156 std::cout << i++ <<
")" << std::scientific
1157 <<
" evtid=" << vsim->eventId().event() <<
"," << vsim->eventId().bunchCrossing()
1158 <<
" sim x=" << vsim->position().x()*
simUnit_
1159 <<
" sim y=" << vsim->position().y()*
simUnit_
1160 <<
" sim z=" << vsim->position().z()*
simUnit_
1161 <<
" sim t=" << vsim->position().t()
1162 <<
" parent=" << vsim->parentIndex()
1175 std::cout <<
" simTrks type, (momentum), vertIndex, genpartIndex" << std::endl;
1177 for(SimTrackContainer::const_iterator
t=simTrks->begin();
1178 t!=simTrks->end(); ++
t){
1181 <<
t->eventId().event() <<
"," <<
t->eventId().bunchCrossing()
1184 << (*t).genpartIndex();
1197 cout <<
"printRecTrks" << endl;
1199 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
t!=recTrks->end(); ++
t){
1203 cout <<
"Track "<<i <<
" " ; i++;
1220 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;
1223 cout << Form(
" found=%6d lost=%6d chi2/ndof=%10.3f ",
t->found(),
t->lost(),
t->normalizedChi2())<<endl;
1225 cout <<
"subdet layers valid lost" << endl;
1226 cout << Form(
" barrel %2d %2d %2d",p.pixelBarrelLayersWithMeasurement(),p.numberOfValidPixelBarrelHits(), p.numberOfLostPixelBarrelHits()) << endl;
1227 cout << Form(
" fwd %2d %2d %2d",p.pixelEndcapLayersWithMeasurement(),p.numberOfValidPixelEndcapHits(), p.numberOfLostPixelEndcapHits()) << endl;
1228 cout << Form(
" pixel %2d %2d %2d",p.pixelLayersWithMeasurement(), p.numberOfValidPixelHits(), p.numberOfLostPixelHits()) << endl;
1229 cout << Form(
" tracker %2d %2d %2d",p.trackerLayersWithMeasurement(), p.numberOfValidTrackerHits(), p.numberOfLostTrackerHits()) << endl;
1241 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1248 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;
1254 cout << Form(
" endcap cluster size=%2d charge=%6.1f wx=%2d wy=%2d",clust->size(),clust->charge(),clust->sizeX(),clust->sizeY()) << endl;
1259 cout <<
"hitpattern" << endl;
1260 for(
int i=0; i<p.numberOfHits(); i++){ p.printHitPattern(i,
std::cout); }
1261 cout <<
"expected inner " << ninner << endl;
1263 cout <<
"expected outer " << nouter << endl;
1283 std::vector<SimPart>& tsim,
1284 std::vector<SimEvent>& simEvt,
1288 vector<TransientTrack> selTrks;
1289 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1290 t!=recTrks->end(); ++
t){
1292 if( (!selectedOnly) || (selectedOnly &&
theTrackFilter(tt))){ selTrks.push_back(tt); }
1294 if (selTrks.size()==0)
return;
1295 stable_sort(selTrks.begin(), selTrks.end(), recTrackLessZ);
1300 for(
unsigned int i=0;
i<selTrks.size();
i++){ selRecTrks.push_back(selTrks[
i].
track());}
1301 int* rectosim=
supf(tsim, selRecTrks);
1306 cout <<
"printPVTrks" << endl;
1307 cout <<
"---- z +/- dz 1bet-m ip +/-dip pt phi eta";
1308 if((tsim.size()>0)||(simEvt.size()>0)) {
cout <<
" type pdg zvtx zdca dca zvtx zdca dsz";}
1313 for(
unsigned int i=0;
i<selTrks.size();
i++){
1315 cout << setw (3)<< isel;
1325 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
1326 v!=recVtxs->end(); ++
v){
1327 if ( (
v->ndof()<-1) || (
v->chi2()<=0) )
continue;
1328 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
1330 if(selTrks[i].
track().vz()==RTv.
vz()) {vmatch=iv;}
1335 double tz=(selTrks[
i].stateAtBeamLine().trackStateAtPCA()).
position().z();
1336 double tantheta=
tan((selTrks[i].stateAtBeamLine().trackStateAtPCA()).momentum().
theta());
1337 double tdz0= selTrks[
i].track().dzError();
1341 cout <<
"["<<setw(2)<<vmatch<<
"]";
1348 if(status&0x1){
cout <<
"i";}
else{
cout <<
".";};
1349 if(status&0x2){
cout <<
"c";}
else{
cout <<
".";};
1350 if(status&0x4){
cout <<
"h";}
else{
cout <<
".";};
1351 if(status&0x8){
cout <<
"q";}
else{
cout <<
".";};
1354 cout << setw (8) << fixed << setprecision(4)<< tz <<
" +/-" << setw (6)<<
sqrt(tdz2);
1359 if(selTrks[i].
track().hitPattern().hasValidHitInFirstPixelBarrel()){
cout <<
"+";}
else{
cout <<
"-";}
1360 cout << setw(1) << selTrks[
i].track().hitPattern().pixelBarrelLayersWithMeasurement();
1361 cout << setw(1) << selTrks[
i].track().hitPattern().pixelEndcapLayersWithMeasurement();
1362 cout << setw(1) << hex << selTrks[
i].track().hitPattern().trackerLayersWithMeasurement()-selTrks[
i].track().hitPattern().pixelLayersWithMeasurement()<<dec;
1363 cout <<
"-" << setw(1)<<hex <<selTrks[
i].track().trackerExpectedHitsOuter().numberOfHits() << dec;
1366 Measurement1D IP=selTrks[
i].stateAtBeamLine().transverseImpactParameter();
1367 cout << setw (8) << IP.
value() <<
"+/-" << setw (6) << IP.
error();
1368 if(selTrks[i].
track().ptError()<1){
1369 cout <<
" " << setw(8) << setprecision(2) << selTrks[
i].track().pt()*selTrks[
i].track().charge();
1371 cout <<
" " << setw(7) << setprecision(1) << selTrks[
i].track().pt()*selTrks[
i].track().charge() <<
"*";
1374 cout <<
" " << setw(5) << setprecision(2) << selTrks[
i].track().phi()
1375 <<
" " << setw(5) << setprecision(2) << selTrks[
i].track().eta() ;
1380 if(simEvt.size()>0){
1387 double vz=parentVertex->
position().z();
1388 cout <<
" " << tpr->eventId().event();
1389 cout <<
" " << setw(5) << tpr->pdgId();
1390 cout <<
" " << setw(8) << setprecision(4) << vz;
1392 cout <<
" not matched";
1397 if(tsim[rectosim[i]].
type==0){
cout <<
" prim " ;}
else{
cout <<
" sec ";}
1398 cout <<
" " << setw(5) << tsim[rectosim[
i]].pdg;
1399 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].zvtx;
1400 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].zdcap;
1401 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].ddcap;
1402 double zvtxpull=(tz-tsim[rectosim[
i]].zvtx)/
sqrt(tdz2);
1403 cout << setw(6) << setprecision(1) << zvtxpull;
1404 double zdcapull=(tz-tsim[rectosim[
i]].zdcap)/tdz0;
1405 cout << setw(6) << setprecision(1) << zdcapull;
1406 double dszpull=(selTrks[
i].track().dsz()-tsim[rectosim[
i]].par[4])/selTrks[i].
track().dszError();
1407 cout << setw(6) << setprecision(1) << dszpull;
1417 const std::vector<SimPart > & tsim,
1423 std::cout <<
"dump rec tracks: " << std::endl;
1425 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1426 t!=recTrks->end(); ++
t){
1428 std::cout << irec++ <<
") " << p << std::endl;
1431 std::cout <<
"match sim tracks: " << std::endl;
1435 for(std::vector<SimPart>::const_iterator
s=tsim.begin();
1436 s!=tsim.end(); ++
s){
1440 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1441 t!=recTrks->end(); ++
t){
1443 if (
match(
s->par,p)){ imatch=irec; }
1449 std::cout <<
" matched to rec trk" << imatch << std::endl;
1451 std::cout <<
" not matched" << std::endl;
1465 double & Tc,
double & chsq,
double & dzmax,
double & dztrim,
double & m4m2){
1466 if (tracks.size()<2){ Tc=-1; chsq=-1; dzmax=-1; dztrim=-1; m4m2=-1;
return;}
1468 double sumw=0, sumwz=0, sumww=0,sumwwz=0,sumwwzz=0;
1469 double zmin=1e10, zmin1=1e10, zmax1=-1e10, zmax=-1e10;
1470 double m4=0,m3=0,m2=0,m1=0,m0=0;
1471 for(vector<reco::TransientTrack>::const_iterator it=tracks.begin(); it!=tracks.end(); it++){
1472 double tantheta=
tan(((*it).stateAtBeamLine().trackStateAtPCA()).momentum().theta());
1474 double z=((*it).stateAtBeamLine().trackStateAtPCA()).
position().z();
1475 double dz2=
pow((*it).track().dzError(),2)+
pow(beamspot.BeamWidthX()/tantheta,2);
1489 if(z<zmin1){zmin1=
z;}
if(z<zmin){zmin1=zmin; zmin=
z;}
1490 if(z>zmax1){zmax1=
z;}
if(z>zmax){zmax1=zmax; zmax=
z;}
1493 double z=sumwz/sumw;
1494 double a=sumwwzz-2*z*sumwwz+z*z*sumww;
1496 if(tracks.size()>1){
1497 chsq=(m2-m0*z*
z)/(tracks.size()-1);
1499 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));
1524 std::vector<std::pair<TrackingParticleRef, double> > tp =
r2s_[
track];
1525 for (std::vector<std::pair<TrackingParticleRef, double> >::const_iterator it = tp.begin();
1526 it != tp.end(); ++it) {
1555 std::vector< edm::RefToBase<reco::Track> >
b;
1584 const View<Track> tC = *(trackCollectionH.product());
1587 vector<SimEvent> simEvt;
1588 map<EncodedEventId, unsigned int> eventIdToEventMap;
1589 map<EncodedEventId, unsigned int>::iterator
id;
1591 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1593 if( fabs(it->parentVertex().get()->position().z())>100.)
continue;
1595 unsigned int event=0;
1596 id=eventIdToEventMap.find(it->eventId());
1597 if (
id==eventIdToEventMap.end()){
1602 event=simEvt.size();
1605 cout <<
"getSimEvents: ";
1606 cout << it->eventId().bunchCrossing() <<
"," << it->eventId().event()
1607 <<
" z="<< it->vz() <<
" "
1609 <<
" z=" << parentVertex->
position().z() << endl;
1611 if (it->eventId()==parentVertex->
eventId()){
1620 e.
x=0; e.
y=0; e.
z=-88.;
1622 simEvt.push_back(e);
1629 simEvt[
event].tp.push_back(&(*it));
1630 if( (
abs(it->eta())<2.5) && (it->charge()!=0) ){
1631 simEvt[
event].sumpt2+=
pow(it->pt(),2);
1632 simEvt[
event].sumpt+=it->pt();
1637 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1646 if( truthMatchedTrack(track,tpr)){
1648 if( eventIdToEventMap.find(tpr->eventId())==eventIdToEventMap.end() ){
cout <<
"Bug in getSimEvents" << endl;
break; }
1650 z2tp_[track.
get()->
vz()]=tpr;
1652 unsigned int event=eventIdToEventMap[tpr->eventId()];
1653 double ipsig=0,ipdist=0;
1655 double vx=parentVertex->
position().x();
1656 double vy=parentVertex->
position().y();
1657 double vz=parentVertex->
position().z();
1660 double dxy=track->
dxy(vertexBeamSpot_.position());
1666 if (theTrackFilter(t)){
1667 simEvt[
event].tk.push_back(t);
1668 if(ipdist<5){simEvt[
event].tkprim.push_back(t);}
1669 if(ipsig<5){simEvt[
event].tkprimsel.push_back(t);}
1678 cout <<
"SimEvents " << simEvt.size() << endl;
1679 for(
unsigned int i=0;
i<simEvt.size();
i++){
1681 if(simEvt[
i].tkprim.size()>0){
1683 getTc(simEvt[
i].tkprimsel, simEvt[
i].Tc, simEvt[
i].chisq, simEvt[
i].dzmax, simEvt[
i].dztrim, simEvt[
i].m4m2);
1695 cout <<
i <<
" ) nTP=" << simEvt[
i].tp.size()
1696 <<
" z=" << simEvt[
i].z
1697 <<
" recTrks=" << simEvt[
i].tk.size()
1698 <<
" recTrksPrim=" << simEvt[
i].tkprim.size()
1699 <<
" zfit=" << simEvt[
i].zfit
1713 std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> simpv;
1714 const HepMC::GenEvent* evt=evtMC->GetEvent();
1723 for(HepMC::GenEvent::vertex_const_iterator vitr= evt->vertices_begin();
1724 vitr != evt->vertices_end(); ++vitr )
1727 HepMC::FourVector
pos = (*vitr)->position();
1730 if (fabs(pos.z())>1000)
continue;
1732 bool hasMotherVertex=
false;
1734 for ( HepMC::GenVertex::particle_iterator
1738 HepMC::GenVertex * mv=(*mother)->production_vertex();
1739 if (mv) {hasMotherVertex=
true;}
1742 if(hasMotherVertex) {
continue;}
1746 const double mm=0.1;
1749 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1750 v0!=simpv.end(); v0++){
1751 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)){
1759 simpv.push_back(sv);
1767 vp->genVertex.push_back((*vitr)->barcode());
1771 for ( HepMC::GenVertex::particle_iterator
1772 daughter = (*vitr)->particles_begin(HepMC::descendants);
1773 daughter != (*vitr)->particles_end(HepMC::descendants);
1777 if (
find(vp->finalstateParticles.begin(), vp->finalstateParticles.end(),(*daughter)->barcode())
1778 == vp->finalstateParticles.end()){
1779 vp->finalstateParticles.push_back((*daughter)->barcode());
1780 HepMC::FourVector
m=(*daughter)->momentum();
1782 vp->ptot.setPx(vp->ptot.px()+m.px());
1783 vp->ptot.setPy(vp->ptot.py()+m.py());
1784 vp->ptot.setPz(vp->ptot.pz()+m.pz());
1785 vp->ptot.setE(vp->ptot.e()+m.e());
1786 vp->ptsq+=(m.perp())*(m.perp());
1788 if ( (m.perp()>0.2) && (fabs(m.pseudoRapidity())<2.5) &&
isCharged( *daughter ) ){
1792 hsimPV[
"rapidity"]->Fill(m.pseudoRapidity());
1793 if( (m.perp()>0.8) &&
isCharged( *daughter ) ){
1794 hsimPV[
"chRapidity"]->Fill(m.pseudoRapidity());
1796 hsimPV[
"pt"]->Fill(m.perp());
1806 cout <<
"------- PrimaryVertexAnalyzer4PU simPVs -------" << endl;
1807 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1808 v0!=simpv.end(); v0++){
1809 cout <<
"z=" << v0->z
1810 <<
" px=" << v0->ptot.px()
1811 <<
" py=" << v0->ptot.py()
1812 <<
" pz=" << v0->ptot.pz()
1813 <<
" pt2="<< v0->ptsq
1816 cout <<
"-----------------------------------------------" << endl;
1833 std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> simpv;
1836 if(
DEBUG_){
std::cout <<
"getSimPVs TrackingVertexCollection " << std::endl;}
1838 for (TrackingVertexCollection::const_iterator
v = tVC ->
begin();
v != tVC ->
end(); ++
v) {
1841 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;
1849 if ((
unsigned int)
v->eventId().event()<simpv.size())
continue;
1851 if (fabs(
v->position().z())>1000)
continue;
1854 const double mm=1.0;
1862 sv.eventId=(**iTrack).eventId();
1866 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1867 v0!=simpv.end(); v0++){
1868 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)){
1875 if(
DEBUG_){
std::cout <<
"this is a new vertex " << sv.eventId.event() <<
" " << sv.x <<
" " << sv.y <<
" " << sv.z <<std::endl;}
1876 simpv.push_back(sv);
1879 if(
DEBUG_){
std::cout <<
"this is not a new vertex" << sv.x <<
" " << sv.y <<
" " << sv.z <<std::endl;}
1886 std::cout <<
" Daughter momentum: " << (*(*iTP)).momentum();
1893 cout <<
"------- PrimaryVertexAnalyzer4PU simPVs from TrackingVertices -------" << endl;
1894 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1895 v0!=simpv.end(); v0++){
1896 cout <<
"z=" << v0->z <<
" event=" << v0->eventId.event() << endl;
1898 cout <<
"-----------------------------------------------" << endl;
1914 std::vector<simPrimaryVertex> simpv;
1915 std::vector<SimPart> tsim;
1916 std::string mcproduct=
"generator";
1931 <<
"PrimaryVertexAnalyzer4PU::analyze event counter=" <<
eventcounter_
1942 std::cout <<
"Some problem occurred with the particle data table. This may not work !" <<std::endl;
1946 bool bnoBS=iEvent.
getByLabel(
"offlinePrimaryVertices", recVtxs);
1949 bool bBS=iEvent.
getByLabel(
"offlinePrimaryVerticesWithBS", recVtxsBS);
1952 bool bDA=iEvent.
getByLabel(
"offlinePrimaryVerticesDA", recVtxsDA);
1965 int nhighpurity=0, ntot=0;
1966 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
t!=recTrks->end(); ++
t){
1970 if(ntot>10)
hnoBS[
"highpurityTrackFraction"]->Fill(
float(nhighpurity)/
float(ntot));
1972 if(
verbose_){
cout <<
"rejected, " << nhighpurity <<
" highpurity out of " << ntot <<
" total tracks "<< endl<< endl;}
1987 cout <<
" beamspot not found, using dummy " << endl;
1993 if((recVtxs->begin()->
isValid())&&(recVtxs->begin()->ndof()>1)&&(recVtxs->begin()->ndof()>(0.0*recVtxs->begin()->tracksSize()))){
1998 cout << Form(
"XBS %10d %5d %10d %4d %lu %5.2f %8f %8f %8f %8f %8f %8f",
2000 (
unsigned long)(recVtxs->begin()->tracksSize()), recVtxs->begin()->ndof(),
2001 recVtxs->begin()->x(), recVtxs->begin()->xError(),
2002 recVtxs->begin()->y(), recVtxs->begin()->yError(),
2003 recVtxs->begin()->z(), recVtxs->begin()->zError()
2029 bool gotTP=iEvent.
getByLabel(
"mergedtruth",
"MergedTrackTruth",TPCollectionH);
2030 bool gotTV=iEvent.
getByLabel(
"mergedtruth",
"MergedTrackTruth",TVCollectionH);
2037 vector<SimEvent> simEvt;
2038 if (gotTP && gotTV ){
2045 simEvt=
getSimEvents(TPCollectionH, TVCollectionH, trackCollectionH);
2047 if (simEvt.size()==0){
2048 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2049 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2050 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2051 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2052 cout <<
" !!!!!!!!!!!!!!!!!!!!!! got TrackingParticles but no simEvt !!!!!!!!!!!!!!!!!" << endl;
2053 cout <<
" dumping Tracking particles " << endl;
2055 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
2056 cout << *it << endl;
2058 cout <<
" dumping Tracking Vertices " << endl;
2060 for(TrackingVertexCollection::const_iterator iv=tpVtxs->begin(); iv!=tpVtxs->end(); iv++){
2061 cout << *iv << endl;
2064 cout <<
"dumping simTracks" << endl;
2065 for(SimTrackContainer::const_iterator
t=simTrks->begin();
t!=simTrks->end(); ++
t){
2068 cout <<
"dumping simVertexes" << endl;
2069 for(SimVertexContainer::const_iterator vv=simVtxs->begin();
2072 cout << *vv << endl;
2075 cout <<
"no hepMC" << endl;
2077 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2079 const HepMC::GenEvent* evt=evtMC->GetEvent();
2081 std::cout <<
"process id " <<evt->signal_process_id()<<std::endl;
2082 std::cout <<
"signal process vertex "<< ( evt->signal_process_vertex() ?
2083 evt->signal_process_vertex()->barcode() : 0 ) <<std::endl;
2084 std::cout <<
"number of vertices " << evt->vertices_size() << std::endl;
2087 cout <<
"no event in HepMC" << endl;
2089 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2101 cout <<
"Found Tracking Vertices " << endl;
2106 }
else if(iEvent.
getByLabel(mcproduct,evtMC)){
2112 cout <<
"Using HepMCProduct " << endl;
2113 std::cout <<
"simtrks " << simTrks->size() << std::endl;
2126 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2127 v!=recVtxs->end(); ++
v){
2128 if ((
v->ndof()==-3) && (
v->chi2()==0) ){
2136 hsimPV[
"nsimvtx"]->Fill(simpv.size());
2137 for(std::vector<simPrimaryVertex>::iterator vsim=simpv.begin();
2138 vsim!=simpv.end(); vsim++){
2143 hsimPV[
"nbsimtksinvtx"]->Fill(vsim->nGenTrk);
2191 cout << endl <<
"Event dump" << endl
2202 if (bnoBS) {
printRecVtxs(recVtxs,
"Offline without Beamspot");}
2203 if (bnoBS && (!bDA)){
printPVTrks(recTrks, recVtxs, tsim, simEvt,
false);}
2204 if (bBS)
printRecVtxs(recVtxsBS,
"Offline with Beamspot");
2207 printPVTrks(recTrks, recVtxsDA, tsim, simEvt,
false);
2218 bool lt(
const std::pair<double,unsigned int>&
a,
const std::pair<double,unsigned int>&
b ){
2219 return a.first<b.first;
2227 vector<SimEvent> & simEvt,
2230 if (simEvt.size()==0){
return;}
2235 vector< pair<double,unsigned int> > zrecv;
2236 for(
unsigned int idx=0; idx<recVtxs->size(); idx++){
2237 if ( (recVtxs->at(idx).ndof()<0) || (recVtxs->at(idx).chi2()<=0) )
continue;
2238 zrecv.push_back( make_pair(recVtxs->at(idx).z(),idx) );
2240 stable_sort(zrecv.begin(),zrecv.end(),
lt);
2243 vector< pair<double,unsigned int> > zsimv;
2244 for(
unsigned int idx=0; idx<simEvt.size(); idx++){
2245 zsimv.push_back(make_pair(simEvt[idx].
z, idx));
2247 stable_sort(zsimv.begin(), zsimv.end(),
lt);
2252 cout <<
"---------------------------" << endl;
2254 cout <<
"---------------------------" << endl;
2255 cout <<
" z[cm] rec --> ";
2257 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2258 cout << setw(7) << fixed << itrec->first;
2259 if (itrec->second==0){
cout <<
"*" ;}
else{
cout <<
" " ;}
2263 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2264 cout << setw(7) << fixed << recVtxs->at(itrec->second).tracksSize();
2265 if (itrec->second==0){
cout <<
"*" ;}
else{
cout <<
" " ;}
2267 cout <<
" rec tracks" << endl;
2269 map<unsigned int, int> truthMatchedVertexTracks;
2270 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2272 cout << setw(7) << fixed << truthMatchedVertexTracks[itrec->second];
2273 if (itrec->second==0){
cout <<
"*" ;}
else{
cout <<
" " ;}
2275 cout <<
" truth matched " << endl;
2277 cout <<
"sim ------- trk prim ----" << endl;
2281 map<unsigned int, unsigned int> rvmatch;
2282 map<unsigned int, double > nmatch;
2283 map<unsigned int, double > purity;
2284 map<unsigned int, double > wpurity;
2286 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2287 purity[itrec->second]=0.;
2288 wpurity[itrec->second]=0.;
2291 for(vector< pair<double,unsigned int> >::iterator itsim=zsimv.begin(); itsim!=zsimv.end(); itsim++){
2292 SimEvent* ev =&(simEvt[itsim->second]);
2296 if (itsim->second==0){
2297 cout << setw(8) << fixed << ev->
z <<
")*" << setw(5) << ev->
tk.size() << setw(5) << ev->
tkprim.size() <<
" | ";
2299 cout << setw(8) << fixed << ev->
z <<
") " << setw(5) << ev->
tk.size() << setw(5) << ev->
tkprim.size() <<
" | ";
2302 nmatch[itsim->second]=0;
2303 double matchpurity=0,matchwpurity=0;
2305 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2310 for(vector<TransientTrack>::iterator te=ev->
tk.begin(); te!=ev->
tk.end(); te++){
2317 cout << setw(7) << int(n)<<
" ";
2319 if (n > nmatch[itsim->second]){
2320 nmatch[itsim->second]=
n;
2321 rvmatch[itsim->second]=itrec->second;
2322 matchpurity=n/truthMatchedVertexTracks[itrec->second];
2323 matchwpurity=wt/truthMatchedVertexTracks[itrec->second];
2326 if(n > purity[itrec->second]){
2327 purity[itrec->second]=
n;
2330 if(wt > wpurity[itrec->second]){
2331 wpurity[itrec->second]=wt;
2337 if (nmatch[itsim->second]>0 ){
2338 if(matchpurity>0.5){
2343 cout <<
" max eff. = " << setw(8) << nmatch[itsim->second]/ev->
tk.size() <<
" p=" << matchpurity <<
" w=" << matchwpurity << endl;
2345 if(ev->
tk.size()==0){
2346 cout <<
" invisible" << endl;
2347 }
else if (ev->
tk.size()==1){
2348 cout <<
"single track " << endl;
2350 cout <<
"lost " << endl;
2354 cout <<
"---------------------------" << endl;
2358 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2359 cout << setw(7) << fixed << purity[itrec->second]/truthMatchedVertexTracks[itrec->second];
2360 if (itrec->second==0){
cout <<
"*" ;}
else{
cout <<
" " ;}
2371 cout <<
"---------------------------" << endl;
2377 for(vector< pair<double,unsigned int> >::iterator itsim=zsimv.begin(); itsim!=zsimv.end(); itsim++){
2378 SimEvent* ev =&(simEvt[itsim->second]);
2380 for(vector<TransientTrack>::iterator te=ev->
tk.begin(); te!=ev->
tk.end(); te++){
2385 for(vector< pair<double,unsigned int> >::iterator itrec=zrecv.begin(); itrec!=zrecv.end(); itrec++){
2390 if(RTe.
vz()==RTv.
vz()) {ivassign=itrec->second;}
2393 double tantheta=
tan((te->stateAtBeamLine().trackStateAtPCA()).momentum().theta());
2396 double dz2=
pow(RTe.
dzError(),2)+
pow(beamspot.BeamWidthX()/tantheta,2);
2398 if(ivassign==(
int)rvmatch[itsim->second]){
2399 Fill(h,
"correctlyassigned",RTe.
eta(),RTe.
pt());
2400 Fill(h,
"ptcat",RTe.
pt());
2405 Fill(h,
"misassigned",RTe.
eta(),RTe.
pt());
2406 Fill(h,
"ptmis",RTe.
pt());
2410 cout <<
"vertex " << setw(8) << fixed << ev->
z;
2413 cout <<
" track lost ";
2417 cout <<
" track misassigned " << setw(8) << fixed << recVtxs->at(ivassign).z();
2420 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);
2425 double zparent=tpr->parentVertex().
get()->position().z();
2426 if(zparent==ev->
z) {
2431 cout <<
" id=" << tpr->pdgId();
2440 cout <<
"---------------------------" << endl;
2452 vector<SimEvent> & simEvt,
2456 if(simEvt.size()==0)
return;
2462 Fill(h,
"npu0",simEvt.size());
2465 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2466 Fill(h,
"Tc", ev->Tc, ev==simEvt.begin());
2467 Fill(h,
"Chisq", ev->chisq, ev==simEvt.begin());
2468 if(ev->chisq>0)
Fill(h,
"logChisq",
log(ev->chisq), ev==simEvt.begin());
2469 Fill(h,
"dzmax", ev->dzmax, ev==simEvt.begin());
2470 Fill(h,
"dztrim",ev->dztrim,ev==simEvt.begin());
2471 Fill(h,
"m4m2", ev->m4m2, ev==simEvt.begin());
2472 if(ev->Tc>0){
Fill(h,
"logTc",
log(ev->Tc)/
log(10.),ev==simEvt.begin());}
2475 for(vector<SimEvent>::iterator ev2=ev+1; ev2!=simEvt.end(); ev2++){
2476 vector<TransientTrack> xt;
2477 if((ev->tkprimsel.size()>0)&&(ev2->tkprimsel.size()>0)&&(ev->tkprimsel.size()+ev2->tkprimsel.size())>1){
2478 xt.insert (xt.end() ,ev->tkprimsel.begin(),ev->tkprimsel.end());
2479 xt.insert (xt.end() ,ev2->tkprimsel.begin(),ev2->tkprimsel.end());
2480 double xTc,xChsq,xDzmax,xDztrim,xm4m2;
2481 getTc(xt, xTc, xChsq, xDzmax, xDztrim,xm4m2);
2483 Fill(h,
"xTc",xTc,ev==simEvt.begin());
2484 Fill(h,
"logxTc",
log(xTc)/
log(10),ev==simEvt.begin());
2485 Fill(h,
"xChisq", xChsq,ev==simEvt.begin());
2486 if(xChsq>0){
Fill(h,
"logxChisq",
log(xChsq),ev==simEvt.begin());};
2487 Fill(h,
"xdzmax", xDzmax,ev==simEvt.begin());
2488 Fill(h,
"xdztrim", xDztrim,ev==simEvt.begin());
2489 Fill(h,
"xm4m2", xm4m2,ev==simEvt.begin());
2498 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2499 v!=recVtxs->end(); ++
v){
2500 if ( (
v->isFake()) || (
v->ndof()<0) || (
v->chi2()<=0) )
continue;
2505 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2506 ev->ntInRecVz.clear();
2509 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2510 v!=recVtxs->end(); ++
v){
2512 for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2514 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
2516 if(RTe.
vz()==RTv.
vz()) {n++; wt+=
v->trackWeight(*tv);}
2519 ev->ntInRecVz[
v->z()]=
n;
2520 if (n > ev->nmatch){ ev->nmatch=
n; ev->zmatch=
v->z(); ev->zmatch=
v->z(); }
2527 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2528 v!=recVtxs->end(); ++
v){
2529 double zmatch=-99;
bool matched=
false;
2530 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2531 if ((ev->nmatch>0)&&(ev->zmatch==
v->z())){
2532 matched=
true; zmatch=ev->z;
2535 if(!matched && !
v->isFake()) {
2537 cout <<
" fake rec vertex at z=" <<
v->z() << endl;
2539 Fill(h,
"unmatchedVtxZ",
v->z());
2540 Fill(h,
"unmatchedVtxNdof",
v->ndof());
2544 Fill(h,
"unmatchedVtx",nfake);
2545 Fill(h,
"unmatchedVtxFrac",nfake/nrecvtxs);
2549 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2550 v!=recVtxs->end(); ++
v){
2552 if ( (
v->ndof()<0) || (
v->chi2()<=0) )
continue;
2555 bool matchFound=
false;
2558 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2561 for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2564 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
2566 if(RTe.
vz()==RTv.
vz()){ n++;}
2574 evmatch=ev->eventId;
2583 if (matchFound && (nmatchany>0)){
2587 double purity =nmatch/nmatchany;
2588 Fill(h,
"recmatchPurity",purity);
2589 if(
v==recVtxs->begin()){
2590 Fill(h,
"recmatchPurityTag",purity, (
bool)(evmatch==iSignal));
2592 Fill(h,
"recmatchPuritynoTag",purity,(
bool)(evmatch==iSignal));
2595 Fill(h,
"recmatchvtxs",nmatchvtx);
2596 if(
v==recVtxs->begin()){
2597 Fill(h,
"recmatchvtxsTag",nmatchvtx);
2599 Fill(h,
"recmatchvtxsnoTag",nmatchvtx);
2605 Fill(h,
"nrecv",nrecvtxs);
2612 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2614 if(ev->tk.size()>0) npu1++;
2615 if(ev->tk.size()>1) npu2++;
2617 bool isSignal= ev->eventId==iSignal;
2619 Fill(h,
"nRecTrkInSimVtx",(
double) ev->tk.size(),isSignal);
2620 Fill(h,
"nPrimRecTrkInSimVtx",(
double) ev->tkprim.size(),isSignal);
2621 Fill(h,
"sumpt2rec",
sqrt(ev->sumpt2rec),isSignal);
2622 Fill(h,
"sumpt2",
sqrt(ev->sumpt2),isSignal);
2623 Fill(h,
"sumpt",
sqrt(ev->sumpt),isSignal);
2625 double nRecVWithTrk=0;
2626 double nmatch=0, ntmatch=0, zmatch=-99;
2628 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2629 v!=recVtxs->end(); ++
v){
2630 if ( (
v->ndof()<-1) || (
v->chi2()<=0) )
continue;
2633 for(vector<TransientTrack>::iterator te=ev->tk.begin(); te!=ev->tk.end(); te++){
2635 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
2637 if(RTe.
vz()==RTv.
vz()) {n++; wt+=
v->trackWeight(*tv);}
2641 if(n>0){ nRecVWithTrk++; }
2643 nmatch=
n; ntmatch=
v->tracksSize(); zmatch=
v->position().z();
2650 if(ev->tk.size()>0){
Fill(h,
"trkAssignmentEfficiency", nmatch/ev->tk.size(), isSignal); };
2651 if(ev->tkprim.size()>0){
Fill(h,
"primtrkAssignmentEfficiency", nmatch/ev->tkprim.size(), isSignal); };
2655 double ntsim=ev->tk.size();
2656 double matchpurity=nmatch/ntmatch;
2660 Fill(h,
"matchVtxFraction",nmatch/ntsim,isSignal);
2661 if(nmatch/ntsim>=0.5){
2662 Fill(h,
"matchVtxEfficiency",1.,isSignal);
2663 if(ntsim>1){
Fill(h,
"matchVtxEfficiency2",1.,isSignal);}
2664 if(matchpurity>0.5){
Fill(h,
"matchVtxEfficiency5",1.,isSignal);}
2666 Fill(h,
"matchVtxEfficiency",0.,isSignal);
2667 if(ntsim>1){
Fill(h,
"matchVtxEfficiency2",0.,isSignal);}
2668 Fill(h,
"matchVtxEfficiency5",0.,isSignal);
2670 cout <<
"Signal vertex not matched " << message <<
" event=" <<
eventcounter_ <<
" nmatch=" << nmatch <<
" ntsim=" << ntsim << endl;
2677 Fill(h,
"matchVtxZ",zmatch-ev->z);
2678 Fill(h,
"matchVtxZ",zmatch-ev->z,isSignal);
2679 Fill(h,
"matchVtxZCum",fabs(zmatch-ev->z));
2680 Fill(h,
"matchVtxZCum",fabs(zmatch-ev->z),isSignal);
2682 Fill(h,
"matchVtxZCum",1.0);
2683 Fill(h,
"matchVtxZCum",1.0,isSignal);
2685 if(fabs(zmatch-ev->z)<
zmatch_){
2686 Fill(h,
"matchVtxEfficiencyZ",1.,isSignal);
2688 Fill(h,
"matchVtxEfficiencyZ",0.,isSignal);
2691 if(ntsim>0)
Fill(h,
"matchVtxEfficiencyZ1", fabs(zmatch-ev->z)<
zmatch_ , isSignal);
2692 if(ntsim>1)
Fill(h,
"matchVtxEfficiencyZ2", fabs(zmatch-ev->z)<
zmatch_ , isSignal);
2695 Fill(h,
"vtxMultiplicity",nRecVWithTrk,isSignal);
2699 if(fabs(zmatch-ev->z)<
zmatch_){
2700 Fill(h,
"vtxFindingEfficiencyVsNtrk",(
double) ev->tk.size(),1.);
2702 Fill(h,
"vtxFindingEfficiencyVsNtrkSignal",ev->tk.size(),1.);
2704 Fill(h,
"vtxFindingEfficiencyVsNtrkPU",(
double) ev->tk.size(),1.);
2707 Fill(h,
"vtxFindingEfficiencyVsNtrk",(
double) ev->tk.size(),0.);
2709 Fill(h,
"vtxFindingEfficiencyVsNtrkSignal",(
double) ev->tk.size(),1.);
2711 Fill(h,
"vtxFindingEfficiencyVsNtrkPU",(
double) ev->tk.size(),1.);
2718 Fill(h,
"npu1",npu1);
2719 Fill(h,
"npu2",npu2);
2721 Fill(h,
"nrecvsnpu",npu1,
float(nrecvtxs));
2722 Fill(h,
"nrecvsnpu2",npu2,
float(nrecvtxs));
2729 for(vector<TransientTrack>::iterator te=ev->
tk.begin(); te!=ev->
tk.end(); te++){
2733 if(RTe.
vz()==RTv.
vz()) {n++;}
2737 cout <<
"Number of tracks in reco tagvtx " << v->
tracksSize() << endl;
2738 cout <<
"Number of selected tracks in sim event vtx " << ev->
tk.size() <<
" (prim=" << ev->
tkprim.size() <<
")"<<endl;
2739 cout <<
"Number of tracks in both " << n << endl;
2741 if (ntruthmatched>0){
2742 cout <<
"TrackPurity = "<< n/ntruthmatched <<endl;
2743 Fill(h,
"TagVtxTrkPurity",n/ntruthmatched);
2745 if (ev->
tk.size()>0){
2746 cout <<
"TrackEfficiency = "<< n/ev->
tk.size() <<endl;
2747 Fill(h,
"TagVtxTrkEfficiency",n/ev->
tk.size());
2763 std::vector<simPrimaryVertex> & simpv,
2767 int nrectrks=recTrks->size();
2768 int nrecvtxs=recVtxs->size();
2778 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
2779 v!=recVtxs->end(); ++
v){
2780 if ( (fabs(
v->ndof()+3.)<0.0001) && (
v->chi2()<=0) ){
2787 }
else if( (fabs(
v->ndof()+2.)<0.0001) && (
v->chi2()==0) ){
2789 clusters.push_back(*
v);
2790 Fill(h,
"cpuvsntrk",(
double)
v->tracksSize(),fabs(
v->y()));
2791 cpufit+=fabs(
v->y());
2792 Fill(h,
"nclutrkall",(
double)
v->tracksSize());
2793 Fill(h,
"selstat",
v->x());
2798 Fill(h,
"cpuclu",cpuclu);
2799 Fill(h,
"cpufit",cpufit);
2800 Fill(h,
"cpucluvsntrk",nrectrks, cpuclu);
2811 for(std::vector<simPrimaryVertex>::iterator vsim=simpv.begin();
2812 vsim!=simpv.end(); vsim++){
2815 nsimtrk+=vsim->nGenTrk;
2820 for(reco::VertexCollection::const_iterator vrec=recVtxs->begin(); vrec!=recVtxs->end(); ++vrec){
2822 if( vrec->isFake() ) {
2824 cout <<
"fake vertex" << endl;
2827 if( vrec->ndof()<0. )
continue;
2831 if( ((vsim->recVtx) && (fabs(vsim->recVtx->position().z()-vsim->z-dsimrecz)>fabs(vrec->z()-vsim->z-dsimrecz)))
2832 || (!vsim->recVtx) )
2834 vsim->recVtx=&(*vrec);
2837 for(
unsigned int iclu=0; iclu<clusters.size(); iclu++){
2838 if( fabs(clusters[iclu].
position().
z()-vrec->position().z()) < 0.001 ){
2840 vsim->nclutrk=clusters[iclu].position().y();
2846 if ((simpv.size()==1) && ( fabs(vsim->recVtx->position().z()-vsim->z-dsimrecz)>
zmatch_ )){
2849 Fill(h,
"fakeVtxZ",vrec->z());
2850 if (vrec->ndof()>=0.5)
Fill(h,
"fakeVtxZNdofgt05",vrec->z());
2851 if (vrec->ndof()>=2.0)
Fill(h,
"fakeVtxZNdofgt2",vrec->z());
2852 Fill(h,
"fakeVtxNdof",vrec->ndof());
2854 Fill(h,
"fakeVtxNtrk",vrec->tracksSize());
2855 if(vrec->tracksSize()==2){
Fill(h,
"fake2trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2856 if(vrec->tracksSize()==3){
Fill(h,
"fake3trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2857 if(vrec->tracksSize()==4){
Fill(h,
"fake4trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2858 if(vrec->tracksSize()==5){
Fill(h,
"fake5trkchi2vsndof",vrec->ndof(),vrec->chi2()); }
2863 Fill(h,
"nsimtrk",
float(nsimtrk));
2864 Fill(h,
"nsimtrk",
float(nsimtrk),vsim==simpv.begin());
2865 Fill(h,
"nrecsimtrk",
float(vsim->nMatchedTracks));
2866 Fill(h,
"nrecnosimtrk",
float(nsimtrk-vsim->nMatchedTracks));
2869 if (vsim->recVtx && ( fabs(vsim->recVtx->z()-vsim->z*
simUnit_)<
zmatch_ )){
2871 if(
verbose_){
std::cout <<
"primary matched " << message <<
" " << setw(8) << setprecision(4) << vsim->x <<
" " << vsim->y <<
" " << vsim->z << std:: endl;}
2872 Fill(h,
"matchedVtxNdof", vsim->recVtx->ndof());
2878 Fill(h,
"pullx", (vsim->recVtx->x()-vsim->x*
simUnit_)/vsim->recVtx->xError() );
2879 Fill(h,
"pully", (vsim->recVtx->y()-vsim->y*
simUnit_)/vsim->recVtx->yError() );
2880 Fill(h,
"pullz", (vsim->recVtx->z()-vsim->z*
simUnit_)/vsim->recVtx->zError() );
2881 Fill(h,
"resxr", vsim->recVtx->x()-vsim->x*
simUnit_-dsimrecx);
2882 Fill(h,
"resyr", vsim->recVtx->y()-vsim->y*
simUnit_-dsimrecy );
2883 Fill(h,
"reszr", vsim->recVtx->z()-vsim->z*
simUnit_-dsimrecz);
2884 Fill(h,
"pullxr", (vsim->recVtx->x()-vsim->x*
simUnit_-dsimrecx)/vsim->recVtx->xError() );
2885 Fill(h,
"pullyr", (vsim->recVtx->y()-vsim->y*
simUnit_-dsimrecy)/vsim->recVtx->yError() );
2886 Fill(h,
"pullzr", (vsim->recVtx->z()-vsim->z*
simUnit_-dsimrecz)/vsim->recVtx->zError() );
2892 if(simpv.size()==1){
2893 if (vsim->recVtx==&(*recVtxs->begin())){
2894 Fill(h,
"efftag", 1.);
2896 Fill(h,
"efftag", 0.);
2903 Fill(h,
"effvsptsq",vsim->ptsq,1.);
2904 Fill(h,
"effvsnsimtrk",vsim->nGenTrk,1.);
2905 Fill(h,
"effvsnrectrk",nrectrks,1.);
2906 Fill(h,
"effvsnseltrk",nseltrks,1.);
2914 bool plapper=
verbose_ && vsim->nGenTrk;
2922 std::cout <<
"nearest recvertex at " << vsim->recVtx->z() <<
" dz=" << vsim->recVtx->z()-vsim->z*
simUnit_ << std::endl;
2925 if (fabs(vsim->recVtx->z()-vsim->z*
simUnit_)<0.2 ){
2929 if (fabs(vsim->recVtx->z()-vsim->z*
simUnit_)<0.5 ){
2934 if(plapper){
std::cout <<
"type 2a no vertex anywhere near" << std::endl;}
2939 if(plapper){
std::cout <<
"type 2b, no vertex at all" << std::endl;}
2945 for(
unsigned int iclu=0; iclu<clusters.size(); iclu++){
2947 selstat=int(clusters[iclu].
position().
x()+0.1);
2948 if(
verbose_){
std::cout <<
"matching cluster found with selstat=" << clusters[iclu].position().x() << std::endl;}
2952 if(plapper){
std::cout <<
"vertex rejected (distance to beam)" << std::endl;}
2954 }
else if(selstat==-1){
2955 if(plapper) {
std::cout <<
"vertex invalid" << std::endl;}
2957 }
else if(selstat==1){
2958 if(plapper){
std::cout <<
"vertex accepted, this cannot be right!!!!!!!!!!" << std::endl;}
2959 }
else if(selstat==-2){
2960 if(plapper){
std::cout <<
"dont know what this means !!!!!!!!!!" << std::endl;}
2961 }
else if(selstat==-3){
2962 if(plapper){
std::cout <<
"no matching cluster found " << std::endl;}
2965 if(plapper){
std::cout <<
"dont know what this means either !!!!!!!!!!" << selstat << std::endl;}
2971 if(simpv.size()==1){
Fill(h,
"efftag", 0.); }
2973 Fill(h,
"effvsptsq",vsim->ptsq,0.);
2974 Fill(h,
"effvsnsimtrk",
float(vsim->nGenTrk),0.);
2975 Fill(h,
"effvsnrectrk",nrectrks,0.);
2976 Fill(h,
"effvsnseltrk",nseltrks,0.);
2988 if (recVtxs->size()>0){
2989 Double_t dz=(*recVtxs->begin()).
z() - (*simpv.begin()).
z*
simUnit_;
2990 Fill(h,
"zdistancetag",dz);
2991 Fill(h,
"abszdistancetag",fabs(dz));
2993 Fill(h,
"puritytag",1.);
2996 Fill(h,
"puritytag",0.);
3016 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
3017 t!=recTrks->end(); ++
t){
3018 if((recVtxs->size()>0) && (recVtxs->begin()->
isValid())){
3029 selTrks.push_back(*
t);
3033 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
3034 v!=recVtxs->end(); ++
v){
3036 if((
v->isFake()) || (
v->ndof()<-2) )
break;
3037 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++ ){
3038 if( ((**tv).vz()==
t->vz()&&((**tv).phi()==
t->phi())) ) {
3046 }
else if(foundinvtx>1){
3047 cout <<
"hmmmm " << foundinvtx << endl;
3055 nseltrks=selTrks.size();
3056 }
else if( ! (nseltrks==(
int)selTrks.size()) ){
3057 std::cout <<
"Warning: inconsistent track selection !" << std::endl;
3063 int nrec=0, nrec0=0, nrec8=0, nrec2=0, nrec4=0;
3064 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
3065 v!=recVtxs->end(); ++
v){
3067 if (! (
v->isFake()) &&
v->ndof()>0 &&
v->chi2()>0 ){
3069 if (
v->ndof()>0) nrec0++;
3070 if (
v->ndof()>8) nrec8++;
3071 if (
v->ndof()>2) nrec2++;
3072 if (
v->ndof()>4) nrec4++;
3074 if(
v==recVtxs->begin()){
3080 Float_t wt=
v->trackWeight(*
t);
3082 Fill(h,
"trackWt",wt);
3095 for(
unsigned int iclu=0; iclu<clusters.size(); iclu++){
3096 if (clusters[iclu].tracksSize()==1){
3097 for(
trackit_t t = clusters[iclu].tracks_begin();
3098 t!=clusters[iclu].tracks_end();
t++){
3108 Fill(h,
"szRecVtx",recVtxs->size());
3109 Fill(h,
"nclu",clusters.size());
3110 Fill(h,
"nseltrk",nseltrks);
3111 Fill(h,
"nrectrk",nrectrks);
3112 Fill(h,
"nrecvtx",nrec);
3113 Fill(h,
"nrecvtx2",nrec2);
3114 Fill(h,
"nrecvtx4",nrec4);
3115 Fill(h,
"nrecvtx8",nrec8);
3118 Fill(h,
"eff0vsntrec",nrectrks,1.);
3119 Fill(h,
"eff0vsntsel",nseltrks,1.);
3121 Fill(h,
"eff0vsntrec",nrectrks,0.);
3122 Fill(h,
"eff0vsntsel",nseltrks,0.);
3124 cout << Form(
"PrimaryVertexAnalyzer4PU: %s may have lost a vertex %10d %10d %4d / %4d ",message.c_str(),
run_,
event_, nrectrks,nseltrks) << endl;
3128 if(nrec0>0) {
Fill(h,
"eff0ndof0vsntsel",nseltrks,1.);}
else{
Fill(h,
"eff0ndof0vsntsel",nseltrks,0.);}
3129 if(nrec2>0) {
Fill(h,
"eff0ndof2vsntsel",nseltrks,1.);}
else{
Fill(h,
"eff0ndof2vsntsel",nseltrks,0.);}
3130 if(nrec4>0) {
Fill(h,
"eff0ndof4vsntsel",nseltrks,1.);}
else{
Fill(h,
"eff0ndof4vsntsel",nseltrks,0.);}
3131 if(nrec8>0) {
Fill(h,
"eff0ndof8vsntsel",nseltrks,1.);}
else{
Fill(h,
"eff0ndof8vsntsel",nseltrks,0.);}
3134 cout <<
"multivertex event" << endl;
3138 if((nrectrks>10)&&(nseltrks<3)){
3139 cout <<
"small fraction of selected tracks " << endl;
3144 if((nrec==0)||(recVtxs->begin()->isFake())){
3145 Fill(h,
"nrectrk0vtx",nrectrks);
3146 Fill(h,
"nseltrk0vtx",nseltrks);
3147 Fill(h,
"nclu0vtx",clusters.size());
3152 double ndof2=-10,ndof1=-10, zndof1=0, zndof2=0;
3153 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
3154 v!=recVtxs->end(); ++
v){
3155 if(
v->isFake()){
Fill(h,
"isFake",1.);}
else{
Fill(h,
"isFake",0.);}
3156 if(
v->isFake()||((
v->ndof()<0)&&(
v->ndof()>-3))){
Fill(h,
"isFake1",1.);}
else{
Fill(h,
"isFake1",0.);}
3158 if((
v->isFake())||(
v->ndof()<0))
continue;
3159 if(
v->ndof()>ndof1){ ndof2=ndof1; zndof2=zndof1; ndof1=
v->ndof(); zndof1=
v->position().z();}
3160 else if(
v->ndof()>ndof2){ ndof2=
v->ndof(); zndof2=
v->position().z();}
3164 if(
v->tracksSize()==2){
3168 double dphi=t1->
phi()-t2->
phi();
if (dphi<0) dphi+=2*
M_PI;
3176 Fill(h,
"2trkmassOS",m12);
3179 Fill(h,
"2trkmassSS",m12);
3181 Fill(h,
"2trkdphi",dphi);
3183 if(fabs(dphi-
M_PI)<0.1)
Fill(h,
"2trksetacurl",t1->
eta()+t2->
eta());
3184 if(fabs(t1->
eta()+t2->
eta())<0.1)
Fill(h,
"2trkdphicurl",dphi);
3186 if(
v!=recVtxs->begin()){
3189 Fill(h,
"2trkmassOSPU",m12);
3192 Fill(h,
"2trkmassSSPU",m12);
3194 Fill(h,
"2trkdphiPU",dphi);
3196 if(fabs(dphi-
M_PI)<0.1)
Fill(h,
"2trksetacurlPU",t1->
eta()+t2->
eta());
3197 if(fabs(t1->
eta()+t2->
eta())<0.1)
Fill(h,
"2trkdphicurlPU",dphi);
3202 Fill(h,
"trkchi2vsndof",
v->ndof(),
v->chi2());
3203 if(
v->ndof()>0){
Fill(h,
"trkchi2overndof",
v->chi2()/
v->ndof()); }
3204 if(
v->tracksSize()==2){
Fill(h,
"2trkchi2vsndof",
v->ndof(),
v->chi2()); }
3205 if(
v->tracksSize()==3){
Fill(h,
"3trkchi2vsndof",
v->ndof(),
v->chi2()); }
3206 if(
v->tracksSize()==4){
Fill(h,
"4trkchi2vsndof",
v->ndof(),
v->chi2()); }
3207 if(
v->tracksSize()==5){
Fill(h,
"5trkchi2vsndof",
v->ndof(),
v->chi2()); }
3209 Fill(h,
"nbtksinvtx",
v->tracksSize());
3210 Fill(h,
"nbtksinvtx2",
v->tracksSize());
3211 Fill(h,
"vtxchi2",
v->chi2());
3212 Fill(h,
"vtxndf",
v->ndof());
3214 Fill(h,
"vtxndfvsntk",
v->tracksSize(),
v->ndof());
3215 Fill(h,
"vtxndfoverntk",
v->ndof()/
v->tracksSize());
3216 Fill(h,
"vtxndf2overntk",(
v->ndof()+2)/
v->tracksSize());
3217 Fill(h,
"zrecvsnt",
v->position().z(),float(nrectrks));
3219 Fill(h,
"zrecNt100",
v->position().z());
3223 Fill(h,
"xrec",
v->position().x());
3224 Fill(h,
"yrec",
v->position().y());
3225 Fill(h,
"zrec",
v->position().z());
3226 Fill(h,
"xrec1",
v->position().x());
3227 Fill(h,
"yrec1",
v->position().y());
3228 Fill(h,
"zrec1",
v->position().z());
3229 Fill(h,
"xrec2",
v->position().x());
3230 Fill(h,
"yrec2",
v->position().y());
3231 Fill(h,
"zrec2",
v->position().z());
3232 Fill(h,
"xrec3",
v->position().x());
3233 Fill(h,
"yrec3",
v->position().y());
3234 Fill(h,
"zrec3",
v->position().z());
3260 Fill(h,
"errx",
v->xError());
3261 Fill(h,
"erry",
v->yError());
3262 Fill(h,
"errz",
v->zError());
3263 double vxx=
v->covariance(0,0);
3264 double vyy=
v->covariance(1,1);
3265 double vxy=
v->covariance(1,0);
3266 double dv=0.25*(vxx+vyy)*(vxx+vyy-(vxx*vyy-vxy*vxy));
3268 double l1=0.5*(vxx+vyy)+
sqrt(dv);
3270 double l2=
sqrt(0.5*(vxx+vyy)-
sqrt(dv));
3276 if (
v==recVtxs->begin()){
3277 Fill(h,
"nbtksinvtxTag",
v->tracksSize());
3278 Fill(h,
"nbtksinvtxTag2",
v->tracksSize());
3279 Fill(h,
"xrectag",
v->position().x());
3280 Fill(h,
"yrectag",
v->position().y());
3281 Fill(h,
"zrectag",
v->position().z());
3283 Fill(h,
"nbtksinvtxPU",
v->tracksSize());
3284 Fill(h,
"nbtksinvtxPU2",
v->tracksSize());
3288 Fill(h,
"xresvsntrk",
v->tracksSize(),
v->xError());
3289 Fill(h,
"yresvsntrk",
v->tracksSize(),
v->yError());
3290 Fill(h,
"zresvsntrk",
v->tracksSize(),
v->zError());
3295 for(
unsigned int iclu=0; iclu<clusters.size(); iclu++){
3296 if( fabs(clusters[iclu].
position().
z()-
v->position().z()) < 0.0001 ){
3297 Fill(h,
"nclutrkvtx",clusters[iclu].tracksSize());
3304 reco::VertexCollection::const_iterator v1=
v; v1++;
3305 for(; v1!=recVtxs->end(); ++v1){
3306 if((v1->isFake())||(v1->ndof()<0))
continue;
3307 Fill(h,
"zdiffrec",
v->position().z()-v1->position().z());
3315 Fill(h,
"zPUcand",z0);
Fill(h,
"zPUcand",z1);
3316 Fill(h,
"ndofPUcand",
v->ndof());
Fill(h,
"ndofPUcand",v1->ndof());
3318 Fill(h,
"zdiffvsz",z1-z0,0.5*(z1+z0));
3320 if ((
v->ndof()>2) && (v1->ndof()>2)){
3321 Fill(h,
"zdiffrec2",
v->position().z()-v1->position().z());
3322 Fill(h,
"zPUcand2",z0);
3323 Fill(h,
"zPUcand2",z1);
3324 Fill(h,
"ndofPUcand2",
v->ndof());
3325 Fill(h,
"ndofPUcand2",v1->ndof());
3326 Fill(h,
"zvszrec2",z0, z1);
3327 Fill(h,
"pzvspz2",TMath::Freq(z0/2.16),TMath::Freq(z1/2.16) );
3330 if ((
v->ndof()>4) && (v1->ndof()>4)){
3331 Fill(h,
"zdiffvsz4",z1-z0,0.5*(z1+z0));
3332 Fill(h,
"zdiffrec4",
v->position().z()-v1->position().z());
3333 Fill(h,
"zvszrec4",z0, z1);
3334 Fill(h,
"pzvspz4",TMath::Freq(z0/2.16),TMath::Freq(z1/2.16) );
3336 if(fabs(z0-z1)>1.0){
3343 Fill(h,
"ndofOverNtkPUcand",
v->ndof()/
v->tracksSize());
3344 Fill(h,
"ndofOverNtkPUcand",v1->ndof()/v1->tracksSize());
3349 Fill(h,
"zPUcand4",z0);
3350 Fill(h,
"zPUcand4",z1);
3351 Fill(h,
"ndofPUcand4",
v->ndof());
3352 Fill(h,
"ndofPUcand4",v1->ndof());
3358 if ((
v->ndof()>4) && (v1->ndof()>2) && (v1->ndof()<4)){
3362 if ((
v->ndof()>8) && (v1->ndof()>8)){
3363 Fill(h,
"zdiffrec8",
v->position().z()-v1->position().z());
3365 cout <<
"PU candidate " <<
run_ <<
" " <<
event_ <<
" " << message <<
" zdiff=" <<z0-z1 << endl;
3374 bool problem =
false;
3375 Fill(h,
"nans",1.,
isnan(
v->position().x())*1.);
3376 Fill(h,
"nans",2.,
isnan(
v->position().y())*1.);
3377 Fill(h,
"nans",3.,
isnan(
v->position().z())*1.);
3380 for (
int i = 0;
i != 3;
i++) {
3381 for (
int j =
i;
j != 3;
j++) {
3383 Fill(h,
"nans",index*1.,
isnan(
v->covariance(
i,
j))*1.);
3384 if (
isnan(
v->covariance(
i,
j))) problem =
true;
3386 if (
j ==
i &&
v->covariance(
i,
j) < 0) {
3387 Fill(h,
"nans",index*1., 1.);
3395 t!=
v->tracks_end();
t++) {
3397 if ( (**t).charge() < -1 || (**t).charge() > 1 ) {
3398 Fill(h,
"tklinks",0.);
3401 Fill(h,
"tklinks",1.);
3406 Fill(h,
"tklinks",0.);
3415 t!=
v->tracks_end();
t++) {
3416 std::cout <<
"Track " << itk++ << std::endl;
3418 for (
int i = 0;
i != 5;
i++) {
3419 for (
int j = 0;
j != 5;
j++) {
3420 data[i2] = (**t).covariance(
i,
j);
3421 std::cout << std:: scientific << data[i2] <<
" ";
3427 = gsl_matrix_view_array (data, 5, 5);
3429 gsl_vector *eval = gsl_vector_alloc (5);
3430 gsl_matrix *evec = gsl_matrix_alloc (5, 5);
3432 gsl_eigen_symmv_workspace * w =
3433 gsl_eigen_symmv_alloc (5);
3435 gsl_eigen_symmv (&m.matrix, eval, evec, w);
3437 gsl_eigen_symmv_free (w);
3439 gsl_eigen_symmv_sort (eval, evec,
3440 GSL_EIGEN_SORT_ABS_ASC);
3445 for (i = 0; i < 5; i++) {
3447 = gsl_vector_get (eval, i);
3448 gsl_vector_view evec_i
3449 = gsl_matrix_column (evec, i);
3451 printf (
"eigenvalue = %g\n", eval_i);
3472 Fill(h,
"ndofnr2",ndof2);
3473 if(fabs(zndof1-zndof2)>1)
Fill(h,
"ndofnr2d1cm",ndof2);
3474 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)
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
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
Geom::Theta< T > theta() const
bool getByType(Handle< PROD > &result) const
Exp< T >::type exp(const T &t)
math::Vector< dimension >::type ParameterVector
parameter vector
double px() const
x coordinate of momentum vector
int pixelLayersWithMeasurement() const
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")
int trackerLayersWithMeasurement() const
reco::BeamSpot vertexBeamSpot_
const Point & position() const
position
TrajectoryStateClosestToBeamLine stateAtBeamLine() const
static int position[TOTALCHAMBERS][3]
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 bunchCrossing() const
get the detector field from this detid
GlobalPoint position() const
std::map< std::string, TH1 * > bookVertexHistograms()
double pt() const
track transverse momentum
< trclass="colgroup">< tdclass="colgroup"colspan=5 > Muon Digi collections</td >< tr >< td >< ahref="classDTDigi.html"> DTDigi</a ></td >< td >< ahref="DataFormats_DTDigi.html"> MuonDigiCollection & lt
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)
Log< T >::type log(const T &t)
const Track & track() const
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)
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
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
std::vector< TrackingParticle > TrackingParticleCollection
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.
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
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 double par[8 *NPar][4]
const LorentzVector & position() const
double x0() const
x coordinate
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.