13 #include "svd/modules/svdDQM/SVDDQMClustersOnTrackModule.h"
15 #include <hlt/softwaretrigger/core/FinalTriggerDecisionCalculator.h>
16 #include <framework/datastore/DataStore.h>
17 #include <framework/datastore/StoreObjPtr.h>
18 #include <framework/datastore/StoreArray.h>
19 #include <framework/dataobjects/EventMetaData.h>
20 #include <svd/dataobjects/SVDShaperDigit.h>
21 #include <svd/dataobjects/SVDRecoDigit.h>
22 #include <svd/dataobjects/SVDCluster.h>
23 #include <tracking/dataobjects/RecoTrack.h>
25 #include <vxd/geometry/GeoTools.h>
27 #include <boost/format.hpp>
28 #include <boost/foreach.hpp>
30 #include "TDirectory.h"
35 using namespace SoftwareTrigger;
50 setDescription(
"SVD DQM module for Clusters related to Tracks.");
52 setPropertyFlags(c_ParallelProcessingCertified);
53 addParam(
"skipHLTRejectedEvents", m_skipRejectedEvents,
"If TRUE skip events rejected by HLT",
bool(
true));
54 addParam(
"TriggerBin", m_tb,
"select events for a specific trigger bin, if -1 then no seleciton is applied (default)",
int(-1));
55 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
"Name of the directory where histograms will be placed",
56 std::string(
"SVDClsTrk"));
57 addParam(
"desynchronizeSVDTime", m_desynchSVDTime,
58 "if TRUE (default is FALSE): svdTime back in SVD time reference",
bool(
false));
60 m_histoList =
new TList();
64 SVDDQMClustersOnTrackModule::~SVDDQMClustersOnTrackModule()
72 void SVDDQMClustersOnTrackModule::defineHisto()
74 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
75 if (gTools->getNumberOfLayers() == 0) {
76 B2FATAL(
"Missing geometry for VXD, check steering file.");
78 if (gTools->getNumberOfSVDLayers() == 0) {
79 B2WARNING(
"Missing geometry for SVD, SVD-DQM is skiped.");
84 TDirectory* oldDir = gDirectory;
85 if (m_histogramDirectoryName !=
"") {
86 oldDir->mkdir(m_histogramDirectoryName.c_str());
87 oldDir->cd(m_histogramDirectoryName.c_str());
91 float ChargeMax = 160;
101 TString refFrame =
"in FTSW reference";
102 if (m_desynchSVDTime)
103 refFrame =
"in SVD reference";
109 TString name =
"SVDTRK_ClusterChargeU3";
110 TString title =
"SVD U-Cluster-on-Track Charge for layer 3 sensors";
111 m_clsTrkChargeU3 =
new TH1F(name.Data(), title.Data(), ChargeBins, 0, ChargeMax);
112 m_clsTrkChargeU3->GetXaxis()->SetTitle(
"cluster charge [ke-]");
113 m_clsTrkChargeU3->GetYaxis()->SetTitle(
"count");
114 m_histoList->Add(m_clsTrkChargeU3);
115 name =
"SVDTRK_ClusterChargeV3";
116 title =
"SVD V-Cluster-on-Track Charge for layer 3 sensors";
117 m_clsTrkChargeV3 =
new TH1F(name.Data(), title.Data(), ChargeBins, 0, ChargeMax);
118 m_clsTrkChargeV3->GetXaxis()->SetTitle(
"cluster charge [ke-]");
119 m_clsTrkChargeV3->GetYaxis()->SetTitle(
"count");
120 m_histoList->Add(m_clsTrkChargeV3);
122 name =
"SVDTRK_ClusterChargeU456";
123 title =
"SVD U-Cluster-on-Track Charge for layers 4,5,6 sensors";
124 m_clsTrkChargeU456 =
new TH1F(name.Data(), title.Data(), ChargeBins, 0, ChargeMax);
125 m_clsTrkChargeU456->GetXaxis()->SetTitle(
"cluster charge [ke-]");
126 m_clsTrkChargeU456->GetYaxis()->SetTitle(
"count");
127 m_histoList->Add(m_clsTrkChargeU456);
129 name =
"SVDTRK_ClusterChargeV456";
130 title =
"SVD V-Cluster-on-Track Charge for layers 4,5,6 sensors";
131 m_clsTrkChargeV456 =
new TH1F(name.Data(), title.Data(), ChargeBins, 0, ChargeMax);
132 m_clsTrkChargeV456->GetXaxis()->SetTitle(
"cluster charge [ke-]");
133 m_clsTrkChargeV456->GetYaxis()->SetTitle(
"count");
134 m_histoList->Add(m_clsTrkChargeV456);
139 name =
"SVDTRK_ClusterSNRU3";
140 title =
"SVD U-Cluster-on-Track SNR for layer 3 sensors";
141 m_clsTrkSNRU3 =
new TH1F(name.Data(), title.Data(), SNRBins, 0, SNRMax);
142 m_clsTrkSNRU3->GetXaxis()->SetTitle(
"cluster SNR");
143 m_clsTrkSNRU3->GetYaxis()->SetTitle(
"count");
144 m_histoList->Add(m_clsTrkSNRU3);
145 name =
"SVDTRK_ClusterSNRV3";
146 title =
"SVD V-Cluster-on-Track SNR for layer 3 sensors";
147 m_clsTrkSNRV3 =
new TH1F(name.Data(), title.Data(), SNRBins, 0, SNRMax);
148 m_clsTrkSNRV3->GetXaxis()->SetTitle(
"cluster SNR");
149 m_clsTrkSNRV3->GetYaxis()->SetTitle(
"count");
150 m_histoList->Add(m_clsTrkSNRV3);
152 name =
"SVDTRK_ClusterSNRU456";
153 title =
"SVD U-Cluster-on-Track SNR for layers 4,5,6 sensors";
154 m_clsTrkSNRU456 =
new TH1F(name.Data(), title.Data(), SNRBins, 0, SNRMax);
155 m_clsTrkSNRU456->GetXaxis()->SetTitle(
"cluster SNR");
156 m_clsTrkSNRU456->GetYaxis()->SetTitle(
"count");
157 m_histoList->Add(m_clsTrkSNRU456);
158 name =
"SVDTRK_ClusterSNRV456";
159 title =
"SVD V-Cluster-on-Track SNR for layers 4,5,6 sensors";
160 m_clsTrkSNRV456 =
new TH1F(name.Data(), title.Data(), SNRBins, 0, SNRMax);
161 m_clsTrkSNRV456->GetXaxis()->SetTitle(
"cluster SNR");
162 m_clsTrkSNRV456->GetYaxis()->SetTitle(
"count");
163 m_histoList->Add(m_clsTrkSNRV456);
168 name =
"SVDTRK_ClusterTimeU3";
169 title = Form(
"SVD U-Cluster-on-Track Time %s for layer 3 sensors", refFrame.Data());
170 m_clsTrkTimeU3 =
new TH1F(name.Data(), title.Data(), TimeBins, TimeMin, TimeMax);
171 m_clsTrkTimeU3->GetXaxis()->SetTitle(
"cluster time (ns)");
172 m_clsTrkTimeU3->GetYaxis()->SetTitle(
"count");
173 m_histoList->Add(m_clsTrkTimeU3);
174 name =
"SVDTRK_ClusterTimeV3";
175 title = Form(
"SVD V-Cluster-on-Track Time %s for layer 3 sensors", refFrame.Data());
176 m_clsTrkTimeV3 =
new TH1F(name.Data(), title.Data(), TimeBins, TimeMin, TimeMax);
177 m_clsTrkTimeV3->GetXaxis()->SetTitle(
"cluster time (ns)");
178 m_clsTrkTimeV3->GetYaxis()->SetTitle(
"count");
179 m_histoList->Add(m_clsTrkTimeV3);
181 name =
"SVDTRK_ClusterTimeU456";
182 title = Form(
"SVD U-Cluster-on-Track Time %s for layers 4,5,6 sensors", refFrame.Data());
183 m_clsTrkTimeU456 =
new TH1F(name.Data(), title.Data(), TimeBins, TimeMin, TimeMax);
184 m_clsTrkTimeU456->GetXaxis()->SetTitle(
"cluster time (ns)");
185 m_clsTrkTimeU456->GetYaxis()->SetTitle(
"count");
186 m_histoList->Add(m_clsTrkTimeU456);
187 name =
"SVDTRK_ClusterTimeV456";
188 title = Form(
"SVD V-Cluster-on-Track Time %s for layers 4,5,6 sensors", refFrame.Data());
189 m_clsTrkTimeV456 =
new TH1F(name.Data(), title.Data(), TimeBins, TimeMin, TimeMax);
190 m_clsTrkTimeV456->GetXaxis()->SetTitle(
"cluster time (ns)");
191 m_clsTrkTimeV456->GetYaxis()->SetTitle(
"count");
192 m_histoList->Add(m_clsTrkTimeV456);
197 name =
"SVDTRK_ClusterTimeUvsEventT0";
198 title = Form(
"SVD U-Cluster-on-Track Time vs EventT0 %s for layer 3 sensors", refFrame.Data());
199 m_clsTrkTimeUEvtT0 =
new TH2F(name.Data(), title.Data(), TimeBins, TimeMin, TimeMax, 100, -50, 50);
200 m_clsTrkTimeUEvtT0->GetXaxis()->SetTitle(
"clusters time (ns)");
201 m_clsTrkTimeUEvtT0->GetYaxis()->SetTitle(
"EventT0 (ns)");
202 m_histoList->Add(m_clsTrkTimeUEvtT0);
203 name =
"SVDTRK_ClusterTimeVvsEventT0";
204 title = Form(
"SVD V-Cluster-on-Track Time vs EventT0 %s for layer 3 sensors", refFrame.Data());
205 m_clsTrkTimeVEvtT0 =
new TH2F(name.Data(), title.Data(), TimeBins, TimeMin, TimeMax, 100, -50, 50);
206 m_clsTrkTimeVEvtT0->GetXaxis()->SetTitle(
"cluster time (ns)");
207 m_clsTrkTimeVEvtT0->GetYaxis()->SetTitle(
"EventT0 (ns)");
208 m_histoList->Add(m_clsTrkTimeVEvtT0);
213 name =
"SVDTRK_StripMaxBinUAll";
214 title =
"SVD U-Strip-on-Track MaxBin for all sensors";
215 m_stripMaxBinUAll =
new TH1F(name.Data(), title.Data(), MaxBinBins, 0, MaxBinMax);
216 m_stripMaxBinUAll->GetXaxis()->SetTitle(
"max bin");
217 m_stripMaxBinUAll->GetYaxis()->SetTitle(
"count");
218 m_histoList->Add(m_stripMaxBinUAll);
219 name =
"SVDTRK_StripMaxBinVAll";
220 title =
"SVD V-Strip-on-Track MaxBin for all sensors";
221 m_stripMaxBinVAll =
new TH1F(name.Data(), title.Data(), MaxBinBins, 0, MaxBinMax);
222 m_stripMaxBinVAll->GetXaxis()->SetTitle(
"max bin");
223 m_stripMaxBinVAll->GetYaxis()->SetTitle(
"count");
224 m_histoList->Add(m_stripMaxBinVAll);
231 void SVDDQMClustersOnTrackModule::initialize()
236 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
237 if (gTools->getNumberOfSVDLayers() != 0) {
239 m_svdEventInfo.isOptional();
240 m_eventT0.isOptional();
241 m_storeTracks.isOptional();
242 m_resultStoreObjectPointer.isOptional();
247 void SVDDQMClustersOnTrackModule::beginRun()
250 m_expNumber = evtMetaData->getExperiment();
251 m_runNumber = evtMetaData->getRun();
253 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
254 if (gTools->getNumberOfSVDLayers() == 0)
return;
257 TString runID = TString::Format(
" ~ Exp%d Run%d", m_expNumber, m_runNumber);
259 TIter nextH(m_histoList);
260 while ((obj = nextH()))
261 if (obj->InheritsFrom(
"TH1")) {
262 ((TH1F*)obj)->SetTitle(obj->GetTitle() + runID);
263 if (obj != NULL)((TH1F*)obj)->Reset();
268 void SVDDQMClustersOnTrackModule::event()
271 if (!m_storeTracks.isValid()) {
272 B2WARNING(
"Missing Tracks StoreArray. Skipping SVDDQMClustersOnTrack");
276 if (!m_svdEventInfo.isValid())
280 if (m_svdEventInfo->getModeByte().getTriggerBin() != m_tb)
285 double eventT0 = -1000;
286 if (m_eventT0.isOptional())
287 if (m_eventT0.isValid())
288 if (m_eventT0->hasEventT0())
289 eventT0 = m_eventT0->getEventT0();
292 if (m_desynchSVDTime && m_svdEventInfo.isValid())
293 eventT0 = eventT0 - m_svdEventInfo->getSVD2FTSWTimeShift(0);
297 if (m_skipRejectedEvents && (m_resultStoreObjectPointer.isValid())) {
298 const bool eventAccepted = FinalTriggerDecisionCalculator::getFinalTriggerDecision(*m_resultStoreObjectPointer);
299 if (!eventAccepted)
return;
302 auto gTools = VXD::GeoCache::getInstance().getGeoTools();
303 if (gTools->getNumberOfSVDLayers() == 0)
return;
306 BOOST_FOREACH(
Track & track, m_storeTracks) {
308 const TrackFitResult* tfr = track.getTrackFitResultWithClosestMass(Const::pion);
314 for (
int cl = 0 ; cl < (int)svdClustersTrack.
size(); cl++) {
316 int iLayer = svdClustersTrack[cl]->getSensorID().getLayerNumber();
318 float time = svdClustersTrack[cl]->getClsTime();
319 if (m_desynchSVDTime && m_svdEventInfo.isValid())
320 time = time - m_svdEventInfo->getSVD2FTSWTimeShift(svdClustersTrack[cl]->getFirstFrame());
322 if (svdClustersTrack[cl]->isUCluster()) {
324 m_clsTrkTimeUEvtT0->Fill(time, eventT0);
327 if (m_clsTrkChargeU3 != NULL) m_clsTrkChargeU3->Fill(svdClustersTrack[cl]->getCharge() / 1000.0);
328 if (m_clsTrkSNRU3 != NULL) m_clsTrkSNRU3->Fill(svdClustersTrack[cl]->getSNR());
329 if (m_clsTrkTimeU3 != NULL) m_clsTrkTimeU3->Fill(time);
331 if (m_clsTrkChargeU456 != NULL) m_clsTrkChargeU456->Fill(svdClustersTrack[cl]->getCharge() / 1000.0);
332 if (m_clsTrkSNRU456 != NULL) m_clsTrkSNRU456->Fill(svdClustersTrack[cl]->getSNR());
333 if (m_clsTrkTimeU456 != NULL) m_clsTrkTimeU456->Fill(time);
337 if (recoDigits.
size() == 0)
continue;
339 for (UInt_t re = 0; re < recoDigits.
size(); re++) {
342 if (m_stripMaxBinUAll != NULL) m_stripMaxBinUAll->Fill(shaper[0]->getMaxTimeBin());
348 m_clsTrkTimeVEvtT0->Fill(time, eventT0);
351 if (m_clsTrkChargeV3 != NULL) m_clsTrkChargeV3->Fill(svdClustersTrack[cl]->getCharge() / 1000.0);
352 if (m_clsTrkSNRV3 != NULL) m_clsTrkSNRV3->Fill(svdClustersTrack[cl]->getSNR());
353 if (m_clsTrkTimeV3 != NULL) m_clsTrkTimeV3->Fill(time);
355 if (m_clsTrkChargeV456 != NULL) m_clsTrkChargeV456->Fill(svdClustersTrack[cl]->getCharge() / 1000.0);
356 if (m_clsTrkSNRV456 != NULL) m_clsTrkSNRV456->Fill(svdClustersTrack[cl]->getSNR());
357 if (m_clsTrkTimeV456 != NULL) m_clsTrkTimeV456->Fill(time);
361 if (recoDigits.
size() == 0)
continue;
363 for (UInt_t re = 0; re < recoDigits.
size(); re++) {
366 if (m_stripMaxBinVAll != NULL) m_stripMaxBinVAll->Fill(shaper[0]->getMaxTimeBin());
377 void SVDDQMClustersOnTrackModule::terminate()