64 printf(
"\n\nDebug!!!\n");
68 printf(
"\n\nRelease!!!\n");
74 auto serIter =
fSerMap.find(serial);
77 printf(
"adding %08X to the map, iSer = %lu\n", serial,
GetNSerials());
146 fPedVal[iCr][iCh][iSmpl] = 0.0;
148 fPedRms[iCr][iCh][iSmpl] = 0.0;
153 fAdc[iCr][iCh][iSmpl] = 0.0;
166 fPedDat[iCr][iEv][iCh][iSmpl] = 0.0;
205 delete[]
fPedDat[iCr][iEv][iCh];
221 delete[]
fAdc[iCr][iCh];
281 LOGF(info,
"%10s: Real time %4.3f s, CPU time %4.3f s ADC processor. Precalc",
fDetName.Data(),
workTime_real_p,
292 if (serIter ==
fSerMap.end()) {
296 Int_t iSer = serIter->second;
316 const UInt_t PAD_WIDTH_SIL = 1920;
317 const UInt_t PAD_HEIGHT_SIL = 1080;
319 TCanvas* c =
new TCanvas(
"can cms",
"can", PAD_WIDTH_SIL, 2 * PAD_HEIGHT_SIL);
321 c->
Print(docName +
"[");
328 hSMode[iCr][iCh]->Draw(
"colz");
330 hCMode[iCr][iCh]->Draw(
"colz");
334 c->
Print(docName +
"]");
342 const UInt_t PAD_WIDTH_SIL = 1920;
343 const UInt_t PAD_HEIGHT_SIL = 1080;
347 TCanvas* c =
new TCanvas(
"can cms",
"can", PAD_WIDTH_SIL, 2 * PAD_HEIGHT_SIL);
349 c->
Print(docName +
"[");
362 c =
new TCanvas(
"can pedestals",
"can", PAD_WIDTH_SIL, PAD_HEIGHT_SIL);
374 c->
Print(docName +
"]");
387 hSMode[iCr][iCh]->Reset();
388 hCMode[iCr][iCh]->Reset();
400 fPedVal[iCr][iCh][iSmpl] = 0.0;
401 fPedRms[iCr][iCh][iSmpl] = 0.0;
413 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
414 if (
fPedDat[iCr][iEv][iCh][iSmpl] == 0)
416 signals[iSmpl] =
fPedDat[iCr][iEv][iCh][iSmpl];
420 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
434 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
435 if (
fPedDat[iCr][iEv][iCh][iSmpl] == 0)
437 signals[iSmpl] =
fPedDat[iCr][iEv][iCh][iSmpl];
441 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
443 fPedRms[iCr][iCh][iSmpl] += ((signals[iSmpl] - CMS - ped) * (signals[iSmpl] - CMS - ped));
450 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl)
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;
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;
524 fPedVal[iCr][iCh][iSmpl] = 0.0;
526 fPedRms[iCr][iCh][iSmpl] = 0.0;
536 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
548 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl)
560 printf(
"iter %d thr %4.2f\n", iter, thr);
584 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
618 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
655 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
670 fPedVal[iCr][iCh][iSmpl] = 0.0;
688 printf(
"cr %8X ich %2d fSumRmsV %4f sumRms %4f\n",
fAdcSerials[iCr], iCh,
fSumRmsV[iCr][iCh],
690 for (
Int_t iSmpl = 0; iSmpl < nSmpl; ++iSmpl) {
694 printf(
"cr %8X ich %2d iSmpl %2d fPedCMod2 %4f\n",
fAdcSerials[iCr], iCh, iSmpl,
701 printf(
"new noisy ch on cr %lu %08X ch %i smpl %i by signal %4.2f\n", iCr,
735 auto serIter =
fSerMap.find(ser);
736 if (serIter ==
fSerMap.end()) {
740 size_t iCr = serIter->second;
745 fAdc[iCr][iCh][iSmpl] = val;
768 const Int_t VecLenSIMD = 4;
787 fvec *fPedVal_vec, *fAdc_vec, *fNoisyChipChannels_vec;
798 fNoisy_float[iCr][iCh][iSmpl] = 1.0;
800 fNoisy_float[iCr][iCh][iSmpl] = 0.0;
804 __m128 outThresh = _mm_set1_ps(10000);
810 auto serIter =
fSerMap.find(ser);
811 if (serIter ==
fSerMap.end()) {
816 size_t iCr = serIter->second;
822 fAdc[iCr][iCh][iSmpl] = val;
827 fNoisyChipChannels_vec = (
fvec*)fNoisy_float[iCr][iCh];
828 fvec fSMode_sum = 0.0;
829 fvec fCMode_sum = 0.0;
839 fvec sig = _mm_blendv_ps(fAdc_vec[iSmpl] - fPedVal_vec[iSmpl], outThresh,
840 fvec(fNoisyChipChannels_vec[iSmpl] == 1.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));
851 _mm_store_ss(&sum1, fSMode_sum);
854 _mm_store_ss(&sum2, fCMode_sum);
857 _mm_store_ss(&sum3, Nval);
862 delete[] fNoisy_float[iCr][iCh];
864 delete[] fNoisy_float[iCr];
866 delete[] fNoisy_float;
881 if (
fNvals[iCr][iCh] > fNvalsMin) {
917 if (
fNvals[iCr][iCh] > fNvalsMin) {
935 const Int_t VecLenSIMD = 4;
940 fvec fNvalsMin_vec = 0;
941 __m128 outThresh = _mm_set1_ps(10000);
942 fvec *fNvals_vec, *fSMode_vec, *fCMode_vec;
949 _mm_blendv_ps(
_f32vec4_zero, fSMode_vec[iCh] / fNvals_vec[iCh],
fvec(fNvals_vec[iCh] > fNvalsMin_vec));
951 _mm_blendv_ps(
_f32vec4_zero, fCMode_vec[iCh] / fNvals_vec[iCh],
fvec(fNvals_vec[iCh] > fNvalsMin_vec));
968 fNoisy_float[iCr][iCh][iSmpl] = 1.0;
970 fNoisy_float[iCr][iCh][iSmpl] = 0.0;
975 fvec *fSMode0_vec, *fCMode0_vec;
976 fvec *fPedVal_vec, *fAdc_vec, *fNoisyChipChannels_vec;
983 fSMode0_vec[iCh] = 0.0;
984 fCMode0_vec[iCh] = 0.0;
995 fNoisyChipChannels_vec = (
fvec*)fNoisy_float[iCr][iCh];
998 fvec fSMode0_sum = 0.0;
999 fvec fCMode0_sum = 0.0;
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));
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));
1017 fSMode0_sum = _mm_dp_ps(fSMode0_sum,
_f32vec4_one, 0xFF);
1018 _mm_store_ss(&sum1, fSMode0_sum);
1020 fCMode0_sum = _mm_dp_ps(fCMode0_sum,
_f32vec4_one, 0xFF);
1021 _mm_store_ss(&sum2, fCMode0_sum);
1024 _mm_store_ss(&sum3, Nval);
1025 fNvals[iCr][iCh] += sum3;
1028 for (
size_t iCr = 0; iCr <
GetNSerials(); ++iCr) {
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));
1054 for (
size_t iCr = 0; iCr <
GetNSerials(); ++iCr) {
1056 delete[] fNoisy_float[iCr][iCh];
1058 delete[] fNoisy_float[iCr];
1060 delete[] fNoisy_float;
1074 for (
Int_t iSmpl = 0; iSmpl < size; ++iSmpl)
1075 upd[iSmpl] = samples[iSmpl];
1077 for (
Int_t itr = 0; itr < kNITER; ++itr) {
1081 for (
UInt_t iSmpl = 0; iSmpl < nStr; ++iSmpl)
1085 for (
UInt_t iSmpl = 0; iSmpl < nStr; ++iSmpl)
1086 rms += (upd[iSmpl] - cms) * (upd[iSmpl] - cms);
1087 rms =
Sqrt(rms / nStr);
1090 for (
UInt_t iSmpl = 0; iSmpl < nStr; ++iSmpl)
1091 if (
Abs(upd[iSmpl] - cms) < 3 * rms)
1092 upd[nOk++] = upd[iSmpl];
1102 vector<vector<vector<bool>>>& noise_obj(data.
GetNoise());
1103 vector<vector<vector<Float_t>>>& calib_obj(data.
GetCalibration());
1110 calib_obj[iCr][iCh][iSmpl] =
fPedVal[iCr][iCh][iSmpl];
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...
friend F32vec4 fabs(const F32vec4 &a)
char * Form(const char *fmt,...)
R__EXTERN TStyle * gStyle
BmnStatus
Define status code.
BmnSetup
Define experimental setup.
uint32_t GetSerial() const
vector< IntType > & GetValue()
uint16_t GetChannel() const
unordered_map< UInt_t, size_t > fSerMap
ADC serials map.
void PrecalcEventMods(TClonesArray *adc)
Double_t **** fPedDat
data set to calculate pedestals
BmnStatus RecalculatePedestalsAugmented()
void CalcEventMods_simd()
Bool_t *** fNoisyChipChannels
BmnAdcProcessor(uint32_t period, uint32_t run, TString det, uint16_t nCh, const uint16_t nSmpl, BmnSetup setup=kBMNSETUP)
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)
vector< uint32_t > fAdcSerials
list of serial id for ADC-detector
vector< vector< TH1 * > > hCMode
Bool_t **** fNoisyChannels
const uint16_t fNChannels
void CopyData2PedMap(TClonesArray *adc, UInt_t ev)
void GrabNewSerial(UInt_t serial)
void InitChipNoiseArrays()
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)
virtual ~BmnAdcProcessor()
BmnStatus LoadFilterInfo(TFile *cTalibFile)
BmnStatus RecalculatePedestals()
FloatVecADC & GetCalibration()
void Clear(Option_t *option="") override
TVirtualPad * cd(Int_t subpadnumber=0) 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
void Start(Bool_t reset=kTRUE)
#define N_EV_FOR_PEDESTALS
Double_t Sqrt(Double_t x)