13 #include <tracking/modules/trackingDQM/TrackDQMModule.h>
15 #include <framework/datastore/StoreArray.h>
16 #include <mdst/dataobjects/Track.h>
17 #include <tracking/dataobjects/RecoTrack.h>
18 #include <tracking/dataobjects/RecoHitInformation.h>
19 #include <svd/geometry/SensorInfo.h>
20 #include <pxd/geometry/SensorInfo.h>
22 #include <vxd/geometry/GeoTools.h>
24 #include <TDirectory.h>
44 setDescription(
"DQM of finding tracks, their momentum, "
45 "Number of hits in tracks, "
48 setPropertyFlags(c_ParallelProcessingCertified);
53 TrackDQMModule::~TrackDQMModule()
64 if (!recoTracks.isOptional()) {
65 B2WARNING(
"Missing recoTracks array, Track-DQM is skipped.");
69 if (!Tracks.isOptional()) {
70 B2WARNING(
"Missing Tracks array, Track-DQM is skipped.");
75 m_eventLevelTrackingInfo.isOptional();
86 if (gTools->getNumberOfLayers() == 0) {
87 B2WARNING(
"Missing geometry for VXD.");
91 int nVXDLayers = gTools->getNumberOfLayers();
92 int nVXDSensors = gTools->getNumberOfSensors();
93 float ResidualRange = 400;
97 TDirectory* oldDir = gDirectory;
100 TDirectory* TracksDQM = oldDir->GetDirectory(
"TracksDQM");
102 TracksDQM = oldDir->mkdir(
"TracksDQM");
104 TDirectory* TracksDQMAlignment = oldDir->GetDirectory(
"TracksDQMAlignment");
105 if (!TracksDQMAlignment)
106 TracksDQMAlignment = oldDir->mkdir(
"TracksDQMAlignment");
109 TDirectory* HalfShells = TracksDQM->GetDirectory(
"HalfShells");
111 HalfShells = TracksDQM->mkdir(
"HalfShells");
116 string name = str(format(
"MomPhi"));
117 string title = str(format(
"Momentum Phi of fit"));
118 m_MomPhi =
new TH1F(name.c_str(), title.c_str(), 180, -180, 180);
119 m_MomPhi->GetXaxis()->SetTitle(
"Mom Phi [deg]");
120 m_MomPhi->GetYaxis()->SetTitle(
"counts");
122 name = str(format(
"MomCosTheta"));
123 title = str(format(
"Cos of Momentum Theta of fit"));
124 m_MomCosTheta =
new TH1F(name.c_str(), title.c_str(), 100, -1, 1);
125 m_MomCosTheta->GetXaxis()->SetTitle(
"Mom CosTheta");
126 m_MomCosTheta->GetYaxis()->SetTitle(
"counts");
129 name = str(format(
"PValue"));
130 title = str(format(
"P value of fit"));
131 m_PValue =
new TH1F(name.c_str(), title.c_str(), 100, 0, 1);
132 m_PValue->GetXaxis()->SetTitle(
"p value");
133 m_PValue->GetYaxis()->SetTitle(
"counts");
135 name = str(format(
"Chi2"));
136 title = str(format(
"Chi2 of fit"));
137 m_Chi2 =
new TH1F(name.c_str(), title.c_str(), 200, 0, 150);
138 m_Chi2->GetXaxis()->SetTitle(
"Chi2");
139 m_Chi2->GetYaxis()->SetTitle(
"counts");
141 name = str(format(
"NDF"));
142 title = str(format(
"NDF of fit"));
143 m_NDF =
new TH1F(name.c_str(), title.c_str(), 200, 0, 200);
144 m_NDF->GetXaxis()->SetTitle(
"NDF");
145 m_NDF->GetYaxis()->SetTitle(
"counts");
147 name = str(format(
"Chi2NDF"));
148 title = str(format(
"Chi2 div NDF of fit"));
149 m_Chi2NDF =
new TH1F(name.c_str(), title.c_str(), 200, 0, 10);
150 m_Chi2NDF->GetXaxis()->SetTitle(
"Chi2NDF");
151 m_Chi2NDF->GetYaxis()->SetTitle(
"counts");
154 name = str(format(
"UBResidualsPXD"));
155 title = str(format(
"Unbiased residuals for PXD"));
156 m_UBResidualsPXD =
new TH2F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange, 200, -ResidualRange, ResidualRange);
157 m_UBResidualsPXD->GetXaxis()->SetTitle(
"u residual [#mum]");
158 m_UBResidualsPXD->GetYaxis()->SetTitle(
"v residual [#mum]");
159 m_UBResidualsPXD->GetZaxis()->SetTitle(
"counts");
161 name = str(format(
"UBResidualsSVD"));
162 title = str(format(
"Unbiased residuals for SVD"));
163 m_UBResidualsSVD =
new TH2F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange, 200, -ResidualRange, ResidualRange);
164 m_UBResidualsSVD->GetXaxis()->SetTitle(
"u residual [#mum]");
165 m_UBResidualsSVD->GetYaxis()->SetTitle(
"v residual [#mum]");
166 m_UBResidualsSVD->GetZaxis()->SetTitle(
"counts");
168 name = str(format(
"UBResidualsPXDU"));
169 title = str(format(
"Unbiased residuals in U for PXD"));
170 m_UBResidualsPXDU =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
171 m_UBResidualsPXDU->GetXaxis()->SetTitle(
"residual [#mum]");
172 m_UBResidualsPXDU->GetYaxis()->SetTitle(
"counts");
173 name = str(format(
"UBResidualsPXDV"));
174 title = str(format(
"Unbiased residuals in V for PXD"));
175 m_UBResidualsPXDV =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
176 m_UBResidualsPXDV->GetXaxis()->SetTitle(
"residual [#mum]");
177 m_UBResidualsPXDV->GetYaxis()->SetTitle(
"counts");
179 name = str(format(
"UBResidualsSVDU"));
180 title = str(format(
"Unbiased residuals in U for SVD"));
181 m_UBResidualsSVDU =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
182 m_UBResidualsSVDU->GetXaxis()->SetTitle(
"residual [#mum]");
183 m_UBResidualsSVDU->GetYaxis()->SetTitle(
"counts");
184 name = str(format(
"UBResidualsSVDV"));
185 title = str(format(
"Unbiased residuals in V for SVD"));
186 m_UBResidualsSVDV =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
187 m_UBResidualsSVDV->GetXaxis()->SetTitle(
"residual [#mum]");
188 m_UBResidualsSVDV->GetYaxis()->SetTitle(
"counts");
195 name =
"Alig_UBResidualsPXDX_Ying";
196 title =
"Unbiased residuals in X for PXD for Ying";
197 m_UBResidualsPXDX_Ying =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
198 m_UBResidualsPXDX_Ying->GetXaxis()->SetTitle(
"residual [#mum]");
199 m_UBResidualsPXDX_Ying->GetYaxis()->SetTitle(
"counts");
202 name =
"Alig_UBResidualsPXDX_Yang";
203 title =
"Unbiased residuals in X for PXD for Yang";
204 m_UBResidualsPXDX_Yang =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
205 m_UBResidualsPXDX_Yang->GetXaxis()->SetTitle(
"residual [#mum]");
206 m_UBResidualsPXDX_Yang->GetYaxis()->SetTitle(
"counts");
209 name =
"Alig_UBResidualsSVDX_Pat";
210 title =
"Unbiased residuals in X for SVD for Pat";
211 m_UBResidualsSVDX_Pat =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
212 m_UBResidualsSVDX_Pat->GetXaxis()->SetTitle(
"residual [#mum]");
213 m_UBResidualsSVDX_Pat->GetYaxis()->SetTitle(
"counts");
216 name =
"Alig_UBResidualsSVDX_Mat";
217 title =
"Unbiased residuals in X for SVD for Mat";
218 m_UBResidualsSVDX_Mat =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
219 m_UBResidualsSVDX_Mat->GetXaxis()->SetTitle(
"residual [#mum]");
220 m_UBResidualsSVDX_Mat->GetYaxis()->SetTitle(
"counts");
224 name =
"Alig_UBResidualsPXDY_Ying";
225 title =
"Unbiased residuals in Y for PXD for Ying";
226 m_UBResidualsPXDY_Ying =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
227 m_UBResidualsPXDY_Ying->GetXaxis()->SetTitle(
"residual [#mum]");
228 m_UBResidualsPXDY_Ying->GetYaxis()->SetTitle(
"counts");
231 name =
"Alig_UBResidualsPXDY_Yang";
232 title =
"Unbiased residuals in Y for PXD for Yang";
233 m_UBResidualsPXDY_Yang =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
234 m_UBResidualsPXDY_Yang->GetXaxis()->SetTitle(
"residual [#mum]");
235 m_UBResidualsPXDY_Yang->GetYaxis()->SetTitle(
"counts");
238 name =
"Alig_UBResidualsSVDY_Pat";
239 title =
"Unbiased residuals in Y for SVD for Pat";
240 m_UBResidualsSVDY_Pat =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
241 m_UBResidualsSVDY_Pat->GetXaxis()->SetTitle(
"residual [#mum]");
242 m_UBResidualsSVDY_Pat->GetYaxis()->SetTitle(
"counts");
245 name =
"Alig_UBResidualsSVDY_Mat";
246 title =
"Unbiased residuals in Y for SVD for Mat";
247 m_UBResidualsSVDY_Mat =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
248 m_UBResidualsSVDY_Mat->GetXaxis()->SetTitle(
"residual [#mum]");
249 m_UBResidualsSVDY_Mat->GetYaxis()->SetTitle(
"counts");
253 name =
"Alig_UBResidualsPXDZ_Ying";
254 title =
"Unbiased residuals in Z for PXD for Ying";
255 m_UBResidualsPXDZ_Ying =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
256 m_UBResidualsPXDZ_Ying->GetXaxis()->SetTitle(
"residual [#mum]");
257 m_UBResidualsPXDZ_Ying->GetYaxis()->SetTitle(
"counts");
260 name =
"Alig_UBResidualsPXDZ_Yang";
261 title =
"Unbiased residuals in Z for PXD for Yang";
262 m_UBResidualsPXDZ_Yang =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
263 m_UBResidualsPXDZ_Yang->GetXaxis()->SetTitle(
"residual [#mum]");
264 m_UBResidualsPXDZ_Yang->GetYaxis()->SetTitle(
"counts");
267 name =
"Alig_UBResidualsSVDZ_Pat";
268 title =
"Unbiased residuals in Z for SVD for Pat";
269 m_UBResidualsSVDZ_Pat =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
270 m_UBResidualsSVDZ_Pat->GetXaxis()->SetTitle(
"residual [#mum]");
271 m_UBResidualsSVDZ_Pat->GetYaxis()->SetTitle(
"counts");
274 name =
"Alig_UBResidualsSVDZ_Mat";
275 title =
"Unbiased residuals in Z for SVD for Mat";
276 m_UBResidualsSVDZ_Mat =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
277 m_UBResidualsSVDZ_Mat->GetXaxis()->SetTitle(
"residual [#mum]");
278 m_UBResidualsSVDZ_Mat->GetYaxis()->SetTitle(
"counts");
290 m_TracksVXD =
nullptr;
291 m_TracksCDC =
nullptr;
292 m_TracksVXDCDC =
nullptr;
297 int iHitsInCDC = 200;
301 float fMomRange = 6.0;
302 name = str(format(
"TrackMomentumX"));
303 title = str(format(
"Track Momentum X"));
304 m_MomX =
new TH1F(name.c_str(), title.c_str(), 2 * iMomRange, -fMomRange, fMomRange);
305 m_MomX->GetXaxis()->SetTitle(
"Momentum");
306 m_MomX->GetYaxis()->SetTitle(
"counts");
307 name = str(format(
"TrackMomentumY"));
308 title = str(format(
"Track Momentum Y"));
309 m_MomY =
new TH1F(name.c_str(), title.c_str(), 2 * iMomRange, -fMomRange, fMomRange);
310 m_MomY->GetXaxis()->SetTitle(
"Momentum");
311 m_MomY->GetYaxis()->SetTitle(
"counts");
312 name = str(format(
"TrackMomentumZ"));
313 title = str(format(
"Track Momentum Z"));
314 m_MomZ =
new TH1F(name.c_str(), title.c_str(), 2 * iMomRange, -fMomRange, fMomRange);
315 m_MomZ->GetXaxis()->SetTitle(
"Momentum");
316 m_MomZ->GetYaxis()->SetTitle(
"counts");
317 name = str(format(
"TrackMomentumPt"));
318 title = str(format(
"Track Momentum pT"));
319 m_MomPt =
new TH1F(name.c_str(), title.c_str(), 2 * iMomRange, 0.0, fMomRange);
320 m_MomPt->GetXaxis()->SetTitle(
"Momentum");
321 m_MomPt->GetYaxis()->SetTitle(
"counts");
322 name = str(format(
"TrackMomentumMag"));
323 title = str(format(
"Track Momentum Magnitude"));
324 m_Mom =
new TH1F(name.c_str(), title.c_str(), 2 * iMomRange, 0.0, fMomRange);
325 m_Mom->GetXaxis()->SetTitle(
"Momentum");
326 m_Mom->GetYaxis()->SetTitle(
"counts");
327 name = str(format(
"TrackZ0"));
328 title = str(format(
"z0 - the z coordinate of the perigee (beam spot position)"));
329 m_Z0 =
new TH1F(name.c_str(), title.c_str(), 200, -10.0, 10.0);
330 m_Z0->GetXaxis()->SetTitle(
"z0 [cm]");
331 m_Z0->GetYaxis()->SetTitle(
"Arb. Units");
332 name = str(format(
"TrackD0"));
333 title = str(format(
"d0 - the signed distance to the IP in the r-phi plane"));
334 m_D0 =
new TH1F(name.c_str(), title.c_str(), 200, -1.0, 1.0);
335 m_D0->GetXaxis()->SetTitle(
"d0 [cm]");
336 m_D0->GetYaxis()->SetTitle(
"Arb. Units");
337 name = str(format(
"TrackD0Phi"));
338 title = str(format(
"d0 vs Phi - the signed distance to the IP in the r-phi plane"));
339 m_D0Phi =
new TH2F(name.c_str(), title.c_str(), 72, -180.0, 180.0, 80, -0.4, 0.4);
340 m_D0Phi->GetXaxis()->SetTitle(
"#phi0 [deg]");
341 m_D0Phi->GetYaxis()->SetTitle(
"d0 [cm]");
342 m_D0Phi->GetZaxis()->SetTitle(
"Arb. Units");
343 name = str(format(
"TrackD0Z0"));
345 format(
"z0 vs d0 - signed distance to the IP in r-phi vs. z0 of the perigee (to see primary vertex shifts along R or z)"));
346 m_D0Z0 =
new TH2F(name.c_str(), title.c_str(), 200, -10.0, 10.0, 80, -0.4, 0.4);
347 m_D0Z0->GetXaxis()->SetTitle(
"z0 [cm]");
348 m_D0Z0->GetYaxis()->SetTitle(
"d0 [cm]");
349 m_D0Z0->GetZaxis()->SetTitle(
"Arb. Units");
351 name = str(format(
"TrackPhi"));
352 title = str(format(
"Phi - angle of the transverse momentum in the r-phi plane, with CDF naming convention"));
353 m_Phi =
new TH1F(name.c_str(), title.c_str(), 72, -180.0, 180.0);
354 m_Phi->GetXaxis()->SetTitle(
"#phi [deg]");
355 m_Phi->GetYaxis()->SetTitle(
"Arb. Units");
356 name = str(format(
"TrackTanLambda"));
357 title = str(format(
"TanLambda - the slope of the track in the r-z plane"));
358 m_TanLambda =
new TH1F(name.c_str(), title.c_str(), 400, -4.0, 4.0);
359 m_TanLambda->GetXaxis()->SetTitle(
"Tan Lambda");
360 m_TanLambda->GetYaxis()->SetTitle(
"Arb. Units");
361 name = str(format(
"TrackOmega"));
362 title = str(format(
"Omega - the curvature of the track. It's sign is defined by the charge of the particle"));
363 m_Omega =
new TH1F(name.c_str(), title.c_str(), 400, -0.1, 0.1);
364 m_Omega->GetXaxis()->SetTitle(
"Omega");
365 m_Omega->GetYaxis()->SetTitle(
"Arb. Units");
367 name = str(format(
"NoOfHitsInTrack_PXD"));
368 title = str(format(
"No Of Hits In Track - PXD"));
369 m_HitsPXD =
new TH1F(name.c_str(), title.c_str(), iHitsInPXD, 0, iHitsInPXD);
370 m_HitsPXD->GetXaxis()->SetTitle(
"# hits");
371 m_HitsPXD->GetYaxis()->SetTitle(
"counts");
372 name = str(format(
"NoOfHitsInTrack_SVD"));
373 title = str(format(
"No Of Hits In Track - SVD"));
374 m_HitsSVD =
new TH1F(name.c_str(), title.c_str(), iHitsInSVD, 0, iHitsInSVD);
375 m_HitsSVD->GetXaxis()->SetTitle(
"# hits");
376 m_HitsSVD->GetYaxis()->SetTitle(
"counts");
377 name = str(format(
"NoOfHitsInTrack_CDC"));
378 title = str(format(
"No Of Hits In Track - CDC"));
379 m_HitsCDC =
new TH1F(name.c_str(), title.c_str(), iHitsInCDC, 0, iHitsInCDC);
380 m_HitsCDC->GetXaxis()->SetTitle(
"# hits");
381 m_HitsCDC->GetYaxis()->SetTitle(
"counts");
382 name = str(format(
"NoOfHitsInTrack"));
383 title = str(format(
"No Of Hits In Track"));
384 m_Hits =
new TH1F(name.c_str(), title.c_str(), iHits, 0, iHits);
385 m_Hits->GetXaxis()->SetTitle(
"# hits");
386 m_Hits->GetYaxis()->SetTitle(
"counts");
388 name = str(format(
"NoOfTracksInVXDOnly"));
389 title = str(format(
"No Of Tracks Per Event, Only In VXD"));
390 m_TracksVXD =
new TH1F(name.c_str(), title.c_str(), iTracks, 0, iTracks);
391 m_TracksVXD->GetXaxis()->SetTitle(
"# tracks");
392 m_TracksVXD->GetYaxis()->SetTitle(
"counts");
393 name = str(format(
"NoOfTracksInCDCOnly"));
394 title = str(format(
"No Of Tracks Per Event, Only In CDC"));
395 m_TracksCDC =
new TH1F(name.c_str(), title.c_str(), iTracks, 0, iTracks);
396 m_TracksCDC->GetXaxis()->SetTitle(
"# tracks");
397 m_TracksCDC->GetYaxis()->SetTitle(
"counts");
398 name = str(format(
"NoOfTracksInVXDCDC"));
399 title = str(format(
"No Of Tracks Per Event, In VXD+CDC"));
400 m_TracksVXDCDC =
new TH1F(name.c_str(), title.c_str(), iTracks, 0, iTracks);
401 m_TracksVXDCDC->GetXaxis()->SetTitle(
"# tracks");
402 m_TracksVXDCDC->GetYaxis()->SetTitle(
"counts");
403 name = str(format(
"NoOfTracks"));
404 title = str(format(
"No Of All Tracks Per Event"));
405 m_Tracks =
new TH1F(name.c_str(), title.c_str(), iTracks, 0, iTracks);
406 m_Tracks->GetXaxis()->SetTitle(
"# tracks");
407 m_Tracks->GetYaxis()->SetTitle(
"counts");
409 if (gTools->getNumberOfLayers() == 0) {
410 B2WARNING(
"Missing geometry for VXD, VXD-DQM related are skiped.");
414 m_TRClusterHitmap = (TH2F**)
new TH2F*[nVXDLayers];
415 m_TRClusterCorrelationsPhi = (TH2F**)
new TH2F*[nVXDLayers - 1];
416 m_TRClusterCorrelationsTheta = (TH2F**)
new TH2F*[nVXDLayers - 1];
417 m_UBResidualsSensor = (TH2F**)
new TH2F*[nVXDSensors];
418 m_UBResidualsSensorU = (TH1F**)
new TH1F*[nVXDSensors];
419 m_UBResidualsSensorV = (TH1F**)
new TH1F*[nVXDSensors];
422 int i = layer.getLayerNumber();
423 int index = gTools->getLayerIndex(layer.getLayerNumber());
425 name = str(format(
"TRClusterHitmapLayer%1%") % i);
426 title = str(format(
"Cluster Hitmap for layer %1%") % i);
427 m_TRClusterHitmap[index] =
new TH2F(name.c_str(), title.c_str(), 360, -180.0, 180.0, 180, 0.0, 180.0);
428 m_TRClusterHitmap[index]->GetXaxis()->SetTitle(
"Phi angle [deg]");
429 m_TRClusterHitmap[index]->GetYaxis()->SetTitle(
"Theta angle [deg]");
430 m_TRClusterHitmap[index]->GetZaxis()->SetTitle(
"counts");
435 int i = layer.getLayerNumber();
436 if (i == gTools->getLastLayer())
continue;
437 int index = gTools->getLayerIndex(layer.getLayerNumber());
439 name = str(format(
"CorrelationsPhiLayers_%1%_%2%") % i % (i + 1));
440 title = str(format(
"Correlations in Phi for Layers %1% %2%") % i % (i + 1));
441 m_TRClusterCorrelationsPhi[index] =
new TH2F(name.c_str(), title.c_str(), 360, -180.0, 180.0, 360, -180.0, 180.0);
442 title = str(format(
"angle layer %1% [deg]") % i);
443 m_TRClusterCorrelationsPhi[index]->GetXaxis()->SetTitle(title.c_str());
444 title = str(format(
"angle layer %1% [deg]") % (i + 1));
445 m_TRClusterCorrelationsPhi[index]->GetYaxis()->SetTitle(title.c_str());
446 m_TRClusterCorrelationsPhi[index]->GetZaxis()->SetTitle(
"counts");
448 name = str(format(
"CorrelationsThetaLayers_%1%_%2%") % i % (i + 1));
449 title = str(format(
"Correlations in Theta for Layers %1% %2%") % i % (i + 1));
450 m_TRClusterCorrelationsTheta[index] =
new TH2F(name.c_str(), title.c_str(), 180, 0.0, 180.0, 180, 0.0, 180.0);
451 title = str(format(
"angle layer %1% [deg]") % i);
452 m_TRClusterCorrelationsTheta[index]->GetXaxis()->SetTitle(title.c_str());
453 title = str(format(
"angle layer %1% [deg]") % (i + 1));
454 m_TRClusterCorrelationsTheta[index]->GetYaxis()->SetTitle(title.c_str());
455 m_TRClusterCorrelationsTheta[index]->GetZaxis()->SetTitle(
"counts");
459 m_trackingErrorFlags =
new TH1F(
"NumberTrackingErrorFlags",
"Tracking error summary."
460 " Mean = errors/event (should be 0 or very close to 0); Error occured yes or no; Number of events", 2, -0.5, 1.5);
461 m_trackingErrorFlags->GetXaxis()->SetBinLabel(1,
"No Error");
462 m_trackingErrorFlags->GetXaxis()->SetBinLabel(2,
"Error occured");
464 TracksDQMAlignment->cd();
466 for (
int i = 0; i < nVXDSensors; i++) {
467 VxdID id = gTools->getSensorIDFromIndex(i);
469 int iLadder =
id.getLadderNumber();
470 int iSensor =
id.getSensorNumber();
472 string sensorDescr = str(format(
"%1%_%2%_%3%") % iLayer % iLadder % iSensor);
473 name = str(format(
"UBResidualsU_%1%") % sensorDescr);
474 sensorDescr = str(format(
"Layer %1% Ladder %2% Sensor %3%") % iLayer % iLadder % iSensor);
475 title = str(format(
"PXD Unbiased U residuals for sensor %1%") % sensorDescr);
476 m_UBResidualsSensorU[i] =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
477 m_UBResidualsSensorU[i]->GetXaxis()->SetTitle(
"residual [#mum]");
478 m_UBResidualsSensorU[i]->GetYaxis()->SetTitle(
"counts");
479 sensorDescr = str(format(
"%1%_%2%_%3%") % iLayer % iLadder % iSensor);
480 name = str(format(
"UBResidualsV_%1%") % sensorDescr);
481 sensorDescr = str(format(
"Layer %1% Ladder %2% Sensor %3%") % iLayer % iLadder % iSensor);
482 title = str(format(
"PXD Unbiased V residuals for sensor %1%") % sensorDescr);
483 m_UBResidualsSensorV[i] =
new TH1F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange);
484 m_UBResidualsSensorV[i]->GetXaxis()->SetTitle(
"residual [#mum]");
485 m_UBResidualsSensorV[i]->GetYaxis()->SetTitle(
"counts");
486 sensorDescr = str(format(
"%1%_%2%_%3%") % iLayer % iLadder % iSensor);
487 name = str(format(
"UBResiduals_%1%") % sensorDescr);
488 sensorDescr = str(format(
"Layer %1% Ladder %2% Sensor %3%") % iLayer % iLadder % iSensor);
489 title = str(format(
"PXD Unbiased residuals for sensor %1%") % sensorDescr);
490 m_UBResidualsSensor[i] =
new TH2F(name.c_str(), title.c_str(), 200, -ResidualRange, ResidualRange, 200, -ResidualRange,
492 m_UBResidualsSensor[i]->GetXaxis()->SetTitle(
"residual U [#mum]");
493 m_UBResidualsSensor[i]->GetYaxis()->SetTitle(
"residual V [#mum]");
494 m_UBResidualsSensor[i]->GetZaxis()->SetTitle(
"counts");
505 if (!recoTracks.isOptional())
return;
507 if (!Tracks.isOptional())
return;
512 if (m_MomPhi !=
nullptr) m_MomPhi->Reset();
513 if (m_MomCosTheta !=
nullptr) m_MomCosTheta->Reset();
514 if (m_PValue !=
nullptr) m_PValue->Reset();
515 if (m_Chi2 !=
nullptr) m_Chi2->Reset();
516 if (m_NDF !=
nullptr) m_NDF->Reset();
517 if (m_Chi2NDF !=
nullptr) m_Chi2NDF->Reset();
518 if (m_UBResidualsPXD !=
nullptr) m_UBResidualsPXD->Reset();
519 if (m_UBResidualsSVD !=
nullptr) m_UBResidualsSVD->Reset();
520 if (m_UBResidualsPXDU !=
nullptr) m_UBResidualsPXDU->Reset();
521 if (m_UBResidualsSVDU !=
nullptr) m_UBResidualsSVDU->Reset();
522 if (m_UBResidualsPXDV !=
nullptr) m_UBResidualsPXDV->Reset();
523 if (m_UBResidualsSVDV !=
nullptr) m_UBResidualsSVDV->Reset();
526 if (m_UBResidualsPXDX_Ying !=
nullptr) m_UBResidualsPXDX_Ying->Reset();
527 if (m_UBResidualsPXDX_Yang !=
nullptr) m_UBResidualsPXDX_Yang->Reset();
528 if (m_UBResidualsSVDX_Pat !=
nullptr) m_UBResidualsSVDX_Pat->Reset();
529 if (m_UBResidualsSVDX_Mat !=
nullptr) m_UBResidualsSVDX_Mat->Reset();
531 if (m_UBResidualsPXDY_Ying !=
nullptr) m_UBResidualsPXDY_Ying->Reset();
532 if (m_UBResidualsPXDY_Yang !=
nullptr) m_UBResidualsPXDY_Yang->Reset();
533 if (m_UBResidualsSVDY_Pat !=
nullptr) m_UBResidualsSVDY_Pat->Reset();
534 if (m_UBResidualsSVDY_Mat !=
nullptr) m_UBResidualsSVDY_Mat->Reset();
536 if (m_UBResidualsPXDZ_Ying !=
nullptr) m_UBResidualsPXDZ_Ying->Reset();
537 if (m_UBResidualsPXDZ_Yang !=
nullptr) m_UBResidualsPXDZ_Yang->Reset();
538 if (m_UBResidualsSVDZ_Pat !=
nullptr) m_UBResidualsSVDZ_Pat->Reset();
539 if (m_UBResidualsSVDZ_Mat !=
nullptr) m_UBResidualsSVDZ_Mat->Reset();
542 if (m_MomX !=
nullptr) m_MomX->Reset();
543 if (m_MomY !=
nullptr) m_MomY->Reset();
544 if (m_MomZ !=
nullptr) m_MomZ->Reset();
545 if (m_Mom !=
nullptr) m_Mom->Reset();
546 if (m_D0 !=
nullptr) m_D0->Reset();
547 if (m_D0Phi !=
nullptr) m_D0Phi->Reset();
548 if (m_D0Z0 !=
nullptr) m_D0Z0->Reset();
550 if (m_Z0 !=
nullptr) m_Z0->Reset();
551 if (m_Phi !=
nullptr) m_Phi->Reset();
552 if (m_TanLambda !=
nullptr) m_TanLambda->Reset();
553 if (m_Omega !=
nullptr) m_Omega->Reset();
554 if (m_HitsPXD !=
nullptr) m_HitsPXD->Reset();
555 if (m_HitsSVD !=
nullptr) m_HitsSVD->Reset();
556 if (m_HitsCDC !=
nullptr) m_HitsCDC->Reset();
557 if (m_Hits !=
nullptr) m_Hits->Reset();
558 if (m_TracksVXD !=
nullptr) m_TracksVXD->Reset();
559 if (m_TracksCDC !=
nullptr) m_TracksCDC->Reset();
560 if (m_TracksVXDCDC !=
nullptr) m_TracksVXDCDC->Reset();
561 if (m_Tracks !=
nullptr) m_Tracks->Reset();
563 if (m_trackingErrorFlags !=
nullptr) m_trackingErrorFlags->Reset();
566 if (gTools->getNumberOfLayers() == 0)
return;
569 int i = gTools->getLayerIndex(layer.getLayerNumber());
570 if (m_TRClusterHitmap && m_TRClusterHitmap[i] !=
nullptr) m_TRClusterHitmap[i]->Reset();
574 int i = layer.getLayerNumber();
575 if (i == gTools->getLastLayer())
continue;
576 i = gTools->getLayerIndex(i);
577 if (m_TRClusterCorrelationsPhi && m_TRClusterCorrelationsPhi[i] !=
nullptr) m_TRClusterCorrelationsPhi[i]->Reset();
578 if (m_TRClusterCorrelationsTheta && m_TRClusterCorrelationsTheta[i] !=
nullptr) m_TRClusterCorrelationsTheta[i]->Reset();
581 for (
int i = 0; i < gTools->getNumberOfSensors(); i++) {
582 if (m_UBResidualsSensor && m_UBResidualsSensor[i] !=
nullptr) m_UBResidualsSensor[i]->Reset();
583 if (m_UBResidualsSensorU && m_UBResidualsSensorU[i] !=
nullptr) m_UBResidualsSensorU[i]->Reset();
584 if (m_UBResidualsSensorV && m_UBResidualsSensorV[i] !=
nullptr) m_UBResidualsSensorV[i]->Reset();
594 if (!recoTracks.isOptional() || !recoTracks.
getEntries())
return;
596 if (!tracks.isOptional() || !tracks.getEntries())
return;
603 int iTrackVXDCDC = 0;
605 for (
const Track& track : tracks) {
607 if (!recoTrack.
size())
continue;
609 int nPXD = (int)pxdClustersTrack.
size();
611 int nSVD = (int)svdClustersTrack.
size();
613 int nCDC = (int)cdcHitTrack.
size();
625 if (tfr ==
nullptr)
continue;
627 TString message = Form(
"TrackDQM: track %3i, Mom: %f, %f, %f, Pt: %f, Mag: %f, Hits: PXD %i SVD %i CDC %i Suma %i\n",
634 nPXD, nSVD, nCDC, nPXD + nSVD + nCDC
636 B2DEBUG(20, message.Data());
643 m_MomCosTheta->Fill(cos(Theta));
645 if (recoTrack[0]->wasFitSuccessful()) {
646 if (!recoTrack[0]->getTrackFitStatus())
651 float NDF = recoTrack[0]->getTrackFitStatus()->getNdf();
654 m_Chi2->Fill(recoTrack[0]->getTrackFitStatus()->getChi2());
656 float Chi2NDF = recoTrack[0]->getTrackFitStatus()->getChi2() / NDF;
657 m_Chi2NDF->Fill(Chi2NDF);
660 float pValue = recoTrack[0]->getTrackFitStatus()->getPVal();
661 m_PValue->Fill(pValue);
665 float ResidUPlaneRHUnBias = 0;
666 float ResidVPlaneRHUnBias = 0;
667 float fPosSPUPrev = 0;
668 float fPosSPVPrev = 0;
674 bool isNotFirstHit =
false;
677 for (
auto recoHitInfo : recoTrack[0]->getRecoHitInformations(
true)) {
679 B2DEBUG(20,
"No genfit::pxd recoHitInfo is missing.");
682 if (!recoHitInfo->useInFit())
684 if (!((recoHitInfo->getTrackingDetector() == RecoHitInformation::c_PXD) ||
685 (recoHitInfo->getTrackingDetector() == RecoHitInformation::c_SVD)))
689 if (!recoTrack[0]->getCreatedTrackPoint(recoHitInfo)->getFitterInfo())
continue;
690 TVectorD resUnBias = recoTrack[0]->getCreatedTrackPoint(recoHitInfo)->getFitterInfo()->getResidual(0, biased).getState();
692 if (recoHitInfo->getTrackingDetector() == RecoHitInformation::c_PXD) {
694 VxdID sensorID = recoHitInfo->getRelatedTo<
PXDCluster>()->getSensorID();
697 TVector3 ral = info.pointToGlobal(rLocal,
true);
698 fPosSPU = ral.Phi() / TMath::Pi() * 180;
699 fPosSPV = ral.Theta() / TMath::Pi() * 180;
702 if (isNotFirstHit && ((iLayer - iLayerPrev) == 1)) {
703 int index = gTools->getLayerIndex(sensorID.
getLayerNumber()) - gTools->getFirstLayer();
704 m_TRClusterCorrelationsPhi[index]->Fill(fPosSPUPrev, fPosSPU);
705 m_TRClusterCorrelationsTheta[index]->Fill(fPosSPVPrev, fPosSPV);
707 isNotFirstHit =
true;
709 fPosSPUPrev = fPosSPU;
710 fPosSPVPrev = fPosSPV;
711 m_UBResidualsPXD->Fill(ResidUPlaneRHUnBias, ResidVPlaneRHUnBias);
712 m_UBResidualsPXDU->Fill(ResidUPlaneRHUnBias);
713 m_UBResidualsPXDV->Fill(ResidVPlaneRHUnBias);
714 int index = gTools->getSensorIndex(sensorID);
715 m_UBResidualsSensor[index]->Fill(ResidUPlaneRHUnBias, ResidVPlaneRHUnBias);
716 m_UBResidualsSensorU[index]->Fill(ResidUPlaneRHUnBias);
717 m_UBResidualsSensorV[index]->Fill(ResidVPlaneRHUnBias);
718 m_TRClusterHitmap[gTools->getLayerIndex(sensorID.
getLayerNumber())]->Fill(fPosSPU, fPosSPV);
721 TVector3 localResidual(ResidUPlaneRHUnBias, ResidVPlaneRHUnBias, 0);
722 auto globalResidual = info.vectorToGlobal(localResidual,
true);
725 m_UBResidualsPXDX_Ying->Fill(globalResidual.x());
726 m_UBResidualsPXDY_Ying->Fill(globalResidual.y());
727 m_UBResidualsPXDZ_Ying->Fill(globalResidual.z());
729 m_UBResidualsPXDX_Yang->Fill(globalResidual.x());
730 m_UBResidualsPXDY_Yang->Fill(globalResidual.y());
731 m_UBResidualsPXDZ_Yang->Fill(globalResidual.z());
734 if (recoHitInfo->getTrackingDetector() == RecoHitInformation::c_SVD) {
735 IsSVDU = recoHitInfo->getRelatedTo<
SVDCluster>()->isUCluster();
736 VxdID sensorID = recoHitInfo->getRelatedTo<
SVDCluster>()->getSensorID();
741 TVector3 ral = info.pointToGlobal(rLocal,
true);
742 fPosSPU = ral.Phi() / TMath::Pi() * 180;
744 if (sensorIDPrew != sensorID) {
745 ResidVPlaneRHUnBias = 0;
748 sensorIDPrew = sensorID;
751 TVector3 ral = info.pointToGlobal(rLocal,
true);
752 fPosSPV = ral.Theta() / TMath::Pi() * 180;
754 if (sensorIDPrew == sensorID) {
755 if (isNotFirstHit && ((iLayer - iLayerPrev) == 1)) {
756 int index = gTools->getLayerIndex(sensorID.
getLayerNumber()) - gTools->getFirstLayer();
757 m_TRClusterCorrelationsPhi[index]->Fill(fPosSPUPrev, fPosSPU);
758 m_TRClusterCorrelationsTheta[index]->Fill(fPosSPVPrev, fPosSPV);
760 isNotFirstHit =
true;
762 fPosSPUPrev = fPosSPU;
763 fPosSPVPrev = fPosSPV;
764 m_UBResidualsSVD->Fill(ResidUPlaneRHUnBias, ResidVPlaneRHUnBias);
765 m_UBResidualsSVDU->Fill(ResidUPlaneRHUnBias);
766 m_UBResidualsSVDV->Fill(ResidVPlaneRHUnBias);
767 int index = gTools->getSensorIndex(sensorID);
768 m_UBResidualsSensor[index]->Fill(ResidUPlaneRHUnBias, ResidVPlaneRHUnBias);
769 m_UBResidualsSensorU[index]->Fill(ResidUPlaneRHUnBias);
770 m_UBResidualsSensorV[index]->Fill(ResidVPlaneRHUnBias);
771 m_TRClusterHitmap[gTools->getLayerIndex(sensorID.
getLayerNumber())]->Fill(fPosSPU, fPosSPV);
774 TVector3 localResidual(ResidUPlaneRHUnBias, ResidVPlaneRHUnBias, 0);
775 auto globalResidual = info.vectorToGlobal(localResidual,
true);
778 m_UBResidualsSVDX_Pat->Fill(globalResidual.x());
779 m_UBResidualsSVDY_Pat->Fill(globalResidual.y());
780 m_UBResidualsSVDZ_Pat->Fill(globalResidual.z());
782 m_UBResidualsSVDX_Mat->Fill(globalResidual.x());
783 m_UBResidualsSVDY_Mat->Fill(globalResidual.y());
784 m_UBResidualsSVDZ_Mat->Fill(globalResidual.z());
787 if (sensorIDPrew != sensorID) {
788 ResidUPlaneRHUnBias = 0;
791 sensorIDPrew = sensorID;
796 if (((nPXD > 0) || (nSVD > 0)) && (nCDC > 0)) iTrackVXDCDC++;
797 if (((nPXD > 0) || (nSVD > 0)) && (nCDC == 0)) iTrackVXD++;
798 if (((nPXD == 0) && (nSVD == 0)) && (nCDC > 0)) iTrackCDC++;
799 if (m_MomX !=
nullptr) m_MomX->Fill(tfr->
getMomentum().Px());
800 if (m_MomY !=
nullptr) m_MomY->Fill(tfr->
getMomentum().Py());
801 if (m_MomZ !=
nullptr) m_MomZ->Fill(tfr->
getMomentum().Pz());
802 if (m_MomPt !=
nullptr) m_MomPt->Fill(tfr->
getMomentum().Pt());
803 if (m_Mom !=
nullptr) m_Mom->Fill(tfr->
getMomentum().Mag());
804 if (m_D0 !=
nullptr) m_D0->Fill(tfr->
getD0());
806 if (m_Z0 !=
nullptr) m_Z0->Fill(tfr->
getZ0());
807 if (m_D0Z0 !=
nullptr) m_D0Z0->Fill(tfr->
getZ0(), tfr->
getD0());
810 if (m_TanLambda !=
nullptr) m_TanLambda->Fill(tfr->
getTanLambda());
811 if (m_Omega !=
nullptr) m_Omega->Fill(tfr->
getOmega());
813 if (m_HitsPXD !=
nullptr) m_HitsPXD->Fill(nPXD);
814 if (m_HitsSVD !=
nullptr) m_HitsSVD->Fill(nSVD);
815 if (m_HitsCDC !=
nullptr) m_HitsCDC->Fill(nCDC);
816 if (m_Hits !=
nullptr) m_Hits->Fill(nPXD + nSVD + nCDC);
818 if (m_TracksVXD !=
nullptr) m_TracksVXD->Fill(iTrackVXD);
819 if (m_TracksCDC !=
nullptr) m_TracksCDC->Fill(iTrackCDC);
820 if (m_TracksVXDCDC !=
nullptr) m_TracksVXDCDC->Fill(iTrackVXDCDC);
821 if (m_Tracks !=
nullptr) m_Tracks->Fill(iTrack);
823 B2DEBUG(20,
"Some problem in Track DQM module!");
829 if (m_eventLevelTrackingInfo.isValid()) m_trackingErrorFlags->Fill((
double)m_eventLevelTrackingInfo->hasAnErrorFlag());
830 else m_trackingErrorFlags->Fill(0.0);
835 switch (layerNumber) {
837 return ladderNumber < 5 || ladderNumber > 8;
839 return ladderNumber < 7 || ladderNumber > 12;
847 switch (layerNumber) {
849 return ladderNumber < 3 || ladderNumber > 5;
851 return ladderNumber < 4 || ladderNumber > 8;
853 return ladderNumber < 5 || ladderNumber > 10;
855 return ladderNumber < 6 || ladderNumber > 13;