12 #include <ecl/utility/ECLDspUtilities.h>
13 #include <ecl/utility/ECLChannelMapper.h>
14 #include <ecl/dbobjects/ECLDspData.h>
15 #include <ecl/dbobjects/ECLCrystalCalib.h>
16 #include <ecl/dataobjects/ECLDigit.h>
18 #include <framework/logging/Logger.h>
19 #include <framework/database/DBObjPtr.h>
20 #include <framework/database/DBArray.h>
21 #include <framework/utilities/FileSystem.h>
30 const short ECLDSP_FORMAT_VERSION = 1;
40 void readEclDspCoefs(FILE* fl,
void* ptr,
int word_size,
int word_count)
42 int read_items = fread(ptr, word_size, word_count, fl);
43 if (read_items != word_count) {
44 B2ERROR(
"Error reading DSP coefficients");
51 fl = fopen(filename,
"rb");
53 B2ERROR(
"Can't open file " << filename);
59 int crateNum = (boardNumber - 1) / 12 + 1;
60 int shaperNum = (boardNumber - 1) % 12;
67 if (shaperNum >= 10) {
68 if (crateNum >= 37 && crateNum <= 44) {
80 int size = fread(
id, nsiz, nsiz1, fl);
82 B2ERROR(
"Error reading header of DSP file");
85 std::vector<short int> extraData;
86 extraData.push_back(ECLDSP_FORMAT_VERSION);
87 extraData.push_back(data->getPackerVersion());
88 data->setExtraData(extraData);
90 data->setverMaj(
id[8] & 0xFF);
91 data->setverMin(
id[8] >> 8);
92 data->setkb(
id[13] >> 8);
93 data->setka(
id[13] - 256 * data->getkb());
94 data->sety0Startr(
id[14] >> 8);
95 data->setkc(
id[14] - 256 * data->gety0Startr());
96 data->setchiThresh(
id[15]);
97 data->setk2(
id[16] >> 8);
98 data->setk1(
id[16] - 256 * data->getk2());
100 data->setlAT(
id[128]);
101 data->setsT(
id[192]);
102 data->setaAT(
id[208]);
104 std::vector<short int> f(49152), f1(49152), f31(49152),
105 f32(49152), f33(49152), f41(6144), f43(6144);
107 for (
int i = 0; i < 16; ++i) {
109 readEclDspCoefs(fl, &(*(f41.begin() + i * nsiz1)), nsiz, nsiz1);
111 readEclDspCoefs(fl, &(*(f31.begin() + i * nsiz1)), nsiz, nsiz1);
112 readEclDspCoefs(fl, &(*(f32.begin() + i * nsiz1)), nsiz, nsiz1);
113 readEclDspCoefs(fl, &(*(f33.begin() + i * nsiz1)), nsiz, nsiz1);
115 readEclDspCoefs(fl, &(*(f43.begin() + i * nsiz1)), nsiz, nsiz1);
117 readEclDspCoefs(fl, &(*(f.begin() + i * nsiz1)), nsiz, nsiz1);
118 readEclDspCoefs(fl, &(*(f1.begin() + i * nsiz1)), nsiz, nsiz1);
137 const unsigned short DEFAULT_HEADER[256] {
139 0x4543, 0x4c44, 0x5350, 0x2046, 0x494c, 0x4500, 0x0000, 0x0000,
140 0xABCD, 0xffff, 0x0000, 0x0000, 0x0000, 0xABCD, 0xABCD, 0xABCD,
141 0xABCD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
142 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
143 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
144 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
145 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
146 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
147 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD,
148 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD,
149 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
150 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
151 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
152 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
153 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
154 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
155 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD,
156 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD,
157 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
158 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
159 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
160 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
161 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
162 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
163 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD,
164 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD,
165 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD,
166 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD, 0xABCD,
167 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
168 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
169 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
170 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
174 fl = fopen(filename,
"wb");
180 unsigned short header[256];
182 int format_version = data->getExtraData()[0];
183 if (format_version > ECLDSP_FORMAT_VERSION) {
184 B2WARNING(
"Format version " << format_version <<
" is not fully supported, some data might be discarded.");
187 for (
int i = 0; i < 256; i++) {
189 header[i] = (data->getverMin() << 8) | data->getverMaj();
190 }
else if (i == 13) {
191 header[i] = (data->getkb() << 8) | data->getka();
192 }
else if (i == 14) {
193 header[i] = (data->gety0Startr() << 8) | data->getkc();
194 }
else if (i == 15) {
195 header[i] = data->getchiThresh();
196 }
else if (i == 16) {
197 header[i] = (data->getk2() << 8) | data->getk1();
198 }
else if (i >= 64 && i < 80) {
199 header[i] = data->gethT();
200 }
else if (i >= 128 && i < 144) {
201 header[i] = data->getlAT();
202 }
else if (i >= 192 && i < 208) {
203 header[i] = data->getsT();
204 }
else if (i >= 208 && i < 224) {
205 header[i] = data->getaAT();
208 int high = (DEFAULT_HEADER[i] & 0xFF00) >> 8;
209 int low = (DEFAULT_HEADER[i] & 0x00FF);
210 header[i] = (low << 8) + high;
214 int size = fwrite(header, nsiz, nsiz1, fl);
216 B2FATAL(
"Error writing header of DSP file " << filename);
219 std::vector<short int> f(49152), f1(49152), f31(49152),
220 f32(49152), f33(49152), f41(6144), f43(6144);
229 for (
int i = 0; i < 16; ++i) {
231 fwrite(&(*(f41.begin() + i * nsiz1)), nsiz, nsiz1, fl);
233 fwrite(&(*(f31.begin() + i * nsiz1)), nsiz, nsiz1, fl);
234 fwrite(&(*(f32.begin() + i * nsiz1)), nsiz, nsiz1, fl);
235 fwrite(&(*(f33.begin() + i * nsiz1)), nsiz, nsiz1, fl);
237 fwrite(&(*(f43.begin() + i * nsiz1)), nsiz, nsiz1, fl);
239 fwrite(&(*(f.begin() + i * nsiz1)), nsiz, nsiz1, fl);
240 fwrite(&(*(f1.begin() + i * nsiz1)), nsiz, nsiz1, fl);
248 short int* vectorsplit(std::vector<short int>& vectorFrom,
int channel)
250 size_t size = vectorFrom.size();
251 if (size % 16) B2ERROR(
"Split is impossible!" <<
"Vector size" << size);
252 return (vectorFrom.data() + (size / 16) * (channel - 1));
268 int dsp_group = (crate - 1) / 18;
269 int dsp_id = (crate - 1) % 18;
270 std::string payload_name =
"ECLDSPPars" + std::to_string(dsp_group);
272 const ECLDspData* data = dsp_data[dsp_id * 12 + shaper - 1];
274 std::vector<short> vec_f; data->getF(vec_f);
275 std::vector<short> vec_f1; data->getF1(vec_f1);
276 std::vector<short> vec_fg31; data->getF31(vec_fg31);
277 std::vector<short> vec_fg32; data->getF32(vec_fg32);
278 std::vector<short> vec_fg33; data->getF33(vec_fg33);
279 std::vector<short> vec_fg41; data->getF41(vec_fg41);
280 std::vector<short> vec_fg43; data->getF43(vec_fg43);
282 short* f = vectorsplit(vec_f, channel);
283 short* f1 = vectorsplit(vec_f1, channel);
284 short* fg31 = vectorsplit(vec_fg31, channel);
285 short* fg32 = vectorsplit(vec_fg32, channel);
286 short* fg33 = vectorsplit(vec_fg33, channel);
287 short* fg41 = vectorsplit(vec_fg41, channel);
288 short* fg43 = vectorsplit(vec_fg43, channel);
290 int k_a = data->getka();
291 int k_b = data->getkb();
292 int k_c = data->getkc();
293 int k_1 = data->getk1();
294 int k_2 = data->getk2();
295 int k_16 = data->gety0Startr();
296 int chi_thres = data->getchiThresh();
302 int ttrig2 = ttrig - 2 * (ttrig / 8);
309 int A0 = thr_LowAmp->getCalibVector()[cid - 1];
310 int Ahard = thr_HitThresh->getCalibVector()[cid - 1];
311 int Askip = thr_StoreDigit->getCalibVector()[cid - 1];
314 auto result = lftda_(f, f1, fg41, fg43, fg31, fg32, fg33, y, ttrig2, A0,
315 Ahard, Askip, k_a, k_b, k_c, k_16, k_1, k_2,
324 TFile* file =
new TFile(path.c_str(),
"read");
325 if (!file->IsOpen()) {
326 B2FATAL(
"Unable to load coefficients for ECL pedestal fit");
328 TTree* tree = (TTree*)file->Get(
"dsp_coefs");
329 int nentries = tree->GetEntries();
330 float fg31_i, fg32_i;
331 tree->SetBranchAddress(
"fg31", &fg31_i);
332 tree->SetBranchAddress(
"fg32", &fg32_i);
334 for (
int i = 0; i < nentries; i++) {
357 for (
int i = 0; i < 16; i++) {
358 if (adc[i] > ped_max) {
365 if (ped_max_pos < 2 || ped_max_pos > 13) {
372 int time_index = ped_max_pos * 4 - 8;
373 if (time_index > 47) time_index = 47;
374 if (time_index < 0) time_index = 0;
377 for (
int iter = 0; iter < 2; iter++) {
380 for (
int j = 0; j < 16; j++) {
385 time_index -= tim * 4;
386 if (time_index > 47) time_index = 47;
387 if (time_index < 0) time_index = 0;