Belle II Software development
eclDQMExtended.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/eclDQMExtended/eclDQMExtended.h>
11
12/* ECL headers. */
13#include <ecl/dataobjects/ECLElementNumbers.h>
14#include <ecl/utility/ECLDspEmulator.h>
15#include <ecl/utility/ECLDspUtilities.h>
16
17/* Basf2 headers. */
18#include <framework/core/HistoModule.h>
19#include <framework/logging/Logger.h>
20
21/* ROOT headers. */
22#include <TDirectory.h>
23#include <TH1F.h>
24#include <TH2F.h>
25
26/* Boost headers. */
27#include <boost/format.hpp>
28
29/* C++ headers. */
30#include <filesystem>
31#include <iostream>
32#include <map>
33#include <regex>
34#include <string>
35#include <vector>
36
37
38//NAMESPACE(S)
39using namespace Belle2;
40using namespace ECL;
41
42//-----------------------------------------------------------------
43// Register the Module
44//-----------------------------------------------------------------
45REG_MODULE(ECLDQMEXTENDED);
46
47
48//-----------------------------------------------------------------
49// Implementation
50//-----------------------------------------------------------------
51
53 : HistoModule(),
54 m_ECLDspDataArray0("ECLDSPPars0"),
55 m_ECLDspDataArray1("ECLDSPPars1"),
56 m_ECLDspDataArray2("ECLDSPPars2"),
57 m_calibrationThrA0("ECL_FPGA_LowAmp"),
58 m_calibrationThrAhard("ECL_FPGA_HitThresh"),
59 m_calibrationThrAskip("ECL_FPGA_StoreDigit")
60
61{
62
63 //Set module properties
64 setDescription("ECL Data Quality Monitor. Logic Test");
65 setPropertyFlags(c_ParallelProcessingCertified); // specify this flag if you need parallel processing
66 addParam("histogramDirectoryName", m_histogramDirectoryName,
67 "histogram directory in ROOT file", std::string("ECL"));
68 addParam("InitKey", m_InitKey,
69 "How to initialize DSP coeffs: ''DB'' or ''File'' are acceptable ", std::string("DB"));
70 addParam("DSPDirectoryName", m_DSPDirectoryName,
71 "directory for DSP coeffs", std::string("/hsm/belle2/bdata/users/dmitry/dsp/"));
72 addParam("RunName", m_RunName,
73 "Name of run with DSP files", std::string("run0000/"));
74 addParam("SaveDetailedFitData", m_SaveDetailedFitData, "Save detailed data "
75 "(ampdiff_{cellid,shaper}, timediff_{cellid,shaper} histograms) for "
76 "failed fits.", false);
77 addParam("AdjustedTiming", m_adjusted_timing, "Use improved procedure for "
78 "time determination in ShaperDSP emulator", true);
79
80 std::vector<int> default_skip = {
81 // By default, skip delayed bhabha and random trigger events
85 };
86 addParam("skipEvents", m_skipEvents, "Skip events that have listed timing "
87 "source (from TRGSummary)", default_skip);
88}
89
93
94//------------------------------------------------------------------
95// Function to define histograms
96//-----------------------------------------------------------------
97
99{
100 TDirectory* oldDir = gDirectory;
101
102 // Create a separate histogram directory and cd into it.
103
104 TDirectory* dirDAQ = dynamic_cast<TDirectory*>(oldDir->Get(m_histogramDirectoryName.c_str()));
105 if (!dirDAQ) dirDAQ = oldDir->mkdir(m_histogramDirectoryName.c_str());
106 dirDAQ->cd();
107
108 //1D histograms creation.
109
110 std::vector<TH1F*> h_amp_qualityfail_raw, h_time_qualityfail_raw;
111
112 for (int i = 0; i < 4; i++) {
113 std::string h_name_a, h_title_a, h_name_t, h_title_t;
114 h_name_a = str(boost::format("amp_timefail_q%1%") % i);
115 h_title_a = str(boost::format("Amp for time mismatches w/ FPGA fit qual=%1%") % i);
116 h_name_t = str(boost::format("time_ampfail_q%1%") % i);
117 h_title_t = str(boost::format("Time for amp mismatches w/ FPGA fit qual=%1%") % i);
118 TH1F* h_a = new TH1F(h_name_a.c_str(), h_title_a.c_str(), 1200, 0, 262144);
119 TH1F* h_t = new TH1F(h_name_t.c_str(), h_title_t.c_str(), 240, -2050, 2050);
120 h_amp_timefail.push_back(h_a);
121 h_time_ampfail.push_back(h_t);
122 }
123
124 for (int i = 0; i < 4; i++) {
125 for (int j = 0; j < 4; j++) {
126 if (j != i) {
127 std::string h_name_a, h_title_a, h_name_t, h_title_t;
128 h_name_a = str(boost::format("amp_qf%1%_qd%2%") % i % j);
129 h_title_a = str(boost::format("Amp for C++ fit qual=%1% and FPGA fit qual=%2%") % i % j);
130 h_name_t = str(boost::format("time_qf%1%_qd%2%") % i % j);
131 h_title_t = str(boost::format("Time for C++ fit qual=%1% and FPGA fit qual=%2%") % i % j);
132 TH1F* h_a = new TH1F(h_name_a.c_str(), h_title_a.c_str(), 1200, 0, 262144);
133 TH1F* h_t = new TH1F(h_name_t.c_str(), h_title_t.c_str(), 240, -2050, 2050);
134 h_amp_qualityfail_raw.push_back(h_a);
135 h_time_qualityfail_raw.push_back(h_t);
136 }
137 }
138 h_amp_qualityfail.push_back(h_amp_qualityfail_raw);
139 h_time_qualityfail.push_back(h_time_qualityfail_raw);
140 h_amp_qualityfail_raw.clear();
141 h_time_qualityfail_raw.clear();
142 }
143
144 h_ampfail_quality = new TH1F("ampfail_quality", "Number of FPGA <-> C++ fitter #bf{amp} inconsistencies vs fit qual", 5, -1, 4);
145 h_ampfail_quality->SetFillColor(kPink - 4);
146 h_ampfail_quality->GetXaxis()->SetTitle("FPGA fit qual. -1-all evts,0-good,1-int overflow,2-low amp,3-bad chi2");
147 h_ampfail_quality->SetDrawOption("hist");
148
149 h_timefail_quality = new TH1F("timefail_quality", "Number of FPGA <-> C++ fitter #bf{time} inconsistencies vs fit qual", 5, -1, 4);
150 h_timefail_quality->SetFillColor(kPink - 4);
151 h_timefail_quality->GetXaxis()->SetTitle("FPGA fit qual. -1-all evts,0-good,1-int overflow,2-low amp,3-bad chi2");
152
153 h_ampfail_cellid = new TH1F("ampfail_cellid", "Cell IDs w/ amp inconsistencies",
155 h_ampfail_cellid->GetXaxis()->SetTitle("Cell ID");
156
157 h_timefail_cellid = new TH1F("timefail_cellid", "Cell IDs w/ time inconsistencies",
159 h_timefail_cellid->GetXaxis()->SetTitle("Cell ID");
160
161 h_amptimefail_cellid = new TH1F("amptimefail_cellid", "Cell IDs w/ time and amp inconsistencies",
163 h_amptimefail_cellid->GetXaxis()->SetTitle("Cell ID");
164
165 h_ampfail_shaperid = new TH1F("ampfail_shaperid", "Shaper IDs w/ amp inconsistencies", 624, 1, 625);
166 h_ampfail_shaperid->GetXaxis()->SetTitle("Shaper ID");
167
168 h_timefail_shaperid = new TH1F("timefail_shaperid", "Shaper IDs w/ time inconsistencies", 624, 1, 625);
169 h_timefail_shaperid->GetXaxis()->SetTitle("Shaper ID");
170
171 h_amptimefail_shaperid = new TH1F("amptimefail_shaperid", "Shaper IDs w/ time and amp inconsistencies", 624, 1, 625);
172 h_amptimefail_shaperid->GetXaxis()->SetTitle("Shaper ID");
173
174 h_ampfail_crateid = new TH1F("ampfail_crateid", "Crate IDs w/ amp inconsistencies", 52, 1, 53);
175 h_ampfail_crateid->GetXaxis()->SetTitle("Crate ID (same as ECLCollector ID)");
176
177 h_timefail_crateid = new TH1F("timefail_crateid", "Crate IDs w/ time inconsistencies", 52, 1, 53);
178 h_timefail_crateid->GetXaxis()->SetTitle("Crate ID (same as ECLCollector ID)");
179
180 h_amptimefail_crateid = new TH1F("amptimefail_crateid", "Crate IDs w/ time and amp inconsistencies", 52, 1, 53);
181 h_amptimefail_crateid->GetXaxis()->SetTitle("Crate ID (same as ECLCollector ID)");
182
183 h_qualityfail_cellid = new TH1F("qualityfail_cellid", "Cell IDs w/ fit qual inconsistencies",
185 h_qualityfail_cellid->GetXaxis()->SetTitle("Cell ID");
186
187 h_qualityfail_shaperid = new TH1F("qualityfail_shaperid", "Shaper IDs w/ fit qual inconsistencies", 624, 1, 625);
188 h_qualityfail_shaperid->GetXaxis()->SetTitle("Shaper ID");
189
190 h_qualityfail_crateid = new TH1F("qualityfail_crateid", "Crate IDs w/ fit qual inconsistencies", 52, 1, 53);
191 h_qualityfail_crateid->GetXaxis()->SetTitle("Crate ID (same as ECLCollector ID)");
192
193 h_fail_shaperid = new TH1F("fail_shaperid", "Shaper IDs w/ inconsistencies", 624, 1, 625);
194 h_fail_shaperid->GetXaxis()->SetTitle("Shaper ID");
195
196 h_fail_crateid = new TH1F("fail_crateid", "Crate IDs w/ inconsistencies", 52, 1, 53);
197 h_fail_crateid->GetXaxis()->SetTitle("Crate ID (same as ECLCollector ID)");
198
199
200 //2D histograms creation.
201
203 h_ampdiff_cellid = new TH2F("ampdiff_cellid", "Amp. diff. (Emulator-Data) for amp inconsistencies",
205 h_ampdiff_cellid->GetXaxis()->SetTitle("Cell ID");
206 h_ampdiff_cellid->GetYaxis()->SetTitle("Amplitude difference");
207
208 h_timediff_cellid = new TH2F("timediff_cellid", "Time diff. (Emulator-Data) for time inconsistencies",
210 h_timediff_cellid->GetXaxis()->SetTitle("Cell ID");
211 h_timediff_cellid->GetYaxis()->SetTitle("Time difference");
212
213 h_ampdiff_shaperid = new TH2F("ampdiff_shaper", "Amp. diff. (Emulator-Data) "
214 "for amp inconsistencies vs Shaper Id",
215 624, 1, 625, 239, -262143, 262143);
216 h_ampdiff_shaperid->GetXaxis()->SetTitle("Shaper Id");
217 h_ampdiff_shaperid->GetYaxis()->SetTitle("Amplitude difference");
218
219 h_timediff_shaperid = new TH2F("timediff_shaper", "Time diff. (Emulator-Data) "
220 "for time inconsistencies vs Shaper Id",
221 624, 1, 625, 239, -4095, 4095);
222 h_timediff_shaperid->GetXaxis()->SetTitle("Shaper Id");
223 h_timediff_shaperid->GetYaxis()->SetTitle("Time difference");
224 }
225
226 h_ampdiff_quality = new TH2F("ampdiff_quality", "Amp. diff. (Emulator-Data) for amp. inconsistencies", 4, 0, 4, 239,
227 -262143, 262143);
228 h_ampdiff_quality->GetXaxis()->SetTitle("FPGA fit quality. 0-good, 1-int overflow, 2-low amp, 3-bad chi2");
229 h_ampdiff_quality->GetYaxis()->SetTitle("Amplitude difference");
230
231 h_timediff_quality = new TH2F("timediff_quality", "Time diff. (Emulator-Data) for time inconsistencies", 4, 0, 4, 239,
232 -4095, 4095);
233 h_timediff_quality->GetXaxis()->SetTitle("FPGA fit quality. 0-good, 1-int overflow, 2-low amp, 3-bad chi2");
234 h_timediff_quality->GetYaxis()->SetTitle("Time difference");
235
236 h_quality_fit_data = new TH2F("quality_fit_data", "C++ fitter vs FPGA, fit quality inconsistencies", 4, 0, 4, 4, 0, 4);
237 h_quality_fit_data->GetXaxis()->SetTitle("C++ fit qual. 0-good,1-int overflow,2-low amp,3-bad chi2");
238 h_quality_fit_data->GetYaxis()->SetTitle("FPGA fit qual. 0-good,1-int overflow,2-low amp,3-bad chi2");
239
240 h_ampflag_qualityfail = new TH2F("ampflag_qualityfail", "Amp flag (0/1) for fit qual inconsistencies", 4, 0, 4, 4, -1,
241 3);
242 h_ampflag_qualityfail->GetXaxis()->SetTitle("FPGA fit quality. 0-good,1-int overflow,2-low amp,3-bad chi2");
243 h_ampflag_qualityfail->GetYaxis()->SetTitle("Amp flag (0-amp consistent)");
244
245 h_timeflag_qualityfail = new TH2F("timeflag_qualityfail", "Time flag (0/1) for fit qual inconsistencies", 4, 0, 4, 4,
246 -1, 3);
247 h_timeflag_qualityfail->GetXaxis()->SetTitle("FPGA fit quality. 0-good,1-int overflow,2-low amp,3-bad chi2");
248 h_timeflag_qualityfail->GetYaxis()->SetTitle("Time flag (0-time consistent)");
249
250 h_missing_ecldigits = new TH1F("missing_ecldigits", "", 4, 0, 4);
251 h_missing_ecldigits->SetTitle("Fit quality flag for missing ECLDigits (missing fit results)");
252 h_missing_ecldigits->GetXaxis()->SetTitle("C++ fit quality. 0-good,1-int overflow,2-low amplitude,3-bad chi2");
253
254 oldDir->cd();
255}
256
257
259{
260 REG_HISTOGRAM; // required to register histograms to HistoManager
261
262 m_ECLDigits.isRequired();
263 m_ECLTrigs.isOptional();
264 m_ECLDsps.isOptional();
265
266 if (!mapper.initFromDB()) B2FATAL("ECL DQM logic test FATAL:: Can't initialize eclChannelMapper");
267
268 if (m_InitKey == "DB") initDspfromDB();
269 else if (m_InitKey == "File") initDspfromFile();
270 else B2FATAL("ECL DQM logic test FATAL: No way to initialize DSP coeffs!!! Please choose InitKey = DB or InitKey = File");
271}
272
273void ECLDQMEXTENDEDModule::callbackCalibration(DBObjPtr<ECLCrystalCalib>& cal, std::vector<short int>& constants)
274{
275 const std::vector<float> intermediate = cal->getCalibVector();
276 constants.resize(intermediate.size());
277 for (size_t i = 0; i < constants.size(); i++) constants[i] = (short int)intermediate[i];
278}
279
280
282 std::map<std::string, std::vector<short int>>& map1,
283 std::map<std::string, short int>& map2)
284{
285
286 dspdata->getF(map1["F"]);
287 dspdata->getF1(map1["F1"]);
288 dspdata->getF31(map1["F31"]);
289 dspdata->getF32(map1["F32"]);
290 dspdata->getF33(map1["F33"]);
291 dspdata->getF41(map1["F41"]);
292 dspdata->getF43(map1["F43"]);
293
294 map2["k_a"] = (short int)dspdata->getka();
295 map2["k_b"] = (short int)dspdata->getkb();
296 map2["k_c"] = (short int)dspdata->getkc();
297 map2["k_16"] = (short int)dspdata->gety0Startr();
298 map2["k_1"] = (short int)dspdata->getk1();
299 map2["k_2"] = (short int)dspdata->getk2();
300 map2["chi_thres"] = dspdata->getchiThresh();
301}
302
303
305{
306 int iCrate = mapper.getCrateID(cellID);
307 int iShaperPosition = mapper.getShaperPosition(cellID);
308 return (iCrate - 1) * 12 + iShaperPosition;
309
310}
311const short int* ECLDQMEXTENDEDModule::vectorsplit(const std::vector<short int>& vectorFrom, int iChannel)
312{
313 size_t size = vectorFrom.size();
314 if (size % 16) B2ERROR("ECL DQM logic test error: Split is impossible!" << LogVar("Vector size", size));
315 return (vectorFrom.data() + (size / 16) * (iChannel - 1));
316}
317
318
320{
321 size_t iShaper = 0;
322
326
327 for (const auto& dspdata : m_ECLDspDataArray0) { //iCrate = 1, ..., 18
328 iShaper++;
329 callbackCalibration(&dspdata, map_container_vec[iShaper],
330 map_container_coef[iShaper]);
331 }
332
333 for (const auto& dspdata : m_ECLDspDataArray1) { //iCrate = 19, ..., 36
334 iShaper++;
335 callbackCalibration(&dspdata, map_container_vec[iShaper],
336 map_container_coef[iShaper]);
337 }
338
339 for (const auto& dspdata : m_ECLDspDataArray2) { //iCrate = 37, ..., 52
340 iShaper++;
341 if (iShaper < 529) {
342 if (iShaper - (iShaper - 1) / 12 * 12 > 10) continue;
343 } else {
344 if (iShaper - (iShaper - 1) / 12 * 12 > 8) continue;
345 }
346 callbackCalibration(&dspdata, map_container_vec[iShaper],
347 map_container_coef[iShaper]);
348 }
349}
350
352{
353 const std::filesystem::path MainDir(m_DSPDirectoryName);
354 const std::filesystem::path RunSubDir(m_RunName);
355 const std::regex Filter(".*(crate)([0-9]{2})/.*(dsp)([0-9]{2})(.dat)");
356 if (!exists(MainDir / RunSubDir)) B2FATAL("ECL DQM logic test FATAL: Directory w/ DSP files don't exist" << LogVar("Directory",
357 MainDir / RunSubDir));
358 for (const std::filesystem::directory_entry& x : std::filesystem::recursive_directory_iterator(MainDir / RunSubDir)) {
359 if (!std::regex_match(x.path().string(), Filter) || !std::filesystem::is_regular_file(x.path())) continue;
360 int iCrate = atoi(std::regex_replace(x.path().string(), Filter, "$2").c_str());
361 int iShaperPosition = atoi(std::regex_replace(x.path().string(), Filter, "$4").c_str());
362 int iShaper = (iCrate - 1) * 12 + iShaperPosition;
363 if (iCrate > 36 && iCrate < 45) {
364 if (iShaperPosition > 10) continue;
365 } else if (iCrate > 44) {
366 if (iShaperPosition > 8) continue;
367 }
368 ECLDspData* dspdata = ECLDspUtilities::readEclDsp(x.path().string().c_str(), iShaperPosition - 1);
369 callbackCalibration(dspdata, map_container_vec[iShaper],
370 map_container_coef[iShaper]);
374 }
375}
376
377void ECLDQMEXTENDEDModule::emulator(int cellID, int trigger_time, std::vector<int> adc_data)
378{
379 int iShaper = conversion(cellID);
380 int iChannelPosition = mapper.getShaperChannel(cellID);
381
382 const auto& map_vec = map_container_vec[iShaper];
383 const short int* f = vectorsplit(map_vec.at("F"), iChannelPosition);
384 const short int* f1 = vectorsplit(map_vec.at("F1"), iChannelPosition);
385 const short int* fg31 = vectorsplit(map_vec.at("F31"), iChannelPosition);
386 const short int* fg32 = vectorsplit(map_vec.at("F32"), iChannelPosition);
387 const short int* fg33 = vectorsplit(map_vec.at("F33"), iChannelPosition);
388 const short int* fg41 = vectorsplit(map_vec.at("F41"), iChannelPosition);
389 const short int* fg43 = vectorsplit(map_vec.at("F43"), iChannelPosition);
390
391 const auto& map_coef = map_container_coef[iShaper];
392 int k_a = map_coef.at("k_a");
393 int k_b = map_coef.at("k_b");
394 int k_c = map_coef.at("k_c");
395 int k_1 = map_coef.at("k_1");
396 int k_2 = map_coef.at("k_2");
397 int k_16 = map_coef.at("k_16");
398 int chi_thres = map_coef.at("chi_thres");
399
400 int A0 = (int)v_totalthrA0[cellID - 1];
401 int Ahard = (int)v_totalthrAhard[cellID - 1];
402 int Askip = (int)v_totalthrAskip[cellID - 1];
403
404 int* y = adc_data.data();
405 int ttrig2 = trigger_time - 2 * (trigger_time / 8);
406
407 auto result = lftda_(f, f1, fg41, fg43, fg31, fg32, fg33, y, ttrig2, A0,
408 Ahard, Askip, k_a, k_b, k_c, k_16, k_1, k_2, chi_thres,
410 m_AmpFit = result.amp;
411 m_TimeFit = result.time;
412 m_QualityFit = result.quality;
413
414 if (result.skip_thr || result.hit_thr) m_QualityFit += 4;
415}
416
418{
419 for (int i = 0; i < 4; i++) {
420 h_amp_timefail[i]->Reset();
421 h_time_ampfail[i]->Reset();
422 }
423 for (int i = 0; i < 4; i++) {
424 for (int j = 0; j < 3; j++) {
425 h_amp_qualityfail[i][j]->Reset();
426 h_time_qualityfail[i][j]->Reset();
427 }
428 }
429 h_ampfail_quality->Reset();
430 h_timefail_quality->Reset();
431 h_ampfail_cellid->Reset();
432 h_timefail_cellid->Reset();
433 h_amptimefail_cellid->Reset();
434 h_ampfail_shaperid->Reset();
435 h_timefail_shaperid->Reset();
436 h_amptimefail_shaperid->Reset();
437 h_ampfail_crateid->Reset();
438 h_timefail_crateid->Reset();
439 h_amptimefail_crateid->Reset();
440 h_qualityfail_cellid->Reset();
441 h_qualityfail_shaperid->Reset();
442 h_qualityfail_crateid->Reset();
443 h_fail_shaperid->Reset();
444 h_fail_crateid->Reset();
445
446 //2D histograms reset.
447
449 h_ampdiff_cellid->Reset();
450 h_timediff_cellid->Reset();
451 h_ampdiff_shaperid->Reset();
452 h_timediff_shaperid->Reset();
453 }
454 h_ampdiff_quality->Reset();
455 h_timediff_quality->Reset();
456 h_quality_fit_data->Reset();
457 h_ampflag_qualityfail->Reset();
458 h_timeflag_qualityfail->Reset();
459 h_missing_ecldigits->Reset();
460}
461
463{
464 if (m_TRGSummary.isValid()) {
465 // Skip events for several types of timing sources
466 // to reduce CPU time usage on HLT (random trigger, delayed bhahba).
467 int timing_type = m_TRGSummary->getTimType();
468 for (auto& skipped_timing_type : m_skipEvents) {
469 if (timing_type == skipped_timing_type) return;
470 }
471 }
472
473 int iAmpflag_qualityfail = 0;
474 int iTimeflag_qualityfail = 0;
475
476 if (!m_ECLTrigs.isValid()) B2FATAL("ECL DQM logic test FATAL: Trigger time information is not available");
477
478 for (auto& aECLDsp : m_ECLDsps) {
479 m_CellId = aECLDsp.getCellId();
480 std::vector<int> DspArray = aECLDsp.getDspA();
482
483 emulator(m_CellId, m_TrigTime, DspArray);
485
486 if ((m_AmpFit >= (int)v_totalthrAskip[m_CellId - 1]) && m_QualityFit < 4 && !aECLDigit) {
487 if (h_missing_ecldigits->GetEntries() == 0) {
488 B2ERROR("ECL DQM logic test error: ECL Digit does not exist for A_emulator > Thr_skip"
489 << LogVar("Thr_skip", (int)v_totalthrAskip[m_CellId - 1])
490 << LogVar("A_emulator", m_AmpFit)
491 << LogVar("Quality_emulator", m_QualityFit));
492 }
494 }
495
496 if ((m_AmpFit >= (int)v_totalthrAskip[m_CellId - 1]) && aECLDigit) {
497
498 m_AmpData = aECLDigit->getAmp();
499 m_TimeData = aECLDigit->getTimeFit();
500 m_QualityData = aECLDigit->getQuality();
501
502 if (m_AmpFit != m_AmpData) {
503 for (int i = 0; i < 4; i++) if (m_QualityData == i && m_TimeFit == m_TimeData) h_time_ampfail[i]->Fill(m_TimeData);
507 h_ampfail_crateid->Fill(mapper.getCrateID(m_CellId));
511 }
513 }
514 if (m_TimeFit != m_TimeData) {
515 for (int i = 0; i < 4; i++) if (m_QualityData == i && m_AmpFit == m_AmpData) h_amp_timefail[i]->Fill(m_AmpData);
519 h_timefail_crateid->Fill(mapper.getCrateID(m_CellId));
523 }
525 }
526 if (m_AmpFit != m_AmpData && m_TimeFit != m_TimeData) {
529 h_amptimefail_crateid->Fill(mapper.getCrateID(m_CellId));
530 }
532 for (int i = 0; i < 4; i++) {
533 for (int j = 0; j < 3; j++) {
534 int k = 0;
535 if (i == 0) k = j + 1;
536 if (i == 1) { if (j == 0) k = j; else k = j + 1; }
537 if (i == 2) { if (j == 2) k = j + 1; else k = j; }
538 if (i == 3) k = j;
539 if (m_QualityFit == i && m_QualityData == k) { h_amp_qualityfail[i][j]->Fill(m_AmpData); h_time_qualityfail[i][j]->Fill(m_TimeData); }
540 }
541 }
542 if (m_AmpFit != m_AmpData) iAmpflag_qualityfail = 1;
543 if (m_TimeFit != m_TimeData) iTimeflag_qualityfail = 1;
546 h_qualityfail_crateid->Fill(mapper.getCrateID(m_CellId));
547 h_ampflag_qualityfail->Fill(m_QualityData, iAmpflag_qualityfail);
548 h_timeflag_qualityfail->Fill(m_QualityData, iTimeflag_qualityfail);
550 }
553 h_fail_crateid->Fill(mapper.getCrateID(m_CellId));
554 }
555 h_ampfail_quality->Fill(-1);
556 h_timefail_quality->Fill(-1);
557 } //aECLDigit
558 } //aECLDsp
559} //event
560
561
565
566
567
Class for accessing objects in the database.
Definition DBObjPtr.h:21
TH2F * h_timediff_cellid
Histogram: Time diff.
virtual ~ECLDQMEXTENDEDModule() override
Destructor.
TH1F * h_amptimefail_shaperid
Histogram: ShaperIDs w/ failed amplitudes and times.
int m_TimeData
Signal time from ECL data.
void initDspfromDB()
Get DSP coeffs and auxiliary constants from DB.
TH2F * h_timediff_shaperid
Histogram: Time diff.
TH1F * h_ampfail_crateid
Histogram: CrateIDs w/ failed amplitudes.
TH1F * h_fail_crateid
Histogram: CrateIDs w/ failed logic.
bool m_SaveDetailedFitData
Save detailed fit data for failed fits.
std::vector< short int > v_totalthrA0
Vector to store Low amplitude thresholds.
TH1F * h_timefail_quality
Histogram: Time control flags in bins of QualityData.
bool m_adjusted_timing
Use modified time determination algorithm in emulator, same as in ShaperDSP version >= 1....
int m_AmpFit
Signal amplitude obtaining from DSP emulator.
int m_TrigTime
Trigger time value.
StoreArray< ECLDsp > m_ECLDsps
ECL DSP data.
virtual void initialize() override
Initialize the module.
TH1F * h_timefail_shaperid
Histogram: ShaperIDs w/ failed times.
std::vector< short int > v_totalthrAhard
Vector to store hit thresholds.
int m_QualityData
Quality flag from ECL data.
TH1F * h_qualityfail_shaperid
Histogram: ShaperIDs w/ failed qualities.
virtual void event() override
Event processor.
TH1F * h_fail_shaperid
Histogram: ShaperIDs w/ failed logic.
void emulator(int, int, std::vector< int >)
Call for DSP emulator.
TH2F * h_timediff_quality
Histogram: Time diff.
virtual void endRun() override
Call when a run ends.
TH1F * h_qualityfail_crateid
Histogram: CrateIDs w/ failed qualities.
TH1F * h_amptimefail_crateid
Histogram: CrateIDs w/ failed amplitudes and times.
virtual void terminate() override
Terminate.
int m_AmpData
Signal amplitude from ECL data.
void callbackCalibration(DBObjPtr< ECLCrystalCalib > &, std::vector< short int > &)
Read calibration values for thresholds from DBObject.
std::vector< short int > v_totalthrAskip
Vector to store skip amplitude threshold.
std::map< int, std::map< std::string, std::vector< short int > > > map_container_vec
Map to store DSP coeffs.
std::vector< int > m_skipEvents
Skip events with specified type of timing source (see TRGSummary class, ETimingType enum)
StoreArray< ECLDigit > m_ECLDigits
ECL digits.
DBArray< ECLDspData > m_ECLDspDataArray2
DBArray for payload 'ECLDSPPars2'.
std::vector< TH1F * > h_amp_timefail
Histogram vector: Amplitude for time mismacthes (AmplitudeFit == AmplitudeData) w/ various QualityDat...
TH1F * h_amptimefail_cellid
Histogram: CellIDs w/ failed amplitudes and times.
TH2F * h_ampflag_qualityfail
Histogram: Amp flag (0/1) w/ failed qualities in bins of QualityData.
DBObjPtr< ECLCrystalCalib > m_calibrationThrAhard
Hit threshold.
TH1F * h_timefail_crateid
Histogram: CrateIDs w/ failed times.
const short int * vectorsplit(const std::vector< short int > &, int)
Select from vector of DSP coeffs a subvector corresponding to accurate channel number.
std::string m_InitKey
Key to initialize DSP coeffs.
TH2F * h_quality_fit_data
Histogram: QualityFit vs QualityData for quality fails.
DBObjPtr< ECLCrystalCalib > m_calibrationThrAskip
Skip amplitude threshold.
int conversion(int)
Convert a CellID number to the global Shaper number.
virtual void beginRun() override
Call when a run begins.
std::string m_histogramDirectoryName
Histogram directory in ROOT file.
ECL::ECLChannelMapper mapper
ECL channel mapper.
ECLDQMEXTENDEDModule()
< derived from HistoModule class.
TH2F * h_ampdiff_quality
Histogram: Amp.
DBArray< ECLDspData > m_ECLDspDataArray1
DBArray for payload 'ECLDSPPars1'.
TH1F * h_ampfail_cellid
Histogram: CellIDs w/ failed amplitudes.
TH2F * h_ampdiff_shaperid
Histogram: Amp.
TH1F * h_ampfail_quality
Histogram: Amp.
int m_QualityFit
Quality flag obtaining from DSP emulator.
std::string m_RunName
Run with valid DSP coeffs.
DBArray< ECLDspData > m_ECLDspDataArray0
DBArray for payload 'ECLDSPPars0'.
TH2F * h_ampdiff_cellid
Histogram: Amplitude diff.
TH1F * h_ampfail_shaperid
Histogram: ShaperIDs w/ failed amplitudes.
TH1F * h_timefail_cellid
Histogram: CellIDs w/ failed times.
StoreArray< ECLTrig > m_ECLTrigs
ECL trigger data.
DBObjPtr< ECLCrystalCalib > m_calibrationThrA0
Low amplitude threshold.
TH1F * h_qualityfail_cellid
Histogram: CellIDs w/ failed qualities.
std::map< int, std::map< std::string, short int > > map_container_coef
Map to store auxiliary constants for all shapers.
std::vector< std::vector< TH1F * > > h_amp_qualityfail
Histogram vector: AmplitudeData for quality mismathes w/ various QualityFit (raw) and QualityData (co...
StoreObjPtr< TRGSummary > m_TRGSummary
StoreObjPtr TRGSummary.
std::vector< TH1F * > h_time_ampfail
Histogram vector: Time for amplitude mismathces (TimeFit == TimeData) w/ various QualityData values.
std::string m_DSPDirectoryName
Directory name consisting of DSP coeffs.
int m_TimeFit
Signal time obtaining from DSP emulator.
void initDspfromFile()
Get DSP coeffs and auxiliary constants from Files.
TH2F * h_timeflag_qualityfail
Histogram: Time flag (0/1) w/ failed qualities in bins of Quality Data.
TH1F * h_missing_ecldigits
Histogram: Quality flag (from emulator) for the waveforms where fit result (ECLDigit) should have bee...
std::vector< std::vector< TH1F * > > h_time_qualityfail
Histogram vector: TimeData for quality mismacthes w/ various QualitFit (raw) and QualityData (column)...
virtual void defineHisto() override
Function to define histograms.
Class to store ECL digitized hits (output of ECLDigi) relation to ECLHit filled in ecl/modules/eclDig...
Definition ECLDigit.h:24
int getAmp() const
Get Fitting Amplitude.
Definition ECLDigit.h:70
int getQuality() const
Get Fitting Quality.
Definition ECLDigit.h:80
static ECLDigit * getByCellID(int cid)
Find ECLDigit by Cell ID using linear search.
Definition ECLDigit.cc:14
int getTimeFit() const
Get Fitting Time.
Definition ECLDigit.h:75
This object contains ECL DSP coefs – electromagnetic calorimeter digital signal processing coefficien...
Definition ECLDspData.h:33
unsigned char getkb() const
Number of bits for FG32.
Definition ECLDspData.h:199
short int getchiThresh() const
chi2 threshold for fit quality flag
Definition ECLDspData.h:191
void getF43(std::vector< short int > &dst) const
Alternative for FG33 for signals with small amplitude.
Definition ECLDspData.h:169
unsigned char gety0Startr() const
start point for pedestal calculation
Definition ECLDspData.h:203
void getF(std::vector< short int > &dst) const
Array with tabulated signal waveform.
Definition ECLDspData.h:139
void getF31(std::vector< short int > &dst) const
Array FG31, used to estimate signal amplitude.
Definition ECLDspData.h:148
unsigned char getk2() const
multipliers power of 2 for chi2 calculation
Definition ECLDspData.h:195
void getF33(std::vector< short int > &dst) const
Array FG33, used to estimate pedestal height in signal.
Definition ECLDspData.h:161
unsigned char getka() const
Number of bits for FG31, FG41.
Definition ECLDspData.h:197
unsigned char getk1() const
multipliers power of 2 for f, f1
Definition ECLDspData.h:193
void getF32(std::vector< short int > &dst) const
Array FG32, used to estimate A * delta_t.
Definition ECLDspData.h:155
void getF41(std::vector< short int > &dst) const
Alternative for FG31 for signals with small amplitude.
Definition ECLDspData.h:165
void getF1(std::vector< short int > &dst) const
Array with tabulated derivative of signal waveform.
Definition ECLDspData.h:143
unsigned char getkc() const
Number of bits for FG33, FG43.
Definition ECLDspData.h:201
double getTimeTrig() const
Get Trig Time.
Definition ECLTrig.h:111
static ECLTrig * getByCellID(int cid)
Find ECLTrig by Cell ID using linear search.
Definition ECLTrig.cc:15
static ECLDspData * readEclDsp(const char *raw_file, int boardNumber)
Convert ECLDspData from *.dat file to Root object.
This class is used to select pairs, triplets... of objects.
Definition Filter.h:34
HistoModule()
Constructor.
Definition HistoModule.h:32
void setDescription(const std::string &description)
Sets the description of the module.
Definition Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition Module.h:80
@ TTYP_DPHY
delayed physics events for background
Definition TRGSummary.h:65
@ TTYP_POIS
poisson random trigger
Definition TRGSummary.h:73
@ TTYP_RAND
random trigger events
Definition TRGSummary.h:67
Class to store variables with their name which were sent to the logging service.
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.