13 #include "vxd/modules/vxdDQM/VXDDQMExpressRecoModule.h"
15 #include <framework/datastore/StoreArray.h>
16 #include <framework/datastore/RelationArray.h>
18 #include <svd/dataobjects/SVDShaperDigit.h>
19 #include <svd/dataobjects/SVDCluster.h>
20 #include <svd/geometry/SensorInfo.h>
22 #include <pxd/dataobjects/PXDDigit.h>
23 #include <pxd/dataobjects/PXDCluster.h>
24 #include <pxd/geometry/SensorInfo.h>
26 #include <vxd/geometry/SensorInfoBase.h>
27 #include <vxd/geometry/GeoTools.h>
31 #include <boost/format.hpp>
33 #include "TDirectory.h"
52 setDescription(
"VXD DQM module for Express Reco "
53 "Recommended Number of events for monitor is 40 kEvents or more to fill all histograms "
56 setPropertyFlags(c_ParallelProcessingCertified);
57 addParam(
"UseDigits", m_UseDigits,
58 "flag <0,1> for using digits only, no cluster information will be required, default = 0 ", m_UseDigits);
59 addParam(
"CorrelationGranulation", m_CorrelationGranulation,
60 "Set granulation of histogram plots, default is 1 degree, min = 0.02 degree, max = 1 degree ", m_CorrelationGranulation);
61 addParam(
"SwapPXD", m_SwapPXD,
"flag <0,1> very special case for swap of phi-theta coordinates, default = 0 ", m_SwapPXD);
62 addParam(
"CutCorrelationSigPXD", m_CutCorrelationSigPXD,
63 "Cut threshold of PXD signal for accepting to correlations, default = 0 ADU ", m_CutCorrelationSigPXD);
64 addParam(
"CutCorrelationSigUSVD", m_CutCorrelationSigUSVD,
65 "Cut threshold of SVD signal for accepting to correlations in u, default = 0 ADU ", m_CutCorrelationSigUSVD);
66 addParam(
"CutCorrelationSigVSVD", m_CutCorrelationSigVSVD,
67 "Cut threshold of SVD signal for accepting to correlations in v, default = 0 ADU ", m_CutCorrelationSigVSVD);
68 addParam(
"CutCorrelationTimeSVD", m_CutCorrelationTimeSVD,
69 "Cut threshold of SVD time window for accepting to correlations, default = 70 ns ", m_CutCorrelationTimeSVD);
71 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
"Name of the directory where histograms will be placed",
72 std::string(
"VXDExpReco"));
76 VXDDQMExpressRecoModule::~VXDDQMExpressRecoModule()
84 void VXDDQMExpressRecoModule::defineHisto()
86 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
87 if (gTools->getNumberOfLayers() == 0) {
88 B2WARNING(
"Missing geometry for VXD, check steering file.");
91 if (gTools->getNumberOfPXDLayers() == 0) {
92 B2WARNING(
"Missing geometry for PXD.");
94 if (gTools->getNumberOfSVDLayers() == 0) {
95 B2WARNING(
"Missing geometry for SVD.");
99 TDirectory* oldDir = gDirectory;
100 if (m_histogramDirectoryName !=
"") {
101 oldDir->mkdir(m_histogramDirectoryName.c_str());
102 oldDir->cd(m_histogramDirectoryName.c_str());
105 if (m_CorrelationGranulation > 5.0) m_CorrelationGranulation = 5.0;
106 if (m_CorrelationGranulation < 0.02) m_CorrelationGranulation = 0.02;
109 int h_MaxBins = 2000;
114 int nVXDLayers = gTools->getNumberOfLayers();
117 m_correlationsSP = (TH2F**)
new TH2F*[nVXDLayers * nVXDLayers];
118 m_correlationsSP1DPhi = (TH1F**)
new TH1F*[nVXDLayers * nVXDLayers];
119 m_correlationsSP1DTheta = (TH1F**)
new TH1F*[nVXDLayers * nVXDLayers];
122 for (
int i = 0; i < nVXDLayers; i++) {
123 for (
int j = 0; j < nVXDLayers; j++) {
124 m_correlationsSP[nVXDLayers * j + i] = NULL;
125 m_correlationsSP1DPhi[nVXDLayers * j + i] = NULL;
126 m_correlationsSP1DTheta[nVXDLayers * j + i] = NULL;
130 string Diru = str(format(
"Phi"));
131 string Dirv = str(format(
"Theta"));
132 string Unit = str(format(
"degree"));
133 string AxisTitPhi = str(format(
"%1% position [%2%]") % Diru.c_str() %
Unit.c_str());
134 string AxisTitTheta = str(format(
"%1% position [%2%]") % Dirv.c_str() %
Unit.c_str());
136 AxisTitPhi = str(format(
"From digits: %1%") % AxisTitPhi);
137 AxisTitTheta = str(format(
"From digits: %1%") % AxisTitTheta);
140 int i = layer1.getLayerNumber() - gTools->getFirstLayer();
141 float uSize1s, uSize1e;
142 float vSize1s, vSize1e;
143 int nStripsU1, nStripsV1;
148 nStripsU1 = (uSize1e - uSize1s) / m_CorrelationGranulation;
149 if (nStripsU1 > h_MaxBins) nStripsU1 = h_MaxBins;
150 nStripsV1 = nStripsU1;
152 int j = layer2.getLayerNumber() - gTools->getFirstLayer();
153 float uSize2s, uSize2e;
154 float vSize2s, vSize2e;
155 int nStripsU2, nStripsV2;
160 nStripsU2 = nStripsU1;
161 nStripsV2 = nStripsV1;
164 string nameSP = str(format(
"DQMER_VXD_Hitmap_L%1%") % layer2.getLayerNumber());
165 string titleSP = str(format(
"DQM ER VXD Hitmap, layer %1%") % layer2.getLayerNumber());
166 m_correlationsSP[nVXDLayers * j + i] =
new TH2F(nameSP.c_str(), titleSP.c_str(),
167 nStripsU2, uSize2s, uSize2e,
168 nStripsV2, vSize2s, vSize2e);
169 m_correlationsSP[nVXDLayers * j + i]->GetXaxis()->SetTitle(AxisTitPhi.c_str());
170 m_correlationsSP[nVXDLayers * j + i]->GetYaxis()->SetTitle(AxisTitTheta.c_str());
171 m_correlationsSP[nVXDLayers * j + i]->GetZaxis()->SetTitle(
"hits");
173 nameSP = str(format(
"DQMER_VXD_Hitmap_%1%_L%2%") % Diru.c_str() % layer2.getLayerNumber());
174 titleSP = str(format(
"DQM ER VXD Hitmap in %1%, layer %2%") % Diru.c_str() % layer2.getLayerNumber());
175 m_correlationsSP1DPhi[nVXDLayers * j + i] =
new TH1F(nameSP.c_str(), titleSP.c_str(),
176 nStripsU2, uSize2s, uSize2e);
177 m_correlationsSP1DPhi[nVXDLayers * j + i]->GetXaxis()->SetTitle(AxisTitPhi.c_str());
178 m_correlationsSP1DPhi[nVXDLayers * j + i]->GetYaxis()->SetTitle(
"hits");
180 nameSP = str(format(
"DQMER_VXD_Hitmap_%1%_L%2%") % Dirv.c_str() % layer2.getLayerNumber());
181 titleSP = str(format(
"DQM ER VXD Hitmap in %1%, layer %2%") % Dirv.c_str() % layer2.getLayerNumber());
182 m_correlationsSP1DTheta[nVXDLayers * j + i] =
new TH1F(nameSP.c_str(), titleSP.c_str(),
183 nStripsV2, vSize2s, vSize2e);
184 m_correlationsSP1DTheta[nVXDLayers * j + i]->GetXaxis()->SetTitle(AxisTitTheta.c_str());
185 m_correlationsSP1DTheta[nVXDLayers * j + i]->GetYaxis()->SetTitle(
"hits");
188 string nameSP = str(format(
"DQMER_VXD_Correlations_%1%_L%2%_L%3%") % Diru.c_str() % layer1.getLayerNumber() %
189 layer2.getLayerNumber());
190 string titleSP = str(format(
"DQM ER VXD Correlations in %1%, layers %2% %3%") % Diru.c_str() % layer1.getLayerNumber() %
191 layer2.getLayerNumber());
192 m_correlationsSP[nVXDLayers * j + i] =
new TH2F(nameSP.c_str(), titleSP.c_str(),
193 nStripsU1, uSize1s, uSize1e,
194 nStripsU2, uSize2s, uSize2e);
195 string axisxtitle = str(format(
"%1%, layer %2%") % AxisTitPhi.c_str() % layer1.getLayerNumber());
196 string axisytitle = str(format(
"%1%, layer %2%") % AxisTitPhi.c_str() % layer2.getLayerNumber());
197 m_correlationsSP[nVXDLayers * j + i]->GetXaxis()->SetTitle(axisxtitle.c_str());
198 m_correlationsSP[nVXDLayers * j + i]->GetYaxis()->SetTitle(axisytitle.c_str());
199 m_correlationsSP[nVXDLayers * j + i]->GetZaxis()->SetTitle(
"hits");
201 nameSP = str(format(
"DQMER_VXD_1D_Correlations_%1%_L%2%_L%3%") % Diru.c_str() % layer1.getLayerNumber() % layer2.getLayerNumber());
202 titleSP = str(format(
"DQM ER VXD 1D Correlations in %1%, layers %2% %3%") % Diru.c_str() % layer1.getLayerNumber() %
203 layer2.getLayerNumber());
204 m_correlationsSP1DPhi[nVXDLayers * j + i] =
new TH1F(nameSP.c_str(), titleSP.c_str(),
205 nStripsU1, uSize1s, uSize1e);
206 axisxtitle = str(format(
"%1%, layer %2% - %3%") % AxisTitPhi.c_str() % layer1.getLayerNumber() % layer2.getLayerNumber());
207 m_correlationsSP1DPhi[nVXDLayers * j + i]->GetXaxis()->SetTitle(axisxtitle.c_str());
208 m_correlationsSP1DPhi[nVXDLayers * j + i]->GetYaxis()->SetTitle(
"hits");
210 string nameSP = str(format(
"DQMER_VXD_Correlations_%1%_L%2%_L%3%") % Dirv.c_str() % layer1.getLayerNumber() %
211 layer2.getLayerNumber());
212 string titleSP = str(format(
"DQM ER VXD Correlations in %1%, layers %2% %3%") % Dirv.c_str() % layer1.getLayerNumber() %
213 layer2.getLayerNumber());
214 m_correlationsSP[nVXDLayers * j + i] =
new TH2F(nameSP.c_str(), titleSP.c_str(),
215 nStripsV1, vSize1s, vSize1e,
216 nStripsV2, vSize2s, vSize2e);
217 string axisxtitle = str(format(
"%1%, layer %2%") % AxisTitTheta.c_str() % layer1.getLayerNumber());
218 string axisytitle = str(format(
"%1%, layer %2%") % AxisTitTheta.c_str() % layer2.getLayerNumber());
219 m_correlationsSP[nVXDLayers * j + i]->GetXaxis()->SetTitle(axisxtitle.c_str());
220 m_correlationsSP[nVXDLayers * j + i]->GetYaxis()->SetTitle(axisytitle.c_str());
221 m_correlationsSP[nVXDLayers * j + i]->GetZaxis()->SetTitle(
"hits");
223 nameSP = str(format(
"DQMER_VXD_1D_Correlations_%1%_L%2%_L%3%") % Dirv.c_str() % layer1.getLayerNumber() % layer2.getLayerNumber());
224 titleSP = str(format(
"DQM ER VXD 1D Correlations in %1%, layers %2% %3%") % Dirv.c_str() % layer1.getLayerNumber() %
225 layer2.getLayerNumber());
226 m_correlationsSP1DTheta[nVXDLayers * j + i] =
new TH1F(nameSP.c_str(), titleSP.c_str(),
227 nStripsV1, -vSize1e, vSize1e);
228 axisxtitle = str(format(
"%1%, layer %2% - %3%") % AxisTitTheta.c_str() % layer1.getLayerNumber() % layer2.getLayerNumber());
229 m_correlationsSP1DTheta[nVXDLayers * j + i]->GetXaxis()->SetTitle(axisxtitle.c_str());
230 m_correlationsSP1DTheta[nVXDLayers * j + i]->GetYaxis()->SetTitle(
"hits");
239 void VXDDQMExpressRecoModule::initialize()
244 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
245 if (gTools->getNumberOfLayers() != 0) {
251 RelationArray relPXDClusterDigits(storePXDClusters, storePXDDigits);
252 RelationArray relSVDClusterDigits(storeSVDClusters, storeSVDShaperDigits);
253 m_storePXDClustersName = storePXDClusters.getName();
254 m_relPXDClusterDigitName = relPXDClusterDigits.
getName();
255 m_storeSVDClustersName = storeSVDClusters.getName();
256 m_relSVDClusterDigitName = relSVDClusterDigits.
getName();
258 storePXDDigits.isRequired();
259 storeSVDShaperDigits.isRequired();
262 m_storePXDDigitsName = storePXDDigits.getName();
263 m_storeSVDShaperDigitsName = storeSVDShaperDigits.getName();
267 void VXDDQMExpressRecoModule::beginRun()
269 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
270 if (gTools->getNumberOfLayers() == 0)
return;
273 int nVXDLayers = gTools->getNumberOfLayers();
274 for (
int i = 0; i < nVXDLayers; i++) {
275 for (
int j = 0; j < nVXDLayers; j++) {
276 if (m_correlationsSP[nVXDLayers * j + i] != NULL) m_correlationsSP[nVXDLayers * j + i]->Reset();
277 if (m_correlationsSP1DPhi[nVXDLayers * j + i] != NULL) m_correlationsSP1DPhi[nVXDLayers * j + i]->Reset();
278 if (m_correlationsSP1DTheta[nVXDLayers * j + i] != NULL) m_correlationsSP1DTheta[nVXDLayers * j + i]->Reset();
284 void VXDDQMExpressRecoModule::event()
286 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
287 if (gTools->getNumberOfLayers() == 0)
return;
295 const RelationArray relPXDClusterDigits(storePXDClusters, storePXDDigits, m_relPXDClusterDigitName);
296 const RelationArray relSVDClusterDigits(storeSVDClusters, storeSVDShaperDigits, m_relSVDClusterDigitName);
299 if (!storePXDDigits && !storeSVDShaperDigits)
return;
302 int nVXDLayers = gTools->getNumberOfLayers();
303 int firstVXDLayer = gTools->getFirstLayer();
304 int firstPXDLayer = gTools->getFirstPXDLayer();
305 int lastPXDLayer = gTools->getLastPXDLayer();
306 int firstSVDLayer = gTools->getFirstSVDLayer();
307 int lastSVDLayer = gTools->getLastSVDLayer();
317 if (MaxHits == 0)
return;
319 for (
int i1 = 0; i1 < MaxHits; i1++) {
322 float fPosSPU1 = 0.0;
323 float fPosSPV1 = 0.0;
331 const PXDDigit& digitPXD1 = *storePXDDigits[i1];
333 if ((iLayer1 < firstPXDLayer) || (iLayer1 > lastPXDLayer))
continue;
334 index1 = iLayer1 - firstVXDLayer;
336 if (fCharge1 < m_CutCorrelationSigPXD)
continue;
338 auto info =
dynamic_cast<const PXD::SensorInfo&
>(VXD::GeoCache::get(sensorID1));
339 TVector3 rLocal1(info.getUCellPosition(digitPXD1.
getUCellID()), info.getVCellPosition(digitPXD1.
getVCellID()), 0);
340 TVector3 ral1 = info.pointToGlobal(rLocal1);
344 fPosSPU1 = ral1.Phi() / TMath::Pi() * 180;
345 fPosSPV1 = ral1.Theta() / TMath::Pi() * 180;
347 fPosSPV1 = ral1.Phi() / TMath::Pi() * 180;
348 fPosSPU1 = ral1.Theta() / TMath::Pi() * 180;
353 if ((iLayer1 < firstSVDLayer) || (iLayer1 > lastSVDLayer))
continue;
354 index1 = iLayer1 - firstVXDLayer;
357 auto info =
dynamic_cast<const SVD::SensorInfo&
>(VXD::GeoCache::get(sensorID1));
361 for (
size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
362 float fCharge1 = samples[i];
363 if (fCharge1 > m_CutCorrelationSigUSVD) iCont = 1;
365 if (iCont == 0)
continue;
366 float possi = info.getUCellPosition(digitSVD1.
getCellID());
367 TVector3 rLocal1(possi, 0 , 0);
368 TVector3 ral1 = info.pointToGlobal(rLocal1);
370 fPosSPU1 = ral1.Phi() / TMath::Pi() * 180;
373 for (
size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
374 float fCharge1 = samples[i];
375 if (fCharge1 > m_CutCorrelationSigVSVD) iCont = 1;
377 if (iCont == 0)
continue;
380 float possi = info.getVCellPosition(digitSVD1.
getCellID());
382 TVector3 rLocal1(0, possi, 0);
383 TVector3 ral1 = info.pointToGlobal(rLocal1);
385 fPosSPV1 = ral1.Theta() / TMath::Pi() * 180;
390 const PXDCluster& clusterPXD1 = *storePXDClusters[i1];
392 if ((iLayer1 < firstPXDLayer) || (iLayer1 > lastPXDLayer))
continue;
393 index1 = iLayer1 - firstVXDLayer;
394 float fCharge1 = clusterPXD1.
getCharge();
395 if (fCharge1 < m_CutCorrelationSigPXD)
continue;
397 auto info =
dynamic_cast<const PXD::SensorInfo&
>(VXD::GeoCache::get(sensorID1));
398 TVector3 rLocal1(clusterPXD1.
getU(), clusterPXD1.
getV(), 0);
399 TVector3 ral1 = info.pointToGlobal(rLocal1);
403 fPosSPU1 = ral1.Phi() / TMath::Pi() * 180;
404 fPosSPV1 = ral1.Theta() / TMath::Pi() * 180;
406 fPosSPV1 = ral1.Phi() / TMath::Pi() * 180;
407 fPosSPU1 = ral1.Theta() / TMath::Pi() * 180;
412 if ((iLayer1 < firstSVDLayer) || (iLayer1 > lastSVDLayer))
continue;
413 index1 = iLayer1 - firstVXDLayer;
414 float fCharge1 = clusterSVD1.
getCharge();
417 auto info =
dynamic_cast<const SVD::SensorInfo&
>(VXD::GeoCache::get(sensorID1));
419 if (fCharge1 < m_CutCorrelationSigUSVD * 200)
continue;
420 TVector3 rLocal1(clusterSVD1.
getPosition(), 0 , 0);
421 TVector3 ral1 = info.pointToGlobal(rLocal1);
423 fPosSPU1 = ral1.Phi() / TMath::Pi() * 180;
425 if (fCharge1 < m_CutCorrelationSigVSVD * 200)
continue;
427 TVector3 ral1 = info.pointToGlobal(rLocal1);
429 fPosSPV1 = ral1.Theta() / TMath::Pi() * 180;
434 if ((iIsU1 == 1) && (iIsV1 == 1)) {
435 if (m_correlationsSP[nVXDLayers * index1 + index1] != NULL)
436 m_correlationsSP[nVXDLayers * index1 + index1]->Fill(fPosSPU1, fPosSPV1);
437 if (m_correlationsSP1DPhi[nVXDLayers * index1 + index1] != NULL)
438 m_correlationsSP1DPhi[nVXDLayers * index1 + index1]->Fill(fPosSPU1);
439 if (m_correlationsSP1DTheta[nVXDLayers * index1 + index1] != NULL)
440 m_correlationsSP1DTheta[nVXDLayers * index1 + index1]->Fill(fPosSPV1);
442 for (
int i2 = 0; i2 < MaxHits; i2++) {
445 float fPosSPU2 = 0.0;
446 float fPosSPV2 = 0.0;
454 const PXDDigit& digitPXD2 = *storePXDDigits[i2];
456 if ((iLayer2 < firstPXDLayer) || (iLayer2 > lastPXDLayer))
continue;
457 index2 = iLayer2 - firstVXDLayer;
459 if (fCharge2 < m_CutCorrelationSigPXD)
continue;
461 auto info =
dynamic_cast<const PXD::SensorInfo&
>(VXD::GeoCache::get(sensorID2));
462 TVector3 rLocal2(info.getUCellPosition(digitPXD2.
getUCellID()), info.getVCellPosition(digitPXD2.
getVCellID()), 0);
463 TVector3 ral2 = info.pointToGlobal(rLocal2);
467 fPosSPU2 = ral2.Phi() / TMath::Pi() * 180;
468 fPosSPV2 = ral2.Theta() / TMath::Pi() * 180;
470 fPosSPV2 = ral2.Phi() / TMath::Pi() * 180;
471 fPosSPU2 = ral2.Theta() / TMath::Pi() * 180;
476 if ((iLayer2 < firstSVDLayer) || (iLayer2 > lastSVDLayer))
continue;
477 index2 = iLayer2 - firstVXDLayer;
480 auto info =
dynamic_cast<const SVD::SensorInfo&
>(VXD::GeoCache::get(sensorID2));
485 for (
size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
486 float fCharge2 = samples[i];
487 if (fCharge2 > m_CutCorrelationSigUSVD) iCont = 1;
489 if (iCont == 0)
continue;
490 float possi = info.getUCellPosition(digitSVD2.
getCellID());
491 TVector3 rLocal2(possi, 0 , 0);
492 TVector3 ral2 = info.pointToGlobal(rLocal2);
494 fPosSPU2 = ral2.Phi() / TMath::Pi() * 180;
497 for (
size_t i = 0; i < SVDShaperDigit::c_nAPVSamples; ++i) {
498 float fCharge2 = samples[i];
499 if (fCharge2 > m_CutCorrelationSigVSVD) iCont = 1;
501 if (iCont == 0)
continue;
502 float possi = info.getVCellPosition(digitSVD2.
getCellID());
503 TVector3 rLocal2(0, possi, 0);
504 TVector3 ral2 = info.pointToGlobal(rLocal2);
506 fPosSPV2 = ral2.Theta() / TMath::Pi() * 180;
511 const PXDCluster& clusterPXD2 = *storePXDClusters[i2];
513 if ((iLayer2 < firstPXDLayer) || (iLayer2 > lastPXDLayer))
continue;
514 index2 = iLayer2 - firstVXDLayer;
515 float fCharge2 = clusterPXD2.
getCharge();
516 if (fCharge2 < m_CutCorrelationSigPXD)
continue;
518 auto info =
dynamic_cast<const PXD::SensorInfo&
>(VXD::GeoCache::get(sensorID2));
519 TVector3 rLocal2(clusterPXD2.
getU(), clusterPXD2.
getV(), 0);
520 TVector3 ral2 = info.pointToGlobal(rLocal2);
524 fPosSPU2 = ral2.Phi() / TMath::Pi() * 180;
525 fPosSPV2 = ral2.Theta() / TMath::Pi() * 180;
527 fPosSPV2 = ral2.Phi() / TMath::Pi() * 180;
528 fPosSPU2 = ral2.Theta() / TMath::Pi() * 180;
533 if ((iLayer2 < firstSVDLayer) || (iLayer2 > lastSVDLayer))
continue;
534 index2 = iLayer2 - firstVXDLayer;
535 float fCharge2 = clusterSVD2.
getCharge();
538 auto info =
dynamic_cast<const SVD::SensorInfo&
>(VXD::GeoCache::get(sensorID2));
540 if (fCharge2 < m_CutCorrelationSigUSVD * 200)
continue;
541 TVector3 rLocal2(clusterSVD2.
getPosition(), 0 , 0);
542 TVector3 ral2 = info.pointToGlobal(rLocal2);
544 fPosSPU2 = ral2.Phi() / TMath::Pi() * 180;
546 if (fCharge2 < m_CutCorrelationSigVSVD * 200)
continue;
548 TVector3 ral2 = info.pointToGlobal(rLocal2);
550 fPosSPV2 = ral2.Theta() / TMath::Pi() * 180;
554 if ((iIsPXD1 == 0) && (iIsPXD2 == 0))
555 if ((fabs(fTime1 - fTime2)) > m_CutCorrelationTimeSVD)
continue;
557 if ((index1 == index2) && (iIsU1 == 1) && (iIsV2 == 1) && (iIsPXD1 == 0) && (iIsPXD2 == 0)) {
559 if (m_correlationsSP[nVXDLayers * index2 + index1] != NULL)
560 m_correlationsSP[nVXDLayers * index2 + index1]->Fill(fPosSPU1, fPosSPV2);
561 if (m_correlationsSP1DPhi[nVXDLayers * index2 + index1] != NULL)
562 m_correlationsSP1DPhi[nVXDLayers * index2 + index1]->Fill(fPosSPU1);
563 if (m_correlationsSP1DTheta[nVXDLayers * index2 + index1] != NULL)
564 m_correlationsSP1DTheta[nVXDLayers * index2 + index1]->Fill(fPosSPV2);
565 }
else if ((index1 < index2) && (iIsU1 == iIsU2) && (iIsU1 == 1)) {
567 if (m_correlationsSP[nVXDLayers * index2 + index1] != NULL)
568 m_correlationsSP[nVXDLayers * index2 + index1]->Fill(fPosSPU1, fPosSPU2);
569 if (m_correlationsSP1DPhi[nVXDLayers * index2 + index1] != NULL)
570 m_correlationsSP1DPhi[nVXDLayers * index2 + index1]->Fill(fPosSPU2 - fPosSPU1);
571 }
else if ((index1 > index2) && (iIsV1 == iIsV2) && (iIsV1 == 1)) {
573 if (m_correlationsSP[nVXDLayers * index2 + index1] != NULL)
574 m_correlationsSP[nVXDLayers * index2 + index1]->Fill(fPosSPV2, fPosSPV1);
575 if (m_correlationsSP1DTheta[nVXDLayers * index2 + index1] != NULL)
576 m_correlationsSP1DTheta[nVXDLayers * index2 + index1]->Fill(fPosSPV2 - fPosSPV1);