195 auto msDescriptor = ts.descriptor(uMsCompIdx, uMsIdx);
197 const uint8_t* msContent =
reinterpret_cast<const uint8_t*
>(ts.content(uMsCompIdx, uMsIdx));
199 uint32_t uSize = msDescriptor.size;
205 <<
" has size: " << uSize;
215 LOG(info) <<
"---------------------------------------------------------------";
218 LOG(warning) <<
"Could not find the gDPB index for AFCK id 0x" << std::hex <<
fuCurrDpbId << std::dec
219 <<
" in timeslice " <<
fulCurrentTsIdx <<
" in microslice " << uMsIdx <<
" component " << uMsCompIdx
221 <<
"If valid this index has to be added in the PSD "
222 "parameter file in the DbpIdArray field";
267 LOG(error) <<
"negative time! ";
274 LOG(error) <<
"The input microslice buffer does NOT "
275 <<
"contain only complete nDPB messages!";
281 const uint64_t* pInBuff =
reinterpret_cast<const uint64_t*
>(msContent);
283 if (fair::Logger::Logging(fair::Severity::debug)) {
284 if (uNbMessages != 0) printf(
"\n\n");
285 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
287 uint64_t ulData =
static_cast<uint64_t
>(pInBuff[uIdx]);
288 printf(
"%016llx\n", (
long long int) ulData);
297 if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.
SetPrintOutMode(
true);
299 if (uNbMessages > 1) {
301 int ReadResult = PsdReader.
ReadMs();
302 if (ReadResult == 0) {
307 for (uint64_t hit_iter = 0; hit_iter < PsdReader.
VectHitHdr.size(); hit_iter++) {
309 LOG(error) <<
"Different vector headers sizes!"
310 <<
" in VectPackHdr " << PsdReader.
VectPackHdr.size() <<
" in VectHitHdr "
315 uint16_t uHitChannel = PsdReader.
VectHitHdr.at(hit_iter).uHitChannel;
317 uint32_t uSignalCharge = PsdReader.
VectHitHdr.at(hit_iter).uSignalCharge;
318 uint16_t uZeroLevel = PsdReader.
VectHitHdr.at(hit_iter).uZeroLevel;
319 uint32_t uAccum = PsdReader.
VectHitHdr.at(hit_iter).uFeeAccum;
322 std::vector<uint16_t> uWfm = PsdReader.
VectHitData.at(hit_iter).uWfm;
329 LOG(error) <<
"hit channel number out of range! channel index: " << uHitChannel
344 double dHitAmlpitude = 0;
345 double dHitChargeWfm = 0;
350 dHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), 0);
351 dHitChargeWfm -= uZeroLevel * uWfm.size();
352 auto const max_iter = std::max_element(uWfm.begin(), uWfm.end());
353 assert(max_iter != uWfm.end());
354 if (max_iter == uWfm.end())
break;
356 dHitAmlpitude = *max_iter - uZeroLevel;
364 for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++)
365 fvhHitWfmChan[uHitChannel]->Fill(wfm_iter, uWfm.at(wfm_iter));
367 Form(
"Waveform channel %03u charge %0u zero level %0u; Time [adc "
368 "counts]; Amplitude [adc counts]",
369 uHitChannel, uSignalCharge, uZeroLevel));
372 UInt_t uFlatIndexOfChange = i *
kuNbChanPsd + uHitChannel;
375 UInt_t uFlatIndexHisto =
379 for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++)
382 Form(
"Waveform channel %03u charge %0u zero level %0u; Time "
383 "[adc counts]; Amplitude [adc counts]",
384 uHitChannel, uSignalCharge, uZeroLevel));
404 std::complex<float> first_fit_harmonic = {0.72, 0.0};
405 std::complex<float> second_fit_harmonic = {0.38, -0.0};
418 std::complex<float>* harmonics = Pfitter.
GetHarmonics();
419 std::vector<uint16_t> uFitWfm = Pfitter.
GetFitWfm();
420 for (UInt_t wfm_iter = 0; wfm_iter < uFitWfm.size(); wfm_iter++)
422 fvhHitWfmChan[uHitChannel]->SetTitle(Form(
"Waveform channel %03u charge %0u zero level %0u R2 %.5f; "
423 "Time [adc counts]; Amplitude [adc counts]",
424 uHitChannel, uSignalCharge, uZeroLevel, fit_R2));
428 if (fit_R2 > 0.02)
continue;
435 else if (ReadResult == 1) {
436 LOG(error) <<
"no pack headers in message!";
439 else if (ReadResult == 2) {
443 else if (ReadResult == 3) {
444 LOG(error) <<
"check number of waveform points! In header: " << PsdReader.
HitHdr.
uWfmWords - 1;
448 LOG(error) <<
"PsdGbtReader.ReadEventFles() didn't return expected values";
457 LOG(error) <<
"Wrong amount of messages read!"
461 std::ofstream error_log(Form(
"%llu_errorlog.txt",
fulCurrentMsIdx), std::ofstream::out);
462 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
463 uint64_t ulData =
static_cast<uint64_t
>(pInBuff[uIdx]);
464 error_log << Form(
"%016llx\n", (
long long int) ulData);
488 if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.
SetPrintOutMode(
true);
489 if (uNbMessages > 1) {
493 LOG(error) <<
"too many triggered channels! In header: " << PsdReader.
EvHdrAb.
uHitsNumber
498 if (ReadResult == 0) {
505 UInt_t uHitChannel = PsdReader.
VectHitHdr.at(hit_iter).uHitChannel;
506 UInt_t uSignalCharge = PsdReader.
VectHitHdr.at(hit_iter).uSignalCharge;
507 UInt_t uZeroLevel = PsdReader.
VectHitHdr.at(hit_iter).uZeroLevel;
508 std::vector<uint16_t> uWfm = PsdReader.
VectHitData.at(hit_iter).uWfm;
513 LOG(error) <<
"hit channel number out of range! channel index: " << uHitChannel
528 double dHitAmlpitude = 0;
529 double dHitChargeWfm = 0;
533 dHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), 0);
534 dHitChargeWfm -= uZeroLevel * uWfm.size();
535 auto const max_iter = std::max_element(uWfm.begin(), uWfm.end());
536 assert(max_iter != uWfm.end());
537 if (max_iter == uWfm.end())
break;
539 dHitAmlpitude = *max_iter - uZeroLevel;
546 for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++)
547 fvhHitWfmChan[uHitChannel]->Fill(wfm_iter, uWfm.at(wfm_iter));
549 Form(
"Waveform channel %03u charge %0u zero level %0u; Time [adc "
550 "counts]; Amplitude [adc counts]",
551 uHitChannel, uSignalCharge, uZeroLevel));
554 UInt_t uFlatIndexOfChange = i *
kuNbChanPsd + uHitChannel;
557 UInt_t uFlatIndexHisto =
561 for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++)
564 Form(
"Waveform channel %03u charge %0u zero level %0u; Time "
565 "[adc counts]; Amplitude [adc counts]",
566 uHitChannel, uSignalCharge, uZeroLevel));
578 int gate_end = uWfm.size() - 1;
593 std::complex<float>* harmonics = Pfitter.
GetHarmonics();
594 std::vector<uint16_t> uFitWfm = Pfitter.
GetFitWfm();
595 for (UInt_t wfm_iter = 0; wfm_iter < uFitWfm.size(); wfm_iter++)
597 fvhHitWfmChan[uHitChannel]->SetTitle(Form(
"Waveform channel %03u charge %0u zero level %0u R2 %.5f; "
598 "Time [adc counts]; Amplitude [adc counts]",
599 uHitChannel, uSignalCharge, uZeroLevel, fit_R2));
603 if (fit_R2 > 0.02)
continue;
611 else if (ReadResult == 1) {
612 LOG(error) <<
"no event headers in message!";
615 else if (ReadResult == 2) {
616 LOG(error) <<
"check number of waveform points! In header: " << PsdReader.
HitHdr.
uWfmPoints
617 <<
" should be: " << 8;
620 else if (ReadResult == 3) {
621 LOG(error) <<
"wrong amount of hits read! In header: " << PsdReader.
EvHdrAb.
uHitsNumber
622 <<
" in hit vector: " << PsdReader.
VectHitHdr.size();
626 LOG(error) <<
"PsdGbtReader.ReadEventFles() didn't return expected values";
634 LOG(error) <<
"Wrong amount of messages read!"
638 std::ofstream error_log(Form(
"%llu_errorlog.txt",
fulCurrentMsIdx), std::ofstream::out);
639 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
640 uint64_t ulData =
static_cast<uint64_t
>(pInBuff[uIdx]);
641 error_log << Form(
"%016llx\n", (
long long int) ulData);
650 LOG(error) <<
"Wrong MS index!"
681 std::string sFolder =
"MoniPsd";
682 std::string sFitFolder =
"PronyFit";
683 LOG(info) <<
"create Histos for PSD monitoring ";
686 uint32_t iNbBinsLog = 0;
689 double* dBinsLog = dBinsLogVector.data();
694 "Map of hits in PSD detector electronics vs time in "
695 "run; Chan; Time in run [s]; Hits Count []",
698 "Map of hits in PSD detector vs time in run; "
699 "Chan; Time in run [s]; Hits Count []",
703 fhMissedData =
new TH1I(
"hMissedData",
"PSD Missed data", 2, 0, 2);
705 fhAdcTime =
new TH1I(
"hAdcTime",
"ADC time; Adc time []", 100, 0, 160000);
707 fhMsLengthEvo =
new TH2I(
"hMsLengthEvo",
"Evolution of MS length vs time in run; Time in run [s]; MS length [ns]",
711 "Evolution of TotalMsgs counts, per MS vs time in run; Time in "
712 "run [s]; TotalMsgs Count/MS []; MS",
715 "Evolution of ReadMsgs counts, per MS vs time in run; Time in run "
716 "[s]; ReadMsgs Count/MS []; MS",
719 "Evolution of LostMsgs counts, per MS vs time in run; Time in run "
720 "[s]; LostMsgs Count/MS []; MS",
723 "Evolution of ReadEvents counts, per MS vs time in run; Time in "
724 "run [s]; ReadEvents Count/MS []; MS",
744 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; ++uChan) {
747 Form(
"hHitZLChanEvo%03u", uChan),
748 Form(
"Hits ZeroLevel evolution for channel %03u; Time in run [s]; ZeroLevel [adc counts]", uChan),
752 Form(
"hHitLPChanEvo%03u", uChan),
753 Form(
"Hits LastPoint evolution for channel %03u; Time in run [s]; ZeroLevel [adc counts]", uChan),
757 Form(
"hHitFAChanEvo%03u", uChan),
758 Form(
"Hits FeeAccumulator evolution for channel %03u; Time in run [s]; ZeroLevel [adc counts]", uChan),
764 Form(
"Hits charge distribution for channel %03u; Charge [mV]", uChan),
768 new TH1I(Form(
"hHitZeroLevelChan%03u", uChan),
769 Form(
"Hits zero level distribution for channel %03u; ZeroLevel [adc counts]", uChan),
773 Form(
"Hits amplitude distribution for channel %03u; Amplitude [mV]", uChan),
777 new TH1I(Form(
"hHitChargeByWfmChan%03u", uChan),
778 Form(
"Hits charge by waveform distribution for channel %03u; "
793 fvhHitWfmChan[uChan] =
new TH1I(Form(
"hHitWfmChan%03u", uChan), Form(
"HitWfmChan%03u", uChan), 32, 0, 32);
797 for (UInt_t uWfmRangeIter = 0; uWfmRangeIter <
kuNbWfmRanges; uWfmRangeIter++) {
798 for (UInt_t uWfmExampleIter = 0; uWfmExampleIter <
kuNbWfmExamples; uWfmExampleIter++) {
801 new TH1I(Form(
"hHitWfmChan%03uRange%02uExample%02u", uChan, uWfmRangeIter, uWfmExampleIter),
802 Form(
"HitWfmChan%03uRange%02uExample%02u", uChan, uWfmRangeIter, uWfmExampleIter), 32, 0, 32);
811 new TH1I(Form(
"hHitFitWfmChan%03u", uChan), Form(
"HitFitWfmChan%03u", uChan), 32, 0, 32);
816 Form(
"hFitHarmonic1Chan%03u", uChan),
817 Form(
"Waveform fit harmonic 1 for channel %03u; Real part []; Imag part []", uChan), 400, -2, 2, 200, -1, 1);
821 Form(
"hFitHarmonic2Chan%03u", uChan),
822 Form(
"Waveform fit harmonic 2 for channel %03u; Real part []; Imag part []", uChan), 400, -2, 2, 200, -1, 1);
826 Form(
"hFitQaChan%03u", uChan), Form(
"Waveform fit QA for channel %03u; Integral [adc counts]; R2 []", uChan),
845 fcHitMaps =
new TCanvas(
"cHitMaps",
"Hit maps", w,
h);
865 fcSummary =
new TCanvas(
"cSummary",
"Hit maps, Hit rate, Error fraction", w,
h);
898 fcGenCntsPerMs =
new TCanvas(
"cGenCntsPerMs",
"Messages and hit cnt per MS, Error and Evt Loss Fract. per MS ", w,
h);
936 fcZLevo =
new TCanvas(
"cZLevo",
"ZeroLevel evolaution in all channels", w,
h);
939 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {
951 fcChargesFPGA =
new TCanvas(
"cChargesFPGA",
"Charges spectra in all channels calculated by FPGA", w,
h);
954 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {
964 fcChargesWfm =
new TCanvas(
"cChargesWfm",
"Charges spectra in all channels calculated over waveform", w,
h);
967 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {
977 fcAmplitudes =
new TCanvas(
"cAmplitudes",
"Amplitude spectra in all channels", w,
h);
980 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {
990 fcZeroLevels =
new TCanvas(
"cZeroLevels",
"Zero Level spectra in all channels", w,
h);
993 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {
1005 fcWfmsAllChannels =
new TCanvas(
"cWfmsAllChannels",
"Last waveforms in PSD fired channels", w,
h);
1008 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {
1022 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {
1024 new TCanvas(Form(
"cWfmsChan%03u", uChan), Form(
"Canvas with last waveforms in channel %03u", uChan), w,
h);
1028 for (UInt_t uWfmRangeIter = 0; uWfmRangeIter <
kuNbWfmRanges; uWfmRangeIter++) {
1029 for (UInt_t uWfmExampleIter = 0; uWfmExampleIter <
kuNbWfmExamples; uWfmExampleIter++) {
1046 fcPronyFit =
new TCanvas(
"cPronyFit",
"Prony wfm fitting", w,
h);
1050 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {
1056 for (UInt_t uChan = 0; uChan <
kuNbChanPsd; uChan++) {