Belle II Software development
KLMTimeAlgorithm.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 <klm/calibration/KLMTimeAlgorithm.h>
11
12/* KLM headers. */
13#include <klm/dataobjects/bklm/BKLMElementNumbers.h>
14
15/* Basf2 headers. */
16#include <framework/database/Database.h>
17#include <framework/database/DBObjPtr.h>
18#include <framework/database/DBStore.h>
19#include <framework/dataobjects/EventMetaData.h>
20#include <framework/gearbox/Const.h>
21#include <framework/logging/Logger.h>
22
23/* ROOT headers. */
24#include <Math/MinimizerOptions.h>
25#include <Math/Vector3D.h>
26#include <TFile.h>
27#include <TFitResult.h>
28#include <TMinuit.h>
29#include <TROOT.h>
30#include <TString.h>
31#include <TTree.h>
32
33using namespace Belle2;
34using namespace ROOT::Math;
35
37const int c_NBinsTime = 100;
38
40const int c_NBinsDistance = 100;
41
43static double s_BinnedData[c_NBinsTime][c_NBinsDistance];
44
46static double s_LowerTimeBoundary = 0;
47
49static double s_UpperTimeBoundary = 0;
50
52static double s_StripLength = 0;
53
54static bool compareEventNumber(const std::pair<KLMChannelNumber, unsigned int>& pair1,
55 const std::pair<KLMChannelNumber, unsigned int>& pair2)
56{
57 return pair1.second < pair2.second;
58}
59
60static double timeDensity(const double x[2], const double* par)
61{
62 double polynomial, t0, gauss;
63 polynomial = par[0];
64 t0 = par[2] + par[4] * x[1];
65 gauss = par[1] / (sqrt(2.0 * M_PI) * par[3]) *
66 exp(-0.5 * pow((x[0] - t0) / par[3], 2));
67 return fabs(polynomial + gauss);
68}
69
70static void fcn(int& npar, double* grad, double& fval, double* par, int iflag)
71{
72 (void)npar;
73 (void)grad;
74 (void)iflag;
75 double x[2];
76 fval = 0;
77 for (int i = 0; i < c_NBinsTime; ++i) {
78 x[0] = s_LowerTimeBoundary +
79 (s_UpperTimeBoundary - s_LowerTimeBoundary) *
80 (double(i) + 0.5) / c_NBinsTime;
81 for (int j = 0; j < c_NBinsDistance; ++j) {
82 x[1] = s_StripLength * (double(j) + 0.5) / c_NBinsDistance;
83 double f = timeDensity(x, par);
84 if (s_BinnedData[i][j] == 0)
85 fval = fval + 2.0 * f;
86 else
87 fval = fval + 2.0 * (f - s_BinnedData[i][j] *
88 (1.0 - log(s_BinnedData[i][j] / f)));
89 }
90 }
91}
92
94 CalibrationAlgorithm("KLMTimeCollector")
95{
97 m_minimizerOptions = ROOT::Math::MinimizerOptions();
98}
99
101{
102}
103
105{
106 const std::vector<Calibration::ExpRun>& runs = getRunList();
107 int firstExperiment = runs[0].first;
108 int lastExperiment = runs[runs.size() - 1].first;
109 if (firstExperiment != lastExperiment) {
110 B2FATAL("Runs from different experiments are used "
111 "for KLM time calibration (single algorithm run).");
112 }
113 /* DataStore. */
115 StoreObjPtr<EventMetaData> eventMetaData;
116 eventMetaData.registerInDataStore();
118 /* Database. */
119 if (eventMetaData.isValid()) {
120 if (eventMetaData->getExperiment() != firstExperiment) {
121 B2FATAL("Runs from different experiments are used "
122 "for KLM time calibration (consecutive algorithm runs).");
123 }
124 eventMetaData->setExperiment(firstExperiment);
125 eventMetaData->setRun(runs[0].second);
126 } else {
127 eventMetaData.construct(1, runs[0].second, firstExperiment);
128 }
129 DBStore& dbStore = DBStore::Instance();
130 dbStore.update();
131 dbStore.updateEvent();
132 /*
133 * For calibration algorithms, the database is not initialized on class
134 * creation. Do not move the database object to class members.
135 */
136 DBObjPtr<BKLMGeometryPar> bklmGeometry;
139}
140
142{
143 B2INFO("Read tree entries and separate events by module id.");
144 Event event;
145 std::shared_ptr<TTree> timeCalibrationData;
146 timeCalibrationData = getObjectPtr<TTree>("time_calibration_data");
147 timeCalibrationData->SetBranchAddress("t0", &event.t0);
148 timeCalibrationData->SetBranchAddress("flyTime", &event.flyTime);
149 timeCalibrationData->SetBranchAddress("recTime", &event.recTime);
150 timeCalibrationData->SetBranchAddress("dist", &event.dist);
151 timeCalibrationData->SetBranchAddress("diffDistX", &event.diffDistX);
152 timeCalibrationData->SetBranchAddress("diffDistY", &event.diffDistY);
153 timeCalibrationData->SetBranchAddress("diffDistZ", &event.diffDistZ);
154 timeCalibrationData->SetBranchAddress("eDep", &event.eDep);
155 timeCalibrationData->SetBranchAddress("nPE", &event.nPE);
156 timeCalibrationData->SetBranchAddress("channelId", &event.channelId);
157 timeCalibrationData->SetBranchAddress("inRPC", &event.inRPC);
158 timeCalibrationData->SetBranchAddress("isFlipped", &event.isFlipped);
159
160 B2INFO(LogVar("Total number of digits:", timeCalibrationData->GetEntries()));
161 m_evts.clear();
162
163 int n = timeCalibrationData->GetEntries();
164 if (n < m_MinimalDigitNumber)
166 for (int i = 0; i < n; ++i) {
167 timeCalibrationData->GetEntry(i);
168 m_evts[event.channelId].push_back(event);
169 }
170 B2INFO("Events packing finish.");
172}
173
175{
176 if (m_mc) {
183 } else {
184 m_LowerTimeBoundaryRPC = -800.0;
185 m_UpperTimeBoundaryRPC = -600.0;
190
191 }
192 int nBin = 200;
193 int nBin_scint = 400;
194
195 TString iFstring[2] = {"Backward", "Forward"};
196 TString iPstring[2] = {"ZReadout", "PhiReadout"};
197 TString hn, ht;
198
199 h_diff = new TH1F("h_diff", "Position difference between bklmHit2d and extHit;position difference", 100, 0, 10);
200 h_calibrated = new TH1I("h_calibrated_summary", "h_calibrated_summary;calibrated or not", 3, 0, 3);
201 hc_calibrated = new TH1I("hc_calibrated_summary", "hc_calibrated_summary;calibrated or not", 3, 0, 3);
202
203 gre_time_channel_scint = new TGraphErrors();
204 gre_time_channel_rpc = new TGraphErrors();
205 gre_time_channel_scint_end = new TGraphErrors();
206
207 gr_timeShift_channel_scint = new TGraph();
208 gr_timeShift_channel_rpc = new TGraph();
209 gr_timeShift_channel_scint_end = new TGraph();
210
211 gre_ctime_channel_scint = new TGraphErrors();
212 gre_ctime_channel_rpc = new TGraphErrors();
213 gre_ctime_channel_scint_end = new TGraphErrors();
214
215 gr_timeRes_channel_scint = new TGraph();
216 gr_timeRes_channel_rpc = new TGraph();
217 gr_timeRes_channel_scint_end = new TGraph();
218
219 double maximalPhiStripLengthBKLM =
221 double maximalZStripLengthBKLM =
223 double maximalStripLengthEKLM =
225
226 m_ProfileRpcPhi = new TProfile("hprf_rpc_phi_effC",
227 "Time over propagation length for RPCs (Phi_Readout); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]", 400, 0.0,
228 400.0);
229 m_ProfileRpcZ = new TProfile("hprf_rpc_z_effC",
230 "Time over propagation length for RPCs (Z_Readout); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]", 400, 0.0,
231 400.0);
232 m_ProfileBKLMScintillatorPhi = new TProfile("hprf_scint_phi_effC",
233 "Time over propagation length for scintillators (Phi_Readout); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]",
234 200, 0.0, maximalPhiStripLengthBKLM);
235 m_ProfileBKLMScintillatorZ = new TProfile("hprf_scint_z_effC",
236 "Time over propagation length for scintillators (Z_Readout); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]",
237 200, 0.0, maximalZStripLengthBKLM);
238 m_ProfileEKLMScintillatorPlane1 = new TProfile("hprf_scint_plane1_effC_end",
239 "Time over propagation length for scintillators (plane1, Endcap); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]",
240 200, 0.0, maximalStripLengthEKLM);
241 m_ProfileEKLMScintillatorPlane2 = new TProfile("hprf_scint_plane2_effC_end",
242 "Time over propagation length for scintillators (plane2, Endcap); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]",
243 200, 0.0, maximalStripLengthEKLM);
244
245 m_Profile2RpcPhi = new TProfile("hprf2_rpc_phi_effC",
246 "Time over propagation length for RPCs (Phi_Readout); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]", 400, 0.0,
247 400.0);
248 m_Profile2RpcZ = new TProfile("hprf2_rpc_z_effC",
249 "Time over propagation length for RPCs (Z_Readout); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]", 400, 0.0,
250 400.0);
251 m_Profile2BKLMScintillatorPhi = new TProfile("hprf2_scint_phi_effC",
252 "Time over propagation length for scintillators (Phi_Readout); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]",
253 200, 0.0, maximalPhiStripLengthBKLM);
254 m_Profile2BKLMScintillatorZ = new TProfile("hprf2_scint_z_effC",
255 "Time over propagation length for scintillators (Z_Readout); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]",
256 200, 0.0, maximalZStripLengthBKLM);
257 m_Profile2EKLMScintillatorPlane1 = new TProfile("hprf2_scint_plane1_effC_end",
258 "Time over propagation length for scintillators (plane1, Endcap); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]",
259 200, 0.0, maximalStripLengthEKLM);
260 m_Profile2EKLMScintillatorPlane2 = new TProfile("hprf2_scint_plane2_effC_end",
261 "Time over propagation length for scintillators (plane2, Endcap); propagation distance[cm]; T_rec-T_0-T_fly-'T_calibration'[ns]",
262 200, 0.0, maximalStripLengthEKLM);
263
264 h_time_rpc_tc = new TH1F("h_time_rpc_tc", "time distribution for RPC", nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
265 h_time_scint_tc = new TH1F("h_time_scint_tc", "time distribution for Scintillator", nBin_scint,
267 h_time_scint_tc_end = new TH1F("h_time_scint_tc_end", "time distribution for Scintillator (Endcap)", nBin_scint,
270
272 h_time_rpc = new TH1F("h_time_rpc", "time distribution for RPC; T_rec-T_0-T_fly-T_propagation[ns]", nBin, m_LowerTimeBoundaryRPC,
274 h_time_scint = new TH1F("h_time_scint", "time distribution for Scintillator; T_rec-T_0-T_fly-T_propagation[ns]", nBin_scint,
276 h_time_scint_end = new TH1F("h_time_scint_end", "time distribution for Scintillator (Endcap); T_rec-T_0-T_fly-T_propagation[ns]",
278
279 hc_time_rpc = new TH1F("hc_time_rpc", "Calibrated time distribution for RPC; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
281 hc_time_scint = new TH1F("hc_time_scint",
282 "Calibrated time distribution for Scintillator; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]", nBin_scint,
285 hc_time_scint_end = new TH1F("hc_time_scint_end",
286 "Calibrated time distribution for Scintillator (Endcap); T_rec-T_0-T_fly-T_propagation-T_calibration[ns]", nBin_scint,
288
289 for (int iF = 0; iF < 2; ++iF) {
290 hn = Form("h_timeF%d_rpc", iF);
291 ht = Form("Time distribution for RPC of %s; T_rec-T_0-T_fly-T_propagation[ns]", iFstring[iF].Data());
292 h_timeF_rpc[iF] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
293 hn = Form("h_timeF%d_scint", iF);
294 ht = Form("Time distribution for Scintillator of %s; T_rec-T_0-T_fly-T_propagation[ns]", iFstring[iF].Data());
295 h_timeF_scint[iF] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsBKLM,
297 hn = Form("h_timeF%d_scint_end", iF);
298 ht = Form("Time distribution for Scintillator of %s (Endcap); T_rec-T_0-T_fly-T_propagation[ns]", iFstring[iF].Data());
299 h_timeF_scint_end[iF] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
301
302 hn = Form("h2_timeF%d_rpc", iF);
303 ht = Form("Time distribution for RPC of %s; Sector Index; T_rec-T_0-T_fly-T_propagation[ns]", iFstring[iF].Data());
304 h2_timeF_rpc[iF] = new TH2F(hn.Data(), ht.Data(), 8, 0, 8, nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
305 hn = Form("h2_timeF%d_scint", iF);
306 ht = Form("Time distribution for Scintillator of %s; Sector Index; T_rec-T_0-T_fly-T_propagation[ns]", iFstring[iF].Data());
307 h2_timeF_scint[iF] = new TH2F(hn.Data(), ht.Data(), 8, 0, 8, nBin_scint, m_LowerTimeBoundaryScintillatorsBKLM,
309 hn = Form("h2_timeF%d_scint_end", iF);
310 ht = Form("Time distribution for Scintillator of %s (Endcap); Sector Index; T_rec-T_0-T_fly-T_propagation[ns]",
311 iFstring[iF].Data());
312 h2_timeF_scint_end[iF] = new TH2F(hn.Data(), ht.Data(), 4, 0, 4, nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
314
315 hn = Form("hc_timeF%d_rpc", iF);
316 ht = Form("Calibrated time distribution for RPC of %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]", iFstring[iF].Data());
317 hc_timeF_rpc[iF] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryCalibratedRPC, m_UpperTimeBoundaryCalibratedRPC);
318 hn = Form("hc_timeF%d_scint", iF);
319 ht = Form("Calibrated time distribution for Scintillator of %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
320 iFstring[iF].Data());
321 hc_timeF_scint[iF] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsBKLM,
323 hn = Form("hc_timeF%d_scint_end", iF);
324 ht = Form("Calibrated time distribution for Scintillator of %s (Endcap); T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
325 iFstring[iF].Data());
326 hc_timeF_scint_end[iF] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsEKLM,
328
329 hn = Form("h2c_timeF%d_rpc", iF);
330 ht = Form("Calibrated time distribution for RPC of %s; Sector Index; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
331 iFstring[iF].Data());
332 h2c_timeF_rpc[iF] = new TH2F(hn.Data(), ht.Data(), 8, 0, 8, nBin, m_LowerTimeBoundaryCalibratedRPC,
334 hn = Form("h2c_timeF%d_scint", iF);
335 ht = Form("Calibrated time distribution for Scintillator of %s; Sector Index; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
336 iFstring[iF].Data());
337 h2c_timeF_scint[iF] = new TH2F(hn.Data(), ht.Data(), 8, 0, 8, nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsBKLM,
339 hn = Form("h2c_timeF%d_scint_end", iF);
340 ht = Form("Calibrated time distribution for Scintillator of %s (Endcap) ; Sector Index; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
341 iFstring[iF].Data());
342 h2c_timeF_scint_end[iF] = new TH2F(hn.Data(), ht.Data(), 4, 0, 4, nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsEKLM,
344
345 for (int iS = 0; iS < 8; ++iS) {
346 // Barrel parts
347 hn = Form("h_timeF%d_S%d_scint", iF, iS);
348 ht = Form("Time distribution for Scintillator of Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iS, iFstring[iF].Data());
349 h_timeFS_scint[iF][iS] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsBKLM,
351 hn = Form("h_timeF%d_S%d_rpc", iF, iS);
352 ht = Form("Time distribution for RPC of Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iS, iFstring[iF].Data());
353 h_timeFS_rpc[iF][iS] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
354 hn = Form("h2_timeF%d_S%d", iF, iS);
355 ht = Form("Time distribution of Sector%d, %s; Layer Index; T_rec-T_0-T_fly-T_propagation[ns]", iS, iFstring[iF].Data());
356 h2_timeFS[iF][iS] = new TH2F(hn.Data(), ht.Data(), 15, 0, 15, nBin_scint, m_LowerTimeBoundaryRPC,
358
359 hn = Form("hc_timeF%d_S%d_scint", iF, iS);
360 ht = Form("Calibrated time distribution for Scintillator of Sector%d, %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]", iS,
361 iFstring[iF].Data());
362 hc_timeFS_scint[iF][iS] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsBKLM,
364 hn = Form("hc_timeF%d_S%d_rpc", iF, iS);
365 ht = Form("Calibrated time distribution for RPC of Sector%d, %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]", iS,
366 iFstring[iF].Data());
367 hc_timeFS_rpc[iF][iS] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedRPC,
369 hn = Form("h2c_timeF%d_S%d", iF, iS);
370 ht = Form("Calibrated time distribution of Sector%d, %s; Layer Index; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]", iS,
371 iFstring[iF].Data());
372 h2c_timeFS[iF][iS] = new TH2F(hn.Data(), ht.Data(), 15, 0, 15, nBin_scint, m_LowerTimeBoundaryCalibratedRPC,
374
375 // Inner 2 layers --> Scintillators
376 for (int iL = 0; iL < 2; ++iL) {
377 hn = Form("h_timeF%d_S%d_L%d", iF, iS, iL);
378 ht = Form("Time distribution for Scintillator of Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iL, iS,
379 iFstring[iF].Data());
380 h_timeFSL[iF][iS][iL] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsBKLM,
382 hn = Form("hc_timeF%d_S%d_L%d", iF, iS, iL);
383 ht = Form("Calibrated time distribution for Scintillator of Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
384 iL, iS, iFstring[iF].Data());
385 hc_timeFSL[iF][iS][iL] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsBKLM,
387
388 for (int iP = 0; iP < 2; ++iP) {
389 hn = Form("h_timeF%d_S%d_L%d_P%d", iF, iS, iL, iP);
390 ht = Form("Time distribution for Scintillator of %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]",
391 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
392 h_timeFSLP[iF][iS][iL][iP] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsBKLM,
394 hn = Form("h2_timeF%d_S%d_L%d_P%d", iF, iS, iL, iP);
395 ht = Form("Time distribution for Scintillator of %s, Layer%d, Sector%d, %s; Channel Index; T_rec-T_0-T_fly-T_propagation[ns]",
396 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
397 h2_timeFSLP[iF][iS][iL][iP] = new TH2F(hn.Data(), ht.Data(), 54, 0, 54, nBin_scint, m_LowerTimeBoundaryScintillatorsBKLM,
399
400 hn = Form("hc_timeF%d_S%d_L%d_P%d", iF, iS, iL, iP);
401 ht = Form("Calibrated time distribution for Scintillator of %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
402 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
403 hc_timeFSLP[iF][iS][iL][iP] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsBKLM,
405 hn = Form("h2c_timeF%d_S%d_L%d_P%d", iF, iS, iL, iP);
406 ht = Form("Calibrated time distribution for Scintillator of %s, Layer%d, Sector%d, %s; Channel Index; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
407 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
408 h2c_timeFSLP[iF][iS][iL][iP] = new TH2F(hn.Data(), ht.Data(), 54, 0, 54, nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsBKLM,
410
411 int nchannel_max = BKLMElementNumbers::getNStrips(iF, iS + 1, iL + 1, iP);
412 for (int iC = 0; iC < nchannel_max; ++iC) {
413 hn = Form("h_timeF%d_S%d_L%d_P%d_C%d_tc", iF, iS, iL, iP, iC);
414 ht = Form("time distribution for Scintillator of Channel%d, %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iC,
415 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
416 h_timeFSLPC_tc[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsBKLM,
418
419 hn = Form("h_timeF%d_S%d_L%d_P%d_C%d", iF, iS, iL, iP, iC);
420 ht = Form("time distribution for Scintillator of Channel%d, %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iC,
421 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
422 h_timeFSLPC[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsBKLM,
424
425 hn = Form("hc_timeF%d_S%d_L%d_P%d_C%d", iF, iS, iL, iP, iC);
426 ht = Form("Calibrated time distribution for Scintillator of Channel%d, %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
427 iC, iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
428 hc_timeFSLPC[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsBKLM,
430 hn = Form("time_length_bklm_F%d_S%d_L%d_P%d_C%d", iF, iS, iL, iP, iC);
431 double stripLength = 200;
432 m_HistTimeLengthBKLM[iF][iS][iL][iP][iC] =
433 new TH2F(hn.Data(),
434 "Time versus propagation length; "
435 "propagation distance[cm]; "
436 "T_rec-T_0-T_fly-'T_calibration'[ns]",
437 200, 0.0, stripLength,
440 }
441 }
442 }
443
444 for (int iL = 2; iL < 15; ++iL) {
445 hn = Form("h_timeF%d_S%d_L%d", iF, iS, iL);
446 ht = Form("time distribution for RPC of Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iL, iS, iFstring[iF].Data());
447 h_timeFSL[iF][iS][iL] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
448
449 hn = Form("hc_timeF%d_S%d_L%d", iF, iS, iL);
450 ht = Form("Calibrated time distribution for RPC of Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]", iL, iS,
451 iFstring[iF].Data());
452 hc_timeFSL[iF][iS][iL] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryCalibratedRPC, m_UpperTimeBoundaryCalibratedRPC);
453
454 for (int iP = 0; iP < 2; ++iP) {
455 hn = Form("h_timeF%d_S%d_L%d_P%d", iF, iS, iL, iP);
456 ht = Form("time distribution for RPC of %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iPstring[iP].Data(), iL, iS,
457 iFstring[iF].Data());
458 h_timeFSLP[iF][iS][iL][iP] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
459
460 hn = Form("h2_timeF%d_S%d_L%d_P%d", iF, iS, iL, iP);
461 ht = Form("time distribution for RPC of %s, Layer%d, Sector%d, %s; Channel Index; T_rec-T_0-T_fly-T_propagation[ns]",
462 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
463 h2_timeFSLP[iF][iS][iL][iP] = new TH2F(hn.Data(), ht.Data(), 48, 0, 48, nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
464
465 hn = Form("hc_timeF%d_S%d_L%d_P%d", iF, iS, iL, iP);
466 ht = Form("Calibrated time distribution for RPC of %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
467 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
468 hc_timeFSLP[iF][iS][iL][iP] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryCalibratedRPC,
470
471 hn = Form("h2c_timeF%d_S%d_L%d_P%d", iF, iS, iL, iP);
472 ht = Form("Calibrated time distribution for RPC of %s, Layer%d, Sector%d, %s; Channel Index; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
473 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
474 h2c_timeFSLP[iF][iS][iL][iP] = new TH2F(hn.Data(), ht.Data(), 48, 0, 48, nBin, m_LowerTimeBoundaryCalibratedRPC,
476
477 int nchannel_max = BKLMElementNumbers::getNStrips(iF, iS + 1, iL + 1, iP);
478 for (int iC = 0; iC < nchannel_max; ++iC) {
479 hn = Form("h_timeF%d_S%d_L%d_P%d_C%d_tc", iF, iS, iL, iP, iC);
480 ht = Form("Time distribution for RPC of Channel%d, %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iC,
481 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
482 h_timeFSLPC_tc[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
483
484 hn = Form("h_timeF%d_S%d_L%d_P%d_C%d", iF, iS, iL, iP, iC);
485 ht = Form("Time distribution for RPC of Channel%d, %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation[ns]", iC,
486 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
487 h_timeFSLPC[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryRPC, m_UpperTimeBoundaryRPC);
488
489 hn = Form("hc_timeF%d_S%d_L%d_P%d_C%d", iF, iS, iL, iP, iC);
490 ht = Form("Calibrated time distribution for RPC of Channel%d, %s, Layer%d, Sector%d, %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
491 iC, iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
492 hc_timeFSLPC[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin, m_LowerTimeBoundaryCalibratedRPC,
494 }
495 }
496 }
497 }
498 // Endcap part
499 int maxLay = 12 + 2 * iF;
500 for (int iS = 0; iS < 4; ++iS) {
501 hn = Form("h_timeF%d_S%d_scint_end", iF, iS);
502 ht = Form("Time distribution for Scintillator of Sector%d, %s (Endcap); T_rec-T_0-T_fly-T_propagation[ns]", iS,
503 iFstring[iF].Data());
504 h_timeFS_scint_end[iF][iS] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
506 hn = Form("h2_timeF%d_S%d_end", iF, iS);
507 ht = Form("Time distribution of Sector%d, %s (Endcap); Layer Index; T_rec-T_0-T_fly-T_propagation[ns]", iS, iFstring[iF].Data());
508 h2_timeFS_end[iF][iS] = new TH2F(hn.Data(), ht.Data(), maxLay, 0, maxLay, nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
510 hn = Form("hc_timeF%d_S%d_scint_end", iF, iS);
511 ht = Form("Calibrated time distribution for Scintillator of Sector%d (Endcap), %s; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
512 iS, iFstring[iF].Data());
513 hc_timeFS_scint_end[iF][iS] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsEKLM,
515 hn = Form("h2c_timeF%d_S%d_end", iF, iS);
516 ht = Form("Calibrated time distribution of Sector%d, %s (Endcap); Layer Index; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
517 iS, iFstring[iF].Data());
518 h2c_timeFS_end[iF][iS] = new TH2F(hn.Data(), ht.Data(), maxLay, 0, maxLay, nBin_scint,
521
522 for (int iL = 0; iL < maxLay; ++iL) {
523 hn = Form("h_timeF%d_S%d_L%d_end", iF, iS, iL);
524 ht = Form("Time distribution for Scintillator of Layer%d, Sector%d, %s (Endcap); T_rec-T_0-T_fly-T_propagation[ns]", iL, iS,
525 iFstring[iF].Data());
526 h_timeFSL_end[iF][iS][iL] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
528 hn = Form("hc_timeF%d_S%d_L%d_end", iF, iS, iL);
529 ht = Form("Calibrated time distribution for Scintillator of Layer%d, Sector%d, %s (Endcap); T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
530 iL, iS, iFstring[iF].Data());
531 hc_timeFSL_end[iF][iS][iL] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsEKLM,
533
534 for (int iP = 0; iP < 2; ++iP) {
535 hn = Form("h_timeF%d_S%d_L%d_P%d_end", iF, iS, iL, iP);
536 ht = Form("Time distribution for Scintillator of %s, Layer%d, Sector%d, %s (Endcap); T_rec-T_0-T_fly-T_propagation[ns]",
537 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
538 h_timeFSLP_end[iF][iS][iL][iP] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
540
541 hn = Form("h2_timeF%d_S%d_L%d_P%d_end", iF, iS, iL, iP);
542 ht = Form("Time distribution for Scintillator of %s, Layer%d, Sector%d, %s (Endcap); Channel Index; T_rec-T_0-T_fly-T_propagation[ns]",
543 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
544 h2_timeFSLP_end[iF][iS][iL][iP] = new TH2F(hn.Data(), ht.Data(), 75, 0, 75, nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
546
547 hn = Form("hc_timeF%d_S%d_L%d_P%d_end", iF, iS, iL, iP);
548 ht = Form("Calibrated time distribution for Scintillator of %s, Layer%d, Sector%d, %s (Endcap); T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
549 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
550 hc_timeFSLP_end[iF][iS][iL][iP] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsEKLM,
552
553 hn = Form("h2c_timeF%d_S%d_L%d_P%d_end", iF, iS, iL, iP);
554 ht = Form("Calibrated time distribution for Scintillator of %s, Layer%d, Sector%d, %s (Endcap); Channel Index; T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
555 iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
556 h2c_timeFSLP_end[iF][iS][iL][iP] = new TH2F(hn.Data(), ht.Data(), 75, 0, 75, nBin_scint,
559
560 for (int iC = 0; iC < 75; ++iC) {
561 hn = Form("h_timeF%d_S%d_L%d_P%d_C%d_tc_end", iF, iS, iL, iP, iC);
562 ht = Form("Time distribution for Scintillator of Channel%d, %s, Layer%d, Sector%d, %s (Endcap); T_rec-T_0-T_fly-T_propagation[ns]",
563 iC, iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
564 h_timeFSLPC_tc_end[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
566
567 hn = Form("h_timeF%d_S%d_L%d_P%d_C%d_end", iF, iS, iL, iP, iC);
568 ht = Form("Time distribution for Scintillator of Channel%d, %s, Layer%d, Sector%d, %s (Endcap); T_rec-T_0-T_fly-T_propagation[ns]",
569 iC, iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
570 h_timeFSLPC_end[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryScintillatorsEKLM,
572 hn = Form("hc_timeF%d_S%d_L%d_P%d_C%d_end", iF, iS, iL, iP, iC);
573 ht = Form("Calibrated time distribution for Scintillator of Channel%d, %s, Layer%d, Sector%d, %s (Endcap); T_rec-T_0-T_fly-T_propagation-T_calibration[ns]",
574 iC, iPstring[iP].Data(), iL, iS, iFstring[iF].Data());
575 hc_timeFSLPC_end[iF][iS][iL][iP][iC] = new TH1F(hn.Data(), ht.Data(), nBin_scint, m_LowerTimeBoundaryCalibratedScintillatorsEKLM,
577 hn = Form("time_length_eklm_F%d_S%d_L%d_P%d_C%d", iF, iS, iL, iP, iC);
578 double stripLength = m_EKLMGeometry->getStripLength(iC + 1) /
579 CLHEP::cm * Unit::cm;
580 m_HistTimeLengthEKLM[iF][iS][iL][iP][iC] =
581 new TH2F(hn.Data(),
582 "Time versus propagation length; "
583 "propagation distance[cm]; "
584 "T_rec-T_0-T_fly-'T_calibration'[ns]",
585 200, 0.0, stripLength,
588 }
589 }
590 }
591 }
592 }
593}
594
596 TProfile* profileRpcPhi, TProfile* profileRpcZ,
597 TProfile* profileBKLMScintillatorPhi, TProfile* profileBKLMScintillatorZ,
598 TProfile* profileEKLMScintillatorPlane1,
599 TProfile* profileEKLMScintillatorPlane2, bool fill2dHistograms)
600{
601 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
602 KLMChannelNumber channel = klmChannel.getKLMChannelNumber();
603 if (m_cFlag[channel] == ChannelCalibrationStatus::c_NotEnoughData)
604 continue;
605
606 std::vector<struct Event>::iterator it;
607 std::vector<struct Event> eventsChannel;
608 eventsChannel = m_evts[channel];
609 int iSub = klmChannel.getSubdetector();
610
611 for (it = eventsChannel.begin(); it != eventsChannel.end(); ++it) {
612 double timeHit = it->time() - m_timeShift[channel];
613 if (m_useEventT0)
614 timeHit = timeHit - it->t0;
615 double distHit = it->dist;
616
617 if (iSub == KLMElementNumbers::c_BKLM) {
618 int iF = klmChannel.getSection();
619 int iS = klmChannel.getSector() - 1;
620 int iL = klmChannel.getLayer() - 1;
621 int iP = klmChannel.getPlane();
622 int iC = klmChannel.getStrip() - 1;
623 if (iL > 1) {
624 if (iP) {
625 profileRpcPhi->Fill(distHit, timeHit);
626 } else {
627 profileRpcZ->Fill(distHit, timeHit);
628 }
629 } else {
630 if (fill2dHistograms)
631 m_HistTimeLengthBKLM[iF][iS][iL][iP][iC]->Fill(distHit, timeHit);
632 if (iP) {
633 profileBKLMScintillatorPhi->Fill(distHit, timeHit);
634 } else {
635 profileBKLMScintillatorZ->Fill(distHit, timeHit);
636 }
637 }
638 } else {
639 int iF = klmChannel.getSection() - 1;
640 int iS = klmChannel.getSector() - 1;
641 int iL = klmChannel.getLayer() - 1;
642 int iP = klmChannel.getPlane() - 1;
643 int iC = klmChannel.getStrip() - 1;
644 if (fill2dHistograms)
645 m_HistTimeLengthEKLM[iF][iS][iL][iP][iC]->Fill(distHit, timeHit);
646 if (iP) {
647 profileEKLMScintillatorPlane1->Fill(distHit, timeHit);
648 } else {
649 profileEKLMScintillatorPlane2->Fill(distHit, timeHit);
650 }
651 }
652 }
653 }
654}
655
657 const std::vector< std::pair<KLMChannelNumber, unsigned int> >& channels,
658 double& delay, double& delayError)
659{
660 std::vector<struct Event>::iterator it;
661 std::vector<struct Event> eventsChannel;
662 int nFits = 1000;
663 int nConvergedFits = 0;
664 delay = 0;
665 delayError = 0;
666 if (nFits > (int)channels.size())
667 nFits = channels.size();
668 for (int i = 0; i < nFits; ++i) {
669 int subdetector, section, sector, layer, plane, strip;
671 channels[i].first, &subdetector, &section, &sector, &layer, &plane,
672 &strip);
673 if (subdetector == KLMElementNumbers::c_BKLM) {
674 s_LowerTimeBoundary = m_LowerTimeBoundaryScintillatorsBKLM;
675 s_UpperTimeBoundary = m_UpperTimeBoundaryScintillatorsBKLM;
676 const bklm::Module* module =
677 m_BKLMGeometry->findModule(section, sector, layer);
678 s_StripLength = module->getStripLength(plane, strip);
679 } else {
680 s_LowerTimeBoundary = m_LowerTimeBoundaryScintillatorsEKLM;
681 s_UpperTimeBoundary = m_UpperTimeBoundaryScintillatorsEKLM;
682 s_StripLength = m_EKLMGeometry->getStripLength(strip) /
683 CLHEP::cm * Unit::cm;
684 }
685 for (int j = 0; j < c_NBinsTime; ++j) {
686 for (int k = 0; k < c_NBinsDistance; ++k)
687 s_BinnedData[j][k] = 0;
688 }
689 eventsChannel = m_evts[channels[i].first];
690 double averageTime = 0;
691 for (it = eventsChannel.begin(); it != eventsChannel.end(); ++it) {
692 double timeHit = it->time();
693 if (m_useEventT0)
694 timeHit = timeHit - it->t0;
695 averageTime = averageTime + timeHit;
696 int timeBin = std::floor((timeHit - s_LowerTimeBoundary) * c_NBinsTime /
697 (s_UpperTimeBoundary - s_LowerTimeBoundary));
698 if (timeBin < 0 || timeBin >= c_NBinsTime)
699 continue;
700 int distanceBin = std::floor(it->dist * c_NBinsDistance / s_StripLength);
701 if (distanceBin < 0 || distanceBin >= c_NBinsDistance) {
702 B2ERROR("The distance to SiPM is greater than the strip length.");
703 continue;
704 }
705 s_BinnedData[timeBin][distanceBin] += 1;
706 }
707 averageTime = averageTime / eventsChannel.size();
708 TMinuit minuit(5);
709 minuit.SetPrintLevel(-1);
710 int minuitResult;
711 minuit.mnparm(0, "P0", 1, 0.001, 0, 0, minuitResult);
712 minuit.mnparm(1, "N", 10, 0.001, 0, 0, minuitResult);
713 minuit.mnparm(2, "T0", averageTime, 0.001, 0, 0, minuitResult);
714 minuit.mnparm(3, "SIGMA", 10, 0.001, 0, 0, minuitResult);
715 minuit.mnparm(4, "DELAY", 0.0, 0.001, 0, 0, minuitResult);
716 minuit.SetFCN(fcn);
717 minuit.mncomd("FIX 2 3 4 5", minuitResult);
718 minuit.mncomd("MIGRAD 10000", minuitResult);
719 minuit.mncomd("RELEASE 2", minuitResult);
720 minuit.mncomd("MIGRAD 10000", minuitResult);
721 minuit.mncomd("RELEASE 3", minuitResult);
722 minuit.mncomd("MIGRAD 10000", minuitResult);
723 minuit.mncomd("RELEASE 4", minuitResult);
724 minuit.mncomd("MIGRAD 10000", minuitResult);
725 minuit.mncomd("RELEASE 5", minuitResult);
726 minuit.mncomd("MIGRAD 10000", minuitResult);
727 /* Require converged fit with accurate error matrix. */
728 if (minuit.fISW[1] != 3)
729 continue;
730 nConvergedFits++;
731 double channelDelay, channelDelayError;
732 minuit.GetParameter(4, channelDelay, channelDelayError);
733 delay = delay + channelDelay;
734 delayError = delayError + channelDelayError * channelDelayError;
735 }
736 delay = delay / nConvergedFits;
737 delayError = sqrt(delayError) / (nConvergedFits - 1);
738}
739
741{
742 int channelId;
743 gROOT->SetBatch(kTRUE);
748
749 fcn_gaus = new TF1("fcn_gaus", "gaus");
750 fcn_land = new TF1("fcn_land", "landau");
751 fcn_pol1 = new TF1("fcn_pol1", "pol1");
752 fcn_const = new TF1("fcn_const", "pol0");
753
755 if (result != CalibrationAlgorithm::c_OK)
756 return result;
757
758 /* Choose non-existing file name. */
759 std::string name = "time_calibration.root";
760 int i = 1;
761 while (1) {
762 struct stat buffer;
763 if (stat(name.c_str(), &buffer) != 0)
764 break;
765 name = "time_calibration_" + std::to_string(i) + ".root";
766 i = i + 1;
767 /* Overflow. */
768 if (i < 0)
769 break;
770 }
771 m_outFile = new TFile(name.c_str(), "recreate");
773
774 std::vector<struct Event>::iterator it;
775 std::vector<struct Event> eventsChannel;
776
777 eventsChannel.clear();
778 m_cFlag.clear();
779 m_minimizerOptions.SetDefaultStrategy(2);
780
781 /* Sort channels by number of events. */
782 std::vector< std::pair<KLMChannelNumber, unsigned int> > channelsBKLM;
783 std::vector< std::pair<KLMChannelNumber, unsigned int> > channelsEKLM;
784 KLMChannelIndex klmChannels;
785 for (KLMChannelIndex& klmChannel : klmChannels) {
786 KLMChannelNumber channel = klmChannel.getKLMChannelNumber();
787 m_cFlag[channel] = ChannelCalibrationStatus::c_NotEnoughData;
788 if (m_evts.find(channel) == m_evts.end())
789 continue;
790 int nEvents = m_evts[channel].size();
791 if (nEvents < m_lower_limit_counts) {
792 B2WARNING("Not enough calibration data collected."
793 << LogVar("channel", channel)
794 << LogVar("number of digit", nEvents));
795 continue;
796 }
797 m_cFlag[channel] = ChannelCalibrationStatus::c_FailedFit;
798 if (klmChannel.getSubdetector() == KLMElementNumbers::c_BKLM &&
799 klmChannel.getLayer() < BKLMElementNumbers::c_FirstRPCLayer) {
800 channelsBKLM.push_back(
801 std::pair<KLMChannelNumber, unsigned int>(channel, nEvents));
802 }
803 if (klmChannel.getSubdetector() == KLMElementNumbers::c_EKLM) {
804 channelsEKLM.push_back(
805 std::pair<KLMChannelNumber, unsigned int>(channel, nEvents));
806 }
807 }
808 std::sort(channelsBKLM.begin(), channelsBKLM.end(), compareEventNumber);
809 std::sort(channelsEKLM.begin(), channelsEKLM.end(), compareEventNumber);
810
811 /* Two-dimensional fit for the channel with the maximal number of events. */
812 double delayBKLM, delayBKLMError;
813 double delayEKLM, delayEKLMError;
814 timeDistance2dFit(channelsBKLM, delayBKLM, delayBKLMError);
815 timeDistance2dFit(channelsEKLM, delayEKLM, delayEKLMError);
816
817 /**********************************
818 * First loop
819 * Estimation of effective light speed for Scintillators and RPCs, separately.
820 **********************************/
821 B2INFO("Effective light speed Estimation.");
822 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
823 channelId = klmChannel.getKLMChannelNumber();
824 if (m_cFlag[channelId] == ChannelCalibrationStatus::c_NotEnoughData)
825 continue;
826
827 eventsChannel = m_evts[channelId];
828 int iSub = klmChannel.getSubdetector();
829
830 for (it = eventsChannel.begin(); it != eventsChannel.end(); ++it) {
831 XYZVector diffD = XYZVector(it->diffDistX, it->diffDistY, it->diffDistZ);
832 h_diff->Fill(diffD.R());
833 double timeHit = it->time();
834 if (m_useEventT0)
835 timeHit = timeHit - it->t0;
836 if (iSub == KLMElementNumbers::c_BKLM) {
837 int iF = klmChannel.getSection();
838 int iS = klmChannel.getSector() - 1;
839 int iL = klmChannel.getLayer() - 1;
840 int iP = klmChannel.getPlane();
841 int iC = klmChannel.getStrip() - 1;
842 h_timeFSLPC_tc[iF][iS][iL][iP][iC]->Fill(timeHit);
843 if (iL > 1) {
844 h_time_rpc_tc->Fill(timeHit);
845 } else {
846 h_time_scint_tc->Fill(timeHit);
847 }
848 } else {
849 int iF = klmChannel.getSection() - 1;
850 int iS = klmChannel.getSector() - 1;
851 int iL = klmChannel.getLayer() - 1;
852 int iP = klmChannel.getPlane() - 1;
853 int iC = klmChannel.getStrip() - 1;
854 h_timeFSLPC_tc_end[iF][iS][iL][iP][iC]->Fill(timeHit);
855 h_time_scint_tc_end->Fill(timeHit);
856 }
857 }
858 }
859 B2INFO("Effective light speed Estimation! Hists and Graph filling done.");
860
861 m_timeShift.clear();
862
863 double tmpMean_rpc_global = h_time_rpc_tc->GetMean();
864 double tmpMean_scint_global = h_time_scint_tc->GetMean();
865 double tmpMean_scint_global_end = h_time_scint_tc_end->GetMean();
866
867 B2INFO("Global Mean for Raw." << LogVar("RPC", tmpMean_rpc_global) << LogVar("Scint BKLM",
868 tmpMean_scint_global) << LogVar("Scint EKLM", tmpMean_scint_global_end));
869
870 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
871 channelId = klmChannel.getKLMChannelNumber();
872 if (m_cFlag[channelId] == ChannelCalibrationStatus::c_NotEnoughData)
873 continue;
874
875 int iSub = klmChannel.getSubdetector();
876 if (iSub == KLMElementNumbers::c_BKLM) {
877 int iF = klmChannel.getSection();
878 int iS = klmChannel.getSector() - 1;
879 int iL = klmChannel.getLayer() - 1;
880 int iP = klmChannel.getPlane();
881 int iC = klmChannel.getStrip() - 1;
882 h_timeFSLPC_tc[iF][iS][iL][iP][iC]->Fit(fcn_gaus, "LESQ");
883 double tmpMean_channel = fcn_gaus->GetParameter(1);
884 if (iL > 1) {
885 m_timeShift[channelId] = tmpMean_channel - tmpMean_rpc_global;
886 } else {
887 m_timeShift[channelId] = tmpMean_channel - tmpMean_scint_global;
888 }
889 } else {
890 int iF = klmChannel.getSection() - 1;
891 int iS = klmChannel.getSector() - 1;
892 int iL = klmChannel.getLayer() - 1;
893 int iP = klmChannel.getPlane() - 1;
894 int iC = klmChannel.getStrip() - 1;
895 h_timeFSLPC_tc_end[iF][iS][iL][iP][iC]->Fit(fcn_gaus, "LESQ");
896 double tmpMean_channel = fcn_gaus->GetParameter(1);
897 m_timeShift[channelId] = tmpMean_channel - tmpMean_scint_global_end;
898 }
899 }
900
901 delete h_time_scint_tc;
902 delete h_time_scint_tc_end;
903 delete h_time_rpc_tc;
904 B2INFO("Effective Light m_timeShift obtained. done.");
905
910
911 B2INFO("Effective light speed fitting.");
912 m_ProfileRpcPhi->Fit("fcn_pol1", "EMQ");
913 double delayRPCPhi = fcn_pol1->GetParameter(1);
914 double e_slope_rpc_phi = fcn_pol1->GetParError(1);
915
916 m_ProfileRpcZ->Fit("fcn_pol1", "EMQ");
917 double delayRPCZ = fcn_pol1->GetParameter(1);
918 double e_slope_rpc_z = fcn_pol1->GetParError(1);
919
920 m_ProfileBKLMScintillatorPhi->Fit("fcn_pol1", "EMQ");
921 double slope_scint_phi = fcn_pol1->GetParameter(1);
922 double e_slope_scint_phi = fcn_pol1->GetParError(1);
923
924 m_ProfileBKLMScintillatorZ->Fit("fcn_pol1", "EMQ");
925 double slope_scint_z = fcn_pol1->GetParameter(1);
926 double e_slope_scint_z = fcn_pol1->GetParError(1);
927
928 m_ProfileEKLMScintillatorPlane1->Fit("fcn_pol1", "EMQ");
929 double slope_scint_plane1_end = fcn_pol1->GetParameter(1);
930 double e_slope_scint_plane1_end = fcn_pol1->GetParError(1);
931
932 m_ProfileEKLMScintillatorPlane2->Fit("fcn_pol1", "EMQ");
933 double slope_scint_plane2_end = fcn_pol1->GetParameter(1);
934 double e_slope_scint_plane2_end = fcn_pol1->GetParError(1);
935
936 TString logStr_phi, logStr_z;
937 logStr_phi = Form("%.4f +/- %.4f ns/cm", delayRPCPhi, e_slope_rpc_phi);
938 logStr_z = Form("%.4f +/- %.4f ns/cm", delayRPCZ, e_slope_rpc_z);
939 B2INFO("Delay in RPCs:"
940 << LogVar("Fitted Value (phi readout) ", logStr_phi.Data())
941 << LogVar("Fitted Value (z readout) ", logStr_z.Data()));
942 logStr_phi = Form("%.4f +/- %.4f ns/cm", slope_scint_phi, e_slope_scint_phi);
943 logStr_z = Form("%.4f +/- %.4f ns/cm", slope_scint_z, e_slope_scint_z);
944 B2INFO("Delay in BKLM scintillators:"
945 << LogVar("Fitted Value (phi readout) ", logStr_phi.Data())
946 << LogVar("Fitted Value (z readout) ", logStr_z.Data()));
947 logStr_phi = Form("%.4f +/- %.4f ns/cm", slope_scint_plane1_end,
948 e_slope_scint_plane1_end);
949 logStr_z = Form("%.4f +/- %.4f ns/cm", slope_scint_plane2_end,
950 e_slope_scint_plane2_end);
951 B2INFO("Delay in EKLM scintillators:"
952 << LogVar("Fitted Value (plane1 readout) ", logStr_phi.Data())
953 << LogVar("Fitted Value (plane2 readout) ", logStr_z.Data()));
954
955 logStr_z = Form("%.4f +/- %.4f ns/cm", delayBKLM, delayBKLMError);
956 B2INFO("Delay in BKLM scintillators:"
957 << LogVar("Fitted Value (2d fit) ", logStr_z.Data()));
958 logStr_z = Form("%.4f +/- %.4f ns/cm", delayEKLM, delayEKLMError);
959 B2INFO("Delay in EKLM scintillators:"
960 << LogVar("Fitted Value (2d fit) ", logStr_z.Data()));
961
962 // Default Effective light speed in current Database
963 //delayEKLM = 0.5 * (slope_scint_plane1_end + slope_scint_plane2_end);
964 //delayBKLM = 0.5 * (slope_scint_phi + slope_scint_z);
965
970
972 B2INFO("Time distribution filling begins.");
973 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
974 channelId = klmChannel.getKLMChannelNumber();
975 int iSub = klmChannel.getSubdetector();
976
977 if (m_cFlag[channelId] == ChannelCalibrationStatus::c_NotEnoughData)
978 continue;
979 eventsChannel = m_evts[channelId];
980
981 for (it = eventsChannel.begin(); it != eventsChannel.end(); ++it) {
982 double timeHit = it->time();
983 if (m_useEventT0)
984 timeHit = timeHit - it->t0;
985 if (iSub == KLMElementNumbers::c_BKLM) {
986 int iF = klmChannel.getSection();
987 int iS = klmChannel.getSector() - 1;
988 int iL = klmChannel.getLayer() - 1;
989 int iP = klmChannel.getPlane();
990 int iC = klmChannel.getStrip() - 1;
991 if (iL > 1) {
992 double propgationT;
994 propgationT = it->dist * delayRPCZ;
995 else
996 propgationT = it->dist * delayRPCPhi;
997 double time = timeHit - propgationT;
998 h_time_rpc->Fill(time);
999 h_timeF_rpc[iF]->Fill(time);
1000 h_timeFS_rpc[iF][iS]->Fill(time);
1001 h_timeFSL[iF][iS][iL]->Fill(time);
1002 h_timeFSLP[iF][iS][iL][iP]->Fill(time);
1003 h_timeFSLPC[iF][iS][iL][iP][iC]->Fill(time);
1004 h2_timeF_rpc[iF]->Fill(iS, time);
1005 h2_timeFS[iF][iS]->Fill(iL, time);
1006 h2_timeFSLP[iF][iS][iL][iP]->Fill(iC, time);
1007 } else {
1008 double propgationT = it->dist * delayBKLM;
1009 double time = timeHit - propgationT;
1010 h_time_scint->Fill(time);
1011 h_timeF_scint[iF]->Fill(time);
1012 h_timeFS_scint[iF][iS]->Fill(time);
1013 h_timeFSL[iF][iS][iL]->Fill(time);
1014 h_timeFSLP[iF][iS][iL][iP]->Fill(time);
1015 h_timeFSLPC[iF][iS][iL][iP][iC]->Fill(time);
1016 h2_timeF_scint[iF]->Fill(iS, time);
1017 h2_timeFS[iF][iS]->Fill(iL, time);
1018 h2_timeFSLP[iF][iS][iL][iP]->Fill(iC, time);
1019 }
1020 } else {
1021 int iF = klmChannel.getSection() - 1;
1022 int iS = klmChannel.getSector() - 1;
1023 int iL = klmChannel.getLayer() - 1;
1024 int iP = klmChannel.getPlane() - 1;
1025 int iC = klmChannel.getStrip() - 1;
1026 double propgationT = it->dist * delayEKLM;
1027 double time = timeHit - propgationT;
1028 h_time_scint_end->Fill(time);
1029 h_timeF_scint_end[iF]->Fill(time);
1030 h_timeFS_scint_end[iF][iS]->Fill(time);
1031 h_timeFSL_end[iF][iS][iL]->Fill(time);
1032 h_timeFSLP_end[iF][iS][iL][iP]->Fill(time);
1033 h_timeFSLPC_end[iF][iS][iL][iP][iC]->Fill(time);
1034 h2_timeF_scint_end[iF]->Fill(iS, time);
1035 h2_timeFS_end[iF][iS]->Fill(iL, time);
1036 h2_timeFSLP_end[iF][iS][iL][iP]->Fill(iC, time);
1037 }
1038 }
1039 }
1040
1041 B2INFO("Original filling done.");
1042
1043 int iChannel_rpc = 0;
1044 int iChannel = 0;
1045 int iChannel_end = 0;
1046 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1047 channelId = klmChannel.getKLMChannelNumber();
1048 if (m_cFlag[channelId] == ChannelCalibrationStatus::c_NotEnoughData)
1049 continue;
1050 int iSub = klmChannel.getSubdetector();
1051
1052 if (iSub == KLMElementNumbers::c_BKLM) {
1053 int iF = klmChannel.getSection();
1054 int iS = klmChannel.getSector() - 1;
1055 int iL = klmChannel.getLayer() - 1;
1056 int iP = klmChannel.getPlane();
1057 int iC = klmChannel.getStrip() - 1;
1058
1059 TFitResultPtr r = h_timeFSLPC[iF][iS][iL][iP][iC]->Fit(fcn_gaus, "LESQ");
1060 if (int(r) != 0)
1061 continue;
1062 if (int(r) == 0)
1063 m_cFlag[channelId] = ChannelCalibrationStatus::c_SuccessfulCalibration;
1064 m_time_channel[channelId] = fcn_gaus->GetParameter(1);
1065 m_etime_channel[channelId] = fcn_gaus->GetParError(1);
1066 if (iL > 1) {
1067 gre_time_channel_rpc->SetPoint(iChannel_rpc, channelId, m_time_channel[channelId]);
1068 gre_time_channel_rpc->SetPointError(iChannel_rpc, 0., m_etime_channel[channelId]);
1069 iChannel_rpc++;
1070 } else {
1071 gre_time_channel_scint->SetPoint(iChannel, channelId, m_time_channel[channelId]);
1072 gre_time_channel_scint->SetPointError(iChannel, 0., m_etime_channel[channelId]);
1073 iChannel++;
1074 }
1075 } else {
1076 int iF = klmChannel.getSection() - 1;
1077 int iS = klmChannel.getSector() - 1;
1078 int iL = klmChannel.getLayer() - 1;
1079 int iP = klmChannel.getPlane() - 1;
1080 int iC = klmChannel.getStrip() - 1;
1081
1082 TFitResultPtr r = h_timeFSLPC_end[iF][iS][iL][iP][iC]->Fit(fcn_gaus, "LESQ");
1083 if (int(r) != 0)
1084 continue;
1085 if (int(r) == 0)
1086 m_cFlag[channelId] = ChannelCalibrationStatus::c_SuccessfulCalibration;
1087 m_time_channel[channelId] = fcn_gaus->GetParameter(1);
1088 m_etime_channel[channelId] = fcn_gaus->GetParError(1);
1089 gre_time_channel_scint_end->SetPoint(iChannel_end, channelId, m_time_channel[channelId]);
1090 gre_time_channel_scint_end->SetPointError(iChannel_end, 0., m_etime_channel[channelId]);
1091 iChannel_end++;
1092 }
1093 }
1094
1095 gre_time_channel_scint->Fit("fcn_const", "EMQ");
1096 m_time_channelAvg_scint = fcn_const->GetParameter(0);
1097 m_etime_channelAvg_scint = fcn_const->GetParError(0);
1098
1099 gre_time_channel_scint_end->Fit("fcn_const", "EMQ");
1100 m_time_channelAvg_scint_end = fcn_const->GetParameter(0);
1101 m_etime_channelAvg_scint_end = fcn_const->GetParError(0);
1102
1103 gre_time_channel_rpc->Fit("fcn_const", "EMQ");
1104 m_time_channelAvg_rpc = fcn_const->GetParameter(0);
1105 m_etime_channelAvg_rpc = fcn_const->GetParError(0);
1106
1107 B2INFO("Channel's time distribution fitting done.");
1108 B2DEBUG(20, LogVar("Average time (RPC)", m_time_channelAvg_rpc)
1109 << LogVar("Average time (BKLM scintillators)", m_time_channelAvg_scint)
1110 << LogVar("Average time (EKLM scintillators)", m_time_channelAvg_scint_end));
1111
1112 B2INFO("Calibrated channel's time distribution filling begins.");
1113
1114 m_timeShift.clear();
1115 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1116 channelId = klmChannel.getKLMChannelNumber();
1117 h_calibrated->Fill(m_cFlag[channelId]);
1118 if (m_time_channel.find(channelId) == m_time_channel.end())
1119 continue;
1120 double timeShift = m_time_channel[channelId];
1121 int iSub = klmChannel.getSubdetector();
1122 if (iSub == KLMElementNumbers::c_BKLM) {
1123 int iL = klmChannel.getLayer() - 1;
1124 if (iL > 1)
1125 m_timeShift[channelId] = timeShift;
1126 else
1127 m_timeShift[channelId] = timeShift;
1128 } else {
1129 m_timeShift[channelId] = timeShift;
1130 }
1131 m_timeCableDelay->setTimeDelay(channelId, m_timeShift[channelId]);
1132 }
1133
1134 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1135 channelId = klmChannel.getKLMChannelNumber();
1136 if (m_timeShift.find(channelId) != m_timeShift.end())
1137 continue;
1138 m_timeShift[channelId] = esti_timeShift(klmChannel);
1139 m_timeCableDelay->setTimeDelay(channelId, m_timeShift[channelId]);
1140 B2DEBUG(20, "Uncalibrated Estimation " << LogVar("Channel", channelId) << LogVar("Estimated value", m_timeShift[channelId]));
1141 }
1142
1143 iChannel_rpc = 0;
1144 iChannel = 0;
1145 iChannel_end = 0;
1146 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1147 channelId = klmChannel.getKLMChannelNumber();
1148 if (m_timeShift.find(channelId) == m_timeShift.end()) {
1149 B2ERROR("!!! Not All Channels Calibration Constant Set. Error Happened on " << LogVar("Channel", channelId));
1150 continue;
1151 }
1152 int iSub = klmChannel.getSubdetector();
1153 if (iSub == KLMElementNumbers::c_BKLM) {
1154 int iL = klmChannel.getLayer();
1155 if (iL > 2) {
1156 gr_timeShift_channel_rpc->SetPoint(iChannel_rpc, channelId, m_timeShift[channelId]);
1157 iChannel_rpc++;
1158 } else {
1159 gr_timeShift_channel_scint->SetPoint(iChannel, channelId, m_timeShift[channelId]);
1160 iChannel++;
1161 }
1162 } else {
1163 gr_timeShift_channel_scint_end->SetPoint(iChannel_end, channelId, m_timeShift[channelId]);
1164 iChannel_end++;
1165 }
1166 }
1167
1172
1173 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1174 channelId = klmChannel.getKLMChannelNumber();
1175 int iSub = klmChannel.getSubdetector();
1176 eventsChannel = m_evts[channelId];
1177 for (it = eventsChannel.begin(); it != eventsChannel.end(); ++it) {
1178 double timeHit = it->time();
1179 if (m_useEventT0)
1180 timeHit = timeHit - it->t0;
1181 if (iSub == KLMElementNumbers::c_BKLM) {
1182 int iF = klmChannel.getSection();
1183 int iS = klmChannel.getSector() - 1;
1184 int iL = klmChannel.getLayer() - 1;
1185 int iP = klmChannel.getPlane();
1186 int iC = klmChannel.getStrip() - 1;
1187 if (iL > 1) {
1188 double propgationT;
1190 propgationT = it->dist * delayRPCZ;
1191 else
1192 propgationT = it->dist * delayRPCPhi;
1193 double time = timeHit - propgationT - m_timeShift[channelId];
1194 hc_time_rpc->Fill(time);
1195 hc_timeF_rpc[iF]->Fill(time);
1196 hc_timeFS_rpc[iF][iS]->Fill(time);
1197 hc_timeFSL[iF][iS][iL]->Fill(time);
1198 hc_timeFSLP[iF][iS][iL][iP]->Fill(time);
1199 hc_timeFSLPC[iF][iS][iL][iP][iC]->Fill(time);
1200 h2c_timeF_rpc[iF]->Fill(iS, time);
1201 h2c_timeFS[iF][iS]->Fill(iL, time);
1202 h2c_timeFSLP[iF][iS][iL][iP]->Fill(iC, time);
1203 } else {
1204 double propgationT = it->dist * delayBKLM;
1205 double time = timeHit - propgationT - m_timeShift[channelId];
1206 hc_time_scint->Fill(time);
1207 hc_timeF_scint[iF]->Fill(time);
1208 hc_timeFS_scint[iF][iS]->Fill(time);
1209 hc_timeFSL[iF][iS][iL]->Fill(time);
1210 hc_timeFSLP[iF][iS][iL][iP]->Fill(time);
1211 hc_timeFSLPC[iF][iS][iL][iP][iC]->Fill(time);
1212 h2c_timeF_scint[iF]->Fill(iS, time);
1213 h2c_timeFS[iF][iS]->Fill(iL, time);
1214 h2c_timeFSLP[iF][iS][iL][iP]->Fill(iC, time);
1215 }
1216 } else {
1217 int iF = klmChannel.getSection() - 1;
1218 int iS = klmChannel.getSector() - 1;
1219 int iL = klmChannel.getLayer() - 1;
1220 int iP = klmChannel.getPlane() - 1;
1221 int iC = klmChannel.getStrip() - 1;
1222 double propgationT = it->dist * delayEKLM;
1223 double time = timeHit - propgationT - m_timeShift[channelId];
1224 hc_time_scint_end->Fill(time);
1225 hc_timeF_scint_end[iF]->Fill(time);
1226 hc_timeFS_scint_end[iF][iS]->Fill(time);
1227 hc_timeFSL_end[iF][iS][iL]->Fill(time);
1228 hc_timeFSLP_end[iF][iS][iL][iP]->Fill(time);
1229 hc_timeFSLPC_end[iF][iS][iL][iP][iC]->Fill(time);
1230 h2c_timeF_scint_end[iF]->Fill(iS, time);
1231 h2c_timeFS_end[iF][iS]->Fill(iL, time);
1232 h2c_timeFSLP_end[iF][iS][iL][iP]->Fill(iC, time);
1233 }
1234 }
1235 }
1236
1237 int icChannel_rpc = 0;
1238 int icChannel = 0;
1239 int icChannel_end = 0;
1240 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1241 channelId = klmChannel.getKLMChannelNumber();
1242 if (m_cFlag[channelId] == ChannelCalibrationStatus::c_NotEnoughData)
1243 continue;
1244 int iSub = klmChannel.getSubdetector();
1245
1246 if (iSub == KLMElementNumbers::c_BKLM) {
1247 int iF = klmChannel.getSection();
1248 int iS = klmChannel.getSector() - 1;
1249 int iL = klmChannel.getLayer() - 1;
1250 int iP = klmChannel.getPlane();
1251 int iC = klmChannel.getStrip() - 1;
1252
1253 TFitResultPtr rc = hc_timeFSLPC[iF][iS][iL][iP][iC]->Fit(fcn_gaus, "LESQ");
1254 if (int(rc) != 0)
1255 continue;
1256 if (int(rc) == 0)
1257 m_cFlag[channelId] = ChannelCalibrationStatus::c_SuccessfulCalibration;
1258 m_ctime_channel[channelId] = fcn_gaus->GetParameter(1);
1259 mc_etime_channel[channelId] = fcn_gaus->GetParError(1);
1260 if (iL > 1) {
1261 gre_ctime_channel_rpc->SetPoint(icChannel_rpc, channelId, m_ctime_channel[channelId]);
1262 gre_ctime_channel_rpc->SetPointError(icChannel_rpc, 0., mc_etime_channel[channelId]);
1263 icChannel_rpc++;
1264 } else {
1265 gre_ctime_channel_scint->SetPoint(icChannel, channelId, m_ctime_channel[channelId]);
1266 gre_ctime_channel_scint->SetPointError(icChannel, 0., mc_etime_channel[channelId]);
1267 icChannel++;
1268 }
1269 } else {
1270 int iF = klmChannel.getSection() - 1;
1271 int iS = klmChannel.getSector() - 1;
1272 int iL = klmChannel.getLayer() - 1;
1273 int iP = klmChannel.getPlane() - 1;
1274 int iC = klmChannel.getStrip() - 1;
1275
1276 TFitResultPtr rc = hc_timeFSLPC_end[iF][iS][iL][iP][iC]->Fit(fcn_gaus, "LESQ");
1277 if (int(rc) != 0)
1278 continue;
1279 if (int(rc) == 0)
1280 m_cFlag[channelId] = ChannelCalibrationStatus::c_SuccessfulCalibration;
1281 m_ctime_channel[channelId] = fcn_gaus->GetParameter(1);
1282 mc_etime_channel[channelId] = fcn_gaus->GetParError(1);
1283 gre_ctime_channel_scint_end->SetPoint(icChannel_end, channelId, m_ctime_channel[channelId]);
1284 gre_ctime_channel_scint_end->SetPointError(icChannel_end, 0., mc_etime_channel[channelId]);
1285 icChannel_end++;
1286 }
1287 }
1288
1289 gre_ctime_channel_scint->Fit("fcn_const", "EMQ");
1290 m_ctime_channelAvg_scint = fcn_const->GetParameter(0);
1291 mc_etime_channelAvg_scint = fcn_const->GetParError(0);
1292
1293 gre_ctime_channel_scint_end->Fit("fcn_const", "EMQ");
1294 m_ctime_channelAvg_scint_end = fcn_const->GetParameter(0);
1295 mc_etime_channelAvg_scint_end = fcn_const->GetParError(0);
1296
1297 gre_ctime_channel_rpc->Fit("fcn_const", "EMQ");
1298 m_ctime_channelAvg_rpc = fcn_const->GetParameter(0);
1299 mc_etime_channelAvg_rpc = fcn_const->GetParError(0);
1300
1301 B2INFO("Channel's time distribution fitting done.");
1302 B2DEBUG(20, LogVar("Average calibrated time (RPC)", m_ctime_channelAvg_rpc)
1303 << LogVar("Average calibrated time (BKLM scintillators)", m_ctime_channelAvg_scint)
1304 << LogVar("Average calibrated time (EKLM scintillators)", m_ctime_channelAvg_scint_end));
1305
1306 B2INFO("Calibrated channel's time distribution filling begins.");
1307
1308 m_timeRes.clear();
1309 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1310 channelId = klmChannel.getKLMChannelNumber();
1311 hc_calibrated->Fill(m_cFlag[channelId]);
1312 if (m_ctime_channel.find(channelId) == m_ctime_channel.end())
1313 continue;
1314 double timeRes = m_ctime_channel[channelId];
1315 int iSub = klmChannel.getSubdetector();
1316 if (iSub == KLMElementNumbers::c_BKLM) {
1317 int iL = klmChannel.getLayer() - 1;
1318 if (iL > 1)
1319 m_timeRes[channelId] = timeRes;
1320 else
1321 m_timeRes[channelId] = timeRes;
1322 } else {
1323 m_timeRes[channelId] = timeRes;
1324 }
1325 m_timeResolution->setTimeResolution(channelId, m_timeRes[channelId]);
1326 }
1327
1328 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1329 channelId = klmChannel.getKLMChannelNumber();
1330 if (m_timeRes.find(channelId) != m_timeRes.end())
1331 continue;
1332 m_timeRes[channelId] = esti_timeRes(klmChannel);
1333 m_timeResolution->setTimeResolution(channelId, m_timeRes[channelId]);
1334 B2DEBUG(20, "Calibrated Estimation " << LogVar("Channel", channelId) << LogVar("Estimated value", m_timeRes[channelId]));
1335 }
1336
1337 icChannel_rpc = 0;
1338 icChannel = 0;
1339 icChannel_end = 0;
1340 for (KLMChannelIndex klmChannel = m_klmChannels.begin(); klmChannel != m_klmChannels.end(); ++klmChannel) {
1341 channelId = klmChannel.getKLMChannelNumber();
1342 if (m_timeRes.find(channelId) == m_timeRes.end()) {
1343 B2ERROR("!!! Not All Channels Calibration Constant Set. Error Happened on " << LogVar("Channel", channelId));
1344 continue;
1345 }
1346 int iSub = klmChannel.getSubdetector();
1347 if (iSub == KLMElementNumbers::c_BKLM) {
1348 int iL = klmChannel.getLayer();
1349 if (iL > 2) {
1350 gr_timeRes_channel_rpc->SetPoint(icChannel_rpc, channelId, m_timeRes[channelId]);
1351 icChannel_rpc++;
1352 } else {
1353 gr_timeRes_channel_scint->SetPoint(icChannel, channelId, m_timeRes[channelId]);
1354 icChannel++;
1355 }
1356 } else {
1357 gr_timeRes_channel_scint_end->SetPoint(icChannel_end, channelId, m_timeRes[channelId]);
1358 icChannel_end++;
1359 }
1360 }
1361 saveHist();
1362
1363 delete fcn_const;
1364 m_evts.clear();
1365 m_timeShift.clear();
1366 m_timeRes.clear();
1367 m_cFlag.clear();
1368
1369 saveCalibration(m_timeCableDelay, "KLMTimeCableDelay");
1370 saveCalibration(m_timeConstants, "KLMTimeConstants");
1371 saveCalibration(m_timeResolution, "KLMTimeResolution");
1373}
1374
1375
1377{
1378 m_outFile->cd();
1379 B2INFO("Save Histograms into Files.");
1380 TDirectory* dir_monitor = m_outFile->mkdir("monitor_Hists", "", true);
1381 dir_monitor->cd();
1382 h_calibrated->SetDirectory(dir_monitor);
1383 hc_calibrated->SetDirectory(dir_monitor);
1384 h_diff->SetDirectory(dir_monitor);
1385
1386 m_outFile->cd();
1387 TDirectory* dir_effC = m_outFile->mkdir("effC_Hists", "", true);
1388 dir_effC->cd();
1389 m_ProfileRpcPhi->SetDirectory(dir_effC);
1390 m_ProfileRpcZ->SetDirectory(dir_effC);
1391 m_ProfileBKLMScintillatorPhi->SetDirectory(dir_effC);
1392 m_ProfileBKLMScintillatorZ->SetDirectory(dir_effC);
1393 m_ProfileEKLMScintillatorPlane1->SetDirectory(dir_effC);
1394 m_ProfileEKLMScintillatorPlane2->SetDirectory(dir_effC);
1395 m_Profile2RpcPhi->SetDirectory(dir_effC);
1396 m_Profile2RpcZ->SetDirectory(dir_effC);
1397 m_Profile2BKLMScintillatorPhi->SetDirectory(dir_effC);
1398 m_Profile2BKLMScintillatorZ->SetDirectory(dir_effC);
1399 m_Profile2EKLMScintillatorPlane1->SetDirectory(dir_effC);
1400 m_Profile2EKLMScintillatorPlane2->SetDirectory(dir_effC);
1401
1402 m_outFile->cd();
1403 TDirectory* dir_time = m_outFile->mkdir("time", "", true);
1404 dir_time->cd();
1405
1406 h_time_scint->SetDirectory(dir_time);
1407 hc_time_scint->SetDirectory(dir_time);
1408
1409 h_time_scint_end->SetDirectory(dir_time);
1410 hc_time_scint_end->SetDirectory(dir_time);
1411
1412 h_time_rpc->SetDirectory(dir_time);
1413 hc_time_rpc->SetDirectory(dir_time);
1414
1415 gre_time_channel_rpc->Write("gre_time_channel_rpc");
1416 gre_time_channel_scint->Write("gre_time_channel_scint");
1417 gre_time_channel_scint_end->Write("gre_time_channel_scint_end");
1418 gr_timeShift_channel_rpc->Write("gr_timeShift_channel_rpc");
1419 gr_timeShift_channel_scint->Write("gr_timeShift_channel_scint");
1420 gr_timeShift_channel_scint_end->Write("gr_timeShift_channel_scint_end");
1421 gre_ctime_channel_rpc->Write("gre_ctime_channel_rpc");
1422 gre_ctime_channel_scint->Write("gre_ctime_channel_scint");
1423 gre_ctime_channel_scint_end->Write("gre_ctime_channel_scint_end");
1424 gr_timeRes_channel_rpc->Write("gr_timeRes_channel_rpc");
1425 gr_timeRes_channel_scint->Write("gr_timeRes_channel_scint");
1426 gr_timeRes_channel_scint_end->Write("gr_timeRes_channel_scint_end");
1427
1428 B2INFO("Top file setup Done.");
1429
1430 TDirectory* dir_time_F[2];
1431 TDirectory* dir_time_FS[2][8];
1432 TDirectory* dir_time_FSL[2][8][15];
1433 TDirectory* dir_time_FSLP[2][8][15][2];
1434 TDirectory* dir_time_F_end[2];
1435 TDirectory* dir_time_FS_end[2][4];
1436 TDirectory* dir_time_FSL_end[2][4][14];
1437 TDirectory* dir_time_FSLP_end[2][4][14][2];
1438 char dirname[50];
1439 B2INFO("Sub files declare Done.");
1440 for (int iF = 0; iF < 2; ++iF) {
1441 h_timeF_rpc[iF]->SetDirectory(dir_time);
1442 hc_timeF_rpc[iF]->SetDirectory(dir_time);
1443
1444 h2_timeF_rpc[iF]->SetDirectory(dir_time);
1445 h2c_timeF_rpc[iF]->SetDirectory(dir_time);
1446
1447 h_timeF_scint[iF]->SetDirectory(dir_time);
1448 hc_timeF_scint[iF]->SetDirectory(dir_time);
1449
1450 h2_timeF_scint[iF]->SetDirectory(dir_time);
1451 h2c_timeF_scint[iF]->SetDirectory(dir_time);
1452
1453 h_timeF_scint_end[iF]->SetDirectory(dir_time);
1454 hc_timeF_scint_end[iF]->SetDirectory(dir_time);
1455
1456 h2_timeF_scint_end[iF]->SetDirectory(dir_time);
1457 h2c_timeF_scint_end[iF]->SetDirectory(dir_time);
1458
1459 sprintf(dirname, "isForward_%d", iF);
1460 dir_time_F[iF] = dir_time->mkdir(dirname, "", true);
1461 dir_time_F[iF]->cd();
1462
1463 for (int iS = 0; iS < 8; ++iS) {
1464 h_timeFS_rpc[iF][iS]->SetDirectory(dir_time_F[iF]);
1465 hc_timeFS_rpc[iF][iS]->SetDirectory(dir_time_F[iF]);
1466
1467 h_timeFS_scint[iF][iS]->SetDirectory(dir_time_F[iF]);
1468 hc_timeFS_scint[iF][iS]->SetDirectory(dir_time_F[iF]);
1469
1470 h2_timeFS[iF][iS]->SetDirectory(dir_time_F[iF]);
1471 h2c_timeFS[iF][iS]->SetDirectory(dir_time_F[iF]);
1472
1473 sprintf(dirname, "Sector_%d", iS + 1);
1474 dir_time_FS[iF][iS] = dir_time_F[iF]->mkdir(dirname, "", true);
1475 dir_time_FS[iF][iS]->cd();
1476
1477 for (int iL = 0; iL < 15; ++iL) {
1478 h_timeFSL[iF][iS][iL]->SetDirectory(dir_time_FS[iF][iS]);
1479 hc_timeFSL[iF][iS][iL]->SetDirectory(dir_time_FS[iF][iS]);
1480
1481 sprintf(dirname, "Layer_%d", iL + 1);
1482 dir_time_FSL[iF][iS][iL] = dir_time_FS[iF][iS]->mkdir(dirname, "", true);
1483 dir_time_FSL[iF][iS][iL]->cd();
1484 for (int iP = 0; iP < 2; ++iP) {
1485 h_timeFSLP[iF][iS][iL][iP]->SetDirectory(dir_time_FSL[iF][iS][iL]);
1486 hc_timeFSLP[iF][iS][iL][iP]->SetDirectory(dir_time_FSL[iF][iS][iL]);
1487 h2_timeFSLP[iF][iS][iL][iP]->SetDirectory(dir_time_FSL[iF][iS][iL]);
1488 h2c_timeFSLP[iF][iS][iL][iP]->SetDirectory(dir_time_FSL[iF][iS][iL]);
1489
1490 sprintf(dirname, "Plane_%d", iP);
1491 dir_time_FSLP[iF][iS][iL][iP] = dir_time_FSL[iF][iS][iL]->mkdir(dirname, "", true);
1492 dir_time_FSLP[iF][iS][iL][iP]->cd();
1493
1494 int nchannel_max = BKLMElementNumbers::getNStrips(iF, iS + 1, iL + 1, iP);
1495 for (int iC = 0; iC < nchannel_max; ++iC) {
1496 if (iL < 2)
1497 m_HistTimeLengthBKLM[iF][iS][iL][iP][iC]->SetDirectory(dir_time_FSLP[iF][iS][iL][iP]);
1498 h_timeFSLPC[iF][iS][iL][iP][iC]->SetDirectory(dir_time_FSLP[iF][iS][iL][iP]);
1499 hc_timeFSLPC[iF][iS][iL][iP][iC]->SetDirectory(dir_time_FSLP[iF][iS][iL][iP]);
1500 delete h_timeFSLPC_tc[iF][iS][iL][iP][iC];
1501 }
1502 }
1503 }
1504 }
1505
1506 sprintf(dirname, "isForward_%d_end", iF + 1);
1507 dir_time_F_end[iF] = dir_time->mkdir(dirname, "", true);
1508 dir_time_F_end[iF]->cd();
1509 int maxLayer = 12 + 2 * iF;
1510 for (int iS = 0; iS < 4; ++iS) {
1511 h_timeFS_scint_end[iF][iS]->SetDirectory(dir_time_F_end[iF]);
1512 hc_timeFS_scint_end[iF][iS]->SetDirectory(dir_time_F_end[iF]);
1513
1514 h2_timeFS_end[iF][iS]->SetDirectory(dir_time_F_end[iF]);
1515 h2c_timeFS_end[iF][iS]->SetDirectory(dir_time_F_end[iF]);
1516
1517 sprintf(dirname, "Sector_%d_end", iS + 1);
1518 dir_time_FS_end[iF][iS] = dir_time_F_end[iF]->mkdir(dirname, "", true);
1519 dir_time_FS_end[iF][iS]->cd();
1520 for (int iL = 0; iL < maxLayer; ++iL) {
1521 h_timeFSL_end[iF][iS][iL]->SetDirectory(dir_time_FS_end[iF][iS]);
1522 hc_timeFSL_end[iF][iS][iL]->SetDirectory(dir_time_FS_end[iF][iS]);
1523
1524 sprintf(dirname, "Layer_%d_end", iL + 1);
1525 dir_time_FSL_end[iF][iS][iL] = dir_time_FS_end[iF][iS]->mkdir(dirname, "", true);
1526 dir_time_FSL_end[iF][iS][iL]->cd();
1527 for (int iP = 0; iP < 2; ++iP) {
1528 h_timeFSLP_end[iF][iS][iL][iP]->SetDirectory(dir_time_FSL_end[iF][iS][iL]);
1529 hc_timeFSLP_end[iF][iS][iL][iP]->SetDirectory(dir_time_FSL_end[iF][iS][iL]);
1530 h2_timeFSLP_end[iF][iS][iL][iP]->SetDirectory(dir_time_FSL_end[iF][iS][iL]);
1531 h2c_timeFSLP_end[iF][iS][iL][iP]->SetDirectory(dir_time_FSL_end[iF][iS][iL]);
1532
1533 sprintf(dirname, "plane_%d_end", iP);
1534 dir_time_FSLP_end[iF][iS][iL][iP] = dir_time_FSL_end[iF][iS][iL]->mkdir(dirname, "", true);
1535 dir_time_FSLP_end[iF][iS][iL][iP]->cd();
1536
1537 for (int iC = 0; iC < 75; ++iC) {
1538 h_timeFSLPC_end[iF][iS][iL][iP][iC]->SetDirectory(dir_time_FSLP_end[iF][iS][iL][iP]);
1539 hc_timeFSLPC_end[iF][iS][iL][iP][iC]->SetDirectory(dir_time_FSLP_end[iF][iS][iL][iP]);
1540 m_HistTimeLengthEKLM[iF][iS][iL][iP][iC]->SetDirectory(dir_time_FSLP_end[iF][iS][iL][iP]);
1541 delete h_timeFSLPC_tc_end[iF][iS][iL][iP][iC];
1542 }
1543 }
1544 }
1545 }
1546 }
1547 m_outFile->cd();
1548 m_outFile->Write();
1549 m_outFile->Close();
1550 B2INFO("File Write and Close. Done.");
1551}
1552
1554{
1555 double tS = 0.0;
1556 int iSub = klmChannel.getSubdetector();
1557 int iF = klmChannel.getSection();
1558 int iS = klmChannel.getSector();
1559 int iL = klmChannel.getLayer();
1560 int iP = klmChannel.getPlane();
1561 int iC = klmChannel.getStrip();
1563 if (iSub == KLMElementNumbers::c_BKLM)
1564 totNStrips = BKLMElementNumbers::getNStrips(iF, iS, iL, iP);
1565 if (iC == 1) {
1566 KLMChannelIndex kCIndex_upper(iSub, iF, iS, iL, iP, iC + 1);
1567 tS = tS_upperStrip(kCIndex_upper).second;
1568 } else if (iC == totNStrips) {
1569 KLMChannelIndex kCIndex_lower(iSub, iF, iS, iL, iP, iC - 1);
1570 tS = tS_lowerStrip(kCIndex_lower).second;
1571 } else {
1572 KLMChannelIndex kCIndex_upper(iSub, iF, iS, iL, iP, iC + 1);
1573 KLMChannelIndex kCIndex_lower(iSub, iF, iS, iL, iP, iC - 1);
1574 std::pair<int, double> tS_upper = tS_upperStrip(kCIndex_upper);
1575 std::pair<int, double> tS_lower = tS_lowerStrip(kCIndex_lower);
1576 unsigned int td_upper = tS_upper.first - iC;
1577 unsigned int td_lower = iC - tS_lower.first;
1578 unsigned int td = tS_upper.first - tS_lower.first;
1579 tS = (double(td_upper) * tS_lower.second + double(td_lower) * tS_upper.second) / double(td);
1580 }
1581 return tS;
1582}
1583
1584std::pair<int, double> KLMTimeAlgorithm::tS_upperStrip(const KLMChannelIndex& klmChannel)
1585{
1586 std::pair<int, double> tS;
1587 int cId = klmChannel.getKLMChannelNumber();
1588 int iSub = klmChannel.getSubdetector();
1589 int iF = klmChannel.getSection();
1590 int iS = klmChannel.getSector();
1591 int iL = klmChannel.getLayer();
1592 int iP = klmChannel.getPlane();
1593 int iC = klmChannel.getStrip();
1595 if (iSub == KLMElementNumbers::c_BKLM)
1596 totNStrips = BKLMElementNumbers::getNStrips(iF, iS, iL, iP);
1597 if (m_timeShift.find(cId) != m_timeShift.end()) {
1598 tS.first = iC;
1599 tS.second = m_timeShift[cId];
1600 } else if (iC == totNStrips) {
1601 tS.first = iC;
1602 tS.second = 0.0;
1603 } else {
1604 KLMChannelIndex kCIndex(iSub, iF, iS, iL, iP, iC + 1);
1605 tS = tS_upperStrip(kCIndex);
1606 }
1607 return tS;
1608}
1609
1610std::pair<int, double> KLMTimeAlgorithm::tS_lowerStrip(const KLMChannelIndex& klmChannel)
1611{
1612 std::pair<int, double> tS;
1613 int cId = klmChannel.getKLMChannelNumber();
1614 int iSub = klmChannel.getSubdetector();
1615 int iF = klmChannel.getSection();
1616 int iS = klmChannel.getSector();
1617 int iL = klmChannel.getLayer();
1618 int iP = klmChannel.getPlane();
1619 int iC = klmChannel.getStrip();
1620 if (m_timeShift.find(cId) != m_timeShift.end()) {
1621 tS.first = iC;
1622 tS.second = m_timeShift[cId];
1623 } else if (iC == 1) {
1624 tS.first = iC;
1625 tS.second = 0.0;
1626 } else {
1627 KLMChannelIndex kCIndex(iSub, iF, iS, iL, iP, iC - 1);
1628 tS = tS_lowerStrip(kCIndex);
1629 }
1630 return tS;
1631}
1632
1634{
1635 double tR = 0.0;
1636 int iSub = klmChannel.getSubdetector();
1637 int iF = klmChannel.getSection();
1638 int iS = klmChannel.getSector();
1639 int iL = klmChannel.getLayer();
1640 int iP = klmChannel.getPlane();
1641 int iC = klmChannel.getStrip();
1643 if (iSub == KLMElementNumbers::c_BKLM)
1644 totNStrips = BKLMElementNumbers::getNStrips(iF, iS, iL, iP);
1645 if (iC == 1) {
1646 KLMChannelIndex kCIndex_upper(iSub, iF, iS, iL, iP, iC + 1);
1647 tR = tR_upperStrip(kCIndex_upper).second;
1648 } else if (iC == totNStrips) {
1649 KLMChannelIndex kCIndex_lower(iSub, iF, iS, iL, iP, iC - 1);
1650 tR = tR_lowerStrip(kCIndex_lower).second;
1651 } else {
1652 KLMChannelIndex kCIndex_upper(iSub, iF, iS, iL, iP, iC + 1);
1653 KLMChannelIndex kCIndex_lower(iSub, iF, iS, iL, iP, iC - 1);
1654 std::pair<int, double> tR_upper = tR_upperStrip(kCIndex_upper);
1655 std::pair<int, double> tR_lower = tR_lowerStrip(kCIndex_lower);
1656 unsigned int tr_upper = tR_upper.first - iC;
1657 unsigned int tr_lower = iC - tR_lower.first;
1658 unsigned int tr = tR_upper.first - tR_lower.first;
1659 tR = (double(tr_upper) * tR_lower.second + double(tr_lower) * tR_upper.second) / double(tr);
1660 }
1661 return tR;
1662}
1663
1664std::pair<int, double> KLMTimeAlgorithm::tR_upperStrip(const KLMChannelIndex& klmChannel)
1665{
1666 std::pair<int, double> tR;
1667 int cId = klmChannel.getKLMChannelNumber();
1668 int iSub = klmChannel.getSubdetector();
1669 int iF = klmChannel.getSection();
1670 int iS = klmChannel.getSector();
1671 int iL = klmChannel.getLayer();
1672 int iP = klmChannel.getPlane();
1673 int iC = klmChannel.getStrip();
1675 if (iSub == KLMElementNumbers::c_BKLM)
1676 totNStrips = BKLMElementNumbers::getNStrips(iF, iS, iL, iP);
1677 if (m_timeRes.find(cId) != m_timeRes.end()) {
1678 tR.first = iC;
1679 tR.second = m_timeRes[cId];
1680 } else if (iC == totNStrips) {
1681 tR.first = iC;
1682 tR.second = 0.0;
1683 } else {
1684 KLMChannelIndex kCIndex(iSub, iF, iS, iL, iP, iC + 1);
1685 tR = tR_upperStrip(kCIndex);
1686 }
1687 return tR;
1688}
1689
1690std::pair<int, double> KLMTimeAlgorithm::tR_lowerStrip(const KLMChannelIndex& klmChannel)
1691{
1692 std::pair<int, double> tR;
1693 int cId = klmChannel.getKLMChannelNumber();
1694 int iSub = klmChannel.getSubdetector();
1695 int iF = klmChannel.getSection();
1696 int iS = klmChannel.getSector();
1697 int iL = klmChannel.getLayer();
1698 int iP = klmChannel.getPlane();
1699 int iC = klmChannel.getStrip();
1700 if (m_timeRes.find(cId) != m_timeRes.end()) {
1701 tR.first = iC;
1702 tR.second = m_timeRes[cId];
1703 } else if (iC == 1) {
1704 tR.first = iC;
1705 tR.second = 0.0;
1706 } else {
1707 KLMChannelIndex kCIndex(iSub, iF, iS, iL, iP, iC - 1);
1708 tR = tR_lowerStrip(kCIndex);
1709 }
1710 return tR;
1711}
1712
@ c_FirstRPCLayer
First RPC layer.
static int getNStrips(int section, int sector, int layer, int plane)
Get number of strips.
Base class for calibration algorithms.
void saveCalibration(TClonesArray *data, const std::string &name)
Store DBArray payload with given name with default IOV.
const std::vector< Calibration::ExpRun > & getRunList() const
Get the list of runs for which calibration is called.
EResult
The result of calibration.
@ c_OK
Finished successfuly =0 in Python.
@ c_NotEnoughData
Needs more data =2 in Python.
Class for accessing objects in the database.
Definition: DBObjPtr.h:21
Singleton class to cache database objects.
Definition: DBStore.h:31
static DataStore & Instance()
Instance of singleton Store.
Definition: DataStore.cc:54
void setInitializeActive(bool active)
Setter for m_initializeActive.
Definition: DataStore.cc:94
static constexpr int getMaximalStripNumber()
Get maximal strip number.
static const GeometryData & Instance(enum DataSource dataSource=c_Database, const GearDir *gearDir=nullptr)
Instantiation.
Definition: GeometryData.cc:33
double getStripLength(int strip) const
Get strip length.
Definition: GeometryData.h:71
double getMaximalStripLength() const
Get maximal strip length.
Definition: GeometryData.h:79
KLM channel index.
int getSubdetector() const
Get subdetector.
int getLayer() const
Get layer.
KLMChannelIndex begin()
First channel.
int getSection() const
Get section.
int getPlane() const
Get plane.
int getStrip() const
Get strip.
int getSector() const
Get sector.
KLMChannelNumber getKLMChannelNumber() const
Get KLM channel number.
KLMChannelIndex & end()
Last channel.
static const KLMElementNumbers & Instance()
Instantiation.
void channelNumberToElementNumbers(KLMChannelNumber channel, int *subdetector, int *section, int *sector, int *layer, int *plane, int *strip) const
Get element numbers by channel number.
TProfile * m_Profile2EKLMScintillatorPlane2
For EKLM scintillator plane2.
double mc_etime_channelAvg_rpc
Calibrated central value error of the global time distribution (BKLM RPC part).
TH2F * m_HistTimeLengthEKLM[2][4][14][2][75]
Two-dimensional distributions of time versus propagation length.
TH1F * h_timeFSLPC_tc[2][8][15][2][54]
BKLM part, used for effective light speed estimation.
TH2F * h2c_timeF_scint_end[2]
EKLM part.
TH1F * h_timeFSLPC_tc_end[2][4][14][2][75]
EKLM part, used for effective light speed estimation.
KLMTimeResolution * m_timeResolution
DBObject of time resolution.
TH1F * h_time_scint_tc_end
EKLM part.
void createHistograms()
Create histograms.
TGraphErrors * gre_time_channel_scint
BKLM Scintillator.
TH1F * h_timeFSL[2][8][15]
BKLM part.
TH1F * hc_timeFSLPC_end[2][4][14][2][75]
EKLM part.
TH1F * hc_timeFSL_end[2][4][14]
EKLM part.
TH1F * h_timeFSLP_end[2][4][14][2]
EKLM part.
TGraph * gr_timeRes_channel_rpc
BKLM RPC.
TH1F * hc_timeFSLP_end[2][4][14][2]
EKLM part.
TH1F * h_timeFSLP[2][8][15][2]
BKLM part.
TH1F * hc_timeF_scint_end[2]
EKLM part.
std::map< KLMChannelNumber, double > m_timeShift
Shift values of each channel.
TH1F * h_time_scint
BKLM scintillator part.
double m_time_channelAvg_scint
Central value of the global time distribution (BKLM scintillator part).
TH1F * hc_timeFS_scint_end[2][4]
EKLM part.
double esti_timeRes(const KLMChannelIndex &klmChannel)
Estimate value of calibration constant for calibrated channels.
double m_UpperTimeBoundaryCalibratedRPC
Upper time boundary for RPC (calibrated data).
double m_ctime_channelAvg_rpc
Calibrated central value of the global time distribution (BKLM RPC part).
KLMTimeConstants * m_timeConstants
DBObject of time cost on some parts of the detector.
void setupDatabase()
Setup the database.
TH1F * hc_timeFS_scint[2][8]
BKLM scintillator part.
std::map< KLMChannelNumber, double > m_time_channel
Time distribution central value of each channel.
double m_ctime_channelAvg_scint_end
Calibrated central value of the global time distribution (EKLM scintillator part).
CalibrationAlgorithm::EResult readCalibrationData()
Read calibration data.
TGraph * gr_timeShift_channel_scint_end
EKLM.
TGraph * gr_timeRes_channel_scint
BKLM scintillator.
TH1F * hc_timeF_scint[2]
BKLM scintillator part.
TH1F * h_timeFS_scint[2][8]
BKLM scintillator part.
double m_UpperTimeBoundaryScintillatorsBKLM
Upper time boundary for BKLM scintillators.
const KLMElementNumbers * m_ElementNumbers
Element numbers.
std::pair< int, double > tR_upperStrip(const KLMChannelIndex &klmChannel)
Tracing available channels with increasing strip number.
TH1F * hc_timeF_rpc[2]
BKLM RPC part.
TH2F * h2c_timeFS_end[2][4]
EKLM part.
TH1F * h_timeFSLPC_end[2][4][14][2][75]
EKLM part.
const EKLM::GeometryData * m_EKLMGeometry
EKLM geometry data.
TGraphErrors * gre_ctime_channel_scint_end
EKLM.
TProfile * m_Profile2BKLMScintillatorPhi
For BKLM scintillator phi plane.
TH1F * hc_time_scint_end
EKLM part.
TGraphErrors * gre_time_channel_scint_end
EKLM.
TH2F * h2_timeFSLP[2][8][15][2]
BKLM part.
double m_UpperTimeBoundaryCalibratedScintillatorsEKLM
Upper time boundary for BKLM scintillators (calibrated data).
TGraph * gr_timeShift_channel_scint
BKLM scintillator.
double m_time_channelAvg_scint_end
Central value of the global time distribution (EKLM scintillator part).
TProfile * m_Profile2EKLMScintillatorPlane1
For EKLM scintillator plane1.
TH1F * hc_timeFS_rpc[2][8]
BKLM RPC part.
double m_UpperTimeBoundaryScintillatorsEKLM
Upper time boundary for BKLM scintillators.
void fillTimeDistanceProfiles(TProfile *profileRpcPhi, TProfile *profileRpcZ, TProfile *profileBKLMScintillatorPhi, TProfile *profileBKLMScintillatorZ, TProfile *profileEKLMScintillatorPlane1, TProfile *profileEKLMScintillatorPlane2, bool fill2dHistograms)
Fill profiles of time versus distance.
TFile * m_outFile
Output file.
double esti_timeShift(const KLMChannelIndex &klmChannel)
Estimate value of calibration constant for uncalibrated channels.
std::pair< int, double > tS_upperStrip(const KLMChannelIndex &klmChannel)
Tracing available channels with increasing strip number.
double m_LowerTimeBoundaryCalibratedScintillatorsEKLM
Lower time boundary for EKLM scintillators (calibrated data).
TH1F * hc_timeFSLP[2][8][15][2]
BKLM part.
TGraphErrors * gre_ctime_channel_rpc
BKLM RPC.
void saveHist()
Save histograms to file.
const bklm::GeometryPar * m_BKLMGeometry
BKLM geometry data.
TH2F * h2c_timeFSLP[2][8][15][2]
BKLM part.
double m_ctime_channelAvg_scint
Calibrated central value of the global time distribution (BKLM scintillator part).
TF1 * fcn_const
Const function.
double m_UpperTimeBoundaryCalibratedScintillatorsBKLM
Upper time boundary for BKLM scintillators (calibrated data).
TProfile * m_Profile2RpcZ
For BKLM RPC z plane.
TH1F * h_timeFSLPC[2][8][15][2][54]
BKLM part.
TH2F * m_HistTimeLengthBKLM[2][8][15][2][54]
Two-dimensional distributions of time versus propagation length.
TH2F * h2_timeFSLP_end[2][4][14][2]
EKLM part.
TH1I * hc_calibrated
Calibration statistics for each channel.
void timeDistance2dFit(const std::vector< std::pair< KLMChannelNumber, unsigned int > > &channels, double &delay, double &delayError)
Two-dimensional fit for individual channels.
TGraph * gr_timeRes_channel_scint_end
EKLM.
TH1I * h_calibrated
Calibration statistics for each channel.
TProfile * m_ProfileBKLMScintillatorZ
For BKLM scintillator z plane.
double m_LowerTimeBoundaryScintillatorsBKLM
Lower time boundary for BKLM scintillators.
TH1F * h_time_rpc_tc
BKLM RPC part.
TH1F * h_time_scint_end
EKLM part.
TH2F * h2c_timeF_scint[2]
BKLM scintillator part.
TF1 * fcn_pol1
Pol1 function.
double m_etime_channelAvg_scint_end
Central value error of the global time distribution (EKLM scintillator part).
TH1F * hc_time_rpc
BKLM RPC part.
double mc_etime_channelAvg_scint
Calibrated central value error of the global time distribution (BKLM scintillator part).
TH2F * h2c_timeFSLP_end[2][4][14][2]
EKLM part.
double mc_etime_channelAvg_scint_end
Calibrated central value error of the global time distribution (EKLM scintillator part).
TH2F * h2_timeF_scint_end[2]
EKLM part.
TF1 * fcn_gaus
Gaussian function.
double m_LowerTimeBoundaryCalibratedScintillatorsBKLM
Lower time boundary for BKLM scintillators (calibrated data).
TH1F * h_timeF_rpc[2]
BKLM RPC part.
TProfile * m_ProfileBKLMScintillatorPhi
For BKLM scintillator phi plane.
TH1F * hc_time_scint
BKLM scintillator part.
TH2F * h2_timeFS[2][8]
BKLM part.
double m_etime_channelAvg_scint
Central value error of the global time distribution (BKLM scintillator part).
TH1F * h_timeF_scint_end[2]
EKLM part.
TProfile * m_ProfileRpcPhi
For BKLM RPC phi plane.
TGraphErrors * gre_ctime_channel_scint
BKLM Scintillator.
TProfile * m_ProfileEKLMScintillatorPlane2
For EKLM scintillator plane2.
TH1F * h_time_rpc
BKLM RPC part.
TH1F * h_timeFSL_end[2][4][14]
EKLM part.
TProfile * m_Profile2RpcPhi
For BKLM RPC phi plane.
TH1F * h_timeF_scint[2]
BKLM scintillator part.
TH1F * hc_timeFSL[2][8][15]
BKLM part.
TProfile * m_Profile2BKLMScintillatorZ
For BKLM scintillator z plane.
TH1F * h_timeFS_rpc[2][8]
BKLM RPC part.
KLMChannelIndex m_klmChannels
KLM ChannelIndex object.
TGraph * gr_timeShift_channel_rpc
BKLM RPC.
std::map< KLMChannelNumber, double > m_timeRes
Resolution values of each channel.
TH1F * h_diff
Distance between global and local position.
TH2F * h2_timeF_scint[2]
BKLM scintillator part.
TH1F * h_time_scint_tc
BKLM scintillator part.
double m_LowerTimeBoundaryRPC
Lower time boundary for RPC.
virtual EResult calibrate() override
Run algorithm on data.
std::map< KLMChannelNumber, double > m_ctime_channel
Calibrated time distribution central value of each channel.
double m_LowerTimeBoundaryCalibratedRPC
Lower time boundary for RPC (calibrated data).
bool m_useEventT0
Whether to use event T0 from CDC.
int m_MinimalDigitNumber
Minimal digit number (total).
TProfile * m_ProfileEKLMScintillatorPlane1
For EKLM scintillator plane1.
double m_UpperTimeBoundaryRPC
Upper time boundary for RPC.
TH2F * h2c_timeF_rpc[2]
BKLM RPC part.
TF1 * fcn_land
Landau function.
KLMTimeCableDelay * m_timeCableDelay
DBObject of the calibration constant of each channel due to cable decay.
std::pair< int, double > tS_lowerStrip(const KLMChannelIndex &klmChannel)
Tracing available channels with decreasing strip number.
TProfile * m_ProfileRpcZ
For BKLM RPC z plane.
std::map< KLMChannelNumber, double > mc_etime_channel
Calibrated time distribution central value Error of each channel.
std::pair< int, double > tR_lowerStrip(const KLMChannelIndex &klmChannel)
Tracing available channels with decreasing strip number.
TH1F * hc_timeFSLPC[2][8][15][2][54]
BKLM part.
ROOT::Math::MinimizerOptions m_minimizerOptions
Minimization options.
std::map< KLMChannelNumber, int > m_cFlag
Calibration flag if the channel has enough hits collected and fitted OK.
TGraphErrors * gre_time_channel_rpc
BKLM RPC.
TH2F * h2_timeFS_end[2][4]
EKLM part.
TH2F * h2_timeF_rpc[2]
BKLM RPC part.
std::map< KLMChannelNumber, std::vector< struct Event > > m_evts
Container of hit information.
TH1F * h_timeFS_scint_end[2][4]
EKLM part.
double m_time_channelAvg_rpc
Central value of the global time distribution (BKLM RPC part).
TH2F * h2c_timeFS[2][8]
BKLM part.
double m_etime_channelAvg_rpc
Central value error of the global time distribution (BKLM RPC part).
double m_LowerTimeBoundaryScintillatorsEKLM
Lower time boundary for EKLM scintillators.
std::map< KLMChannelNumber, double > m_etime_channel
Time distribution central value Error of each channel.
int m_lower_limit_counts
Lower limit of hits collected for on single channel.
Class to store BKLM delay time coused by cable in the database.
void setTimeDelay(KLMChannelNumber channel, float timeDelay)
Set the time calibration constant.
Class to store KLM constants related to time.
@ c_BKLM
BKLM scintillator.
@ c_EKLM
EKLM scintillator.
void setDelay(float delay, int cType)
Set effective light speed of scintillators.
Class to store KLM time resolution in the database.
void setTimeResolution(KLMChannelNumber channel, float resolution)
Set time resolution.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:96
bool isValid() const
Check whether the object was created.
Definition: StoreObjPtr.h:111
bool construct(Args &&... params)
Construct an object of type T in this StoreObjPtr, using the provided constructor arguments.
Definition: StoreObjPtr.h:119
static const double cm
Standard units with the value = 1.
Definition: Unit.h:47
const Module * findModule(int section, int sector, int layer) const
Get the pointer to the definition of a module.
Definition: GeometryPar.cc:721
double getMaximalZStripLength() const
Get maximal Z strip length (for scintillators).
Definition: GeometryPar.h:289
static GeometryPar * instance(void)
Static method to get a reference to the singleton GeometryPar instance.
Definition: GeometryPar.cc:27
double getMaximalPhiStripLength() const
Get maximal phi strip length (for scintillators).
Definition: GeometryPar.h:283
Define the geometry of a BKLM module Each sector [octant] contains Modules.
Definition: Module.h:76
Class to store variables with their name which were sent to the logging service.
static DBStore & Instance()
Instance of a singleton DBStore.
Definition: DBStore.cc:28
void updateEvent()
Updates all intra-run dependent objects.
Definition: DBStore.cc:142
void update()
Updates all objects that are outside their interval of validity.
Definition: DBStore.cc:79
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
uint16_t KLMChannelNumber
Channel number.
Abstract base class for different kinds of events.