BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnAdcProcessor.cxx
Go to the documentation of this file.
1#include "BmnAdcProcessor.h"
2
3// ROOT
4#include "P4_F32vec4.h"
5#include "smmintrin.h"
6
7#include <TStyle.h>
8
9// #include <BmnMath.h>
10
12 uint32_t run,
13 TString det,
14 uint16_t nCh,
15 const uint16_t nSmpl,
16 BmnSetup setup)
17 : fVerbose(0)
18 , drawCnt(0)
19 , drawCnt2d(0)
20 , thrDif(0)
21 , FinalThr(0)
22 , fNIters(0)
23 , cmodcut(0)
24 , thrMax(0)
25 , fNSamples(nSmpl)
26 , fNChannels(nCh)
28 , fPedDat(nullptr)
29 , fApplyThreshold(true)
30 , fSigProf(nullptr)
31 , fNoisyChannels(nullptr)
32 , fAdc(nullptr)
33 , fPedRms(nullptr)
34 , fPedVal(nullptr)
35 , fPedValTemp(nullptr)
36 , fCMode(nullptr)
37 , fCMode0(nullptr)
38 , fSMode(nullptr)
39 , fSMode0(nullptr)
40 , fNoisyChipChannels(nullptr)
41 , fNvals(nullptr)
42 , fNvalsCMod(nullptr)
43 , fNvalsADC(nullptr)
44 , fPedCMod(nullptr)
45 , fPedCMod2(nullptr)
46 , fSumRmsV(nullptr)
47 , fDetName(det)
48 , fPeriod(period)
49 , fRun(run)
50 , fSetup(setup)
51{
53 // #if CMAKE_BUILD_TYPE == Debug
54 // &BmnAdcProcessor::PrecalcEventMods;
55 // printf("\n\nDebug!!!\n\n");
56 // #else
57 // &BmnAdcProcessor::PrecalcEventMods_simd;
58 // printf("\n\nRelease!!!\n\n");
59 // #endif
60
61#ifdef BUILD_DEBUG
63 if (fVerbose)
64 printf("\n\nDebug!!!\n");
65#else
67 if (fVerbose)
68 printf("\n\nRelease!!!\n");
69#endif
70}
71
73{
74 auto serIter = fSerMap.find(serial);
75 if (serIter == fSerMap.end()) {
76 if (fVerbose > 1)
77 printf("adding %08X to the map, iSer = %lu\n", serial, GetNSerials());
78 fSerMap.insert(make_pair(serial, GetNSerials()));
79 fAdcSerials.push_back(serial);
80 }
81}
82
84{
85 fPedVal = new Float_t**[GetNSerials()];
86 // fPedVal = new Double_t**[GetNSerials()];
88 // fNvals = new UInt_t*[GetNSerials()];
89 fNvals = new Float_t*[GetNSerials()];
90 fNvalsCMod = new UInt_t**[GetNSerials()];
91 fNvalsADC = new UInt_t**[GetNSerials()];
92 fPedRms = new Double_t**[GetNSerials()];
93 fPedCMod = new Double_t**[GetNSerials()];
97 fCMode = new Float_t*[GetNSerials()];
98 fCMode0 = new Float_t*[GetNSerials()];
99 fSMode = new Float_t*[GetNSerials()];
100 fSMode0 = new Float_t*[GetNSerials()];
102 fAdc = new Float_t**[GetNSerials()];
103 // fAdc = new Double_t**[GetNSerials()];
104 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
105 // fPedVal[iCr] = new Double_t*[fNChannels];
106 fPedVal[iCr] = new Float_t*[fNChannels];
107 fPedValTemp[iCr] = new Double_t*[fNChannels];
108 // fNvals[iCr] = new UInt_t[fNChannels];
109 fNvals[iCr] = new Float_t[fNChannels];
110 memset(fNvals[iCr], 0, sizeof(Float_t) * fNChannels);
111 fNvalsCMod[iCr] = new UInt_t*[fNChannels];
112 fNvalsADC[iCr] = new UInt_t*[fNChannels];
113 fPedRms[iCr] = new Double_t*[fNChannels];
114 fPedCMod[iCr] = new Double_t*[fNChannels];
115 fPedCMod2[iCr] = new Double_t*[fNChannels];
116 fSumRmsV[iCr] = new Double_t[fNChannels];
117 memset(fSumRmsV[iCr], 0, sizeof(Double_t) * fNChannels);
119 fAdcProfiles[iCr] = new UInt_t*[fNChannels];
120 // fAdc[iCr] = new Double_t*[fNChannels];
121 fAdc[iCr] = new Float_t*[fNChannels];
122 fCMode[iCr] = new Float_t[fNChannels];
123 fCMode0[iCr] = new Float_t[fNChannels];
124 fSMode[iCr] = new Float_t[fNChannels];
125 fSMode0[iCr] = new Float_t[fNChannels];
126 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
127 // fPedVal[iCr][iCh] = new Double_t[fNSamples];
128 fPedVal[iCr][iCh] = new Float_t[fNSamples];
129 fPedValTemp[iCr][iCh] = new Double_t[fNSamples];
130 fNvalsADC[iCr][iCh] = new UInt_t[fNSamples];
131 memset(fNvalsADC[iCr][iCh], 0, sizeof(UInt_t) * fNSamples);
132 fNvalsCMod[iCr][iCh] = new UInt_t[fNSamples];
133 memset(fNvalsCMod[iCr][iCh], 0, sizeof(UInt_t) * fNSamples);
134 fPedRms[iCr][iCh] = new Double_t[fNSamples];
135 fPedCMod[iCr][iCh] = new Double_t[fNSamples];
136 fPedCMod2[iCr][iCh] = new Double_t[fNSamples];
137 fNoisyChipChannels[iCr][iCh] = new Bool_t[fNSamples];
138 fAdcProfiles[iCr][iCh] = new UInt_t[fNSamples];
139 // fAdc[iCr][iCh] = new Double_t[fNSamples];
140 fAdc[iCr][iCh] = new Float_t[fNSamples];
141 fCMode[iCr][iCh] = 0.0;
142 fCMode0[iCr][iCh] = 0.0;
143 fSMode[iCr][iCh] = 0.0;
144 fSMode0[iCr][iCh] = 0.0;
145 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
146 fPedVal[iCr][iCh][iSmpl] = 0.0;
147 fPedValTemp[iCr][iCh][iSmpl] = 0.0;
148 fPedRms[iCr][iCh][iSmpl] = 0.0;
149 fPedCMod[iCr][iCh][iSmpl] = 0.0;
150 fPedCMod2[iCr][iCh][iSmpl] = 0.0;
151 fNoisyChipChannels[iCr][iCh][iSmpl] = kFALSE;
152 fAdcProfiles[iCr][iCh][iSmpl] = 0;
153 fAdc[iCr][iCh][iSmpl] = 0.0;
154 }
155 }
156 }
157
158 fPedDat = new Double_t***[GetNSerials()];
159 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
160 fPedDat[iCr] = new Double_t**[N_EV_FOR_PEDESTALS];
161 for (UInt_t iEv = 0; iEv < N_EV_FOR_PEDESTALS; ++iEv) {
162 fPedDat[iCr][iEv] = new Double_t*[fNChannels];
163 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
164 fPedDat[iCr][iEv][iCh] = new Double_t[fNSamples];
165 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl)
166 fPedDat[iCr][iEv][iCh][iSmpl] = 0.0;
167 }
168 }
169 }
170 // Int_t nevents = N_EV_FOR_PEDESTALS - 2;
171 // for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
172 // vector<TH1*> hv;
173 // vector<TH1*> hcm;
174 // vector<TH1*> hsm;
175 // for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
176 // TString hname = TString(Form("%08X:%02d pedestals SM ev", fAdcSerials[iCr], iCh));
177 // TH1* h = new TH2F(hname, hname,
178 // N_EV_FOR_PEDESTALS, 0, N_EV_FOR_PEDESTALS,
179 // fNSamples, 0, fNSamples);
180 // h->GetXaxis()->SetTitle("Event #");
181 // h->GetYaxis()->SetTitle("Sample(channel) #");
182 // hv.push_back(h);
183 //
184 // hname = TString(Form("%08X:%02d cmods SM ev", fAdcSerials[iCr], iCh));
185 // TH1* hc = new TH1F(hname, hname, nevents, 0, nevents);
186 // hc->GetXaxis()->SetTitle("Event #");
187 // hcm.push_back(hc);
188 //
189 // hname = TString(Form("%08X:%02d smods SM ev", fAdcSerials[iCr], iCh));
190 // TH1* hs = new TH1F(hname, hname, nevents, 0, nevents);
191 // hs->GetXaxis()->SetTitle("Event #");
192 // hsm.push_back(hs);
193 // }
194 // hPedLine.push_back(hv);
195 // hCMode.push_back(hcm);
196 // hSMode.push_back(hsm);
197 // }
198}
199
201{
202 for (size_t iCr = 0; iCr < GetNSerials(); iCr++) {
203 for (Int_t iEv = 0; iEv < N_EV_FOR_PEDESTALS; iEv++) {
204 for (Int_t iCh = 0; iCh < fNChannels; iCh++)
205 delete[] fPedDat[iCr][iEv][iCh];
206 delete[] fPedDat[iCr][iEv];
207 }
208 delete[] fPedDat[iCr];
209 }
210 delete[] fPedDat;
211 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
212 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
213 delete[] fPedVal[iCr][iCh];
214 delete[] fPedValTemp[iCr][iCh];
215 delete[] fNvalsCMod[iCr][iCh];
216 delete[] fNvalsADC[iCr][iCh];
217 delete[] fPedRms[iCr][iCh];
218 delete[] fPedCMod[iCr][iCh];
219 delete[] fPedCMod2[iCr][iCh];
220 delete[] fAdcProfiles[iCr][iCh];
221 delete[] fAdc[iCr][iCh];
222 delete[] fNoisyChipChannels[iCr][iCh];
223 }
224 delete[] fPedVal[iCr];
225 delete[] fPedValTemp[iCr];
226 delete[] fNvalsADC[iCr];
227 delete[] fNvals[iCr];
228 delete[] fNvalsCMod[iCr];
229 delete[] fPedRms[iCr];
230 delete[] fPedCMod[iCr];
231 delete[] fPedCMod2[iCr];
232 delete[] fSumRmsV[iCr];
233 delete[] fAdcProfiles[iCr];
234 delete[] fAdc[iCr];
235 delete[] fCMode[iCr];
236 delete[] fCMode0[iCr];
237 delete[] fSMode[iCr];
238 delete[] fSMode0[iCr];
239 delete[] fNoisyChipChannels[iCr];
240 }
241 delete[] fPedVal;
242 delete[] fPedValTemp;
243 delete[] fNvalsADC;
244 delete[] fNvals;
245 delete[] fNvalsCMod;
246 delete[] fPedRms;
247 delete[] fPedCMod;
248 delete[] fPedCMod2;
249 delete[] fSumRmsV;
250 delete[] fAdcProfiles;
251 delete[] fAdc;
252 delete[] fCMode;
253 delete[] fCMode0;
254 delete[] fSMode;
255 delete[] fSMode0;
256 delete[] fNoisyChipChannels;
257 /*canStrip->cd(1);
258 h->Draw("colz");
259 canStrip->cd(2);
260 hp->Draw("colz");
261 canStrip->cd(3);
262 hcms->Draw("colz");
263 canStrip->cd(4);
264 hscms_adc->Draw("colz");
265 canStrip->cd(5);
266 hcms1p->Draw("colz");
267 canStrip->cd(6);
268 hscms1p_adc->Draw("colz");
269 canStrip->cd(7);
270 hcms1->Draw("colz");
271 canStrip->cd(8);
272 hscms1_adc->Draw("colz");
273 canStrip->SaveAs("can-cms.png");*/
274 // for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
275 // delete hSModeSi[iCr];
276 // delete hCModeSi[iCr];
277 // for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
278 // delete hPedLineSi[iCr][iCh];
279 // }
280 // }
281 LOGF(info, "%10s: Real time %4.3f s, CPU time %4.3f s ADC processor. Precalc", fDetName.Data(), workTime_real_p,
283 LOGF(info, "%10s: Real time %4.3f s, CPU time %4.3f s ADC processor", fDetName.Data(), workTime_real, workTime_cpu);
284}
285
287{
288 for (Int_t iAdc = 0; iAdc < adc->GetEntriesFast(); ++iAdc) {
289 BmnADCDigit<Short_t>* adcDig = (BmnADCDigit<Short_t>*)adc->At(iAdc);
290 // printf("GEM ser 0x%08X, ev %d\n", adcDig->GetSerial(), ev);
291 auto serIter = fSerMap.find(adcDig->GetSerial());
292 if (serIter == fSerMap.end()) {
293 // printf("Serial %08X not found in the map\n", ser);
294 continue;
295 }
296 Int_t iSer = serIter->second;
297 // printf("GEM ser = 0x%08x, iSer = %02d, ev= %05d, ch = %d\n", adcDig->GetSerial(), iSer, ev,
298 // adcDig->GetChannel());
299 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
300 fPedDat[iSer][ev][adcDig->GetChannel()][iSmpl] = (Double_t)(adcDig->GetValue())[iSmpl] / 16.0;
301 // if ((fRun > GetBoundaryRun(ADC32_N_SAMPLES)) || (fPeriod >= 7)) {
302 // fPedDat[iSer][ev][adcDig->GetChannel()][iSmpl] = (Double_t)(adcDig->GetValue())[iSmpl]
303 // / 16.0;
304 // } else
305 // fPedDat[iSer][ev][adcDig->GetChannel()][iSmpl] =
306 // (Double_t)(adcDig->GetUShortValue())[iSmpl] / 16.0;
307 // // printf("adc = %i pedData = %f\n", (adcDig->GetValue())[iSmpl],
308 // // pedData[iSer][ev][adcDig->GetChannel()][iSmpl]);
309 }
310 }
311}
312
314{
315 TString docName = TString(Form("%s-mods-ev-%d.pdf", fDetName.Data(), drawCnt));
316 const UInt_t PAD_WIDTH_SIL = 1920; // 8192;
317 const UInt_t PAD_HEIGHT_SIL = 1080;
318 // TString docName = "sil-ped-cms.pdf";
319 TCanvas* c = new TCanvas("can cms", "can", PAD_WIDTH_SIL, 2 * PAD_HEIGHT_SIL);
320 c->Divide(1, 2);
321 c->Print(docName + "[");
322 for (size_t iCr = 0; iCr < GetNSerials(); iCr++)
323 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
324 // auto *p = c->cd(iCr * fNChannels + iCh + 1);
325 c->Clear("D");
326 // hPedLine[iCr][iCh]->Draw("colz");
327 c->cd(1);
328 hSMode[iCr][iCh]->Draw("colz");
329 c->cd(2);
330 hCMode[iCr][iCh]->Draw("colz");
331 c->Print(docName);
332 // c->SaveAs(Form("%s.png", hPedLine[iCr][iCh]->GetName()));
333 }
334 c->Print(docName + "]");
335 // c->SaveAs();
336 drawCnt++;
337}
338
340{
341 TString docName = TString(Form("%s-run-%d-mods-%d.pdf", fDetName.Data(), fRun, drawCnt2d));
342 const UInt_t PAD_WIDTH_SIL = 1920; // 8192;
343 const UInt_t PAD_HEIGHT_SIL = 1080;
344 gStyle->SetOptStat(0);
345 // TColor::InvertPalette();
346 gStyle->SetPalette(kDeepSea);
347 TCanvas* c = new TCanvas("can cms", "can", PAD_WIDTH_SIL, 2 * PAD_HEIGHT_SIL);
348 c->Divide(1, 3);
349 c->Print(docName + "[");
350 for (size_t iCr = 0; iCr < GetNSerials(); iCr++) {
351 c->Clear("D");
352 c->cd(1);
353 hPedSi[iCr]->Draw("box");
354 c->cd(2);
355 hCModeSi[iCr]->Draw("colz");
356 c->cd(3);
357 hSModeSi[iCr]->Draw("colz");
358 c->Print(docName);
359 }
360 // c->Print(docName + "]");
361 delete c;
362 c = new TCanvas("can pedestals", "can", PAD_WIDTH_SIL, PAD_HEIGHT_SIL);
363 // c->Print(docName + "[");
364 c->Clear("D");
365 // c->Divide(1, 2);
366 for (size_t iCr = 0; iCr < GetNSerials(); iCr++)
367 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
368 c->Clear("D");
369 c->cd(1);
370 hPedLineSi[iCr][iCh]->Draw("colz");
371 c->Print(docName);
372 // c->SaveAs(Form("%s.png", hPedLine[iCr][iCh]->GetName()));
373 }
374 c->Print(docName + "]");
375 delete c;
376 drawCnt2d++;
377}
378
380{
381 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
382 hPedSi[iCr]->Reset();
383 hSModeSi[iCr]->Reset();
384 hCModeSi[iCr]->Reset();
385 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
386 hPedLine[iCr][iCh]->Reset();
387 hSMode[iCr][iCh]->Reset();
388 hCMode[iCr][iCh]->Reset();
389 }
390 }
391}
392
394{
395 const UShort_t nSmpl = fNSamples;
396
397 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
398 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
399 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
400 fPedVal[iCr][iCh][iSmpl] = 0.0;
401 fPedRms[iCr][iCh][iSmpl] = 0.0;
402 fAdcProfiles[iCr][iCh][iSmpl] = 0;
403 }
404 }
405 // cout << fDetName << " pedestals calculation..." << endl;
406 for (Int_t iEv = 0; iEv < N_EV_FOR_PEDESTALS; ++iEv) {
407 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
408 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
409 Double_t signals[nSmpl];
410 for (Int_t i = 0; i < nSmpl; ++i)
411 signals[i] = 0.0;
412 Int_t nOk = 0;
413 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
414 if (fPedDat[iCr][iEv][iCh][iSmpl] == 0)
415 continue;
416 signals[iSmpl] = fPedDat[iCr][iEv][iCh][iSmpl];
417 nOk++;
418 }
419 Double_t CMS = CalcCMS(signals, nOk);
420 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
421 fPedVal[iCr][iCh][iSmpl] += ((signals[iSmpl] - CMS) / N_EV_FOR_PEDESTALS);
422 }
423 }
424 }
425
426 // cout << fDetName << " RMS calculation..." << endl;
427 for (Int_t iEv = 0; iEv < N_EV_FOR_PEDESTALS; ++iEv) {
428 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
429 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
430 Double_t signals[nSmpl];
431 for (Int_t i = 0; i < nSmpl; ++i)
432 signals[i] = 0.0;
433 Int_t nOk = 0;
434 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
435 if (fPedDat[iCr][iEv][iCh][iSmpl] == 0)
436 continue;
437 signals[iSmpl] = fPedDat[iCr][iEv][iCh][iSmpl];
438 nOk++;
439 }
440 Double_t CMS = CalcCMS(signals, nOk);
441 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
442 Float_t ped = fPedVal[iCr][iCh][iSmpl];
443 fPedRms[iCr][iCh][iSmpl] += ((signals[iSmpl] - CMS - ped) * (signals[iSmpl] - CMS - ped));
444 }
445 }
446 }
447
448 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
449 for (Int_t iCh = 0; iCh < fNChannels; ++iCh)
450 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl)
451 fPedRms[iCr][iCh][iSmpl] = Sqrt(fPedRms[iCr][iCh][iSmpl] / N_EV_FOR_PEDESTALS);
452
453 ofstream pedFile(Form("%s/input/%s_pedestals_%d.txt", getenv("VMCWORKDIR"), fDetName.Data(), fRun));
454 pedFile << "Serial\tCh_id\tPed\tRMS" << endl;
455 pedFile << "============================================" << endl;
456 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
457 for (Int_t iCh = 0; iCh < fNChannels; ++iCh)
458 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl)
459 pedFile << hex << fAdcSerials[iCr] << dec << "\t" << iCh * nSmpl + iSmpl << "\t"
460 << fPedVal[iCr][iCh][iSmpl] << "\t" << fPedRms[iCr][iCh][iSmpl] << endl;
461 pedFile.close();
462
463 return kBMNSUCCESS;
464}
465
467{
468 // if (hSModeSi.size() == 0) {
469 // for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
470 // vector<TH1*> hv;
471 // vector<TH1*> hcm;
472 // vector<TH1*> hsm;
473 // for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
474 // // printf("Creating icr %2d ich %2d %s\n", iCr, iCh, Form("%08X:%02d
475 // pedestal line MK", fSerials[iCr], iCh)); TString hname = TString(Form("%08X:%02d pedestals SM",
476 // fAdcSerials[iCr], iCh)); TH1* h = new TH2F(hname, hname,
477 // 500, 0, 500,
478 // fNSamples, 0, fNSamples);
479 // h->GetXaxis()->SetTitle("Event #");
480 // h->GetYaxis()->SetTitle("Sample(channel) #");
481 // h->SetDirectory(0);
482 // hv.push_back(h);
483 // }
484 // hPedLineSi.push_back(hv);
485 // }
486 // const Int_t maxAdc = 8192;
487 // const Int_t MaxSig = 2300;
488 // const Int_t RngSig = 400;
489 // const Int_t StripSi = fNChannels * fNSamples;
490 // const Int_t StripSiLo = 9 * fNSamples;
491 // const Int_t StripSiHi = 14 * fNSamples;
492 // const Int_t StripSiBins = (StripSiHi - StripSiLo);
493 // for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
494 // TString hname = TString(Form("%08X pedestals SM", fAdcSerials[iCr]));
495 // // TH1* h = new TH2F(hname, hname, maxAdc, 0, maxAdc, MaxSig, 0, MaxSig);
496 // TH1* h = new TH2F(hname, hname, StripSiBins, StripSiLo, StripSiHi, 2 * RngSig, -RngSig, RngSig);
497 // // printf("maxAdc %04d max %04f peds\n", maxAdc, h->GetXaxis()->GetXmax());
498 // h->GetXaxis()->SetTitle("Channel #");
499 // h->GetYaxis()->SetTitle("Signal");
500 // h->SetDirectory(0);
501 // hPedSi.push_back(h);
502 // hname = TString(Form("%08X cmods SM", fAdcSerials[iCr]));
503 // TH1* hc = new TH2F(hname, hname, StripSiBins, StripSiLo, StripSiHi, 2 * RngSig, -RngSig, RngSig);
504 // // printf("maxAdc %04d max %04f cmode\n", maxAdc, hc->GetXaxis()->GetXmax());
505 // hc->GetXaxis()->SetTitle("Channel #");
506 // hc->GetYaxis()->SetTitle("Signal");
507 // hc->SetDirectory(0);
508 // hCModeSi.push_back(hc);
509 // hname = TString(Form("%08X smods SM", fAdcSerials[iCr]));
510 // TH1* hs = new TH2F(hname, hname, StripSiBins, StripSiLo, StripSiHi, 2 * RngSig, -RngSig, RngSig);
511 // hs->GetXaxis()->SetTitle("Channel #");
512 // hs->GetYaxis()->SetTitle("Signal");
513 // hs->SetDirectory(0);
514 // hSModeSi.push_back(hs);
515 // }
516 // }
517 if (fVerbose)
518 printf("%s %s started niter %d thrMax %4.2f\n", fDetName.Data(), __func__, fNIters, thrMax);
519 const UShort_t nSmpl = fNSamples;
520 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
521 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
522 // memset(fNvalsADC[iCr][iCh], 0, sizeof (UInt_t) * fNSamples);
523 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
524 fPedVal[iCr][iCh][iSmpl] = 0.0;
525 fPedValTemp[iCr][iCh][iSmpl] = 0.0;
526 fPedRms[iCr][iCh][iSmpl] = 0.0;
527 fAdcProfiles[iCr][iCh][iSmpl] = 0;
528 fNvalsADC[iCr][iCh][iSmpl] = 0;
529 // fNoisyChipChannels[iCr][iCh][iSmpl] = kFALSE;
530 }
531 }
532 for (Int_t iEv = 0; iEv < N_EV_FOR_PEDESTALS; ++iEv) {
533 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
534 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
535 Int_t nOk = 0;
536 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
537 if (fPedDat[iCr][iEv][iCh][iSmpl] == 0.0 || fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE)
538 continue;
539 fPedVal[iCr][iCh][iSmpl] += fPedDat[iCr][iEv][iCh][iSmpl]; // / N_EV_FOR_PEDESTALS);
540 fNvalsADC[iCr][iCh][iSmpl]++;
541 nOk++;
542 // static_cast<TH2*> (hPedLineSi[iCr][iCh])->Fill(iEv, iSmpl, fPedDat[iCr][iEv][iCh][iSmpl]);
543 }
544 }
545 }
546 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
547 for (Int_t iCh = 0; iCh < fNChannels; ++iCh)
548 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl)
549 if (fNvalsADC[iCr][iCh][iSmpl])
550 fPedVal[iCr][iCh][iSmpl] /= fNvalsADC[iCr][iCh][iSmpl];
551 // iteratively calculate pedestals and CMSs
552 // Double_t rmsthr = 200.0;
553 // Double_t rmsthrf = 200.0;
554 Double_t sumRms = thrMax / 3.5;
555 for (Int_t iter = 0; iter < fNIters; iter++) {
556 Double_t thr = thrMax - thrDif * iter;
557 if (thr < 0)
558 thr = 0;
559 if (fVerbose)
560 printf("iter %d thr %4.2f\n", iter, thr);
561 UInt_t nFiltered = 0;
562 // clear
563 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
564 memset(fSumRmsV[iCr], 0, sizeof(Double_t) * fNChannels);
565 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
566 memset(fNvalsCMod[iCr][iCh], 0, sizeof(UInt_t) * fNSamples);
567 memset(fNvalsADC[iCr][iCh], 0, sizeof(UInt_t) * fNSamples);
568 memset(fPedValTemp[iCr][iCh], 0, sizeof(Double_t) * fNSamples);
569 memset(fPedCMod[iCr][iCh], 0, sizeof(Double_t) * fNSamples);
570 memset(fPedCMod2[iCr][iCh], 0, sizeof(Double_t) * fNSamples);
571 }
572 }
573 for (Int_t iEv = 0; iEv < N_EV_FOR_PEDESTALS - 1; ++iEv) {
574 // clear
575 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
576 // memset(fNvals[iCr], 0, sizeof (UInt_t) * fNChannels);
577 memset(fNvals[iCr], 0, sizeof(Float_t) * fNChannels);
578 memset(fCMode[iCr], 0, sizeof(Float_t) * fNChannels);
579 memset(fSMode[iCr], 0, sizeof(Float_t) * fNChannels);
580 }
581 // Pedestals pre filtering
582 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
583 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
584 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
585 // if (iCr == 3 && iCh == 8) {
586 // printf("iter %i iEv %i fpedDat %f noise %i\n", iter, iEv,
587 // fPedDat[iCr][iEv][iCh][iSmpl],
588 // fNoisyChipChannels[iCr][iCh][iSmpl]);
589 // }
590 if (fPedDat[iCr][iEv][iCh][iSmpl] == 0 || fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE)
591 continue;
592 Double_t Asig = TMath::Abs(fPedDat[iCr][iEv][iCh][iSmpl] - fPedVal[iCr][iCh][iSmpl]);
593 if (Asig < thr) {
594 fSMode[iCr][iCh] += fPedDat[iCr][iEv][iCh][iSmpl]; // CMS from current event
595 fCMode[iCr][iCh] += fPedVal[iCr][iCh][iSmpl]; // CMS over all pedestals
596 // fPedValTemp[iCr][iCh][iSmpl] += fPedDat[iCr][iEv][iCh][iSmpl]; //
597 // CMS from current event fNvalsADC[iCr][iCh][iSmpl]++;
598 fNvals[iCr][iCh]++;
599 }
600 }
601 }
602 // normalize
603 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
604 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
605 if (fNvals[iCr][iCh]) {
606 fSMode[iCr][iCh] /= fNvals[iCr][iCh];
607 fCMode[iCr][iCh] /= fNvals[iCr][iCh];
608 // hSMode[iCr][iCh]->SetBinContent(iEv, fSMode[iCr][iCh]);
609 // hCMode[iCr][iCh]->SetBinContent(iEv, fCMode[iCr][iCh]);
610 } else {
611 fSMode[iCr][iCh] = 0;
612 fCMode[iCr][iCh] = 0;
613 }
614 }
615 // Pedestals filtering
616 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
617 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
618 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
619 Double_t Adc = fPedDat[iCr][iEv][iCh][iSmpl];
620 if ((Adc == 0) || (fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE))
621 continue;
622 Double_t sig = fPedDat[iCr][iEv][iCh][iSmpl] - fPedVal[iCr][iCh][iSmpl] + fCMode[iCr][iCh]
623 - fSMode[iCr][iCh];
624 Double_t Asig = TMath::Abs(sig);
625 if (Asig < thr) {
626 fPedValTemp[iCr][iCh][iSmpl] += fPedDat[iCr][iEv][iCh][iSmpl];
627 fNvalsADC[iCr][iCh][iSmpl]++;
628
629 Adc = fPedDat[iCr][iEv][iCh][iSmpl] - fSMode[iCr][iCh];
630 fPedCMod[iCr][iCh][iSmpl] += Adc;
631 fPedCMod2[iCr][iCh][iSmpl] += Adc * Adc;
632 fNvalsCMod[iCr][iCh][iSmpl]++;
633 nFiltered++;
634 }
635 // if (iter == fEndIter - 1) {
636 // Int_t ic = iCh * nSmpl + iSmpl;
637 // printf("iCh %4d iSmpl %4d ic %4d cmod %5f smod %5f\n", iCh,
638 // iSmpl, ic, fCMode[iCr][iCh], fSMode[iCr][iCh]);
639 // hCModeSi[iCr]->Fill(ic, fCMode[iCr][iCh]);
640 // hSModeSi[iCr]->Fill(ic, fSMode[iCr][iCh]);
641 // hPedSi[iCr]->Fill(ic, fPedVal[iCr][iCh][iSmpl]);
642 //}
643 }
644 }
645 } // event loop
646
647 sumRms = 0.0;
648 Int_t nrms = 0;
649
650 // hists fill
651 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
652 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
653 Int_t nvrms = 0;
654 fSumRmsV[iCr][iCh] = 0.0;
655 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
656 if (fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE)
657 continue;
658 if (fNvalsCMod[iCr][iCh][iSmpl]) {
659 fPedCMod[iCr][iCh][iSmpl] /= fNvalsCMod[iCr][iCh][iSmpl];
660 fPedCMod2[iCr][iCh][iSmpl] = Sqrt(Abs(fPedCMod2[iCr][iCh][iSmpl] / fNvalsCMod[iCr][iCh][iSmpl]
661 - Sq(fPedCMod[iCr][iCh][iSmpl])));
662 sumRms += fPedCMod2[iCr][iCh][iSmpl];
663 fSumRmsV[iCr][iCh] += fPedCMod2[iCr][iCh][iSmpl];
664 nrms++;
665 nvrms++;
666 }
667 if (fNvalsADC[iCr][iCh][iSmpl])
668 fPedVal[iCr][iCh][iSmpl] = fPedValTemp[iCr][iCh][iSmpl] / fNvalsADC[iCr][iCh][iSmpl];
669 else
670 fPedVal[iCr][iCh][iSmpl] = 0.0;
671 // printf("fPedVal[%3d][%3d][%3d] = %4.2f\n", iCr, iCh,
672 // iSmpl,fPedVal[iCr][iCh][iSmpl]);
673 fNvalsADC[iCr][iCh][iSmpl] = 0;
674 // fCMode[iCr][iCh] += fPedVal[iCr][iCh][iSmpl]; // CMS over all pedestals
675 }
676 if (nvrms)
677 fSumRmsV[iCr][iCh] /= nvrms;
678 }
679 if (nrms > 0)
680 sumRms /= nrms;
681
682 // noise ch detection
683 if (fDetName.Contains("SiBT") || fDetName.Contains("SiProf"))
684 continue;
685 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
686 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
687 if ((iter == fNIters - 1) && (fVerbose > 1))
688 printf("cr %8X ich %2d fSumRmsV %4f sumRms %4f\n", fAdcSerials[iCr], iCh, fSumRmsV[iCr][iCh],
689 sumRms);
690 for (Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
691 if (fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE)
692 continue;
693 if ((iter == fNIters - 1) && (fVerbose > 1))
694 printf("cr %8X ich %2d iSmpl %2d fPedCMod2 %4f\n", fAdcSerials[iCr], iCh, iSmpl,
695 fPedCMod2[iCr][iCh][iSmpl]);
696 if ((fPedCMod2[iCr][iCh][iSmpl]
697 > 4 * sumRms) /* || (fPedCMod2[iCr][iCh][iSmpl] > 5 * fSumRmsV[iCr][iCh])*/)
698 {
699 fNoisyChipChannels[iCr][iCh][iSmpl] = kTRUE;
700 if (fVerbose)
701 printf("new noisy ch on cr %lu %08X ch %i smpl %i by signal %4.2f\n", iCr,
702 fAdcSerials[iCr], iCh, iSmpl, fPedCMod2[iCr][iCh][iSmpl]);
703 }
704 }
705 }
706 } // iter loop
707 return kBMNSUCCESS;
708}
709
711{
712 TStopwatch timer;
713 // Double_t rtime;
714 // Double_t ctime;
715 timer.Start();
716 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
717 // memset(fNvals[iCr], 0, sizeof (UInt_t) * fNChannels);
718 memset(fNvals[iCr], 0, sizeof(Float_t) * fNChannels);
719 memset(fCMode[iCr], 0, sizeof(Float_t) * fNChannels);
720 memset(fSMode[iCr], 0, sizeof(Float_t) * fNChannels);
721 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
722 memset(fAdc[iCr][iCh], 0, sizeof(Float_t) * fNSamples);
723 }
724 }
725 timer.Stop();
726 // rtime = timer.RealTime();
727 // ctime = timer.CpuTime();
728 // printf("\nReal time %f s, CPU time %f s clear\n", rtime, ctime);
729 timer.Start();
730 for (Int_t iAdc = 0; iAdc < adc->GetEntriesFast(); ++iAdc) {
731 BmnADCDigit<Short_t>* adcDig = (BmnADCDigit<Short_t>*)adc->At(iAdc);
732 UInt_t iCh = adcDig->GetChannel();
733 UInt_t ser = adcDig->GetSerial();
734 // printf("Serial %08X channel %d\n", ser, iCh);
735 auto serIter = fSerMap.find(ser);
736 if (serIter == fSerMap.end()) {
737 // printf("Serial %08X not found in the map\n", ser);
738 continue;
739 }
740 size_t iCr = serIter->second;
741 for (Int_t iSmpl = 0; iSmpl < fNSamples; iSmpl++) {
742 if ((fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE))
743 continue;
744 Double_t val = static_cast<Double_t>(adcDig->GetValue()[iSmpl] / 16);
745 fAdc[iCr][iCh][iSmpl] = val;
746
747 Double_t Sig = fAdc[iCr][iCh][iSmpl] - fPedVal[iCr][iCh][iSmpl];
748 Double_t Asig = TMath::Abs(Sig);
749 // printf("adc %6f ped %6f\n", fAdc[iCr][iCh][iSmpl], fPedVal[iCr][iCh][iSmpl]);
750
751 if ((Asig < thrMax)) {
752 // printf("adc %6f < thrMax %6f\n", fAdc[iCr][iCh][iSmpl], thrMax);
753 fSMode[iCr][iCh] += fAdc[iCr][iCh][iSmpl];
754 fCMode[iCr][iCh] += fPedVal[iCr][iCh][iSmpl];
755 fNvals[iCr][iCh]++;
756 }
757 }
758 }
759 timer.Stop();
760 workTime_cpu_p += timer.RealTime();
761 workTime_real_p += timer.CpuTime();
762}
763
764// simd function
765
767{
768 const Int_t VecLenSIMD = 4;
769 TStopwatch timer;
770 timer.Start();
771 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
772 // memset(fNvals[iCr], 0, sizeof (UInt_t) * fNChannels);
773 memset(fNvals[iCr], 0, sizeof(Float_t) * fNChannels);
774 memset(fCMode[iCr], 0, sizeof(Float_t) * fNChannels);
775 memset(fSMode[iCr], 0, sizeof(Float_t) * fNChannels);
776 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
777 memset(fAdc[iCr][iCh], 0, sizeof(Float_t) * fNSamples);
778 }
779 }
780 // timer.Stop();
781 // rtime = timer.RealTime();
782 // ctime = timer.CpuTime();
783 // // printf("\nReal time %f s, CPU time %f s clear\n", rtime, ctime);
784 // timer.Start();
785
786 // fvec * fNvals_vec, * fSMode_vec, * fCMode_vec;
787 fvec *fPedVal_vec, *fAdc_vec, *fNoisyChipChannels_vec;
788 Float_t*** fNoisy_float;
789
790 fNoisy_float = new Float_t**[GetNSerials()];
791 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
792 fNoisy_float[iCr] = new Float_t*[fNChannels];
793 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
794 fNoisy_float[iCr][iCh] = new Float_t[fNSamples];
795 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
796 // fNoisy_float[iCr][iCh][iSmpl] = (Float_t)fNoisyChipChannels[iCr][iCh][iSmpl];
797 if (fNoisyChipChannels[iCr][iCh][iSmpl])
798 fNoisy_float[iCr][iCh][iSmpl] = 1.0;
799 else
800 fNoisy_float[iCr][iCh][iSmpl] = 0.0;
801 }
802 }
803 }
804 __m128 outThresh = _mm_set1_ps(10000); // some number definitely higher than threshold
805 for (Int_t iAdc = 0; iAdc < adc->GetEntriesFast(); ++iAdc) {
806 BmnADCDigit<Short_t>* adcDig = (BmnADCDigit<Short_t>*)adc->At(iAdc);
807 UInt_t iCh = adcDig->GetChannel();
808 UInt_t ser = adcDig->GetSerial();
809 // printf("Serial %08X \n", ser);
810 auto serIter = fSerMap.find(ser);
811 if (serIter == fSerMap.end()) {
812 // printf("Serial %08X not found in the map\n", ser);
813 continue;
814 }
815
816 size_t iCr = serIter->second;
817 // printf("ser %08X iCr %d\n", ser, iCr);
818 for (Int_t iSmpl = 0; iSmpl < fNSamples; iSmpl++) {
819 if ((fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE))
820 continue;
821 Float_t val = static_cast<Float_t>(adcDig->GetValue()[iSmpl] / 16);
822 fAdc[iCr][iCh][iSmpl] = val;
823 }
824
825 fPedVal_vec = (fvec*)fPedVal[iCr][iCh];
826 fAdc_vec = (fvec*)fAdc[iCr][iCh];
827 fNoisyChipChannels_vec = (fvec*)fNoisy_float[iCr][iCh]; //!!!!!!!
828 fvec fSMode_sum = 0.0;
829 fvec fCMode_sum = 0.0;
830 fvec Nval = 0.0;
831 Float_t sum1;
832 Float_t sum2;
833 Float_t sum3;
834
835 for (Int_t iSmpl = 0; iSmpl < fNSamples / VecLenSIMD; iSmpl++) {
836 // if ((fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE)) continue;
837 // fvec sig = if3(fvec(fNoisyChipChannels_vec[iSmpl] == 1.0), 10000, fAdc_vec[iSmpl]
838 // - fPedVal_vec[iSmpl]);
839 fvec sig = _mm_blendv_ps(fAdc_vec[iSmpl] - fPedVal_vec[iSmpl], outThresh,
840 fvec(fNoisyChipChannels_vec[iSmpl] == 1.0));
841 // cout << "result of the comparison: " << sig << endl;
842 fvec Asig = fabs(sig);
843 // cout << "absolute value: " << Asig << endl;
844 fvec thrMax_vec = thrMax;
845 // Nval = if3(fvec(Asig < thrMax_vec), Nval + 1.0, Nval + 0.0);
846 Nval = _mm_blendv_ps(Nval, Nval + 1.0, fvec(Asig < thrMax_vec));
847 fSMode_sum = _mm_blendv_ps(fSMode_sum, fSMode_sum + fAdc_vec[iSmpl], fvec(Asig < thrMax_vec));
848 fCMode_sum = _mm_blendv_ps(fCMode_sum, fCMode_sum + fPedVal_vec[iSmpl], fvec(Asig < thrMax_vec));
849 }
850 fSMode_sum = _mm_dp_ps(fSMode_sum, _f32vec4_one, 0xFF);
851 _mm_store_ss(&sum1, fSMode_sum);
852 fSMode[iCr][iCh] += sum1;
853 fCMode_sum = _mm_dp_ps(fCMode_sum, _f32vec4_one, 0xFF);
854 _mm_store_ss(&sum2, fCMode_sum);
855 fCMode[iCr][iCh] += sum2;
856 Nval = _mm_dp_ps(Nval, _f32vec4_one, 0xFF);
857 _mm_store_ss(&sum3, Nval);
858 fNvals[iCr][iCh] += sum3;
859 }
860 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
861 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
862 delete[] fNoisy_float[iCr][iCh];
863 }
864 delete[] fNoisy_float[iCr];
865 }
866 delete[] fNoisy_float;
867
868 timer.Stop();
869 workTime_cpu_p += timer.RealTime();
870 workTime_real_p += timer.CpuTime();
871}
872
874{
875 TStopwatch timer;
876 timer.Start();
877 // normalize
878 Int_t fNvalsMin = 0;
879 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
880 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
881 if (fNvals[iCr][iCh] > fNvalsMin) {
882 fSMode[iCr][iCh] /= fNvals[iCr][iCh];
883 fCMode[iCr][iCh] /= fNvals[iCr][iCh];
884 } else {
885 fSMode[iCr][iCh] = 0.0;
886 fCMode[iCr][iCh] = 0.0;
887 }
888 }
889 // filter out sigs to get mods
890 for (Int_t iter = 0; iter < fNIters; ++iter) {
891 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
892 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
893 fSMode0[iCr][iCh] = 0.0;
894 fCMode0[iCr][iCh] = 0.0;
895 fNvals[iCr][iCh] = 0;
896 }
897 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
898 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
899 Double_t cs = fCMode[iCr][iCh] - fSMode[iCr][iCh];
900 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
901 if (fPedVal[iCr][iCh][iSmpl] == 0 || fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE)
902 continue;
903 Double_t sig = fAdc[iCr][iCh][iSmpl] - fPedVal[iCr][iCh][iSmpl] + cs;
904 Double_t Asig = TMath::Abs(sig);
905 Double_t thr = thrMax - iter * thrDif;
906 if (Asig < thr) {
907 fSMode0[iCr][iCh] += fAdc[iCr][iCh][iSmpl];
908 fCMode0[iCr][iCh] += fPedVal[iCr][iCh][iSmpl];
909 fNvals[iCr][iCh]++;
910 // rmsthrf += Sq(fPedDat[iCr][iEv][iCh][iSmpl] - fSigCMS[iCr][iCh]);
911 }
912 }
913 }
914
915 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
916 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
917 if (fNvals[iCr][iCh] > fNvalsMin) {
918 fSMode[iCr][iCh] = fSMode0[iCr][iCh] / fNvals[iCr][iCh];
919 fCMode[iCr][iCh] = fCMode0[iCr][iCh] / fNvals[iCr][iCh];
920 } else {
921 fSMode[iCr][iCh] = 0.0;
922 fCMode[iCr][iCh] = 0.0;
923 }
924 }
925 }
926 timer.Stop();
927 workTime_cpu += (Double_t)timer.CpuTime();
928 workTime_real += (Double_t)timer.RealTime();
929}
930
931// simd function
932
934{
935 const Int_t VecLenSIMD = 4;
936 TStopwatch timer;
937 timer.Start();
938
939 // normalize
940 fvec fNvalsMin_vec = 0;
941 __m128 outThresh = _mm_set1_ps(10000);
942 fvec *fNvals_vec, *fSMode_vec, *fCMode_vec;
943 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
944 fNvals_vec = (fvec*)fNvals[iCr];
945 fSMode_vec = (fvec*)fSMode[iCr];
946 fCMode_vec = (fvec*)fCMode[iCr];
947 for (Int_t iCh = 0; iCh < fNChannels / VecLenSIMD; iCh++) {
948 fSMode_vec[iCh] =
949 _mm_blendv_ps(_f32vec4_zero, fSMode_vec[iCh] / fNvals_vec[iCh], fvec(fNvals_vec[iCh] > fNvalsMin_vec));
950 fCMode_vec[iCh] =
951 _mm_blendv_ps(_f32vec4_zero, fCMode_vec[iCh] / fNvals_vec[iCh], fvec(fNvals_vec[iCh] > fNvalsMin_vec));
952 }
953 fNvals[iCr] = (Float_t*)fNvals_vec;
954 fSMode[iCr] = (Float_t*)fSMode_vec;
955 fCMode[iCr] = (Float_t*)fCMode_vec;
956 }
957 // filter out sigs to get mods
958
959 Float_t*** fNoisy_float;
960 fNoisy_float = new Float_t**[GetNSerials()];
961 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
962 fNoisy_float[iCr] = new Float_t*[fNChannels];
963 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
964 fNoisy_float[iCr][iCh] = new Float_t[fNSamples];
965 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
966 // fNoisy_float[iCr][iCh][iSmpl] = (Float_t)fNoisyChipChannels[iCr][iCh][iSmpl];
967 if (fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE)
968 fNoisy_float[iCr][iCh][iSmpl] = 1.0;
969 else
970 fNoisy_float[iCr][iCh][iSmpl] = 0.0;
971 }
972 }
973 }
974
975 fvec *fSMode0_vec, *fCMode0_vec;
976 fvec *fPedVal_vec, *fAdc_vec, *fNoisyChipChannels_vec;
977 for (Int_t iter = 0; iter < fNIters; ++iter) {
978 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
979 fSMode0_vec = (fvec*)fSMode0[iCr];
980 fCMode0_vec = (fvec*)fCMode0[iCr];
981 fNvals_vec = (fvec*)fNvals[iCr];
982 for (Int_t iCh = 0; iCh < fNChannels / VecLenSIMD; iCh++) {
983 fSMode0_vec[iCh] = 0.0;
984 fCMode0_vec[iCh] = 0.0;
985 fNvals_vec[iCh] = 0;
986 }
987 fSMode0[iCr] = (Float_t*)fSMode0_vec;
988 fCMode0[iCr] = (Float_t*)fCMode0_vec;
989 fNvals[iCr] = (Float_t*)fNvals_vec;
990 }
991 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
992 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
993 fPedVal_vec = (fvec*)fPedVal[iCr][iCh];
994 fAdc_vec = (fvec*)fAdc[iCr][iCh];
995 fNoisyChipChannels_vec = (fvec*)fNoisy_float[iCr][iCh]; //!!!!!!!
996 Float_t cs = fCMode[iCr][iCh] - fSMode[iCr][iCh];
997 fvec cs_vec = cs;
998 fvec fSMode0_sum = 0.0;
999 fvec fCMode0_sum = 0.0;
1000 fvec Nval = 0.0;
1001 Float_t sum1;
1002 Float_t sum2;
1003 Float_t sum3;
1004
1005 for (Int_t iSmpl = 0; iSmpl < fNSamples / VecLenSIMD; iSmpl++) {
1006 // if (fPedVal[iCr][iCh][iSmpl] == 0 || fNoisyChipChannels[iCr][iCh][iSmpl] == kTRUE) continue;
1007 fvec sig =
1008 _mm_blendv_ps(fAdc_vec[iSmpl] - fPedVal_vec[iSmpl] + cs_vec, outThresh,
1009 fvec(fPedVal_vec[iSmpl] == 0.0) | fvec(fNoisyChipChannels_vec[iSmpl] == 1.0));
1010 fvec Asig = fabs(sig);
1011 Float_t thr = thrMax - iter * thrDif;
1012 fvec thr_vec = thr;
1013 Nval = _mm_blendv_ps(Nval, Nval + 1.0, fvec(Asig < thr_vec));
1014 fSMode0_sum = _mm_blendv_ps(fSMode0_sum, fSMode0_sum + fAdc_vec[iSmpl], fvec(Asig < thr_vec));
1015 fCMode0_sum = _mm_blendv_ps(fCMode0_sum, fCMode0_sum + fPedVal_vec[iSmpl], fvec(Asig < thr_vec));
1016 }
1017 fSMode0_sum = _mm_dp_ps(fSMode0_sum, _f32vec4_one, 0xFF);
1018 _mm_store_ss(&sum1, fSMode0_sum);
1019 fSMode0[iCr][iCh] += sum1;
1020 fCMode0_sum = _mm_dp_ps(fCMode0_sum, _f32vec4_one, 0xFF);
1021 _mm_store_ss(&sum2, fCMode0_sum);
1022 fCMode0[iCr][iCh] += sum2;
1023 Nval = _mm_dp_ps(Nval, _f32vec4_one, 0xFF);
1024 _mm_store_ss(&sum3, Nval);
1025 fNvals[iCr][iCh] += sum3;
1026 }
1027
1028 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
1029 fNvals_vec = (fvec*)fNvals[iCr];
1030 fSMode_vec = (fvec*)fSMode[iCr];
1031 fCMode_vec = (fvec*)fCMode[iCr];
1032 fSMode0_vec = (fvec*)fSMode0[iCr];
1033 fCMode0_vec = (fvec*)fCMode0[iCr];
1034 for (Int_t iCh = 0; iCh < fNChannels / VecLenSIMD; iCh++) {
1035 fSMode_vec[iCh] = _mm_blendv_ps(_f32vec4_zero, fSMode0_vec[iCh] / fNvals_vec[iCh],
1036 fvec(fNvals_vec[iCh] > fNvalsMin_vec));
1037 fCMode_vec[iCh] = _mm_blendv_ps(_f32vec4_zero, fCMode0_vec[iCh] / fNvals_vec[iCh],
1038 fvec(fNvals_vec[iCh] > fNvalsMin_vec));
1039 }
1040 fNvals[iCr] = (Float_t*)fNvals_vec;
1041 fSMode[iCr] = (Float_t*)fSMode_vec;
1042 fCMode[iCr] = (Float_t*)fCMode_vec;
1043 // if (iter == fEndIter - 1) {
1044 // for (Int_t iCh = 0; iCh < fNChannels; iCh++) {
1045 // Int_t ic = iCh * fNSamples + fNSamples / 2;
1046 // // printf("iCh %4d iSmpl %4d ic %4d cmod %5f smod %5f\n",
1047 // iCh, iSmpl, ic, fCMode[iCr][iCh], fSMode[iCr][iCh]); hCModeSi[iCr]->Fill(ic,
1048 // fCMode[iCr][iCh]); hSModeSi[iCr]->Fill(ic, fSMode[iCr][iCh]);
1049 // }
1050 // }
1051 }
1052 }
1053
1054 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
1055 for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
1056 delete[] fNoisy_float[iCr][iCh];
1057 }
1058 delete[] fNoisy_float[iCr];
1059 }
1060 delete[] fNoisy_float;
1061
1062 timer.Stop();
1063 workTime_cpu += timer.CpuTime();
1064 workTime_real += timer.RealTime();
1065}
1066
1068{
1069
1070 const UShort_t kNITER = 10;
1071 Double_t CMS = 0.0;
1072 UInt_t nStr = size;
1073 Double_t upd[size];
1074 for (Int_t iSmpl = 0; iSmpl < size; ++iSmpl)
1075 upd[iSmpl] = samples[iSmpl];
1076
1077 for (Int_t itr = 0; itr < kNITER; ++itr) {
1078 if (nStr == 0)
1079 break;
1080 Double_t cms = 0.0; // common mode shift
1081 for (UInt_t iSmpl = 0; iSmpl < nStr; ++iSmpl)
1082 cms += upd[iSmpl];
1083 cms /= nStr;
1084 Double_t rms = 0.0; // chip noise
1085 for (UInt_t iSmpl = 0; iSmpl < nStr; ++iSmpl)
1086 rms += (upd[iSmpl] - cms) * (upd[iSmpl] - cms);
1087 rms = Sqrt(rms / nStr);
1088
1089 UInt_t nOk = 0;
1090 for (UInt_t iSmpl = 0; iSmpl < nStr; ++iSmpl)
1091 if (Abs(upd[iSmpl] - cms) < 3 * rms)
1092 upd[nOk++] = upd[iSmpl];
1093 nStr = nOk;
1094 CMS = cms;
1095 }
1096 return CMS;
1097}
1098
1100{
1101 BmnCalibData data;
1102 vector<vector<vector<bool>>>& noise_obj(data.GetNoise());
1103 vector<vector<vector<Float_t>>>& calib_obj(data.GetCalibration());
1104 noise_obj.resize(GetNSerials(), vector<vector<bool>>(fNChannels, vector<bool>(fNSamples, false)));
1105 calib_obj.resize(GetNSerials(), vector<vector<Float_t>>(fNChannels, vector<Float_t>(fNSamples, 0.0)));
1106 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
1107 for (Int_t iCh = 0; iCh < fNChannels; ++iCh)
1108 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
1109 noise_obj[iCr][iCh][iSmpl] = fNoisyChipChannels[iCr][iCh][iSmpl];
1110 calib_obj[iCr][iCh][iSmpl] = fPedVal[iCr][iCh][iSmpl];
1111 }
1112 calibFile->cd(); // ??? global variables
1113 calibFile->WriteObject(&data, (fDetName + ".Calibration").Data());
1114 return kBMNSUCCESS;
1115}
1116
1118{
1119 BmnCalibData* data(nullptr);
1120 calibFile->GetObject((fDetName + ".Calibration").Data(), data);
1121 if (data) {
1122 for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
1123 for (Int_t iCh = 0; iCh < fNChannels; ++iCh)
1124 for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
1125 // printf("iCr %3d iCh %3d iSmpl %4d\n", iCr, iCh,iSmpl);
1126 fNoisyChipChannels[iCr][iCh][iSmpl] = data->GetNoise()[iCr][iCh][iSmpl];
1127 fPedVal[iCr][iCh][iSmpl] = data->GetCalibration()[iCr][iCh][iSmpl];
1128 }
1129 delete data;
1130 } else
1131 return kBMNERROR;
1132 // for (size_t iCr = 0; iCr < GetNSerials(); ++iCr) {
1133 // printf("\n");
1134 // for (Int_t iCh = 0; iCh < fNChannels; ++iCh) {
1135 // printf("\n\t");
1136 // for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
1137 // printf(" %3.2f ", fPedVal[iCr][iCh][iSmpl]);
1138 // }
1139 // }
1140 // }
1141 return kBMNSUCCESS;
1142}
1143
1145{
1146 // if (!data)
1147 // return kBMNERROR;
1148 // for (auto )
1149 // for (size_t iCr = 0; iCr < GetNSerials(); ++iCr)
1150 // for (Int_t iCh = 0; iCh < fNChannels; ++iCh)
1151 // for (Int_t iSmpl = 0; iSmpl < fNSamples; ++iSmpl) {
1152 // // printf("iCr %3d iCh %3d iSmpl %4d\n", iCr, iCh,iSmpl);
1153 // fNoisyChipChannels[iCr][iCh][iSmpl] = data->GetNoise()[iCr][iCh][iSmpl];
1154 // fPedVal[iCr][iCh][iSmpl] = data->GetCalibration()[iCr][iCh][iSmpl];
1155 // }
1156 return kBMNSUCCESS;
1157}
1158
1159void BmnAdcProcessor::SetThreshold(Double_t final_thr, Double_t thr_dif, Double_t n_iters, Double_t cmod_cut)
1160{
1161 FinalThr = final_thr;
1162 if (thr_dif >= 0)
1163 thrDif = thr_dif;
1164 if (n_iters >= 0)
1165 fNIters = n_iters;
1166 if (cmod_cut >= 0)
1167 cmodcut = cmod_cut;
1168 thrMax = FinalThr + (fNIters - 1) * thrDif;
1169 return;
1170}
void memset(T *dest, T i, size_t num)
Copy to memory block [@dest, @dest+@num] num number of times the value of i of type @T with size @typ...
Definition L1Grid.h:27
friend F32vec4 fabs(const F32vec4 &a)
Definition P4_F32vec4.h:52
#define _f32vec4_zero
Definition P4_F32vec4.h:38
int i
Definition P4_F32vec4.h:22
#define _f32vec4_one
Definition P4_F32vec4.h:39
F32vec4 fvec
Definition P4_F32vec4.h:231
bool Bool_t
unsigned short UShort_t
int Int_t
unsigned int UInt_t
float Float_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
kDeepSea
char * Form(const char *fmt,...)
R__EXTERN TStyle * gStyle
BmnStatus
Define status code.
Definition BmnEnums.h:93
@ kBMNERROR
Error.
Definition BmnEnums.h:95
@ kBMNSUCCESS
Success.
Definition BmnEnums.h:94
BmnSetup
Define experimental setup.
Definition BmnEnums.h:165
uint32_t GetSerial() const
Definition BmnADCDigit.h:49
vector< IntType > & GetValue()
Definition BmnADCDigit.h:55
uint16_t GetChannel() const
Definition BmnADCDigit.h:51
unordered_map< UInt_t, size_t > fSerMap
ADC serials map.
void PrecalcEventMods(TClonesArray *adc)
Double_t *** fPedRms
Double_t **** fPedDat
data set to calculate pedestals
const uint16_t fNSamples
BmnStatus RecalculatePedestalsAugmented()
UInt_t *** fAdcProfiles
UInt_t *** fNvalsCMod
Bool_t *** fNoisyChipChannels
Double_t *** fPedCMod
Double_t *** fPedValTemp
BmnAdcProcessor(uint32_t period, uint32_t run, TString det, uint16_t nCh, const uint16_t nSmpl, BmnSetup setup=kBMNSETUP)
Double_t *** fPedCMod2
static BmnStatus DrawFilterInfo(BmnCalibData *data)
void SetThreshold(Double_t final_thr, Double_t thr_dif=-1, Double_t n_iters=-1, Double_t cmod_cut=-1)
BmnStatus SaveFilterInfo(TFile *cTalibFile)
Float_t *** fPedVal
vector< TH1 * > hSModeSi
vector< TH1 * > hPedSi
vector< uint32_t > fAdcSerials
list of serial id for ADC-detector
vector< TH1 * > hCModeSi
vector< vector< TH1 * > > hCMode
Bool_t **** fNoisyChannels
const uint16_t fNChannels
void CopyData2PedMap(TClonesArray *adc, UInt_t ev)
Double_t ** fSumRmsV
void GrabNewSerial(UInt_t serial)
void PrecalcEventMods_simd(TClonesArray *adc)
vector< vector< TH1 * > > hPedLine
vector< vector< TH1 * > > hSMode
vector< vector< TH1 * > > hPedLineSi
void(BmnAdcProcessor::* PrecalcEventModsImp)(TClonesArray *adc)
Double_t CalcCMS(Double_t *samples, Int_t size)
BmnStatus LoadFilterInfo(TFile *cTalibFile)
BmnStatus RecalculatePedestals()
FloatVecADC & GetCalibration()
BitVecADC & GetNoise()
void Clear(Option_t *option="") override
TVirtualPad * cd(Int_t subpadnumber=0) override
Bool_t cd() override
std::enable_if_t<!std::is_base_of< TObject, T >::value, Int_t > WriteObject(const T *obj, const char *name, Option_t *option="", Int_t bufsize=0)
void GetObject(const char *namecycle, T *&ptr)
Int_t GetEntriesFast() const
TObject * At(Int_t idx) const override
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
void Print(const char *filename, Option_t *option) override
Double_t RealTime()
void Start(Bool_t reset=kTRUE)
Double_t CpuTime()
void Stop()
#define N_EV_FOR_PEDESTALS
Double_t Sq(Double_t x)
Double_t Sqrt(Double_t x)
Double_t Abs(Double_t d)