Belle II Software prerelease-11-00-00a
SVDTimeValidationCollectorModule.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#include <svd/modules/svdTimeValidationCollector/SVDTimeValidationCollectorModule.h>
9
10using namespace std;
11using namespace Belle2;
12
13//-----------------------------------------------------------------
14// Register the Module
15//-----------------------------------------------------------------
16REG_MODULE(SVDTimeValidationCollector);
17
18//-----------------------------------------------------------------
19// Implementation
20//-----------------------------------------------------------------
21
23{
24 //Set module properties
25
26 setDescription("Collector module used to create the histograms needed for the SVD 6-Sample CoG, 3-Sample CoG and 3-Sample ELS Time calibration");
28
29 addParam("SVDClustersName", m_svdClusters, "Name of the SVDClusters list", m_svdClusters);
30 addParam("SVDClustersOnTracksName", m_svdClustersOnTracks, "Name of the SVDClustersOnTracks list", m_svdClustersOnTracks);
31 addParam("EventT0Name", m_eventTime, "Name of the EventT0 list", m_eventTime);
32 addParam("RecoTracksName", m_recotrack, "Name of the RecoTracks list", m_recotrack);
33 addParam("TracksName", m_track, "Name of the Tracks list", m_track);
34 addParam("TimeAlgorithm", m_timeAlgo, "Time algorithm being validated (CoG6, CoG3, ELS3)", m_timeAlgo);
35}
36
38{
39
40 auto hEventT0 = new TH1F("hEventT0", "EventT0", 300, -150, 150);
41 registerObject<TH1F>("hEventT0", hEventT0);
42
43 auto hEventT0FromCDC = new TH1F("hEventT0FromCDC", "EventT0FromCDC", 300, -150, 150);
44 registerObject<TH1F>("hEventT0FromCDC", hEventT0FromCDC);
45 auto hEventT0FromSVD = new TH1F("hEventT0FromSVD", "EventT0FromSVD", 300, -150, 150);
46 registerObject<TH1F>("hEventT0FromSVD", hEventT0FromSVD);
47
48 auto hAbsoluteShiftValues = new TH1D("hAbsoluteShiftValues", "Fitted shift values ;Bin;Mean (ns)", 8, 0.5, 8.5);
49 registerObject<TH1D>("hAbsoluteShiftValues", hAbsoluteShiftValues);
50
51 m_svdCls.isRequired(m_svdClusters);
53 m_eventT0.isRequired(m_eventTime);
54 m_recoTrk.isRequired(m_recotrack);
55 m_trk.isRequired(m_track);
56
58 std::vector<Belle2::VxdID> allSensors;
59 for (auto layer : geoCache.getLayers(VXD::SensorInfoBase::SVD))
60 for (auto ladder : geoCache.getLadders(layer))
61 for (Belle2::VxdID sensor : geoCache.getSensors(ladder))
62 allSensors.push_back(sensor);
63
64 int numberOfSensorBin = 2 * int(allSensors.size());
65 B2INFO("Number of SensorBin: " << numberOfSensorBin);
66
67 TH2F* __hClsTimeOnTracks__ = new TH2F("__hClsTimeOnTracks__", "clsTimeOnTracks",
68 300, -150, 150,
69 numberOfSensorBin, + 0.5, numberOfSensorBin + 0.5);
70 TH2F* __hClsTimeAll__ = new TH2F("__hClsTimeAll__", "clsTimeAll",
71 300, -150, 150,
72 numberOfSensorBin, + 0.5, numberOfSensorBin + 0.5);
73 TH2F* __hClsDiffTimeOnTracks__ = new TH2F("__hClsDiffTimeOnTracks__", "clsDiffTimeOnTracks",
74 300, -150, 150,
75 numberOfSensorBin, + 0.5, numberOfSensorBin + 0.5);
76 TH3F* __hClusterSizeVsTimeResidual__ = new TH3F("__hClusterSizeVsTimeResidual__",
77 "ClusterSize vs Time Residual",
78 100, -25., 25., 10, 0.5, + 10.5,
79 numberOfSensorBin, + 0.5, numberOfSensorBin + 0.5);
80 TH1F* __hBinToSensorMap__ = new TH1F("__hBinToSensorMap__", "__BinToSensorMap__",
81 numberOfSensorBin, + 0.5, numberOfSensorBin + 0.5);
82 __hClsTimeOnTracks__->GetYaxis()->SetTitle("sensor");
83 __hClsTimeOnTracks__->GetXaxis()->SetTitle("clsTime_onTracks (ns)");
84 __hClsTimeAll__->GetYaxis()->SetTitle("sensor");
85 __hClsTimeAll__->GetXaxis()->SetTitle("clsTime_all (ns)");
86 __hClsDiffTimeOnTracks__->GetYaxis()->SetTitle("sensor");
87 __hClsDiffTimeOnTracks__->GetXaxis()->SetTitle("clsDiffTime_onTracks (ns)");
88 __hClusterSizeVsTimeResidual__->GetZaxis()->SetTitle("Sensor");
89 __hClusterSizeVsTimeResidual__->GetYaxis()->SetTitle("Cluster Size");
90 __hClusterSizeVsTimeResidual__->GetXaxis()->SetTitle("Cluster Time - EventT0 (ns)");
91
92 int tmpBinCnt = 0;
93 for (auto sensor : allSensors) {
94 for (auto view : {'U', 'V'}) {
95 tmpBinCnt++;
96 TString binLabel = TString::Format("L%iL%iS%i%c",
97 sensor.getLayerNumber(),
98 sensor.getLadderNumber(),
99 sensor.getSensorNumber(),
100 view);
101 __hBinToSensorMap__->GetXaxis()->SetBinLabel(tmpBinCnt, binLabel);
102 }
103 }
104 registerObject<TH2F>(__hClsTimeOnTracks__->GetName(), __hClsTimeOnTracks__);
105 registerObject<TH2F>(__hClsTimeAll__->GetName(), __hClsTimeAll__);
106 registerObject<TH2F>(__hClsDiffTimeOnTracks__->GetName(), __hClsDiffTimeOnTracks__);
107 registerObject<TH1F>(__hBinToSensorMap__->GetName(), __hBinToSensorMap__);
108 registerObject<TH3F>(__hClusterSizeVsTimeResidual__->GetName(), __hClusterSizeVsTimeResidual__);
109}
110
112{
113 getObjectPtr<TH1F>("hEventT0")->Reset();
114 getObjectPtr<TH1F>("hEventT0FromCDC")->Reset();
115 getObjectPtr<TH1F>("hEventT0FromSVD")->Reset();
116 getObjectPtr<TH2F>("__hClsTimeOnTracks__")->Reset();
117 getObjectPtr<TH2F>("__hClsTimeAll__")->Reset();
118 getObjectPtr<TH2F>("__hClsDiffTimeOnTracks__")->Reset();
119 getObjectPtr<TH3F>("__hClusterSizeVsTimeResidual__")->Reset();
120 getObjectPtr<TH1F>("__hBinToSensorMap__")->Reset();
121 getObjectPtr<TH1D>("hAbsoluteShiftValues")->Reset();
122
123 // Load absolute time shifts from payload
124 if (m_svdAbsTimeShift.isValid()) {
125 const TString alg = TString(m_timeAlgo.c_str());
126 for (int layer : {3, 4, 5, 6})
127 for (bool side : {true, false}) {
128 const int binIdx = 2 * (layer - 3) + side + 1;
129 const TString binLabel = TString::Format("L%dS%c", layer, side ? 'U' : 'V');
130 getObjectPtr<TH1D>("hAbsoluteShiftValues")->GetXaxis()->SetBinLabel(binIdx, binLabel);
131 getObjectPtr<TH1D>("hAbsoluteShiftValues")->SetBinContent(binIdx, m_svdAbsTimeShift->getAbsTimeShift(alg, layer, side));
132 }
133
134 } else {
135 B2WARNING("SVD Absolute Cluster Time Shift object not found in database");
136 }
137}
138
140{
141
142 if (m_eventT0->hasTemporaryEventT0(Const::EDetector::CDC)) {
143 auto evtT0CDC = m_eventT0->getBestCDCTemporaryEventT0();
144 float eventT0 = evtT0CDC->eventT0;
145 getObjectPtr<TH1F>("hEventT0")->Fill(eventT0);
146
147 // also get CDC and SVD T0
148 if (m_eventT0->hasTemporaryEventT0(Const::EDetector::CDC)) {
149 auto evtT0CDC = m_eventT0->getBestCDCTemporaryEventT0();
150 getObjectPtr<TH1F>("hEventT0FromCDC")->Fill(evtT0CDC->eventT0);
151 } else {B2WARNING("Found no CDC event T0");}
152 if (m_eventT0->hasTemporaryEventT0(Const::EDetector::SVD)) {
153 auto evtT0SVD = m_eventT0->getBestSVDTemporaryEventT0();
154 getObjectPtr<TH1F>("hEventT0FromSVD")->Fill(evtT0SVD->eventT0);
155 } else {B2WARNING("Found no SVD event T0");}
156
157
158
159 // Fill histograms clusters on tracks
160 for (const auto& svdCluster : m_svdClsOnTrk) {
161 // get cluster time
162 float clusterTime = svdCluster.getClsTime();
163 int clusterSize = svdCluster.getSize();
164
165 TString binLabel = TString::Format("L%iL%iS%i%c",
166 svdCluster.getSensorID().getLayerNumber(),
167 svdCluster.getSensorID().getLadderNumber(),
168 svdCluster.getSensorID().getSensorNumber(),
169 svdCluster.isUCluster() ? 'U' : 'V');
170 int sensorBin = getObjectPtr<TH1F>("__hBinToSensorMap__")->GetXaxis()->FindBin(binLabel.Data());
171 double sensorBinCenter = getObjectPtr<TH1F>("__hBinToSensorMap__")->GetXaxis()->GetBinCenter(sensorBin);
172
173 getObjectPtr<TH2F>("__hClsTimeOnTracks__")->Fill(clusterTime, sensorBinCenter);
174 getObjectPtr<TH2F>("__hClsDiffTimeOnTracks__")->Fill(clusterTime - eventT0, sensorBinCenter);
175 getObjectPtr<TH3F>("__hClusterSizeVsTimeResidual__")->Fill(clusterTime - eventT0, clusterSize, sensorBinCenter);
176 };
177
178 // Fill histograms with all clusters
179 for (const auto& svdCluster : m_svdCls) {
180 // get cluster time
181 float clusterTime = svdCluster.getClsTime();
182
183 TString binLabel = TString::Format("L%iL%iS%i%c",
184 svdCluster.getSensorID().getLayerNumber(),
185 svdCluster.getSensorID().getLadderNumber(),
186 svdCluster.getSensorID().getSensorNumber(),
187 svdCluster.isUCluster() ? 'U' : 'V');
188 int sensorBin = getObjectPtr<TH1F>("__hBinToSensorMap__")->GetXaxis()->FindBin(binLabel.Data());
189 double sensorBinCenter = getObjectPtr<TH1F>("__hBinToSensorMap__")->GetXaxis()->GetBinCenter(sensorBin);
190
191 getObjectPtr<TH2F>("__hClsTimeAll__")->Fill(clusterTime, sensorBinCenter);
192 };
193 }
194}
void registerObject(const std::string &name, T *obj)
Register object with a name, takes ownership, do not access the pointer beyond prepare()
T * getObjectPtr(const std::string &name)
Calls the CalibObjManager to get the requested stored collector data.
CalibrationCollectorModule()
Constructor. Sets the default prefix for calibration dataobjects.
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition Module.h:80
StoreArray< SVDCluster > m_svdClsOnTrk
SVDClusters store array.
void prepare() override final
Initialize the module.
StoreObjPtr< EventT0 > m_eventT0
EventT0 store object pointer.
StoreArray< SVDCluster > m_svdCls
SVDClusters store array.
StoreArray< Track > m_trk
Tracks store object pointer.
std::string m_timeAlgo
Time algorithm being validated (CoG6, CoG3, ELS3)
DBObjPtr< SVDAbsoluteClusterTimeShift > m_svdAbsTimeShift
SVDAbsoluteClusterTimeShift.
StoreArray< RecoTrack > m_recoTrk
RecoTracks store object pointer.
void startRun() override final
Called when entering a new run.
Class to facilitate easy access to sensor information of the VXD like coordinate transformations or p...
Definition GeoCache.h:38
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition GeoCache.cc:214
Class to uniquely identify a any structure of the PXD and SVD.
Definition VxdID.h:32
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.
STL namespace.