26 #include "HepMC/GenEvent.h"
27 #include "HepMC/GenVertex.h"
50 #include <gsl/gsl_math.h>
51 #include <gsl/gsl_eigen.h>
75 theTrackFilter(iConfig.getParameter<edm::
ParameterSet>(
"TkFilterParameters")),
76 beamSpot_(iConfig.getParameter<edm::
InputTag>(
"beamSpot"))
84 rootFile_ = TFile::Open(outputFile_.c_str(),
"RECREATE");
96 cout <<
"PrimaryVertexAnalyzer4PU: zmatch=" << zmatch_ << endl;
122 std::map<std::string, TH1*>
h;
125 h[
"nbtksinvtx"] =
new TH1F(
"nbtksinvtx",
"reconstructed tracks in vertex",40,-0.5,39.5);
126 h[
"nbtksinvtxPU"] =
new TH1F(
"nbtksinvtxPU",
"reconstructed tracks in vertex",40,-0.5,39.5);
127 h[
"nbtksinvtxTag"]=
new TH1F(
"nbtksinvtxTag",
"reconstructed tracks in vertex",40,-0.5,39.5);
128 h[
"resx"] =
new TH1F(
"resx",
"residual x",100,-0.04,0.04);
129 h[
"resy"] =
new TH1F(
"resy",
"residual y",100,-0.04,0.04);
130 h[
"resz"] =
new TH1F(
"resz",
"residual z",100,-0.1,0.1);
131 h[
"resz10"] =
new TH1F(
"resz10",
"residual z",100,-1.0,1.);
132 h[
"pullx"] =
new TH1F(
"pullx",
"pull x",100,-25.,25.);
133 h[
"pully"] =
new TH1F(
"pully",
"pull y",100,-25.,25.);
134 h[
"pullz"] =
new TH1F(
"pullz",
"pull z",100,-25.,25.);
135 h[
"vtxchi2"] =
new TH1F(
"vtxchi2",
"chi squared",100,0.,100.);
136 h[
"vtxndf"] =
new TH1F(
"vtxndf",
"degrees of freedom",500,0.,100.);
137 h[
"vtxndfc"] =
new TH1F(
"vtxndfc",
"expected 2nd highest ndof",500,0.,100.);
139 h[
"vtxndfvsntk"] =
new TH2F(
"vtxndfvsntk",
"ndof vs #tracks",20,0.,100, 20, 0., 200.);
140 h[
"vtxndfoverntk"]=
new TH1F(
"vtxndfoverntk",
"ndof / #tracks",40,0.,2.);
141 h[
"vtxndf2overntk"]=
new TH1F(
"vtxndf2overntk",
"(ndof+2) / #tracks",40,0.,2.);
142 h[
"tklinks"] =
new TH1F(
"tklinks",
"Usable track links",2,-0.5,1.5);
143 h[
"nans"] =
new TH1F(
"nans",
"Illegal values for x,y,z,xx,xy,xz,yy,yz,zz",9,0.5,9.5);
147 add(h,
new TH1F(
"szRecVtx",
"size of recvtx collection",20, -0.5, 19.5));
148 add(h,
new TH1F(
"isFake",
"fake vertex",2, -0.5, 1.5));
149 add(h,
new TH1F(
"isFake1",
"fake vertex or ndof<0",2, -0.5, 1.5));
150 add(h,
new TH1F(
"bunchCrossing",
"bunchCrossing",4000, 0., 4000.));
151 add(h,
new TH2F(
"bunchCrossingLogNtk",
"bunchCrossingLogNtk",4000, 0., 4000.,5,0., 5.));
152 add(h,
new TH1F(
"highpurityTrackFraction",
"fraction of high purity tracks",20, 0., 1.));
153 add(h,
new TH2F(
"trkchi2vsndof",
"vertices chi2 vs ndof",50, 0., 100., 50, 0., 200.));
154 add(h,
new TH1F(
"trkchi2overndof",
"vertices chi2 / ndof",50, 0., 5.));
156 add(h,
new TH2F(
"2trkchi2vsndof",
"two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
157 add(h,
new TH1F(
"2trkmassSS",
"two-track vertices mass (same sign)",100, 0., 2.));
158 add(h,
new TH1F(
"2trkmassOS",
"two-track vertices mass (opposite sign)",100, 0., 2.));
159 add(h,
new TH1F(
"2trkdphi",
"two-track vertices delta-phi",360, 0, 2*
M_PI));
160 add(h,
new TH1F(
"2trkseta",
"two-track vertices sum-eta",50, -2., 2.));
161 add(h,
new TH1F(
"2trkdphicurl",
"two-track vertices delta-phi (sum eta<0.1)",360, 0, 2*
M_PI));
162 add(h,
new TH1F(
"2trksetacurl",
"two-track vertices sum-eta (delta-phi<0.1)",50, -2., 2.));
163 add(h,
new TH1F(
"2trkdetaOS",
"two-track vertices delta-eta (same sign)",50, -0.5, 0.5));
164 add(h,
new TH1F(
"2trkdetaSS",
"two-track vertices delta-eta (opposite sign)",50, -0.5, 0.5));
166 add(h,
new TH1F(
"2trkmassSSPU",
"two-track vertices mass (same sign)",100, 0., 2.));
167 add(h,
new TH1F(
"2trkmassOSPU",
"two-track vertices mass (opposite sign)",100, 0., 2.));
168 add(h,
new TH1F(
"2trkdphiPU",
"two-track vertices delta-phi",360, 0, 2*
M_PI));
169 add(h,
new TH1F(
"2trksetaPU",
"two-track vertices sum-eta",50, -2., 2.));
170 add(h,
new TH1F(
"2trkdphicurlPU",
"two-track vertices delta-phi (sum eta<0.1)",360, 0, 2*
M_PI));
171 add(h,
new TH1F(
"2trksetacurlPU",
"two-track vertices sum-eta (delta-phi<0.1)",50, -2., 2.));
172 add(h,
new TH1F(
"2trkdetaOSPU",
"two-track vertices delta-eta (same sign)",50, -0.5, 0.5));
173 add(h,
new TH1F(
"2trkdetaSSPU",
"two-track vertices delta-eta (opposite sign)",50, -0.5, 0.5));
175 add(h,
new TH2F(
"2trkchi2vsndof",
"two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
176 add(h,
new TH2F(
"3trkchi2vsndof",
"three-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
177 add(h,
new TH2F(
"4trkchi2vsndof",
"four-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
178 add(h,
new TH2F(
"5trkchi2vsndof",
"five-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
180 add(h,
new TH2F(
"fake2trkchi2vsndof",
"fake two-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
181 add(h,
new TH2F(
"fake3trkchi2vsndof",
"fake three-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
182 add(h,
new TH2F(
"fake4trkchi2vsndof",
"fake four-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
183 add(h,
new TH2F(
"fake5trkchi2vsndof",
"fake five-track vertices chi2 vs ndof",40, 0., 10., 20, 0., 20.));
184 h[
"resxr"] =
new TH1F(
"resxr",
"relative residual x",100,-0.04,0.04);
185 h[
"resyr"] =
new TH1F(
"resyr",
"relative residual y",100,-0.04,0.04);
186 h[
"reszr"] =
new TH1F(
"reszr",
"relative residual z",100,-0.1,0.1);
187 h[
"pullxr"] =
new TH1F(
"pullxr",
"relative pull x",100,-25.,25.);
188 h[
"pullyr"] =
new TH1F(
"pullyr",
"relative pull y",100,-25.,25.);
189 h[
"pullzr"] =
new TH1F(
"pullzr",
"relative pull z",100,-25.,25.);
190 h[
"vtxprob"] =
new TH1F(
"vtxprob",
"chisquared probability",100,0.,1.);
191 h[
"eff"] =
new TH1F(
"eff",
"efficiency",2, -0.5, 1.5);
192 h[
"efftag"] =
new TH1F(
"efftag",
"efficiency tagged vertex",2, -0.5, 1.5);
193 h[
"zdistancetag"] =
new TH1F(
"zdistancetag",
"z-distance between tagged and generated",100, -0.1, 0.1);
194 h[
"abszdistancetag"] =
new TH1F(
"abszdistancetag",
"z-distance between tagged and generated",1000, 0., 1.0);
195 h[
"abszdistancetagcum"] =
new TH1F(
"abszdistancetagcum",
"z-distance between tagged and generated",1000, 0., 1.0);
196 h[
"puritytag"] =
new TH1F(
"puritytag",
"purity of primary vertex tags",2, -0.5, 1.5);
197 h[
"effvsptsq"] =
new TProfile(
"effvsptsq",
"efficiency vs ptsq",20, 0., 10000., 0, 1.);
198 h[
"effvsnsimtrk"] =
new TProfile(
"effvsnsimtrk",
"efficiency vs # simtracks",50, 0., 50., 0, 1.);
199 h[
"effvsnrectrk"] =
new TProfile(
"effvsnrectrk",
"efficiency vs # rectracks",50, 0., 50., 0, 1.);
200 h[
"effvsnseltrk"] =
new TProfile(
"effvsnseltrk",
"efficiency vs # selected tracks",50, 0., 50., 0, 1.);
201 h[
"effvsz"] =
new TProfile(
"effvsz",
"efficiency vs z",20, -20., 20., 0, 1.);
202 h[
"effvsz2"] =
new TProfile(
"effvsz2",
"efficiency vs z (2mm)",20, -20., 20., 0, 1.);
203 h[
"effvsr"] =
new TProfile(
"effvsr",
"efficiency vs r",20, 0., 1., 0, 1.);
204 h[
"xresvsntrk"] =
new TProfile(
"xresvsntrk",
"xresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
205 h[
"yresvsntrk"] =
new TProfile(
"yresvsntrk",
"yresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
206 h[
"zresvsntrk"] =
new TProfile(
"zresvsntrk",
"zresolution vs # vertex tracks",40, 0., 200., 0, 0.01);
207 h[
"cpuvsntrk"] =
new TProfile(
"cpuvsntrk",
"cpu time vs # of fitted tracks",40, 0., 200., 0, 200.);
208 h[
"cpucluvsntrk"] =
new TProfile(
"cpucluvsntrk",
"clustering cpu time # of tracks",40, 0., 200., 0, 10.);
209 h[
"cpufit"] =
new TH1F(
"cpufit",
"cpu time for fitting",100, 0., 200.);
210 h[
"cpuclu"] =
new TH1F(
"cpuclu",
"cpu time for clustering",100, 0., 200.);
211 h[
"nbtksinvtx2"] =
new TH1F(
"nbtksinvtx2",
"reconstructed tracks in vertex",40,0.,200.);
212 h[
"nbtksinvtxPU2"] =
new TH1F(
"nbtksinvtxPU2",
"reconstructed tracks in vertex",40,0.,200.);
213 h[
"nbtksinvtxTag2"] =
new TH1F(
"nbtksinvtxTag2",
"reconstructed tracks in vertex",40,0.,200.);
215 h[
"xrec"] =
new TH1F(
"xrec",
"reconstructed x",100,-0.1,0.1);
216 h[
"yrec"] =
new TH1F(
"yrec",
"reconstructed y",100,-0.1,0.1);
217 h[
"zrec"] =
new TH1F(
"zrec",
"reconstructed z",100,-20.,20.);
218 h[
"err1"] =
new TH1F(
"err1",
"error 1",100,0.,0.1);
219 h[
"err2"] =
new TH1F(
"err2",
"error 2",100,0.,0.1);
220 h[
"errx"] =
new TH1F(
"errx",
"error x",100,0.,0.1);
221 h[
"erry"] =
new TH1F(
"erry",
"error y",100,0.,0.1);
222 h[
"errz"] =
new TH1F(
"errz",
"error z",100,0.,2.0);
223 h[
"errz1"] =
new TH1F(
"errz1",
"error z",100,0.,0.2);
225 h[
"zrecNt100"] =
new TH1F(
"zrecNt100",
"reconstructed z for high multiplicity events",80,-40.,40.);
226 add(h,
new TH2F(
"zrecvsnt",
"reconstructed z vs number of tracks",100,-50., 50., 20, 0., 200.));
227 add(h,
new TH2F(
"xyrec",
"reconstructed xy",100, -4., 4., 100, -4., 4.));
228 h[
"xrecBeam"] =
new TH1F(
"xrecBeam",
"reconstructed x - beam x",100,-0.1,0.1);
229 h[
"yrecBeam"] =
new TH1F(
"yrecBeam",
"reconstructed y - beam y",100,-0.1,0.1);
230 h[
"zrecBeam"] =
new TH1F(
"zrecBeam",
"reconstructed z - beam z",100,-20.,20.);
231 h[
"xrecBeamvsz"] =
new TH2F(
"xrecBeamvsz",
"reconstructed x - beam x vs z", 20, -20., 20.,100,-0.1,0.1);
232 h[
"yrecBeamvsz"] =
new TH2F(
"yrecBeamvsz",
"reconstructed y - beam y vs z", 20, -20., 20.,100,-0.1,0.1);
233 h[
"xrecBeamvszprof"] =
new TProfile(
"xrecBeamvszprof",
"reconstructed x - beam x vs z-z0", 20, -20., 20.,-0.1,0.1);
234 h[
"yrecBeamvszprof"] =
new TProfile(
"yrecBeamvszprof",
"reconstructed y - beam y vs z-z0", 20, -20., 20.,-0.1,0.1);
235 add(h,
new TH2F(
"xrecBeamvsdxXBS",
"reconstructed x - beam x vs resolution",10,0., 0.02, 100, -0.1,0.1));
236 add(h,
new TH2F(
"yrecBeamvsdyXBS",
"reconstructed z - beam z vs resolution",10,0., 0.02, 100, -0.1,0.1));
237 add(h,
new TH2F(
"xrecBeamvsdx",
"reconstructed x - beam x vs resolution",10,0., 0.02, 100, -0.1,0.1));
238 add(h,
new TH2F(
"yrecBeamvsdy",
"reconstructed z - beam z vs resolution",10,0., 0.02, 100, -0.1,0.1));
239 add(h,
new TH2F(
"xrecBeamvsdxR2",
"reconstructed x - beam x vs resolution",20,0., 0.04, 100, -0.1,0.1));
240 add(h,
new TH2F(
"yrecBeamvsdyR2",
"reconstructed z - beam z vs resolution",20,0., 0.04, 100, -0.1,0.1));
243 h[
"xrecBeamvsdxprof"] =
new TProfile(
"xrecBeamvsdxprof",
"reconstructed x - beam x vs resolution",10, 0., 0.04,-0.1,0.1 );
244 h[
"yrecBeamvsdyprof"] =
new TProfile(
"yrecBeamvsdyprof",
"reconstructed y - beam y vs resolution",10, 0., 0.04,-0.1,0.1 );
245 add(h,
new TProfile(
"xrecBeam2vsdx2prof",
"reconstructed x - beam x vs resolution",10,0., 0.002, 0., 0.01));
246 add(h,
new TProfile(
"yrecBeam2vsdy2prof",
"reconstructed y - beam y vs resolution",10,0., 0.002, 0., 0.01));
247 add(h,
new TH2F(
"xrecBeamvsdx2",
"reconstructed x - beam x vs resolution",10,0., 0.002, 100, -0.01, 0.01));
248 add(h,
new TH2F(
"yrecBeamvsdy2",
"reconstructed y - beam y vs resolution",10,0., 0.002, 100, -0.01, 0.01));
249 h[
"xrecb"] =
new TH1F(
"xrecb",
"reconstructed x - beam x",100,-0.01,0.01);
250 h[
"yrecb"] =
new TH1F(
"yrecb",
"reconstructed y - beam y",100,-0.01,0.01);
251 h[
"zrecb"] =
new TH1F(
"zrecb",
"reconstructed z - beam z",100,-20.,20.);
252 h[
"xrec1"] =
new TH1F(
"xrec1",
"reconstructed x",100,-4,4);
253 h[
"yrec1"] =
new TH1F(
"yrec1",
"reconstructed y",100,-4,4);
254 h[
"zrec1"] =
new TH1F(
"zrec1",
"reconstructed z",100,-80.,80.);
255 h[
"xrec2"] =
new TH1F(
"xrec2",
"reconstructed x",100,-1,1);
256 h[
"yrec2"] =
new TH1F(
"yrec2",
"reconstructed y",100,-1,1);
257 h[
"zrec2"] =
new TH1F(
"zrec2",
"reconstructed z",100,-40.,40.);
258 h[
"xrec3"] =
new TH1F(
"xrec3",
"reconstructed x",100,-0.1,0.1);
259 h[
"yrec3"] =
new TH1F(
"yrec3",
"reconstructed y",100,-0.1,0.1);
260 h[
"zrec3"] =
new TH1F(
"zrec3",
"reconstructed z",100,-20.,20.);
261 add(h,
new TH1F(
"xrecBeamPull",
"normalized residuals reconstructed x - beam x",100,-20,20));
262 add(h,
new TH1F(
"yrecBeamPull",
"normalized residuals reconstructed y - beam y",100,-20,20));
263 add(h,
new TH1F(
"zdiffrec",
"z-distance between vertices",200,-20., 20.));
264 add(h,
new TH1F(
"zdiffrec2",
"z-distance between ndof>2 vertices",200,-20., 20.));
265 add(h,
new TH1F(
"zdiffrec4",
"z-distance between ndof>4 vertices",200,-20., 20.));
266 add(h,
new TH1F(
"zdiffrec8",
"z-distance between ndof>8 vertices",200,-20., 20.));
267 add(h,
new TH2F(
"zvszrec2",
"z positions of multiple vertices",200,-20., 20., 200,-20., 20.));
268 add(h,
new TH2F(
"pzvspz2",
"prob(z) of multiple vertices",100, 0.,1.,100,0., 1.));
269 add(h,
new TH2F(
"zvszrec4",
"z positions of multiple vertices",100,-20., 20., 100,-20., 20.));
270 add(h,
new TH2F(
"pzvspz4",
"prob(z) of multiple vertices",100, 0.,1.,100,0., 1.));
271 add(h,
new TH2F(
"zdiffvsz",
"z-distance vs z",100,-10.,10.,30,-15.,15.));
272 add(h,
new TH2F(
"zdiffvsz4",
"z-distance vs z (ndof>4)",100,-10.,10.,30,-15.,15.));
273 add(h,
new TProfile(
"eff0vsntrec",
"efficiency vs # reconstructed tracks",50, 0., 50., 0, 1.));
274 add(h,
new TProfile(
"eff0vsntsel",
"efficiency vs # selected tracks",50, 0., 50., 0, 1.));
275 add(h,
new TProfile(
"eff0ndof0vsntsel",
"efficiency (ndof>0) vs # selected tracks",50, 0., 50., 0, 1.));
276 add(h,
new TProfile(
"eff0ndof8vsntsel",
"efficiency (ndof>8) vs # selected tracks",50, 0., 50., 0, 1.));
277 add(h,
new TProfile(
"eff0ndof2vsntsel",
"efficiency (ndof>2) vs # selected tracks",50, 0., 50., 0, 1.));
278 add(h,
new TProfile(
"eff0ndof4vsntsel",
"efficiency (ndof>4) vs # selected tracks",50, 0., 50., 0, 1.));
279 add(h,
new TH1F(
"xbeamPUcand",
"x - beam of PU candidates (ndof>4)",100,-1., 1.));
280 add(h,
new TH1F(
"ybeamPUcand",
"y - beam of PU candidates (ndof>4)",100,-1., 1.));
281 add(h,
new TH1F(
"xbeamPullPUcand",
"x - beam pull of PU candidates (ndof>4)",100,-20., 20.));
282 add(h,
new TH1F(
"ybeamPullPUcand",
"y - beam pull of PU candidates (ndof>4)",100,-20., 20.));
283 add(h,
new TH1F(
"ndofOverNtk",
"ndof / ntk of ndidates (ndof>4)",100,0., 2.));
285 add(h,
new TH1F(
"ndofOverNtkPUcand",
"ndof / ntk of ndidates (ndof>4)",100,0., 2.));
287 add(h,
new TH1F(
"zPUcand",
"z positions of PU candidates (all)",100,-20., 20.));
288 add(h,
new TH1F(
"zPUcand2",
"z positions of PU candidates (ndof>2)",100,-20., 20.));
289 add(h,
new TH1F(
"zPUcand4",
"z positions of PU candidates (ndof>4)",100,-20., 20.));
290 add(h,
new TH1F(
"ndofPUcand",
"ndof of PU candidates (all)",50,0., 100.));
291 add(h,
new TH1F(
"ndofPUcand2",
"ndof of PU candidates (ndof>2)",50,0., 100.));
292 add(h,
new TH1F(
"ndofPUcand4",
"ndof of PU candidates (ndof>4)",50,0., 100.));
293 add(h,
new TH1F(
"ndofnr2",
"second highest ndof",500,0., 100.));
294 add(h,
new TH1F(
"ndofnr2d1cm",
"second highest ndof (dz>1cm)",500,0., 100.));
295 add(h,
new TH1F(
"ndofnr2d2cm",
"second highest ndof (dz>2cm)",500,0., 100.));
297 h[
"nrecvtx"] =
new TH1F(
"nrecvtx",
"# of reconstructed vertices", 50, -0.5, 49.5);
298 h[
"nrecvtx8"] =
new TH1F(
"nrecvtx8",
"# of reconstructed vertices with ndof>8", 50, -0.5, 49.5);
299 h[
"nrecvtx2"] =
new TH1F(
"nrecvtx2",
"# of reconstructed vertices with ndof>2", 50, -0.5, 49.5);
300 h[
"nrecvtx4"] =
new TH1F(
"nrecvtx4",
"# of reconstructed vertices with ndof>4", 50, -0.5, 49.5);
302 h[
"nrectrk"] =
new TH1F(
"nrectrk",
"# of reconstructed tracks", 100, -0.5, 99.5);
303 add(h,
new TH1F(
"nsimtrk",
"# of simulated tracks", 100, -0.5, 99.5));
304 add(h,
new TH1F(
"nsimtrkSignal",
"# of simulated tracks (Signal)", 100, -0.5, 99.5));
305 add(h,
new TH1F(
"nsimtrkPU",
"# of simulated tracks (PU)", 100, -0.5, 99.5));
306 h[
"nsimtrk"]->StatOverflows(kTRUE);
307 h[
"nsimtrkPU"]->StatOverflows(kTRUE);
308 h[
"nsimtrkSignal"]->StatOverflows(kTRUE);
309 h[
"xrectag"] =
new TH1F(
"xrectag",
"reconstructed x, signal vtx",100,-0.05,0.05);
310 h[
"yrectag"] =
new TH1F(
"yrectag",
"reconstructed y, signal vtx",100,-0.05,0.05);
311 h[
"zrectag"] =
new TH1F(
"zrectag",
"reconstructed z, signal vtx",100,-20.,20.);
312 h[
"nrectrk0vtx"] =
new TH1F(
"nrectrk0vtx",
"# rec tracks no vertex ",100,-0.5, 99.5);
313 h[
"nseltrk0vtx"] =
new TH1F(
"nseltrk0vtx",
"# rec tracks no vertex ",100,-0.5, 99.5);
314 h[
"nrecsimtrk"] =
new TH1F(
"nrecsimtrk",
"# rec tracks matched to sim tracks in vertex",100,-0.5, 99.5);
315 h[
"nrecnosimtrk"] =
new TH1F(
"nrecsimtrk",
"# rec tracks not matched to sim tracks in vertex",100,-0.5, 99.5);
316 h[
"trackAssEffvsPt"] =
new TProfile(
"trackAssEffvsPt",
"track association efficiency vs pt",20, 0., 100., 0, 1.);
319 h[
"nseltrk"] =
new TH1F(
"nseltrk",
"# of reconstructed tracks selected for PV", 100, -0.5, 99.5);
320 h[
"nclutrkall"] =
new TH1F(
"nclutrkall",
"# of reconstructed tracks in clusters", 100, -0.5, 99.5);
321 h[
"nclutrkvtx"] =
new TH1F(
"nclutrkvtx",
"# of reconstructed tracks in clusters of reconstructed vertices", 100, -0.5, 99.5);
322 h[
"nclu"] =
new TH1F(
"nclu",
"# of clusters", 100, -0.5, 99.5);
323 h[
"nclu0vtx"] =
new TH1F(
"nclu0vtx",
"# of clusters in events with no PV", 100, -0.5, 99.5);
324 h[
"zlost1"] =
new TH1F(
"zlost1",
"z of lost vertices (bad z)", 100, -20., 20.);
325 h[
"zlost2"] =
new TH1F(
"zlost2",
"z of lost vertices (no matching cluster)", 100, -20., 20.);
326 h[
"zlost3"] =
new TH1F(
"zlost3",
"z of lost vertices (vertex too far from beam)", 100, -20., 20.);
327 h[
"zlost4"] =
new TH1F(
"zlost4",
"z of lost vertices (invalid vertex)", 100, -20., 20.);
328 h[
"selstat"] =
new TH1F(
"selstat",
"selstat", 5, -2.5, 2.5);
332 add(h,
new TH1F(
"fakeVtxZNdofgt05",
"z of fake vertices with ndof>0.5", 100, -20., 20.));
333 add(h,
new TH1F(
"fakeVtxZNdofgt2",
"z of fake vertices with ndof>2", 100, -20., 20.));
334 add(h,
new TH1F(
"fakeVtxZ",
"z of fake vertices", 100, -20., 20.));
335 add(h,
new TH1F(
"fakeVtxNdof",
"ndof of fake vertices", 500,0., 100.));
336 add(h,
new TH1F(
"fakeVtxNtrk",
"number of tracks in fake vertex",20,-0.5, 19.5));
337 add(h,
new TH1F(
"matchedVtxNdof",
"ndof of matched vertices", 500,0., 100.));
341 string types[] = {
"all",
"sel",
"bachelor",
"sellost",
"wgt05",
"wlt05",
"M",
"tagged",
"untagged",
"ndof4",
"PUcand",
"PUfake"};
342 for(
int t=0;
t<12;
t++){
343 add(h,
new TH1F((
"rapidity_"+types[
t]).c_str(),
"rapidity ",100,-3., 3.));
344 h[
"z0_"+types[
t]] =
new TH1F((
"z0_"+types[t]).c_str(),
"z0 ",80,-40., 40.);
345 h[
"phi_"+types[
t]] =
new TH1F((
"phi_"+types[t]).c_str(),
"phi ",80,-3.14159, 3.14159);
346 h[
"eta_"+types[
t]] =
new TH1F((
"eta_"+types[t]).c_str(),
"eta ",80,-4., 4.);
347 h[
"pt_"+types[
t]] =
new TH1F((
"pt_"+types[t]).c_str(),
"pt ",100,0., 20.);
348 h[
"found_"+types[
t]] =
new TH1F((
"found_"+types[t]).c_str(),
"found hits",20, 0., 20.);
349 h[
"lost_"+types[
t]] =
new TH1F((
"lost_"+types[t]).c_str(),
"lost hits",20, 0., 20.);
350 h[
"nchi2_"+types[
t]] =
new TH1F((
"nchi2_"+types[t]).c_str(),
"normalized track chi2",100, 0., 20.);
351 h[
"rstart_"+types[
t]] =
new TH1F((
"rstart_"+types[t]).c_str(),
"start radius",100, 0., 20.);
352 h[
"tfom_"+types[
t]] =
new TH1F((
"tfom_"+types[t]).c_str(),
"track figure of merit",100, 0., 100.);
353 h[
"expectedInner_"+types[
t]] =
new TH1F((
"expectedInner_"+types[t]).c_str(),
"expected inner hits ",10, 0., 10.);
354 h[
"expectedOuter_"+types[
t]] =
new TH1F((
"expectedOuter_"+types[t]).c_str(),
"expected outer hits ",10, 0., 10.);
355 h[
"logtresxy_"+types[
t]] =
new TH1F((
"logtresxy_"+types[t]).c_str(),
"log10(track r-phi resolution/um)",100, 0., 5.);
356 h[
"logtresz_"+types[
t]] =
new TH1F((
"logtresz_"+types[t]).c_str(),
"log10(track z resolution/um)",100, 0., 5.);
357 h[
"tpullxy_"+types[
t]] =
new TH1F((
"tpullxy_"+types[t]).c_str(),
"track r-phi pull",100, -10., 10.);
358 add(h,
new TH2F( (
"lvseta_"+types[t]).c_str(),
"cluster length vs eta",60,-3., 3., 20, 0., 20));
359 add(h,
new TH2F( (
"lvstanlambda_"+types[t]).c_str(),
"cluster length vs tan lambda",60,-6., 6., 20, 0., 20));
360 add(h,
new TH1F( (
"restrkz_"+types[t]).c_str(),
"z-residuals (track vs vertex)", 200, -5., 5.));
361 add(h,
new TH2F( (
"restrkzvsphi_"+types[t]).c_str(),
"z-residuals (track - vertex)", 12,-3.14159,3.14159,100, -5., 5.));
362 add(h,
new TH2F( (
"restrkzvseta_"+types[t]).c_str(),
"z-residuals (track - vertex)", 12,-3.,3.,200, -5., 5.));
363 add(h,
new TH2F( (
"pulltrkzvsphi_"+types[t]).c_str(),
"normalized z-residuals (track - vertex)", 12,-3.14159,3.14159,100, -5., 5.));
364 add(h,
new TH2F( (
"pulltrkzvseta_"+types[t]).c_str(),
"normalized z-residuals (track - vertex)", 12,-3.,3.,100, -5., 5.));
365 add(h,
new TH1F( (
"pulltrkz_"+types[t]).c_str(),
"normalized z-residuals (track vs vertex)", 100, -5., 5.));
366 add(h,
new TH1F( (
"sigmatrkz0_"+types[t]).c_str(),
"z-resolution (excluding beam)", 100, 0., 5.));
367 add(h,
new TH1F( (
"sigmatrkz_"+types[t]).c_str(),
"z-resolution (including beam)", 100,0., 5.));
368 add(h,
new TH1F( (
"nbarrelhits_"+types[t]).c_str(),
"number of pixel barrel hits", 10, 0., 10.));
369 add(h,
new TH1F( (
"nbarrelLayers_"+types[t]).c_str(),
"number of pixel barrel layers", 10, 0., 10.));
370 add(h,
new TH1F( (
"nPxLayers_"+types[t]).c_str(),
"number of pixel layers (barrel+endcap)", 10, 0., 10.));
371 add(h,
new TH1F( (
"nSiLayers_"+types[t]).c_str(),
"number of Tracker layers ", 20, 0., 20.));
372 add(h,
new TH1F( (
"trackAlgo_"+types[t]).c_str(),
"track algorithm ", 30, 0., 30.));
373 add(h,
new TH1F( (
"trackQuality_"+types[t]).c_str(),
"track quality ", 7, -1., 6.));
375 add(h,
new TH1F(
"trackWt",
"track weight in vertex",100,0., 1.));
378 h[
"nrectrk"]->StatOverflows(kTRUE);
379 h[
"nrectrk"]->StatOverflows(kTRUE);
380 h[
"nrectrk0vtx"]->StatOverflows(kTRUE);
381 h[
"nseltrk0vtx"]->StatOverflows(kTRUE);
382 h[
"nrecsimtrk"]->StatOverflows(kTRUE);
383 h[
"nrecnosimtrk"]->StatOverflows(kTRUE);
384 h[
"nseltrk"]->StatOverflows(kTRUE);
385 h[
"nbtksinvtx"]->StatOverflows(kTRUE);
386 h[
"nbtksinvtxPU"]->StatOverflows(kTRUE);
387 h[
"nbtksinvtxTag"]->StatOverflows(kTRUE);
388 h[
"nbtksinvtx2"]->StatOverflows(kTRUE);
389 h[
"nbtksinvtxPU2"]->StatOverflows(kTRUE);
390 h[
"nbtksinvtxTag2"]->StatOverflows(kTRUE);
393 h[
"npu0"] =
new TH1F(
"npu0",
"Number of simulated vertices",40,0.,40.);
394 h[
"npu1"] =
new TH1F(
"npu1",
"Number of simulated vertices with >0 track",40,0.,40.);
395 h[
"npu2"] =
new TH1F(
"npu2",
"Number of simulated vertices with >1 track",40,0.,40.);
396 h[
"nrecv"] =
new TH1F(
"nrecv",
"# of reconstructed vertices", 40, 0, 40);
397 add(h,
new TH2F(
"nrecvsnpu",
"#rec vertices vs number of sim vertices with >0 tracks", 40, 0., 40, 40, 0, 40));
398 add(h,
new TH2F(
"nrecvsnpu2",
"#rec vertices vs number of sim vertices with >1 tracks", 40, 0., 40, 40, 0, 40));
399 add(h,
new TH1F(
"sumpt",
"sumpt of simulated tracks",100,0.,100.));
400 add(h,
new TH1F(
"sumptSignal",
"sumpt of simulated tracks in Signal events",100,0.,200.));
401 add(h,
new TH1F(
"sumptPU",
"sumpt of simulated tracks in PU events",100,0.,200.));
402 add(h,
new TH1F(
"sumpt2rec",
"sumpt2 of reconstructed and matched tracks",100,0.,100.));
403 add(h,
new TH1F(
"sumpt2",
"sumpt2 of simulated tracks",100,0.,100.));
404 add(h,
new TH1F(
"sumpt2Signal",
"sumpt2 of simulated tracks in Signal events",100,0.,200.));
405 add(h,
new TH1F(
"sumpt2PU",
"sumpt2 of simulated tracks in PU events",100,0.,200.));
406 add(h,
new TH1F(
"sumpt2rec",
"sumpt2 of reconstructed and matched tracks",100,0.,100.));
407 add(h,
new TH1F(
"sumpt2recSignal",
"sumpt2 of reconstructed and matched tracks in Signal events",100,0.,200.));
408 add(h,
new TH1F(
"sumpt2recPU",
"sumpt2 of reconstructed and matched tracks in PU events",100,0.,200.));
409 add(h,
new TH1F(
"nRecTrkInSimVtx",
"number of reco tracks matched to sim-vertex", 101, 0., 100));
410 add(h,
new TH1F(
"nRecTrkInSimVtxSignal",
"number of reco tracks matched to signal sim-vertex", 101, 0., 100));
411 add(h,
new TH1F(
"nRecTrkInSimVtxPU",
"number of reco tracks matched to PU-vertex", 101, 0., 100));
412 add(h,
new TH1F(
"nPrimRecTrkInSimVtx",
"number of reco primary tracks matched to sim-vertex", 101, 0., 100));
413 add(h,
new TH1F(
"nPrimRecTrkInSimVtxSignal",
"number of reco primary tracks matched to signal sim-vertex", 101, 0., 100));
414 add(h,
new TH1F(
"nPrimRecTrkInSimVtxPU",
"number of reco primary tracks matched to PU-vertex", 101, 0., 100));
416 add(h,
new TH1F(
"recPurity",
"track purity of reconstructed vertices", 101, 0., 1.01));
417 add(h,
new TH1F(
"recPuritySignal",
"track purity of reconstructed Signal vertices", 101, 0., 1.01));
418 add(h,
new TH1F(
"recPurityPU",
"track purity of reconstructed PU vertices", 101, 0., 1.01));
420 add(h,
new TH1F(
"recmatchPurity",
"track purity of all vertices", 101, 0., 1.01));
421 add(h,
new TH1F(
"recmatchPurityTag",
"track purity of tagged vertices", 101, 0., 1.01));
422 add(h,
new TH1F(
"recmatchPurityTagSignal",
"track purity of tagged Signal vertices", 101, 0., 1.01));
423 add(h,
new TH1F(
"recmatchPurityTagPU",
"track purity of tagged PU vertices", 101, 0., 1.01));
424 add(h,
new TH1F(
"recmatchPuritynoTag",
"track purity of untagged vertices", 101, 0., 1.01));
425 add(h,
new TH1F(
"recmatchPuritynoTagSignal",
"track purity of untagged Signal vertices", 101, 0., 1.01));
426 add(h,
new TH1F(
"recmatchPuritynoTagPU",
"track purity of untagged PU vertices", 101, 0., 1.01));
427 add(h,
new TH1F(
"recmatchvtxs",
"number of sim vertices contributing to recvtx", 10, 0., 10.));
428 add(h,
new TH1F(
"recmatchvtxsTag",
"number of sim vertices contributing to recvtx", 10, 0., 10.));
429 add(h,
new TH1F(
"recmatchvtxsnoTag",
"number of sim vertices contributing to recvtx", 10, 0., 10.));
431 add(h,
new TH1F(
"trkAssignmentEfficiency",
"track to vertex assignment efficiency", 101, 0., 1.01) );
432 add(h,
new TH1F(
"trkAssignmentEfficiencySignal",
"track to signal vertex assignment efficiency", 101, 0., 1.01) );
433 add(h,
new TH1F(
"trkAssignmentEfficiencyPU",
"track to PU vertex assignment efficiency", 101, 0., 1.01) );
434 add(h,
new TH1F(
"primtrkAssignmentEfficiency",
"track to vertex assignment efficiency", 101, 0., 1.01) );
435 add(h,
new TH1F(
"primtrkAssignmentEfficiencySignal",
"track to signal vertex assignment efficiency", 101, 0., 1.01) );
436 add(h,
new TH1F(
"primtrkAssignmentEfficiencyPU",
"track to PU vertex assignment efficiency", 101, 0., 1.01) );
437 add(h,
new TH1F(
"vtxMultiplicity",
"number of rec vertices containg tracks from one true vertex", 10, 0., 10.) );
438 add(h,
new TH1F(
"vtxMultiplicitySignal",
"number of rec vertices containg tracks from the Signal Vertex", 10, 0., 10.) );
439 add(h,
new TH1F(
"vtxMultiplicityPU",
"number of rec vertices containg tracks from a PU Vertex", 10, 0., 10.) );
441 add(h,
new TProfile(
"vtxFindingEfficiencyVsNtrk",
"finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
442 add(h,
new TProfile(
"vtxFindingEfficiencyVsNtrkSignal",
"Signal vertex finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
443 add(h,
new TProfile(
"vtxFindingEfficiencyVsNtrkPU",
"PU vertex finding efficiency vs number of associated rec tracks",100, 0., 100., 0., 1.) );
445 add(h,
new TH1F(
"TagVtxTrkPurity",
"TagVtxTrkPurity",100,0.,1.01));
446 add(h,
new TH1F(
"TagVtxTrkEfficiency",
"TagVtxTrkEfficiency",100,0.,1.01));
448 add(h,
new TH1F(
"matchVtxFraction",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
449 add(h,
new TH1F(
"matchVtxFractionSignal",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
450 add(h,
new TH1F(
"matchVtxFractionPU",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
451 add(h,
new TH1F(
"matchVtxFractionCum",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
452 add(h,
new TH1F(
"matchVtxFractionCumSignal",
"fraction of sim vertexs track found in a recvertex",101,0,1.01));
453 add(h,
new TH1F(
"matchVtxFractionCumPU",
"fraction of sim vertex tracks found in a recvertex",101,0,1.01));
454 add(h,
new TH1F(
"matchVtxEfficiency",
"efficiency for finding matching rec vertex",2,-0.5,1.5));
455 add(h,
new TH1F(
"matchVtxEfficiencySignal",
"efficiency for finding matching rec vertex",2,-0.5,1.5));
456 add(h,
new TH1F(
"matchVtxEfficiencyPU",
"efficiency for finding matching rec vertex",2,-0.5,1.5));
457 add(h,
new TH1F(
"matchVtxEfficiency2",
"efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
458 add(h,
new TH1F(
"matchVtxEfficiency2Signal",
"efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
459 add(h,
new TH1F(
"matchVtxEfficiency2PU",
"efficiency for finding matching rec vertex (nt>1)",2,-0.5,1.5));
460 add(h,
new TH1F(
"matchVtxEfficiency5",
"efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
461 add(h,
new TH1F(
"matchVtxEfficiency5Signal",
"efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
462 add(h,
new TH1F(
"matchVtxEfficiency5PU",
"efficiency for finding matching rec vertex (purity>0.5)",2,-0.5,1.5));
465 add(h,
new TH1F(
"matchVtxEfficiencyZ",
"efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
466 add(h,
new TH1F(
"matchVtxEfficiencyZSignal",
"efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
467 add(h,
new TH1F(
"matchVtxEfficiencyZPU",
"efficiency for finding matching rec vertex within 1 mm",2,-0.5,1.5));
469 add(h,
new TH1F(
"matchVtxEfficiencyZ1",
"efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
470 add(h,
new TH1F(
"matchVtxEfficiencyZ1Signal",
"efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
471 add(h,
new TH1F(
"matchVtxEfficiencyZ1PU",
"efficiency for finding matching rec vertex within 1 mm (nt>0)",2,-0.5,1.5));
473 add(h,
new TH1F(
"matchVtxEfficiencyZ2",
"efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
474 add(h,
new TH1F(
"matchVtxEfficiencyZ2Signal",
"efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
475 add(h,
new TH1F(
"matchVtxEfficiencyZ2PU",
"efficiency for finding matching rec vertex within 1 mm (nt>1)",2,-0.5,1.5));
477 add(h,
new TH1F(
"matchVtxZ",
"z distance to matched recvtx",100, -0.1, 0.1));
478 add(h,
new TH1F(
"matchVtxZPU",
"z distance to matched recvtx",100, -0.1, 0.1));
479 add(h,
new TH1F(
"matchVtxZSignal",
"z distance to matched recvtx",100, -0.1, 0.1));
481 add(h,
new TH1F(
"matchVtxZCum",
"z distance to matched recvtx",1001,0, 1.01));
482 add(h,
new TH1F(
"matchVtxZCumSignal",
"z distance to matched recvtx",1001,0, 1.01));
483 add(h,
new TH1F(
"matchVtxZCumPU",
"z distance to matched recvtx",1001,0, 1.01));
485 add(h,
new TH1F(
"unmatchedVtx",
"number of unmatched rec vertices (fakes)",10,0.,10.));
486 add(h,
new TH1F(
"unmatchedVtxFrac",
"fraction of unmatched rec vertices (fakes)",1000,0.,1.0));
487 add(h,
new TH1F(
"unmatchedVtxZ",
"z of unmached rec vertices (fakes)",100,-20., 20.));
488 add(h,
new TH1F(
"unmatchedVtxNdof",
"ndof of unmatched rec vertices (fakes)", 500,0., 100.));
489 add(h,
new TH2F(
"correctlyassigned",
"pt and eta of correctly assigned tracks", 60, -3., 3., 100, 0, 10.));
490 add(h,
new TH2F(
"misassigned",
"pt and eta of mis assigned tracks", 60, -3., 3., 100, 0, 10.));
492 add(h,
new TH1F(
"ptcat",
"pt of correctly assigned tracks", 100, 0, 10.));
493 add(h,
new TH1F(
"etacat",
"eta of correctly assigned tracks", 60, -3., 3.));
494 add(h,
new TH1F(
"phicat",
"phi of correctly assigned tracks", 100, -3.14159, 3.14159));
495 add(h,
new TH1F(
"dzcat",
"dz of correctly assigned tracks", 100, 0., 1.));
497 add(h,
new TH1F(
"ptmis",
"pt of mis-assigned tracks", 100, 0, 10.));
498 add(h,
new TH1F(
"etamis",
"eta of mis-assigned tracks", 60, -3., 3.));
499 add(h,
new TH1F(
"phimis",
"phi of mis-assigned tracks",100, -3.14159, 3.14159));
500 add(h,
new TH1F(
"dzmis",
"dz of mis-assigned tracks", 100, 0., 1.));
503 add(h,
new TH1F(
"Tc",
"Tc computed with Truth matched Reco Tracks",100,0.,20.));
504 add(h,
new TH1F(
"TcSignal",
"Tc of signal vertices computed with Truth matched Reco Tracks",100,0.,20.));
505 add(h,
new TH1F(
"TcPU",
"Tc of PU vertices computed with Truth matched Reco Tracks",100,0.,20.));
507 add(h,
new TH1F(
"logTc",
"log Tc computed with Truth matched Reco Tracks",100,-2.,8.));
508 add(h,
new TH1F(
"logTcSignal",
"log Tc of signal vertices computed with Truth matched Reco Tracks",100,-2.,8.));
509 add(h,
new TH1F(
"logTcPU",
"log Tc of PU vertices computed with Truth matched Reco Tracks",100,-2.,8.));
511 add(h,
new TH1F(
"xTc",
"Tc of merged clusters",100,0.,20.));
512 add(h,
new TH1F(
"xTcSignal",
"Tc of signal vertices merged with PU",100,0.,20.));
513 add(h,
new TH1F(
"xTcPU",
"Tc of merged PU vertices",100,0.,20.));
515 add(h,
new TH1F(
"logxTc",
"log Tc merged vertices",100,-2.,8.));
516 add(h,
new TH1F(
"logxTcSignal",
"log Tc of signal vertices merged with PU",100,-2.,8.));
517 add(h,
new TH1F(
"logxTcPU",
"log Tc of merged PU vertices ",100,-2.,8.));
519 add(h,
new TH1F(
"logChisq",
"Chisq/ntrk computed with Truth matched Reco Tracks",100,-2.,8.));
520 add(h,
new TH1F(
"logChisqSignal",
"Chisq/ntrk of signal vertices computed with Truth matched Reco Tracks",100,-2.,8.));
521 add(h,
new TH1F(
"logChisqPU",
"Chisq/ntrk of PU vertices computed with Truth matched Reco Tracks",100,-2.,8.));
523 add(h,
new TH1F(
"logxChisq",
"Chisq/ntrk of merged clusters",100,-2.,8.));
524 add(h,
new TH1F(
"logxChisqSignal",
"Chisq/ntrk of signal vertices merged with PU",100,-2.,8.));
525 add(h,
new TH1F(
"logxChisqPU",
"Chisq/ntrk of merged PU vertices",100,-2.,8.));
527 add(h,
new TH1F(
"Chisq",
"Chisq/ntrk computed with Truth matched Reco Tracks",100,0.,20.));
528 add(h,
new TH1F(
"ChisqSignal",
"Chisq/ntrk of signal vertices computed with Truth matched Reco Tracks",100,0.,20.));
529 add(h,
new TH1F(
"ChisqPU",
"Chisq/ntrk of PU vertices computed with Truth matched Reco Tracks",100,0.,20.));
531 add(h,
new TH1F(
"xChisq",
"Chisq/ntrk of merged clusters",100,0.,20.));
532 add(h,
new TH1F(
"xChisqSignal",
"Chisq/ntrk of signal vertices merged with PU",100,0.,20.));
533 add(h,
new TH1F(
"xChisqPU",
"Chisq/ntrk of merged PU vertices",100,0.,20.));
535 add(h,
new TH1F(
"dzmax",
"dzmax computed with Truth matched Reco Tracks",100,0.,2.));
536 add(h,
new TH1F(
"dzmaxSignal",
"dzmax of signal vertices computed with Truth matched Reco Tracks",100,0.,2.));
537 add(h,
new TH1F(
"dzmaxPU",
"dzmax of PU vertices computed with Truth matched Reco Tracks",100,0.,2.));
539 add(h,
new TH1F(
"xdzmax",
"dzmax of merged clusters",100,0.,2.));
540 add(h,
new TH1F(
"xdzmaxSignal",
"dzmax of signal vertices merged with PU",100,0.,2.));
541 add(h,
new TH1F(
"xdzmaxPU",
"dzmax of merged PU vertices",100,0.,2.));
543 add(h,
new TH1F(
"dztrim",
"dzmax computed with Truth matched Reco Tracks",100,0.,2.));
544 add(h,
new TH1F(
"dztrimSignal",
"dzmax of signal vertices computed with Truth matched Reco Tracks",100,0.,2.));
545 add(h,
new TH1F(
"dztrimPU",
"dzmax of PU vertices computed with Truth matched Reco Tracks",100,0.,2.));
547 add(h,
new TH1F(
"xdztrim",
"dzmax of merged clusters",100,0.,2.));
548 add(h,
new TH1F(
"xdztrimSignal",
"dzmax of signal vertices merged with PU",100,0.,2.));
549 add(h,
new TH1F(
"xdztrimPU",
"dzmax of merged PU vertices",100,0.,2.));
551 add(h,
new TH1F(
"m4m2",
"m4m2 computed with Truth matched Reco Tracks",100,0.,100.));
552 add(h,
new TH1F(
"m4m2Signal",
"m4m2 of signal vertices computed with Truth matched Reco Tracks",100,0.,100.));
553 add(h,
new TH1F(
"m4m2PU",
"m4m2 of PU vertices computed with Truth matched Reco Tracks",100,0.,100.));
555 add(h,
new TH1F(
"xm4m2",
"m4m2 of merged clusters",100,0.,100.));
556 add(h,
new TH1F(
"xm4m2Signal",
"m4m2 of signal vertices merged with PU",100,0.,100.));
557 add(h,
new TH1F(
"xm4m2PU",
"m4m2 of merged PU vertices",100,0.,100.));
567 std::cout <<
" PrimaryVertexAnalyzer4PU::beginJob conversion from sim units to rec units is " <<
simUnit_ << std::endl;
572 TDirectory *noBS =
rootFile_->mkdir(
"noBS");
576 hist->second->SetDirectory(noBS);
579 TDirectory *withBS =
rootFile_->mkdir(
"BS");
582 for(std::map<std::string,TH1*>::const_iterator
hist=
hBS.begin();
hist!=
hBS.end();
hist++){
583 hist->second->SetDirectory(withBS);
589 for(std::map<std::string,TH1*>::const_iterator
hist=
hDA.begin();
hist!=
hDA.end();
hist++){
590 hist->second->SetDirectory(DA);
608 hsimPV[
"rapidity"] =
new TH1F(
"rapidity",
"rapidity ",100,-10., 10.);
609 hsimPV[
"chRapidity"] =
new TH1F(
"chRapidity",
"charged rapidity ",100,-10., 10.);
610 hsimPV[
"recRapidity"] =
new TH1F(
"recRapidity",
"reconstructed rapidity ",100,-10., 10.);
611 hsimPV[
"pt"] =
new TH1F(
"pt",
"pt ",100,0., 20.);
613 hsimPV[
"xsim"] =
new TH1F(
"xsim",
"simulated x",100,-0.01,0.01);
614 hsimPV[
"ysim"] =
new TH1F(
"ysim",
"simulated y",100,-0.01,0.01);
615 hsimPV[
"zsim"] =
new TH1F(
"zsim",
"simulated z",100,-20.,20.);
617 hsimPV[
"xsim1"] =
new TH1F(
"xsim1",
"simulated x",100,-4.,4.);
618 hsimPV[
"ysim1"] =
new TH1F(
"ysim1",
"simulated y",100,-4.,4.);
619 hsimPV[
"zsim1"] =
new TH1F(
"zsim1",
"simulated z",100,-40.,40.);
621 add(
hsimPV,
new TH1F(
"xsim2PU",
"simulated x (Pile-up)",100,-1.,1.));
622 add(
hsimPV,
new TH1F(
"ysim2PU",
"simulated y (Pile-up)",100,-1.,1.));
623 add(
hsimPV,
new TH1F(
"zsim2PU",
"simulated z (Pile-up)",100,-20.,20.));
624 add(
hsimPV,
new TH1F(
"xsim2Signal",
"simulated x (Signal)",100,-1.,1.));
625 add(
hsimPV,
new TH1F(
"ysim2Signal",
"simulated y (Signal)",100,-1.,1.));
626 add(
hsimPV,
new TH1F(
"zsim2Signal",
"simulated z (Signal)",100,-20.,20.));
628 hsimPV[
"xsim2"] =
new TH1F(
"xsim2",
"simulated x",100,-1,1);
629 hsimPV[
"ysim2"] =
new TH1F(
"ysim2",
"simulated y",100,-1,1);
630 hsimPV[
"zsim2"] =
new TH1F(
"zsim2",
"simulated z",100,-20.,20.);
631 hsimPV[
"xsim3"] =
new TH1F(
"xsim3",
"simulated x",100,-0.1,0.1);
632 hsimPV[
"ysim3"] =
new TH1F(
"ysim3",
"simulated y",100,-0.1,0.1);
633 hsimPV[
"zsim3"] =
new TH1F(
"zsim3",
"simulated z",100,-20.,20.);
634 hsimPV[
"xsimb"] =
new TH1F(
"xsimb",
"simulated x",100,-0.01,0.01);
635 hsimPV[
"ysimb"] =
new TH1F(
"ysimb",
"simulated y",100,-0.01,0.01);
636 hsimPV[
"zsimb"] =
new TH1F(
"zsimb",
"simulated z",100,-20.,20.);
637 hsimPV[
"xsimb1"] =
new TH1F(
"xsimb1",
"simulated x",100,-0.1,0.1);
638 hsimPV[
"ysimb1"] =
new TH1F(
"ysimb1",
"simulated y",100,-0.1,0.1);
639 hsimPV[
"zsimb1"] =
new TH1F(
"zsimb1",
"simulated z",100,-20.,20.);
640 add(
hsimPV,
new TH1F(
"xbeam",
"beamspot x",100,-1.,1.));
641 add(
hsimPV,
new TH1F(
"ybeam",
"beamspot y",100,-1.,1.));
642 add(
hsimPV,
new TH1F(
"zbeam",
"beamspot z",100,-1.,1.));
643 add(
hsimPV,
new TH1F(
"wxbeam",
"beamspot sigma x",100,-1.,1.));
644 add(
hsimPV,
new TH1F(
"wybeam",
"beamspot sigma y",100,-1.,1.));
645 add(
hsimPV,
new TH1F(
"wzbeam",
"beamspot sigma z",100,-1.,1.));
646 hsimPV[
"xsim2"]->StatOverflows(kTRUE);
647 hsimPV[
"ysim2"]->StatOverflows(kTRUE);
648 hsimPV[
"zsim2"]->StatOverflows(kTRUE);
649 hsimPV[
"xsimb"]->StatOverflows(kTRUE);
650 hsimPV[
"ysimb"]->StatOverflows(kTRUE);
651 hsimPV[
"zsimb"]->StatOverflows(kTRUE);
652 hsimPV[
"nsimvtx"] =
new TH1F(
"nsimvtx",
"# of simulated vertices", 50, -0.5, 49.5);
655 hsimPV[
"nbsimtksinvtx"]=
new TH1F(
"nbsimtksinvtx",
"simulated tracks in vertex",100,-0.5,99.5);
656 hsimPV[
"nbsimtksinvtx"]->StatOverflows(kTRUE);
662 std::cout <<
"this is void PrimaryVertexAnalyzer4PU::endJob() " << std::endl;
664 double sumDA=0,sumBS=0,sumnoBS=0;
666 for(
int i=101;
i>0;
i--){
667 sumDA+=
hDA[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hDA[
"matchVtxFractionSignal"]->Integral();
668 hDA[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumDA);
669 sumBS+=
hBS[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hBS[
"matchVtxFractionSignal"]->Integral();
670 hBS[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumBS);
671 sumnoBS+=
hnoBS[
"matchVtxFractionSignal"]->GetBinContent(
i)/
hnoBS[
"matchVtxFractionSignal"]->Integral();
672 hnoBS[
"matchVtxFractionCumSignal"]->SetBinContent(
i,sumnoBS);
678 sumDA=0,sumBS=0,sumnoBS=0;
680 for(
int i=1;
i<1001;
i++){
681 sumDA+=
hDA[
"abszdistancetag"]->GetBinContent(
i);
682 hDA[
"abszdistancetagcum"]->SetBinContent(
i,sumDA/
float(
hDA[
"abszdistancetag"]->GetEntries()));
683 sumBS+=
hBS[
"abszdistancetag"]->GetBinContent(
i);
684 hBS[
"abszdistancetagcum"]->SetBinContent(
i,sumBS/
float(
hBS[
"abszdistancetag"]->GetEntries()));
685 sumnoBS+=
hnoBS[
"abszdistancetag"]->GetBinContent(
i);
686 hnoBS[
"abszdistancetagcum"]->SetBinContent(
i,sumnoBS/
float(
hnoBS[
"abszdistancetag"]->GetEntries()));
707 for(
int i=1;
i<501;
i++){
708 if(
hDA[
"vtxndf"]->GetEntries()>0){
709 p=
hDA[
"vtxndf"]->Integral(
i,501)/
hDA[
"vtxndf"]->GetEntries();
hDA[
"vtxndfc"]->SetBinContent(
i,p*
hDA[
"vtxndf"]->GetBinContent(
i));
711 if(
hBS[
"vtxndf"]->GetEntries()>0){
712 p=
hBS[
"vtxndf"]->Integral(
i,501)/
hBS[
"vtxndf"]->GetEntries();
hBS[
"vtxndfc"]->SetBinContent(
i,p*
hBS[
"vtxndf"]->GetBinContent(
i));
714 if(
hnoBS[
"vtxndf"]->GetEntries()>0){
715 p=
hnoBS[
"vtxndf"]->Integral(
i,501)/
hnoBS[
"vtxndf"]->GetEntries();
hnoBS[
"vtxndfc"]->SetBinContent(
i,p*
hnoBS[
"vtxndf"]->GetBinContent(
i));
725 hist->second->Write();
728 std::cout <<
"PrimaryVertexAnalyzer4PU::endJob: done" << std::endl;
740 std::vector<SimPart > tsim;
741 if(simVtcs->begin()==simVtcs->end()){
743 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters no simvtcs" << endl;
748 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters simVtcs n=" << simVtcs->size() << endl;
749 cout <<
" PrimaryVertexAnalyzer4PU::getSimTrkParameters 1st position" << setw(8) << setprecision(4) << simVtcs->begin()->position() << endl;
751 double t0=simVtcs->begin()->position().e();
753 for(edm::SimTrackContainer::const_iterator
t=simTrks->begin();
754 t!=simTrks->end(); ++
t){
756 std::cout <<
"simtrk has no vertex" << std::endl;
761 (*simVtcs)[
t->vertIndex()].position().y(),
762 (*simVtcs)[
t->vertIndex()].position().z(),
763 (*simVtcs)[
t->vertIndex()].position().e());
764 int pdgCode=
t->type();
768 std::cout <<
"funny particle skipped , code=" << pdgCode << std::endl;
771 if ((pdgCode==11)||(pdgCode==13)||(pdgCode==15)||(pdgCode==-211)||(pdgCode==-2212)||(pdgCode==-321)||(pdgCode==-3222)){Q=-1;}
772 else if((pdgCode==-11)||(pdgCode==-13)||(pdgCode==-15)||(pdgCode==211)||(pdgCode==2212)||(pdgCode==321)||(pdgCode==3222)){Q=1;}
777 if ( (Q != 0) && (
p.pt()>0.1) && (fabs(
t->momentum().eta())<3.0)
778 && fabs(
v.z()*simUnit<20) && (
sqrt(
v.x()*
v.x()+
v.y()*
v.y())<10.)){
779 double x0=
v.x()*simUnit;
780 double y0=
v.y()*simUnit;
781 double z0=
v.z()*simUnit;
782 double kappa=-Q*0.002998*
fBfield_/
p.pt();
783 double D0=x0*
sin(
p.phi())-y0*
cos(
p.phi())-0.5*kappa*(x0*x0+y0*y0);
784 double q=
sqrt(1.-2.*kappa*D0);
785 double s0=(x0*
cos(
p.phi())+y0*
sin(
p.phi()))/
q;
787 if (fabs(kappa*s0)>0.001){
788 s1=asin(kappa*s0)/kappa;
790 double ks02=(kappa*s0)*(kappa*s0);
791 s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*
pow(ks02,3));
808 double x1=x0-0.033;
double y1=y0-0.;
809 D0=x1*
sin(
p.phi())-y1*
cos(
p.phi())-0.5*kappa*(x1*x1+y1*y1);
810 q=
sqrt(1.-2.*kappa*D0);
812 if (fabs(kappa*s0)>0.001){
813 s1=asin(kappa*s0)/kappa;
815 double ks02=(kappa*s0)*(kappa*s0);
816 s1=s0*(1.+ks02/6.+3./40.*ks02*ks02+5./112.*
pow(ks02,3));
834 int nsim=simtrks.size();
835 int nrec=trks.size();
836 int *rectosim=
new int[nrec];
837 double** pij=
new double*[nrec];
841 for(reco::TrackCollection::const_iterator
t=trks.begin();
t!=trks.end(); ++
t){
842 pij[
i]=
new double[nsim];
848 for(
int j=0;
j<nsim;
j++){
852 for(
int k=0;
k<5;
k++){
853 for(
int l=0;
l<5;
l++){
857 pij[
i][
j]=
exp(-0.5*c);
890 for(
int k=0;
k<nrec;
k++){
891 int imatch=-1;
int jmatch=-1;
893 for(
int j=0;
j<nsim;
j++){
894 if ((simtrks[
j].rec)<0){
895 double psum=
exp(-0.5*mu);
896 for(
int i=0; i<nrec; i++){
897 if (rectosim[i]<0){ psum+=pij[
i][
j];}
899 for(
int i=0; i<nrec; i++){
900 if ((rectosim[i]<0)&&(pij[i][
j]/psum>pmatch)){
901 pmatch=pij[
i][
j]/psum;
907 if((jmatch>=0)||(imatch>=0)){
911 rectosim[imatch]=jmatch;
912 simtrks[jmatch].rec=imatch;
914 }
else if (
match(simtrks[jmatch].par, trks.at(imatch).parameters())){
916 rectosim[imatch]=jmatch;
917 simtrks[jmatch].rec=imatch;
935 std::cout <<
"unmatched sim " << std::endl;
936 for(
int j=0;
j<nsim;
j++){
937 if(simtrks[
j].rec<0){
938 double pt= 1./simtrks[
j].par[0]/
tan(simtrks[
j].par[1]);
940 std::cout << setw(3) <<
j << setw(8) << simtrks[
j].pdg
941 << setw(8) << setprecision(4) <<
" (" << simtrks[
j].xvtx <<
"," << simtrks[
j].yvtx <<
"," << simtrks[
j].zvtx <<
")"
943 <<
" phi=" << simtrks[
j].par[2]
944 <<
" eta= " << -
log(
tan(0.5*(
M_PI/2-simtrks[
j].par[1])))
952 for(
int i=0; i<nrec; i++){
delete pij[
i];}
966 double dqoverp =
a(0)-
b(0);
967 double dlambda =
a(1)-
b(1);
968 double dphi =
a(2)-
b(2);
969 double dsz =
a(4)-
b(4);
970 if (dphi>
M_PI){ dphi-=M_2_PI; }
else if(dphi<-
M_PI){dphi+=M_2_PI;}
972 return ( (fabs(dqoverp)<0.2) && (fabs(dlambda)<0.02) && (fabs(dphi)<0.04) && (fabs(dsz)<1.0) );
982 double ctau=(
pdt_->particle(
abs(p->pdg_id()) ))->lifetime();
984 return ctau >0 && ctau <1
e-6;
988 return ( !p->end_vertex() && p->status()==1 );
995 return part->charge()!=0;
998 return pdt_->particle( -p->pdg_id() )!=0;
1006 Fill(h,
"rapidity_"+ttype,t.
eta());
1007 Fill(h,
"z0_"+ttype,t.
vz());
1010 Fill(h,
"pt_"+ttype,t.
pt());
1019 Fill(h,
"logtresxy_"+ttype,
log(d0Error/0.0001)/
log(10.));
1020 Fill(h,
"tpullxy_"+ttype,d0/d0Error);
1025 Fill(h,
"logtresz_"+ttype,
log(dzError/0.0001)/
log(10.));
1033 if((! (v==
NULL)) && (v->
ndof()>10.)) {
1051 double D0=x1*
sin(t.
phi())-y1*
cos(t.
phi())-0.5*kappa*(x1*x1+y1*y1);
1052 double q=
sqrt(1.-2.*kappa*D0);
1055 if (fabs(kappa*s0)>0.001){
1073 Fill(h,
"trackAlgo_"+ttype,t.
algo());
1077 int longesthit=0, nbarrel=0;
1079 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1087 if (clust->sizeY()-longesthit>0) longesthit=clust->sizeY();
1088 if (clust->sizeY()>20.){
1089 Fill(h,
"lvseta_"+ttype,t.
eta(), 19.9);
1092 Fill(h,
"lvseta_"+ttype,t.
eta(), float(clust->sizeY()));
1093 Fill(h,
"lvstanlambda_"+ttype,
tan(t.
lambda()),
float(clust->sizeY()));
1099 Fill(h,
"nbarrelhits_"+ttype,
float(nbarrel));
1106 int longesthit=0, nbarrel=0;
1107 cout << Form(
"%5.2f %5.2f : ",t.
pt(),t.
eta());
1109 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1117 cout << Form(
"%4d",clust->sizeY());
1118 if (clust->sizeY()-longesthit>0) longesthit=clust->sizeY();
1128 std::cout << std::endl << title << std::endl;
1129 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
1130 v!=recVtxs->end(); ++
v){
1131 string vtype=
" recvtx ";
1134 }
else if (
v->ndof()==-5){
1136 }
else if(
v->ndof()==-3){
1139 std::cout <<
"vtx "<< std::setw(3) << std::setfill(
' ')<<ivtx++
1141 <<
" #trk " << std::fixed << std::setprecision(4) << std::setw(3) <<
v->tracksSize()
1142 <<
" chi2 " << std::fixed << std::setw(4) << std::setprecision(1) <<
v->chi2()
1143 <<
" ndof " << std::fixed << std::setw(5) << std::setprecision(2) <<
v->ndof()
1144 <<
" x " << std::setw(8) <<std::fixed << std::setprecision(4) <<
v->x()
1145 <<
" dx " << std::setw(8) <<
v->xError()
1146 <<
" y " << std::setw(8) <<
v->y()
1147 <<
" dy " << std::setw(8) <<
v->yError()
1148 <<
" z " << std::setw(8) <<
v->z()
1149 <<
" dz " << std::setw(8) <<
v->zError()
1157 for(SimVertexContainer::const_iterator vsim=simVtxs->begin();
1158 vsim!=simVtxs->end(); ++vsim){
1159 if ( vsim->position().x()*vsim->position().x()+vsim->position().y()*vsim->position().y() < 1.){
1160 std::cout << i++ <<
")" << std::scientific
1161 <<
" evtid=" << vsim->eventId().event() <<
"," << vsim->eventId().bunchCrossing()
1162 <<
" sim x=" << vsim->position().x()*
simUnit_
1163 <<
" sim y=" << vsim->position().y()*
simUnit_
1164 <<
" sim z=" << vsim->position().z()*
simUnit_
1165 <<
" sim t=" << vsim->position().t()
1166 <<
" parent=" << vsim->parentIndex()
1179 std::cout <<
" simTrks type, (momentum), vertIndex, genpartIndex" << std::endl;
1181 for(SimTrackContainer::const_iterator
t=simTrks->begin();
1182 t!=simTrks->end(); ++
t){
1185 <<
t->eventId().event() <<
"," <<
t->eventId().bunchCrossing()
1188 << (*t).genpartIndex();
1201 cout <<
"printRecTrks" << endl;
1203 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
t!=recTrks->end(); ++
t){
1207 cout <<
"Track "<<i <<
" " ; i++;
1224 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;
1227 cout << Form(
" found=%6d lost=%6d chi2/ndof=%10.3f ",
t->found(),
t->lost(),
t->normalizedChi2())<<endl;
1229 cout <<
"subdet layers valid lost" << endl;
1230 cout << Form(
" barrel %2d %2d %2d",p.pixelBarrelLayersWithMeasurement(),p.numberOfValidPixelBarrelHits(), p.numberOfLostPixelBarrelHits()) << endl;
1231 cout << Form(
" fwd %2d %2d %2d",p.pixelEndcapLayersWithMeasurement(),p.numberOfValidPixelEndcapHits(), p.numberOfLostPixelEndcapHits()) << endl;
1232 cout << Form(
" pixel %2d %2d %2d",p.pixelLayersWithMeasurement(), p.numberOfValidPixelHits(), p.numberOfLostPixelHits()) << endl;
1233 cout << Form(
" tracker %2d %2d %2d",p.trackerLayersWithMeasurement(), p.numberOfValidTrackerHits(), p.numberOfLostTrackerHits()) << endl;
1245 if ((**hit).isValid() && (**hit).geographicalId().det() ==
DetId::Tracker ){
1252 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;
1258 cout << Form(
" endcap cluster size=%2d charge=%6.1f wx=%2d wy=%2d",clust->size(),clust->charge(),clust->sizeX(),clust->sizeY()) << endl;
1263 cout <<
"hitpattern" << endl;
1264 for(
int i=0; i<p.numberOfHits(); i++){ p.printHitPattern(i,
std::cout); }
1265 cout <<
"expected inner " << ninner << endl;
1267 cout <<
"expected outer " << nouter << endl;
1287 std::vector<SimPart>& tsim,
1288 std::vector<SimEvent>& simEvt,
1292 vector<TransientTrack> selTrks;
1293 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1294 t!=recTrks->end(); ++
t){
1296 if( (!selectedOnly) || (selectedOnly &&
theTrackFilter(tt))){ selTrks.push_back(tt); }
1298 if (selTrks.size()==0)
return;
1299 stable_sort(selTrks.begin(), selTrks.end(), recTrackLessZ);
1304 for(
unsigned int i=0;
i<selTrks.size();
i++){ selRecTrks.push_back(selTrks[
i].track());}
1305 int* rectosim=
supf(tsim, selRecTrks);
1310 cout <<
"printPVTrks" << endl;
1311 cout <<
"---- z +/- dz 1bet-m ip +/-dip pt phi eta";
1312 if((tsim.size()>0)||(simEvt.size()>0)) {
cout <<
" type pdg zvtx zdca dca zvtx zdca dsz";}
1317 for(
unsigned int i=0;
i<selTrks.size();
i++){
1319 cout << setw (3)<< isel;
1329 for(reco::VertexCollection::const_iterator
v=recVtxs->begin();
1330 v!=recVtxs->end(); ++
v){
1331 if ( (
v->ndof()<-1) || (
v->chi2()<=0) )
continue;
1332 for(
trackit_t tv=
v->tracks_begin(); tv!=
v->tracks_end(); tv++){
1334 if(selTrks[i].track().vz()==RTv.
vz()) {vmatch=iv;}
1339 double tz=(selTrks[
i].stateAtBeamLine().trackStateAtPCA()).
position().z();
1340 double tantheta=
tan((selTrks[i].stateAtBeamLine().trackStateAtPCA()).momentum().
theta());
1341 double tdz0= selTrks[
i].track().dzError();
1345 cout <<
"["<<setw(2)<<vmatch<<
"]";
1352 if(status&0x1){
cout <<
"i";}
else{
cout <<
".";};
1353 if(status&0x2){
cout <<
"c";}
else{
cout <<
".";};
1354 if(status&0x4){
cout <<
"h";}
else{
cout <<
".";};
1355 if(status&0x8){
cout <<
"q";}
else{
cout <<
".";};
1358 cout << setw (8) << fixed << setprecision(4)<< tz <<
" +/-" << setw (6)<<
sqrt(tdz2);
1363 if(selTrks[i].track().hitPattern().hasValidHitInFirstPixelBarrel()){
cout <<
"+";}
else{
cout <<
"-";}
1364 cout << setw(1) << selTrks[
i].track().hitPattern().pixelBarrelLayersWithMeasurement();
1365 cout << setw(1) << selTrks[
i].track().hitPattern().pixelEndcapLayersWithMeasurement();
1366 cout << setw(1) << hex << selTrks[
i].track().hitPattern().trackerLayersWithMeasurement()-selTrks[
i].track().hitPattern().pixelLayersWithMeasurement()<<dec;
1367 cout <<
"-" << setw(1)<<hex <<selTrks[
i].track().trackerExpectedHitsOuter().numberOfHits() << dec;
1371 cout << setw (8) << IP.
value() <<
"+/-" << setw (6) << IP.
error();
1372 if(selTrks[i].track().ptError()<1){
1373 cout <<
" " << setw(8) << setprecision(2) << selTrks[
i].track().pt()*selTrks[
i].track().charge();
1375 cout <<
" " << setw(7) << setprecision(1) << selTrks[
i].track().pt()*selTrks[
i].track().charge() <<
"*";
1378 cout <<
" " << setw(5) << setprecision(2) << selTrks[
i].track().phi()
1379 <<
" " << setw(5) << setprecision(2) << selTrks[
i].track().eta() ;
1384 if(simEvt.size()>0){
1391 double vz=parentVertex->
position().z();
1392 cout <<
" " << tpr->eventId().event();
1393 cout <<
" " << setw(5) << tpr->pdgId();
1394 cout <<
" " << setw(8) << setprecision(4) << vz;
1396 cout <<
" not matched";
1401 if(tsim[rectosim[i]].
type==0){
cout <<
" prim " ;}
else{
cout <<
" sec ";}
1402 cout <<
" " << setw(5) << tsim[rectosim[
i]].pdg;
1403 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].zvtx;
1404 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].zdcap;
1405 cout <<
" " << setw(8) << setprecision(4) << tsim[rectosim[
i]].ddcap;
1406 double zvtxpull=(tz-tsim[rectosim[
i]].zvtx)/
sqrt(tdz2);
1407 cout << setw(6) << setprecision(1) << zvtxpull;
1408 double zdcapull=(tz-tsim[rectosim[
i]].zdcap)/tdz0;
1409 cout << setw(6) << setprecision(1) << zdcapull;
1410 double dszpull=(selTrks[
i].track().dsz()-tsim[rectosim[
i]].par[4])/selTrks[i].track().dszError();
1411 cout << setw(6) << setprecision(1) << dszpull;
1421 const std::vector<SimPart > & tsim,
1427 std::cout <<
"dump rec tracks: " << std::endl;
1429 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1430 t!=recTrks->end(); ++
t){
1432 std::cout << irec++ <<
") " << p << std::endl;
1435 std::cout <<
"match sim tracks: " << std::endl;
1439 for(std::vector<SimPart>::const_iterator
s=tsim.begin();
1440 s!=tsim.end(); ++
s){
1444 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
1445 t!=recTrks->end(); ++
t){
1447 if (
match(
s->par,p)){ imatch=irec; }
1453 std::cout <<
" matched to rec trk" << imatch << std::endl;
1455 std::cout <<
" not matched" << std::endl;
1469 double & Tc,
double & chsq,
double & dzmax,
double & dztrim,
double & m4m2){
1470 if (tracks.size()<2){ Tc=-1; chsq=-1; dzmax=-1; dztrim=-1; m4m2=-1;
return;}
1472 double sumw=0, sumwz=0, sumww=0,sumwwz=0,sumwwzz=0;
1473 double zmin=1e10, zmin1=1e10, zmax1=-1e10,
zmax=-1e10;
1474 double m4=0,m3=0,m2=0,m1=0,m0=0;
1475 for(vector<reco::TransientTrack>::const_iterator it=tracks.begin(); it!=tracks.end(); it++){
1476 double tantheta=
tan(((*it).stateAtBeamLine().trackStateAtPCA()).momentum().theta());
1478 double z=((*it).stateAtBeamLine().trackStateAtPCA()).
position().z();
1479 double dz2=
pow((*it).track().dzError(),2)+
pow(beamspot.BeamWidthX()/tantheta,2);
1493 if(z<zmin1){zmin1=
z;}
if(z<zmin){zmin1=
zmin; zmin=
z;}
1494 if(z>zmax1){zmax1=
z;}
if(z>zmax){zmax1=
zmax; zmax=
z;}
1497 double z=sumwz/sumw;
1498 double a=sumwwzz-2*z*sumwwz+z*z*sumww;
1500 if(tracks.size()>1){
1501 chsq=(m2-m0*z*
z)/(tracks.size()-1);
1503 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));
1528 std::vector<std::pair<TrackingParticleRef, double> > tp =
r2s_[track];
1529 for (std::vector<std::pair<TrackingParticleRef, double> >::const_iterator it = tp.begin();
1530 it != tp.end(); ++it) {
1559 std::vector< edm::RefToBase<reco::Track> >
b;
1588 const View<Track> tC = *(trackCollectionH.product());
1591 vector<SimEvent> simEvt;
1592 map<EncodedEventId, unsigned int> eventIdToEventMap;
1593 map<EncodedEventId, unsigned int>::iterator id;
1595 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1597 if( fabs(it->parentVertex().get()->position().z())>100.)
continue;
1599 unsigned int event=0;
1600 id=eventIdToEventMap.find(it->eventId());
1601 if (
id==eventIdToEventMap.end()){
1606 event=simEvt.size();
1609 cout <<
"getSimEvents: ";
1610 cout << it->eventId().bunchCrossing() <<
"," << it->eventId().event()
1611 <<
" z="<< it->vz() <<
" "
1613 <<
" z=" << parentVertex->
position().z() << endl;
1615 if (it->eventId()==parentVertex->
eventId()){
1624 e.
x=0; e.
y=0; e.
z=-88.;
1626 simEvt.push_back(e);
1633 simEvt[
event].tp.push_back(&(*it));
1634 if( (
abs(it->eta())<2.5) && (it->charge()!=0) ){
1635 simEvt[
event].sumpt2+=
pow(it->pt(),2);
1636 simEvt[
event].sumpt+=it->pt();
1641 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
1650 if( truthMatchedTrack(track,tpr)){
1652 if( eventIdToEventMap.find(tpr->eventId())==eventIdToEventMap.end() ){
cout <<
"Bug in getSimEvents" << endl;
break; }
1654 z2tp_[track.
get()->
vz()]=tpr;
1656 unsigned int event=eventIdToEventMap[tpr->eventId()];
1657 double ipsig=0,ipdist=0;
1659 double vx=parentVertex->
position().x();
1660 double vy=parentVertex->
position().y();
1661 double vz=parentVertex->
position().z();
1664 double dxy=track->
dxy(vertexBeamSpot_.position());
1670 if (theTrackFilter(t)){
1671 simEvt[
event].tk.push_back(t);
1672 if(ipdist<5){simEvt[
event].tkprim.push_back(t);}
1673 if(ipsig<5){simEvt[
event].tkprimsel.push_back(t);}
1682 cout <<
"SimEvents " << simEvt.size() << endl;
1683 for(
unsigned int i=0;
i<simEvt.size();
i++){
1685 if(simEvt[
i].tkprim.size()>0){
1687 getTc(simEvt[
i].tkprimsel, simEvt[
i].Tc, simEvt[
i].chisq, simEvt[
i].dzmax, simEvt[
i].dztrim, simEvt[
i].m4m2);
1699 cout <<
i <<
" ) nTP=" << simEvt[
i].tp.size()
1700 <<
" z=" << simEvt[
i].z
1701 <<
" recTrks=" << simEvt[
i].tk.size()
1702 <<
" recTrksPrim=" << simEvt[
i].tkprim.size()
1703 <<
" zfit=" << simEvt[
i].zfit
1717 std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> simpv;
1718 const HepMC::GenEvent* evt=evtMC->GetEvent();
1727 for(HepMC::GenEvent::vertex_const_iterator vitr= evt->vertices_begin();
1728 vitr != evt->vertices_end(); ++vitr )
1731 HepMC::FourVector
pos = (*vitr)->position();
1734 if (fabs(pos.z())>1000)
continue;
1736 bool hasMotherVertex=
false;
1738 for ( HepMC::GenVertex::particle_iterator
1742 HepMC::GenVertex * mv=(*mother)->production_vertex();
1743 if (mv) {hasMotherVertex=
true;}
1746 if(hasMotherVertex) {
continue;}
1750 const double mm=0.1;
1753 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1754 v0!=simpv.end(); v0++){
1755 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)){
1763 simpv.push_back(sv);
1771 vp->genVertex.push_back((*vitr)->barcode());
1775 for ( HepMC::GenVertex::particle_iterator
1776 daughter = (*vitr)->particles_begin(HepMC::descendants);
1777 daughter != (*vitr)->particles_end(HepMC::descendants);
1781 if (
find(vp->finalstateParticles.begin(), vp->finalstateParticles.end(),(*daughter)->barcode())
1782 == vp->finalstateParticles.end()){
1783 vp->finalstateParticles.push_back((*daughter)->barcode());
1784 HepMC::FourVector
m=(*daughter)->momentum();
1786 vp->ptot.setPx(vp->ptot.px()+m.px());
1787 vp->ptot.setPy(vp->ptot.py()+m.py());
1788 vp->ptot.setPz(vp->ptot.pz()+m.pz());
1789 vp->ptot.setE(vp->ptot.e()+m.e());
1790 vp->ptsq+=(m.perp())*(m.perp());
1792 if ( (m.perp()>0.2) && (fabs(m.pseudoRapidity())<2.5) &&
isCharged( *daughter ) ){
1796 hsimPV[
"rapidity"]->Fill(m.pseudoRapidity());
1797 if( (m.perp()>0.8) &&
isCharged( *daughter ) ){
1798 hsimPV[
"chRapidity"]->Fill(m.pseudoRapidity());
1800 hsimPV[
"pt"]->Fill(m.perp());
1810 cout <<
"------- PrimaryVertexAnalyzer4PU simPVs -------" << endl;
1811 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1812 v0!=simpv.end(); v0++){
1813 cout <<
"z=" << v0->z
1814 <<
" px=" << v0->ptot.px()
1815 <<
" py=" << v0->ptot.py()
1816 <<
" pz=" << v0->ptot.pz()
1817 <<
" pt2="<< v0->ptsq
1820 cout <<
"-----------------------------------------------" << endl;
1837 std::vector<PrimaryVertexAnalyzer4PU::simPrimaryVertex> simpv;
1840 if(
DEBUG_){
std::cout <<
"getSimPVs TrackingVertexCollection " << std::endl;}
1842 for (TrackingVertexCollection::const_iterator
v = tVC ->
begin();
v != tVC ->
end(); ++
v) {
1845 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;
1853 if ((
unsigned int)
v->eventId().event()<simpv.size())
continue;
1855 if (fabs(
v->position().z())>1000)
continue;
1858 const double mm=1.0;
1866 sv.eventId=(**iTrack).eventId();
1870 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1871 v0!=simpv.end(); v0++){
1872 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)){
1879 if(
DEBUG_){
std::cout <<
"this is a new vertex " << sv.eventId.event() <<
" " << sv.x <<
" " << sv.y <<
" " << sv.z <<std::endl;}
1880 simpv.push_back(sv);
1883 if(
DEBUG_){
std::cout <<
"this is not a new vertex" << sv.x <<
" " << sv.y <<
" " << sv.z <<std::endl;}
1890 std::cout <<
" Daughter momentum: " << (*(*iTP)).momentum();
1897 cout <<
"------- PrimaryVertexAnalyzer4PU simPVs from TrackingVertices -------" << endl;
1898 for(std::vector<simPrimaryVertex>::iterator v0=simpv.begin();
1899 v0!=simpv.end(); v0++){
1900 cout <<
"z=" << v0->z <<
" event=" << v0->eventId.event() << endl;
1902 cout <<
"-----------------------------------------------" << endl;
1917 std::vector<simPrimaryVertex> simpv;
1918 std::vector<SimPart> tsim;
1934 <<
"PrimaryVertexAnalyzer4PU::analyze event counter=" <<
eventcounter_
1945 std::cout <<
"Some problem occurred with the particle data table. This may not work !" <<std::endl;
1949 bool bnoBS=iEvent.
getByLabel(
"offlinePrimaryVertices", recVtxs);
1952 bool bBS=iEvent.
getByLabel(
"offlinePrimaryVerticesWithBS", recVtxsBS);
1955 bool bDA=iEvent.
getByLabel(
"offlinePrimaryVerticesDA", recVtxsDA);
1968 int nhighpurity=0, ntot=0;
1969 for(reco::TrackCollection::const_iterator
t=recTrks->begin();
t!=recTrks->end(); ++
t){
1973 if(ntot>10)
hnoBS[
"highpurityTrackFraction"]->Fill(
float(nhighpurity)/
float(ntot));
1975 if(
verbose_){
cout <<
"rejected, " << nhighpurity <<
" highpurity out of " << ntot <<
" total tracks "<< endl<< endl;}
1990 cout <<
" beamspot not found, using dummy " << endl;
1996 if((recVtxs->begin()->
isValid())&&(recVtxs->begin()->ndof()>1)&&(recVtxs->begin()->ndof()>(0.0*recVtxs->begin()->tracksSize()))){
2001 cout << Form(
"XBS %10d %5d %10d %4d %lu %5.2f %8f %8f %8f %8f %8f %8f",
2003 (
unsigned long)(recVtxs->begin()->tracksSize()), recVtxs->begin()->ndof(),
2004 recVtxs->begin()->x(), recVtxs->begin()->xError(),
2005 recVtxs->begin()->y(), recVtxs->begin()->yError(),
2006 recVtxs->begin()->z(), recVtxs->begin()->zError()
2032 bool gotTP=iEvent.
getByLabel(
"mix",
"MergedTrackTruth",TPCollectionH);
2033 bool gotTV=iEvent.
getByLabel(
"mix",
"MergedTrackTruth",TVCollectionH);
2040 vector<SimEvent> simEvt;
2041 if (gotTP && gotTV ){
2048 simEvt=
getSimEvents(TPCollectionH, TVCollectionH, trackCollectionH);
2050 if (simEvt.size()==0){
2051 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2052 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2053 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2054 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2055 cout <<
" !!!!!!!!!!!!!!!!!!!!!! got TrackingParticles but no simEvt !!!!!!!!!!!!!!!!!" << endl;
2056 cout <<
" dumping Tracking particles " << endl;
2058 for(TrackingParticleCollection::const_iterator it=simTracks->begin(); it!=simTracks->end(); it++){
2059 cout << *it << endl;
2061 cout <<
" dumping Tracking Vertices " << endl;
2063 for(TrackingVertexCollection::const_iterator iv=tpVtxs->begin(); iv!=tpVtxs->end(); iv++){
2064 cout << *iv << endl;
2067 cout <<
"dumping simTracks" << endl;
2068 for(SimTrackContainer::const_iterator
t=simTrks->begin();
t!=simTrks->end(); ++
t){
2071 cout <<
"dumping simVertexes" << endl;
2072 for(SimVertexContainer::const_iterator vv=simVtxs->begin();
2075 cout << *vv << endl;
2078 cout <<
"no hepMC" << endl;
2080 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2082 const HepMC::GenEvent* evt=evtMC->GetEvent();
2084 std::cout <<
"process id " <<evt->signal_process_id()<<std::endl;
2085 std::cout <<
"signal process vertex "<< ( evt->signal_process_vertex() ?
2086 evt->signal_process_vertex()->barcode() : 0 ) <<std::endl;
2087 std::cout <<
"number of vertices " << evt->vertices_size() << std::endl;
2090 cout <<
"no event in HepMC" << endl;
2092 cout <<
" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
2103 cout <<
"Found Tracking Vertices " << endl;
2108 }
else if(iEvent.
getByLabel(mcproduct,evtMC)){
2113 cout <<
"Using HepMCProduct " << endl;
2114 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){
2530 for(vector<SimEvent>::iterator ev=simEvt.begin(); ev!=simEvt.end(); ev++){
2531 if ((ev->nmatch>0)&&(ev->zmatch==
v->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;
3380 for (
int i = 0;
i != 3;
i++) {
3381 for (
int j =
i;
j != 3;
j++) {
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);
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)
std::vector< TrackingParticle > TrackingParticleCollection
trackRef_iterator tracks_end() const
last iterator over tracks
void setBeamSpot(const reco::BeamSpot &beamSpot)
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
reco::TrackBase::ParameterVector ParameterVector
std::map< std::string, TH1 * > hsimPV
std::vector< SimVertex >::const_iterator g4v_iterator
edm::Handle< reco::BeamSpot > recoBeamSpotHandle_
std::vector< reco::TransientTrack > tk
double theta() const
polar angle
double dxyError() const
error on dxy
Sin< T >::type sin(const T &t)
Global3DPoint GlobalPoint
std::vector< Track > TrackCollection
collection of Tracks
Geom::Theta< T > theta() const
int pixelLayersWithMeasurement() const
int bunchCrossing() const
edm::LuminosityBlockNumber_t luminosityBlock() const
static bool match(const ParameterVector &a, const ParameterVector &b)
edm::ESHandle< TransientTrackBuilder > theB_
double phi() const
azimuthal angle of momentum vector
std::vector< Vertex > VertexCollection
collection of Vertex objects
math::Vector< dimension >::type ParameterVector
parameter vector
double px() const
x coordinate of momentum vector
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void printRecVtxs(const edm::Handle< reco::VertexCollection > recVtxs, std::string title="Reconstructed Vertices")
reco::BeamSpot vertexBeamSpot_
const Point & position() const
position
TrajectoryStateClosestToBeamLine stateAtBeamLine() const
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
auto const T2 &decltype(t1.eta()) t2
bool truthMatchedTrack(edm::RefToBase< reco::Track >, TrackingParticleRef &)
float trackWeight(const TrackBaseRef &r) const
returns the weight with which a Track has contributed to the vertex-fit.
int trackerLayersWithMeasurement() const
int bunchCrossing() const
get the detector field from this detid
GlobalPoint position() const
std::map< std::string, TH1 * > bookVertexHistograms()
double pt() const
track transverse momentum
void printPVTrks(const edm::Handle< reco::TrackCollection > &recTrks, const edm::Handle< reco::VertexCollection > &recVtxs, std::vector< SimPart > &tsim, std::vector< SimEvent > &simEvt, const bool selectedOnly=true)
Cos< T >::type cos(const T &t)
std::vector< int > matchedRecTrackIndex
virtual CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &) const
Tan< T >::type tan(const T &t)
double z() const
y coordinate
double lambda() const
Lambda angle.
std::vector< simPrimaryVertex > getSimPVs(const edm::Handle< edm::HepMCProduct > evtMC)
float ChiSquaredProbability(double chiSquared, double nrDOF)
double BeamWidthX() const
beam width X
const HitPattern & trackerExpectedHitsInner() const
Access the hit pattern counting (in the Tracker) the number of expected crossed layers before the fir...
void printSimVtxs(const edm::Handle< edm::SimVertexContainer > simVtxs)
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
void printEventSummary(std::map< std::string, TH1 * > &h, const edm::Handle< reco::VertexCollection > recVtxs, const edm::Handle< reco::TrackCollection > recTrks, std::vector< SimEvent > &simEvt, const std::string message)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
HepPDT::ParticleData ParticleData
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
virtual reco::RecoToSimCollection associateRecoToSim(edm::Handle< edm::View< reco::Track > > &tCH, edm::Handle< TrackingParticleCollection > &tPCH, const edm::Event *event, const edm::EventSetup *setup) const
compare reco to sim the handle of reco::Track and TrackingParticle collections
FTS const & trackStateAtPCA() const
double pz() const
z coordinate of momentum vector
std::map< std::string, TH1 * > hBS
std::vector< reco::TransientTrack > tkprim
double dzError() const
error on dz
reco::Vertex::trackRef_iterator trackit_t
std::string getReleaseVersion()
double vz() const
z coordinate of the reference point on track
TrackAssociatorBase * associatorByHits_
GlobalPoint position() const
void matchRecTracksToVertex(simPrimaryVertex &pv, const std::vector< SimPart > &tsim, const edm::Handle< reco::TrackCollection > &recTrks)
double significance() const
bool isResonance(const HepMC::GenParticle *p)
const Track & track() const
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
void printRecTrks(const edm::Handle< reco::TrackCollection > &recTrks)
void getTc(const std::vector< reco::TransientTrack > &, double &, double &, double &, double &, double &)
XYZPointD XYZPoint
point in space with cartesian internal representation
tuple idx
DEBUGGING if hasattr(process,"trackMonIterativeTracking2012"): print "trackMonIterativeTracking2012 D...
std::vector< TrackingVertex > TrackingVertexCollection
reco::RecoToSimCollection r2s_
int pixelBarrelLayersWithMeasurement() const
T const * product() const
double BeamWidthY() const
beam width Y
int * supf(std::vector< SimPart > &simtrks, const reco::TrackCollection &trks)
T const * product() const
PrimaryVertexAnalyzer4PU(const edm::ParameterSet &)
const EncodedEventId & eventId() const
Pixel cluster – collection of neighboring pixels above threshold.
double vy() const
y coordinate of the reference point on track
void printSimTrks(const edm::Handle< edm::SimTrackContainer > simVtrks)
char data[epos_bytes_allocation]
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
< trclass="colgroup">< tdclass="colgroup"colspan=5 > DT local reconstruction</td ></tr >< tr >< td >< ahref="classDTRecHit1DPair.html"> DTRecHit1DPair</a ></td >< td >< ahref="DataFormats_DTRecHit.html"> edm::RangeMap & lt
unsigned short found() const
Number of valid hits on track.
std::string recoTrackProducer_
std::vector< TrackBaseRef >::const_iterator trackRef_iterator
The iteratator for the vector<TrackRef>
double y0() const
y coordinate
int charge() const
track electric charge
const Point & position() const
position
void printHitPattern(int position, std::ostream &stream) const
trackRef_iterator tracks_begin() const
first iterator over tracks
void dumpHitInfo(const reco::Track &t)
T const * get() const
Returns C++ pointer to the item.
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
virtual void analyze(const edm::Event &, const edm::EventSetup &)
std::vector< edm::RefToBase< reco::Track > > getTruthMatchedVertexTracks(const reco::Vertex &)
value_type const * get() const
edm::ESHandle< ParticleDataTable > pdt_
std::map< double, TrackingParticleRef > z2tp_
tuple size
Write out results.
Power< A, B >::type pow(const A &a, const B &b)
size_t tracksSize() const
number of tracks
double py() const
y coordinate of momentum vector
void analyzeVertexCollection(std::map< std::string, TH1 * > &h, const edm::Handle< reco::VertexCollection > recVtxs, const edm::Handle< reco::TrackCollection > recTrks, std::vector< simPrimaryVertex > &simpv, const std::string message="")
double vx() const
x coordinate of the reference point on track
math::Error< dimension >::type CovarianceMatrix
5 parameter covariance matrix
const LorentzVector & position() const
double x0() const
x coordinate
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.