12 #include <top/modules/TOPTimeRecalibrator/TOPTimeRecalibratorModule.h>
13 #include <top/geometry/TOPGeometryPar.h>
16 #include <framework/datastore/StoreArray.h>
17 #include <framework/datastore/StoreObjPtr.h>
20 #include <framework/logging/Logger.h>
47 setDescription(
"Utility module for re-calibrating time of TOPDigits. "
48 "Useful for checking new calibrations on existing cDST files. "
49 "Note that pulseWidth and timeError are not changed "
50 "although they also depend on time calibration.");
51 setPropertyFlags(c_ParallelProcessingCertified);
54 addParam(
"useSampleTimeCalibration", m_useSampleTimeCalibration,
55 "if true, use sample time calibration",
true);
56 addParam(
"useAsicShiftCalibration", m_useAsicShiftCalibration,
57 "if true, use ASIC shifts calibration",
true);
58 addParam(
"useChannelT0Calibration", m_useChannelT0Calibration,
59 "if true, use channel T0 calibration",
true);
60 addParam(
"useModuleT0Calibration", m_useModuleT0Calibration,
61 "if true, use module T0 calibration",
true);
62 addParam(
"useCommonT0Calibration", m_useCommonT0Calibration,
63 "if true, use common T0 calibration",
true);
64 addParam(
"useTimeWalkCalibration", m_useTimeWalkCalibration,
65 "if true, use time-walk calibration",
true);
66 addParam(
"subtractBunchTime", m_subtractBunchTime,
67 "if true, subtract reconstructed bunch time",
true);
71 void TOPTimeRecalibratorModule::initialize()
75 m_digits.isRequired();
76 m_recBunch.isRequired();
79 const auto* geo = TOPGeometryPar::Instance()->getGeometry();
80 m_syncTimeBase = geo->getNominalTDC().getSyncTimeBase();
81 m_sampleTimes.setTimeAxis(m_syncTimeBase);
85 void TOPTimeRecalibratorModule::beginRun()
91 if (m_useSampleTimeCalibration) {
92 if (not m_timebase.isValid()) {
93 B2FATAL(
"Sample time calibration requested but not available for run "
94 << evtMetaData->getRun()
95 <<
" of experiment " << evtMetaData->getExperiment());
98 if (m_useChannelT0Calibration) {
99 if (not m_channelT0.isValid()) {
100 B2FATAL(
"Channel T0 calibration requested but not available for run "
101 << evtMetaData->getRun()
102 <<
" of experiment " << evtMetaData->getExperiment());
105 if (m_useAsicShiftCalibration) {
106 if (not m_asicShift.isValid()) {
107 B2FATAL(
"ASIC shifts calibration requested but not available for run "
108 << evtMetaData->getRun()
109 <<
" of experiment " << evtMetaData->getExperiment());
112 if (m_useModuleT0Calibration) {
113 if (not m_moduleT0.isValid()) {
114 B2FATAL(
"Module T0 calibration requested but not available for run "
115 << evtMetaData->getRun()
116 <<
" of experiment " << evtMetaData->getExperiment());
119 if (m_useCommonT0Calibration) {
120 if (not m_commonT0.isValid()) {
121 B2FATAL(
"Common T0 calibration requested but not available for run "
122 << evtMetaData->getRun()
123 <<
" of experiment " << evtMetaData->getExperiment());
126 if (m_useTimeWalkCalibration) {
127 if (not m_timeWalk.isValid()) {
129 B2WARNING(
"Time-walk calibration is not available for run "
130 << evtMetaData->getRun()
131 <<
" of experiment " << evtMetaData->getExperiment());
135 if (not m_feSetting.isValid()) {
136 B2FATAL(
"Front-end settings are not available for run "
137 << evtMetaData->getRun()
138 <<
" of experiment " << evtMetaData->getExperiment());
143 void TOPTimeRecalibratorModule::event()
145 int revo9cnt = m_recBunch->getRevo9Counter();
146 double SSTfrac = (revo9cnt % 6) / 6.0;
147 double offset = m_feSetting->getOffset() / 24.0;
148 double timeOffset = (SSTfrac + offset) * m_syncTimeBase;
149 const auto& feMapper = TOPGeometryPar::Instance()->getFrontEndMapper();
150 const auto* geo = TOPGeometryPar::Instance()->getGeometry();
152 for (
auto& digit : m_digits) {
155 bool offsetStatus = digit.hasStatus(TOPDigit::c_OffsetSubtracted);
158 unsigned short statusBits = 0;
159 digit.setStatus(statusBits);
162 double rawTimeLeading = digit.getRawTime();
163 auto window = digit.getFirstWindow();
164 auto moduleID = digit.getModuleID();
165 auto channel = digit.getChannel();
168 const auto* sampleTimes = &m_sampleTimes;
169 if (m_useSampleTimeCalibration) {
170 auto bs = channel / 128;
171 const auto* feemap = feMapper.getMap(moduleID, bs);
173 B2ERROR(
"No front-end map available."
174 <<
LogVar(
"slot", moduleID)
175 <<
LogVar(
"boardstack", bs));
178 auto scrodID = feemap->getScrodID();
179 sampleTimes = m_timebase->getSampleTimes(scrodID, channel % 128);
180 if (sampleTimes->isCalibrated()) {
181 statusBits |= TOPDigit::c_TimeBaseCalibrated;
184 double time = sampleTimes->getTime(window, rawTimeLeading) - timeOffset;
187 if (m_useTimeWalkCalibration and m_timeWalk.isValid()) {
188 if (m_timeWalk->isCalibrated()) {
189 time -= m_timeWalk->getTimeWalk(digit.getPulseHeight());
192 if (m_useChannelT0Calibration) {
193 const auto& cal = m_channelT0;
194 if (cal->isCalibrated(moduleID, channel)) {
195 time -= cal->getT0(moduleID, channel);
196 statusBits |= TOPDigit::c_ChannelT0Calibrated;
199 if (m_useAsicShiftCalibration) {
200 auto asic = channel / 8;
201 if (m_asicShift->isCalibrated(moduleID, asic)) {
202 time -= m_asicShift->getT0(moduleID, asic);
205 if (m_useModuleT0Calibration) {
206 const auto& cal = m_moduleT0;
207 if (cal->isCalibrated(moduleID)) {
208 time -= cal->getT0(moduleID);
209 statusBits |= TOPDigit::c_ModuleT0Calibrated;
212 if (m_useCommonT0Calibration) {
213 const auto& cal = m_commonT0;
214 if (cal->isCalibrated()) {
215 time -= cal->getT0();
216 statusBits |= TOPDigit::c_CommonT0Calibrated;
221 if (m_subtractBunchTime and m_recBunch->isReconstructed()) {
222 time -= m_recBunch->getTime();
223 statusBits |= TOPDigit::c_EventT0Subtracted;
228 time -= geo->getNominalTDC().getOffset();
229 statusBits |= TOPDigit::c_OffsetSubtracted;
234 digit.setStatus(statusBits);