Belle II Software development
ECLLocalRunCalibratorModule.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
9/* Own header. */
10#include <ecl/modules/eclLocalRunCalibration/ECLLocalRunCalibratorModule.h>
11
12/* ECL headers. */
13#include <ecl/dataobjects/ECLElementNumbers.h>
14#include <ecl/dataobjects/ECLTrig.h>
15
16/* ROOT headers. */
17#include <TFile.h>
18
19using namespace Belle2;
20//-----------------------------------------------------------------
21// Register the Module
22//-----------------------------------------------------------------
23REG_MODULE(ECLLocalRunCalibrator);
24//-----------------------------------------------------------------
25// Implementation
26//-----------------------------------------------------------------
27// Number of cell ids.
29// Time payload name.
30const std::string
32// Amplitude payload name.
33const std::string
35// Constructor.
37 m_time(nullptr), m_ampl(nullptr)
38{
39 // Module description.
40 setDescription("ECL Local Run Calibration.");
41 // Initial lower limit for time.
42 addParam("minTime", m_minTime, "Initial lower limit for time.", -500.f);
43 // Initial upper limit for time.
44 addParam("maxTime", m_maxTime, "Initial upper limit for time.", 500.f);
45 // Initial lower limit for amplitude.
46 addParam("minAmpl", m_minAmpl, "Initial lower limit for amplitude.", 1.e+04f);
47 // Initial upper limit for amplitude.
48 addParam("maxAmpl", m_maxAmpl, "Initial upper limit for amplitude.", 3.e+04f);
49 // Number of standard deviations
50 // used to update lower and
51 // upper value limits.
52 addParam("nOfStdDevs", m_devs,
53 "Number of standard deviations used to form initial limits.", 5);
54 // Boolean flag used to choose local or central DB.
55 addParam("isLocal", m_isLocal, "Boolean flag used to"
56 "select local or central DB.", true);
57 // Default path to a local database.
58 std::string defaultDBName = "localdb/database.txt";
59 // Central DB name or path to a local DB.
60 addParam("dbName", m_dbName, "Central DB name or path "
61 "to a local DB.", defaultDBName);
62 // Used to change validity intervals in the previous run.
63 addParam("changePrev", m_changePrev,
64 "If changePrev is set, the upper run in the interval of "
65 "validity for the previous written payload will be changed.",
66 false);
67 // Low run for the current validity interval.
68 addParam("lowRun", m_lowRun,
69 "Low run for validity interval. "
70 "If the low run value is negative, "
71 "current run number "
72 "is used as a low run.", -1);
73 // High run for the current validity interval.
74 addParam("highRun", m_highRun,
75 "High run for validity interval. "
76 "If the high run value is equal to -1, "
77 "the high run of validity interval is not limited.",
78 -1);
79 // Mark current run as reference.
80 addParam("addRef", m_addref,
81 "Mark run as reference if it is"
82 "needed to do that at start",
83 false);
84 // Enables histogram filling mode.
85 addParam("fillHisto", m_isFillHisto,
86 "Fill time and amplitude histograms"
87 "for a certain cell id.", false);
88 // Cell id.
89 addParam("cellid", m_cellid,
90 "Cell id number, used to "
91 "fill amplitude or time histogram.");
92 // Default file name used to save histograms,
93 // obtained in the histogram filling mode.
94 const std::string defaultHistoFileName =
95 "time_ampl_histo.root";
96 // File name used to save histograms,
97 // obtained in the histogram filling mode.
98 addParam("histoFileName", m_histoFileName,
99 "File name used to save amplitude and time"
100 "histograms for a certain cell id.",
101 defaultHistoFileName);
102 // Enables full tree writing mode.
103 addParam("fulltree", m_fulltree,
104 "Fill full tree.", false);
105}
106// Destructor.
108{
109 if (m_time) {
110 delete m_time;
111 }
112 if (m_ampl) {
113 delete m_ampl;
114 }
115}
116// Begin run
118{
119 if (m_isFillHisto) {
120 // Histogram filling mode.
121 // Creating histograms, which will
122 // be contain time and amplitude distributions
123 // for a certain cell id.
124 m_histo_time = new TH1F("histo_time", "", 10000, -1, -1);
125 m_histo_ampl = new TH1F("histo_ampl", "", 10000, -1, -1);
126 } else {
127 // Local run calibration mode.
128 // Creating objects, which will be contain
129 // time and amplitude accumulators for all
130 // cell ids.
133 &m_devs);
136 &m_devs);
137 if (m_fulltree) {
138 m_tree = new TTree("localrun", "");
139 m_tree->Branch("cellid", &m_tree_cellid,
140 "m_tree_cellid/I");
141 m_tree->Branch("time", &m_tree_time,
142 "time/F");
143 m_tree->Branch("ampl", &m_tree_ampl,
144 "ampl/F");
145 m_tree_event = 0;
146 m_tree->Branch("event", &m_tree_event,
147 "event/I");
148 }
149 }
150}
151// Event.
153{
154 // Getting amplitude and time input values.
155 if (!m_ECLDigits.isValid()) {
156 B2FATAL("ECLDigits not valid");
157 }
158 // Loop over the input array.
159 for (const auto& digit : m_ECLDigits) {
160 // Getting cell id and setting the
161 // corresponding index.
162 auto cellid = digit.getCellId();
163 auto index = cellid - 1;
164 // Check that the cell id is valid.
165 if (index < 0 || index >= signed(c_ncellids)) {
166 B2FATAL("ECLLocalRunCalibratorModule::event(): cell id = "
167 << cellid << " out of range!");
168 }
169 // Getting raw time and decoding it.
170 auto time = digit.getTimeFit();
171 auto shiftedTime = time + getTimeShift(digit);
172 // Getting amplitude.
173 auto ampl = digit.getAmp();
174 if (m_isFillHisto) {
175 // Histogram filling mode.
176 // Filling time and amplitude
177 // histograms for a certain
178 // cell id.
179 if (cellid == m_cellid) {
180 m_histo_time->Fill(shiftedTime);
181 m_histo_ampl->Fill(ampl);
182 }
183 } else {
184 // Local run calibration mode.
185 // Accumulating time mean
186 // values and standard deviations.
187 m_time->add(index, shiftedTime);
188 // Accumulating amplitude mean
189 // values and standard deviations.
190 m_ampl->add(index, ampl);
191 if (m_fulltree) {
192 m_tree_cellid = cellid;
193 m_tree_time = shiftedTime;
194 m_tree_ampl = ampl;
195 m_tree->Fill();
196 }
197 // Enabling negative value alarm,
198 // if there are negative amplitudes.
199 if (ampl < 0) {
200 m_ampl->enableNegAmpl();
201 }
202 }
203 }
204
205 if (m_fulltree) {
206 m_tree_event++;
207 }
208}
209// Write histograms to file
210// in the case of the histogram
211// filling mode.
213{
214 TFile fl(m_histoFileName.c_str(), "recreate");
215 fl.cd();
216 m_histo_time->Write();
217 m_histo_ampl->Write();
218 fl.Close();
219 delete m_histo_time;
220 delete m_histo_ampl;
221}
222// Write calibration results
223// into a database.
225{
226 // Getting experiment and run
227 // numbers.
228 int exp = m_EventMetaData->getExperiment();
229 int run = m_EventMetaData->getRun();
230 int lowrun;
231 // Setting low run
232 // of validity interval.
233 if (m_lowRun < 0) {
234 lowrun = run;
235 } else {
236 lowrun = m_lowRun;
237 }
238 // Creating validity interval.
239 IntervalOfValidity iov(exp, lowrun, exp, m_highRun);
240 // Saving time payload.
241 m_time->writeToDB(m_isLocal, m_dbName,
243 run, m_changePrev, m_addref);
244 // Saving amplitude payload.
245 m_ampl->writeToDB(m_isLocal, m_dbName,
247 run, m_changePrev, m_addref);
248}
249// End run.
251{
252 if (m_isFillHisto) {
253 // Histogram filling mode.
254 // Writing histograms to file.
256 } else {
257 // Local run calibration
258 // mode.
259 // Getting accumulated
260 // mean values and
261 // standard deviations.
262 m_time->calc();
263 m_ampl->calc();
264 // Saving calibration results
265 // into a database.
267 if (m_fulltree) {
268 auto fl = TFile::Open("/ghi/fs01/belle2/bdata/group/detector/ECL/local-run-db/data-full/ecl_local_run_fulltree.root",
269 "recreate");
270 fl->cd();
271 m_tree->Write();
272 fl->Close();
273 delete m_tree;
274 }
275 }
276}
277// Read collector's time to
278// tune the time starting point.
280 const ECLDigit& digit) const
281{
282 auto trig =
283 static_cast<uint32_t>(
284 digit.getRelationsTo<ECLTrig>()[0]->getTimeTrig());
285 switch (decodeTrigTime(trig) % 3) {
286 case 1 : return 8;
287 case 2 : return -8;
288 }
289 return 0;
290}
291// Decode time obtained
292// from collector.
293inline uint32_t
295{
296 // Bits magic by
297 // Vladimir Zhulanov.
298 return time - 2 * (time / 8);
299}
300
Class to store ECL digitized hits (output of ECLDigi) relation to ECLHit filled in ecl/modules/eclDig...
Definition ECLDigit.h:24
ECLLocalRunCalibUnit is the class designed for the control of mean value and the standard deviation a...
std::string m_dbName
Tag of central database or path to a local database.
float m_tree_ampl
Amplitude variable used to fill tree.
bool m_isFillHisto
If m_isFillHisto is false, than the mode of local run calibration is enabled.
bool m_isLocal
Enables local database usage.
TTree * m_tree
Full tree of times and amplitudes per each cellid before calculating mean values.
float m_tree_time
Time variable used to fill tree.
static const std::string c_amplPayloadName
Name of the amplitude payload.
static const std::string c_timePayloadName
Name of the time payload.
bool m_addref
If m_addref is true, then the current calibration run will be marked as reference run immediately aft...
float m_maxAmpl
Maximum allowed amplitude value.
float m_minTime
Minimum allowed time value.
StoreArray< ECLDigit > m_ECLDigits
ECL digits.
int m_tree_event
Event variable used to fill tree.
int m_tree_cellid
Cellid variable used to fill tree.
ECLLocalRunCalibUnit * m_ampl
m_ampl contains amplitude mean value and standard deviation accumulators for all cell ids.
TH1F * m_histo_ampl
m_histo_ampl is the name of the histogram, which contains amplitude distribution for a certain cell i...
bool m_fulltree
Write full tree of times and amplitudes per each cellid (before calculating mean values) to file "ecl...
ECLLocalRunCalibUnit * m_time
m_time contains time mean value and standard deviation accumulators for all cell ids.
uint32_t decodeTrigTime(uint32_t time) const
Decode time.
float m_maxTime
Maximum allowed time value.
static const int c_ncellids
Number of cell ids.
std::string m_histoFileName
The path of the .root file with the histograms obtained in the histogram filling mode.
bool m_changePrev
If m_changePrev is true, the validity intervals of the previous payloads stored into the database wil...
int m_highRun
High run of the validity interval.
int m_lowRun
Low run of the validity interval.
void writeHistoToFile()
Write histograms to file in the case, if the histogram filling mode is enabled.
TH1F * m_histo_time
m_histo_time is the name of the histogram, which contains time distribution for a certain cell id.
void writeCalibResultsToDB()
Write calibration results into a database.
StoreObjPtr< EventMetaData > m_EventMetaData
Event metadata.
float m_minAmpl
Minimum allowed amplitude value.
int m_devs
Number of standard deviations used to update value limits.
int16_t getTimeShift(const ECLDigit &digit) const
Calculate time shift.
Class to store ECLTrig, still need to be study relation to ECLHit filled in ecl/modules/eclDigitizer/...
Definition ECLTrig.h:25
double getTimeTrig() const
Get Trig Time.
Definition ECLTrig.h:111
A class that describes the interval of experiments/runs for which an object in the database is valid.
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
RelationVector< TO > getRelationsTo(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from this object to another store array.
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
const int c_NCrystals
Number of crystals.
Abstract base class for different kinds of events.