CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2018MonitorAlgoPsd.cxx
Go to the documentation of this file.
1/* Copyright (C) 2019-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: David Emschermann [committer], Nikolay Karpushkin */
4
5// -----------------------------------------------------------------------------
6// ----- -----
7// ----- CbmMcbm2018MonitorAlgoPsd -----
8// ----- Created 26.09.2019 by N.Karpushkin -----
9// ----- based on CbmMcbm2018MonitorAlgoT0 by P.-A. Loizeau -----
10// ----- -----
11// -----------------------------------------------------------------------------
12
14
15#include "CbmFlesHistosTools.h"
17#include "CbmMcbm2018PsdPar.h"
18#include "FairRootManager.h"
19#include "FairRun.h"
20#include "FairRunOnline.h"
21#include "FairRuntimeDb.h"
22#include "TCanvas.h"
23#include "TGraph.h"
24#include "TH1.h"
25#include "TH2.h"
26#include "TList.h"
27#include "TPaveStats.h"
28#include "TProfile.h"
29#include "TROOT.h"
30#include "TString.h"
31
32#include <Logger.h>
33
34#include <cstdint>
35#include <fstream>
36#include <iomanip>
37#include <iostream>
38
39// -------------------------------------------------------------------------
44
49
50// -------------------------------------------------------------------------
52{
53 LOG(info) << "Initializing mCBM Psd 2019 monitor algo";
54
55 return kTRUE;
56}
64
65// -------------------------------------------------------------------------
67{
68 LOG(info) << "Init parameter containers for CbmMcbm2018MonitorAlgoPsd";
69 Bool_t initOK = ReInitContainers();
70
71 return initOK;
72}
74{
75 LOG(info) << "**********************************************";
76 LOG(info) << "ReInit parameter containers for CbmMcbm2018MonitorAlgoPsd";
77
78 fUnpackPar = (CbmMcbm2018PsdPar*) fParCList->FindObject("CbmMcbm2018PsdPar");
79 if (nullptr == fUnpackPar) return kFALSE;
80
81 Bool_t initOK = InitParameters();
82
83 return initOK;
84}
86{
87 if (nullptr == fParCList) fParCList = new TList();
88 fUnpackPar = new CbmMcbm2018PsdPar("CbmMcbm2018PsdPar");
90
91 return fParCList;
92}
94{
95 fuRawDataVersion = fUnpackPar->GetDataVersion();
96 LOG(info) << "Data Version: " << fuRawDataVersion;
97
98 fuNrOfGdpbs = fUnpackPar->GetNrOfGdpbs();
99 LOG(info) << "Nr. of Tof GDPBs: " << fuNrOfGdpbs;
100
101 fuNrOfFeePerGdpb = fUnpackPar->GetNrOfFeesPerGdpb();
102 LOG(info) << "Nr. of FEEs per Psd GDPB: " << fuNrOfFeePerGdpb;
103
104 fuNrOfChannelsPerFee = fUnpackPar->GetNrOfChannelsPerFee();
105 LOG(info) << "Nr. of channels per FEE: " << fuNrOfChannelsPerFee;
106
108 LOG(info) << "Nr. of channels per GDPB: " << fuNrOfChannelsPerGdpb;
109
110 fGdpbIdIndexMap.clear();
111 for (UInt_t i = 0; i < fuNrOfGdpbs; ++i) {
112 fGdpbIdIndexMap[fUnpackPar->GetGdpbId(i)] = i;
113 LOG(info) << "GDPB Id of PSD " << i << " : " << std::hex << fUnpackPar->GetGdpbId(i) << std::dec;
114 } // for( UInt_t i = 0; i < fuNrOfGdpbs; ++i )
115
116
117 return kTRUE;
118}
119// -------------------------------------------------------------------------
120
121void CbmMcbm2018MonitorAlgoPsd::AddMsComponentToList(size_t component, UShort_t usDetectorId)
122{
124 for (UInt_t uCompIdx = 0; uCompIdx < fvMsComponentsList.size(); ++uCompIdx)
125 if (component == fvMsComponentsList[uCompIdx]) return;
126
128 fvMsComponentsList.push_back(component);
129
130 LOG(info) << "CbmMcbm2018MonitorAlgoPsd::AddMsComponentToList => Component " << component << " with detector ID 0x"
131 << std::hex << usDetectorId << std::dec << " added to list";
132}
133// -------------------------------------------------------------------------
134
136{
137 fulCurrentTsIdx = ts.index();
138 fdTsStartTime = static_cast<Double_t>(ts.descriptor(0, 0).idx);
139
141 if (0 == fulCurrentTsIdx) {
142 LOG(info) << "Reseting Histos for a new run";
144 return kTRUE;
145 }
146
148 if (-1.0 == fdTsCoreSizeInNs) {
149 fuNbCoreMsPerTs = ts.num_core_microslices();
150 fuNbOverMsPerTs = ts.num_microslices(0) - ts.num_core_microslices();
153 LOG(info) << "Timeslice parameters: each TS has " << fuNbCoreMsPerTs << " Core MS and " << fuNbOverMsPerTs
154 << " Overlap MS, for a core duration of " << fdTsCoreSizeInNs << " ns and a full duration of "
155 << fdTsFullSizeInNs << " ns";
156
160 LOG(info) << "In each TS " << fuNbMsLoop << " MS will be looped over";
161 } // if( -1.0 == fdTsCoreSizeInNs )
162
164 for (fuMsIndex = 0; fuMsIndex < fuNbMsLoop; fuMsIndex++) {
166 for (UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx) {
167 UInt_t uMsComp = fvMsComponentsList[uMsCompIdx];
168
169 if (kFALSE == ProcessMs(ts, uMsComp, fuMsIndex)) {
170 LOG(error) << "Failed to process ts " << fulCurrentTsIdx << " MS " << fuMsIndex << " for component " << uMsComp;
171 return kFALSE;
172 } // if( kFALSE == ProcessMs( ts, uMsCompIdx, fuMsIndex ) )
173 } // for( UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx )
174
176
177 } // for( fuMsIndex = 0; fuMsIndex < uNbMsLoop; fuMsIndex ++ )
178
180
181
183 if (fbMonitorMode) {
184 if (kFALSE == FillHistograms()) {
185 LOG(error) << "Failed to fill histos in ts " << fulCurrentTsIdx;
186 return kFALSE;
187 } // if( kFALSE == FillHistograms() )
188 } // if( fbMonitorMode )
189
190 return kTRUE;
191}
192
193Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uMsCompIdx, size_t uMsIdx)
194{
195 auto msDescriptor = ts.descriptor(uMsCompIdx, uMsIdx);
196 fuCurrentEquipmentId = msDescriptor.eq_id;
197 const uint8_t* msContent = reinterpret_cast<const uint8_t*>(ts.content(uMsCompIdx, uMsIdx));
198
199 uint32_t uSize = msDescriptor.size;
200 fulCurrentMsIdx = msDescriptor.idx;
201
202 fdMsTime = (1e-9) * static_cast<double>(fulCurrentMsIdx);
203
204 LOG(debug) << "Microslice: " << fulCurrentMsIdx << " from EqId " << std::hex << fuCurrentEquipmentId << std::dec
205 << " has size: " << uSize;
206
207 if (0 == fvbMaskedComponents.size()) fvbMaskedComponents.resize(ts.num_components(), kFALSE);
208
209 fuCurrDpbId = static_cast<uint32_t>(fuCurrentEquipmentId & 0xFFFF);
210
212 auto it = fGdpbIdIndexMap.find(fuCurrDpbId);
213 if (it == fGdpbIdIndexMap.end()) {
214 if (kFALSE == fvbMaskedComponents[uMsCompIdx]) {
215 LOG(info) << "---------------------------------------------------------------";
216
217 LOG(info) << FormatMsHeaderPrintout(msDescriptor);
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
220 << "\n"
221 << "If valid this index has to be added in the PSD "
222 "parameter file in the DbpIdArray field";
223 fvbMaskedComponents[uMsCompIdx] = kTRUE;
224 } // if( kFALSE == fvbMaskedComponents[ uMsComp ] )
225 else
226 return kTRUE;
227
230
231
232 return kFALSE;
233
234 } // if( it == fGdpbIdIndexMap.end() )
235 else
237
239 if (0 == fuCurrDpbIdx) {
241 if (1.0 < fdMsTime - fdLastSecondTime) {
244 fbSpillOn = kFALSE;
247 } // if( fbSpillOn && fuCountsLastSecond < kuOffSpillCountLimit )
249 fbSpillOn = kTRUE;
250
253 } // if( 1 < fdMsTime - fdLastSecondTime )
254 } // if( 0 == fuCurrDpbIdx )
255
258
263 } // else if( fuHistoryHistoSize < fdMsTime - fdStartTime )
264
265 // If MS time is less than start time print error and return
266 if (fdMsTime - fdStartTime < 0) {
267 LOG(error) << "negative time! ";
269 return kFALSE;
270 }
271
272 // If not integer number of message in input buffer, print warning/error
273 if (0 != (uSize % kuBytesPerMessage))
274 LOG(error) << "The input microslice buffer does NOT "
275 << "contain only complete nDPB messages!";
276
277 // Compute the number of complete messages in the input microslice buffer
278 uint32_t uNbMessages = (uSize - (uSize % kuBytesPerMessage)) / kuBytesPerMessage;
279
280 // Prepare variables for the loop on contents
281 const uint64_t* pInBuff = reinterpret_cast<const uint64_t*>(msContent);
282
283 if (fair::Logger::Logging(fair::Severity::debug)) {
284 if (uNbMessages != 0) printf("\n\n");
285 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
286 // Fill message
287 uint64_t ulData = static_cast<uint64_t>(pInBuff[uIdx]);
288 printf("%016llx\n", (long long int) ulData);
289 }
290 }
291
292 switch (fuRawDataVersion) {
293 // --------------------------------------------------------------------------------------------------
294 case 100: {
295
296 PsdDataV100::PsdGbtReader PsdReader(pInBuff);
297 if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.SetPrintOutMode(true);
298 // every 80bit gbt word is decomposed into two 64bit words
299 if (uNbMessages > 1) {
300 while (PsdReader.GetTotalGbtWordsRead() < uNbMessages) {
301 int ReadResult = PsdReader.ReadMs();
302 if (ReadResult == 0) {
305
306 //hit loop
307 for (uint64_t hit_iter = 0; hit_iter < PsdReader.VectHitHdr.size(); hit_iter++) {
308 if (PsdReader.VectPackHdr.size() != PsdReader.VectHitHdr.size()) {
309 LOG(error) << "Different vector headers sizes!"
310 << " in VectPackHdr " << PsdReader.VectPackHdr.size() << " in VectHitHdr "
311 << PsdReader.VectHitHdr.size() << "\n";
312 break;
313 }
314
315 uint16_t uHitChannel = PsdReader.VectHitHdr.at(hit_iter).uHitChannel;
316 //uint8_t uLinkIndex = PsdReader.VectPackHdr.at(hit_iter).uLinkIndex;
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;
320 //double dHitTime = (double) fulCurrentMsIdx + PsdReader.VectPackHdr.at(hit_iter).uAdcTime * 12.5; //in ns
321 //double dHitTime = PsdReader.MsHdr.ulMicroSlice*1000. + PsdReader.VectPackHdr.at(hit_iter).uAdcTime*12.5; //in ns
322 std::vector<uint16_t> uWfm = PsdReader.VectHitData.at(hit_iter).uWfm;
323 uSignalCharge /= (int) kfAdc_to_mV; // ->now in mV
324
325 fhAdcTime->Fill(PsdReader.VectPackHdr.at(hit_iter).uAdcTime);
326
327 //uHitChannel numerated from 0
328 if (uHitChannel >= kuNbChanPsd) {
329 LOG(error) << "hit channel number out of range! channel index: " << uHitChannel
330 << " max: " << GetNbChanPsd();
331 break;
332 }
333
334 //Pack header
335 fhHitChargeMap->Fill(uHitChannel, uSignalCharge);
336 fhChanHitMapEvo->Fill(uHitChannel, fdMsTime - fdStartTime); //should be placed map(channel)
337 if (fbMonitorChanMode) {
338 fvhHitChargeChan[uHitChannel]->Fill(uSignalCharge);
339 fvhHitZeroLevelChan[uHitChannel]->Fill(uZeroLevel);
340 fvhHitZLChanEvo[uHitChannel]->Fill(fdMsTime - fdStartTime, uZeroLevel);
341 fvhHitFAChanEvo[uHitChannel]->Fill(fdMsTime - fdStartTime, uAccum);
342
343 //Hit data
344 double dHitAmlpitude = 0;
345 double dHitChargeWfm = 0;
346 if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Reset();
347 if (fbMonitorFitMode) fvhHitFitWfmChan[uHitChannel]->Reset();
348
349 if (!uWfm.empty()) {
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;
355 //uint8_t hit_time_max = std::distance(uWfm.begin(), max_iter);
356 dHitAmlpitude = *max_iter - uZeroLevel;
357 dHitAmlpitude /= kfAdc_to_mV;
358 dHitChargeWfm /= kfAdc_to_mV;
359 fvhHitAmplChan[uHitChannel]->Fill(dHitAmlpitude);
360 fvhHitChargeByWfmChan[uHitChannel]->Fill(dHitChargeWfm);
361
362 if (fbMonitorWfmMode) {
363 fvhHitLPChanEvo[uHitChannel]->Fill(fdMsTime - fdStartTime, uWfm.back());
364 for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++)
365 fvhHitWfmChan[uHitChannel]->Fill(wfm_iter, uWfm.at(wfm_iter));
366 fvhHitWfmChan[uHitChannel]->SetTitle(
367 Form("Waveform channel %03u charge %0u zero level %0u; Time [adc "
368 "counts]; Amplitude [adc counts]",
369 uHitChannel, uSignalCharge, uZeroLevel));
370 for (uint8_t i = 0; i < kuNbWfmRanges; ++i) {
371 if (uSignalCharge > kvuWfmRanges.at(i) && uSignalCharge < kvuWfmRanges.at(i + 1)) {
372 UInt_t uFlatIndexOfChange = i * kuNbChanPsd + uHitChannel;
373
374 UInt_t uWfmExampleIter = kvuWfmInRangeToChangeChan.at(uFlatIndexOfChange);
375 UInt_t uFlatIndexHisto =
376 uWfmExampleIter * kuNbWfmRanges * kuNbChanPsd + i * kuNbChanPsd + uHitChannel;
377 fv3hHitWfmFlattenedChan[uFlatIndexHisto]->Reset();
378
379 for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++)
380 fv3hHitWfmFlattenedChan[uFlatIndexHisto]->Fill(wfm_iter, uWfm.at(wfm_iter));
381 fv3hHitWfmFlattenedChan[uFlatIndexHisto]->SetTitle(
382 Form("Waveform channel %03u charge %0u zero level %0u; Time "
383 "[adc counts]; Amplitude [adc counts]",
384 uHitChannel, uSignalCharge, uZeroLevel));
385
386 kvuWfmInRangeToChangeChan.at(uFlatIndexOfChange)++;
387 if (kvuWfmInRangeToChangeChan.at(uFlatIndexOfChange) == kuNbWfmExamples)
388 kvuWfmInRangeToChangeChan.at(uFlatIndexOfChange) = 0;
389
390 } // if( uSignalCharge > kvuWfmRanges.at(i) && uSignalCharge < kvuWfmRanges.at(i+1) )
391 } // for (uint8_t i=0; i<kuNbWfmRanges; ++i)
392 } //if (fbMonitorWfmMode)
393 } //if (!uWfm.empty())
394
395
396 if (fbMonitorFitMode && !uWfm.empty()) {
397 int gate_beg = 0;
398 int gate_end = 10; //uWfm.size() - 1;
399 PsdSignalFitting::PronyFitter Pfitter(2, 2, gate_beg, gate_end);
400
401 Pfitter.SetDebugMode(0);
402 Pfitter.SetWaveform(uWfm, uZeroLevel);
403 int SignalBeg = 4;
404 std::complex<float> first_fit_harmonic = {0.72, 0.0};
405 std::complex<float> second_fit_harmonic = {0.38, -0.0};
406 Pfitter.SetExternalHarmonics(first_fit_harmonic, second_fit_harmonic);
407 Int_t best_signal_begin = Pfitter.ChooseBestSignalBegin(SignalBeg - 1, SignalBeg + 1);
408 Pfitter.SetSignalBegin(best_signal_begin);
409 Pfitter.CalculateFitAmplitudes();
410
411 Pfitter.SetSignalBegin(best_signal_begin);
412 Pfitter.CalculateFitHarmonics();
413 Pfitter.CalculateFitAmplitudes();
414
415 Float_t fit_integral = Pfitter.GetIntegral(gate_beg, uWfm.size() - 1) / kfAdc_to_mV;
416 Float_t fit_R2 = Pfitter.GetRSquare(gate_beg, uWfm.size() - 1);
417
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++)
421 fvhHitFitWfmChan[uHitChannel]->Fill(wfm_iter, uFitWfm.at(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));
425
426 fvhFitQaChan[uHitChannel]->Fill(fit_integral, fit_R2);
427
428 if (fit_R2 > 0.02) continue;
429 fvhFitHarmonic1Chan[uHitChannel]->Fill(std::real(harmonics[1]), std::imag(harmonics[1]));
430 fvhFitHarmonic2Chan[uHitChannel]->Fill(std::real(harmonics[2]), std::imag(harmonics[2]));
431 } //if (fbMonitorFitMode && !uWfm.empty())
432 } //if (fbMonitorChanMode)
433 } // for(int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; hit_iter++)
434 }
435 else if (ReadResult == 1) {
436 LOG(error) << "no pack headers in message!";
437 break;
438 }
439 else if (ReadResult == 2) {
440 LOG(error) << "wrong channel! In header: " << PsdReader.HitHdr.uHitChannel;
441 break;
442 }
443 else if (ReadResult == 3) {
444 LOG(error) << "check number of waveform points! In header: " << PsdReader.HitHdr.uWfmWords - 1;
445 break;
446 }
447 else {
448 LOG(error) << "PsdGbtReader.ReadEventFles() didn't return expected values";
449 break;
450 }
451
452 } // while(PsdReader.GetTotalGbtWordsRead()<uNbMessages)
453
454
455 if (uNbMessages != PsdReader.GetTotalGbtWordsRead()) {
456 fbPsdMissedData = kTRUE;
457 LOG(error) << "Wrong amount of messages read!"
458 << " in microslice " << uNbMessages << " by PsdReader " << PsdReader.GetTotalGbtWordsRead();
459
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);
465 }
466 error_log.close();
467 fbFirstPackageError = kFALSE;
468 printf("Written file %llu_errorlog.txt\n", fulCurrentMsIdx);
469 }
470 }
471
472 fuMsgsCntInMs += uNbMessages;
474 fuLostMsgsCntInMs += uNbMessages - PsdReader.GetTotalGbtWordsRead();
475 } //if (uNbMessages > 1)
476
479
480 break;
481
482 } // case 1
483 // --------------------------------------------------------------------------------------------------
484 // --------------------------------------------------------------------------------------------------
485 case 000: {
486
487 PsdDataV000::PsdGbtReader PsdReader(pInBuff);
488 if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.SetPrintOutMode(true);
489 if (uNbMessages > 1) {
490 while (PsdReader.GetTotalGbtWordsRead() < uNbMessages) {
491 int ReadResult = PsdReader.ReadEventFles();
492 if (PsdReader.EvHdrAb.uHitsNumber > kuNbChanPsd) {
493 LOG(error) << "too many triggered channels! In header: " << PsdReader.EvHdrAb.uHitsNumber
494 << " in PSD: " << GetNbChanPsd();
495 break;
496 }
497
498 if (ReadResult == 0) {
500 fhAdcTime->Fill(PsdReader.EvHdrAc.uAdcTime);
502
503 //hit loop
504 for (int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; hit_iter++) {
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;
509 uSignalCharge /= (int) kfAdc_to_mV; // ->now in mV
510
511 if (uHitChannel >= kuNbChanPsd) //uHitChannel numerated from 0
512 {
513 LOG(error) << "hit channel number out of range! channel index: " << uHitChannel
514 << " max: " << GetNbChanPsd();
515 break;
516 }
517 //Hit header
518 fhHitChargeMap->Fill(uHitChannel, uSignalCharge);
519 fhHitMapEvo->Fill(uHitChannel, fdMsTime - fdStartTime);
520 fhChanHitMapEvo->Fill(uHitChannel, fdMsTime - fdStartTime); //should be placed map(ch)
521
522 if (fbMonitorChanMode) {
523
524 fvhHitChargeChan[uHitChannel]->Fill(uSignalCharge);
525 fvhHitZeroLevelChan[uHitChannel]->Fill(uZeroLevel);
526
527 //Hit data
528 double dHitAmlpitude = 0;
529 double dHitChargeWfm = 0;
530 if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Reset();
531 if (fbMonitorFitMode) fvhHitFitWfmChan[uHitChannel]->Reset();
532
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;
538 //uint8_t hit_time_max = std::distance(uWfm.begin(), max_iter);
539 dHitAmlpitude = *max_iter - uZeroLevel;
540 dHitAmlpitude /= kfAdc_to_mV;
541 dHitChargeWfm /= kfAdc_to_mV;
542 fvhHitAmplChan[uHitChannel]->Fill(dHitAmlpitude);
543 fvhHitChargeByWfmChan[uHitChannel]->Fill(dHitChargeWfm);
544
545 if (fbMonitorWfmMode) {
546 for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++)
547 fvhHitWfmChan[uHitChannel]->Fill(wfm_iter, uWfm.at(wfm_iter));
548 fvhHitWfmChan[uHitChannel]->SetTitle(
549 Form("Waveform channel %03u charge %0u zero level %0u; Time [adc "
550 "counts]; Amplitude [adc counts]",
551 uHitChannel, uSignalCharge, uZeroLevel));
552 for (uint8_t i = 0; i < kuNbWfmRanges; ++i) {
553 if (uSignalCharge > kvuWfmRanges.at(i) && uSignalCharge < kvuWfmRanges.at(i + 1)) {
554 UInt_t uFlatIndexOfChange = i * kuNbChanPsd + uHitChannel;
555
556 UInt_t uWfmExampleIter = kvuWfmInRangeToChangeChan.at(uFlatIndexOfChange);
557 UInt_t uFlatIndexHisto =
558 uWfmExampleIter * kuNbWfmRanges * kuNbChanPsd + i * kuNbChanPsd + uHitChannel;
559 fv3hHitWfmFlattenedChan[uFlatIndexHisto]->Reset();
560
561 for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++)
562 fv3hHitWfmFlattenedChan[uFlatIndexHisto]->Fill(wfm_iter, uWfm.at(wfm_iter));
563 fv3hHitWfmFlattenedChan[uFlatIndexHisto]->SetTitle(
564 Form("Waveform channel %03u charge %0u zero level %0u; Time "
565 "[adc counts]; Amplitude [adc counts]",
566 uHitChannel, uSignalCharge, uZeroLevel));
567
568 kvuWfmInRangeToChangeChan.at(uFlatIndexOfChange)++;
569 if (kvuWfmInRangeToChangeChan.at(uFlatIndexOfChange) == kuNbWfmExamples)
570 kvuWfmInRangeToChangeChan.at(uFlatIndexOfChange) = 0;
571
572 } // if( uSignalCharge > kvuWfmRanges.at(i) && uSignalCharge < kvuWfmRanges.at(i+1) )
573 } // for (uint8_t i=0; i<kuNbWfmRanges; ++i)
574 } //if (fbMonitorWfmMode)
575
576 if (fbMonitorFitMode) {
577 int gate_beg = 0;
578 int gate_end = uWfm.size() - 1;
579 PsdSignalFitting::PronyFitter Pfitter(2, 2, gate_beg, gate_end);
580
581 Pfitter.SetDebugMode(0);
582 Pfitter.SetWaveform(uWfm, uZeroLevel);
583 int SignalBeg = 2;
584 Int_t best_signal_begin = Pfitter.ChooseBestSignalBeginHarmonics(SignalBeg - 1, SignalBeg + 1);
585
586 Pfitter.SetSignalBegin(best_signal_begin);
587 Pfitter.CalculateFitHarmonics();
588 Pfitter.CalculateFitAmplitudes();
589
590 Float_t fit_integral = Pfitter.GetIntegral(gate_beg, gate_end) / kfAdc_to_mV;
591 Float_t fit_R2 = Pfitter.GetRSquare(gate_beg, gate_end);
592
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++)
596 fvhHitFitWfmChan[uHitChannel]->Fill(wfm_iter, uFitWfm.at(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));
600
601 fvhFitQaChan[uHitChannel]->Fill(fit_integral, fit_R2);
602
603 if (fit_R2 > 0.02) continue;
604 fvhFitHarmonic1Chan[uHitChannel]->Fill(std::real(harmonics[1]), std::imag(harmonics[1]));
605 fvhFitHarmonic2Chan[uHitChannel]->Fill(std::real(harmonics[2]), std::imag(harmonics[2]));
606 } //if (fbMonitorFitMode)
607 } //if (fbMonitorChanMode)
608
609 } // for(int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; hit_iter++)
610 }
611 else if (ReadResult == 1) {
612 LOG(error) << "no event headers in message!";
613 break;
614 }
615 else if (ReadResult == 2) {
616 LOG(error) << "check number of waveform points! In header: " << PsdReader.HitHdr.uWfmPoints
617 << " should be: " << 8;
618 break;
619 }
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();
623 break;
624 }
625 else {
626 LOG(error) << "PsdGbtReader.ReadEventFles() didn't return expected values";
627 break;
628 }
629
630 } // while(PsdReader.GetTotalGbtWordsRead()<uNbMessages)
631
632 if (uNbMessages != PsdReader.GetTotalGbtWordsRead()) {
633 fbPsdMissedData = kTRUE;
634 LOG(error) << "Wrong amount of messages read!"
635 << " in microslice " << uNbMessages << " by PsdReader " << PsdReader.GetTotalGbtWordsRead();
636
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);
642 }
643 error_log.close();
644 fbFirstPackageError = kFALSE;
645 printf("Written file %llu_errorlog.txt\n", fulCurrentMsIdx);
646 }
647 }
648
649 if (fulCurrentMsIdx != PsdReader.EvHdrAb.ulMicroSlice)
650 LOG(error) << "Wrong MS index!"
651 << " in microslice " << fulCurrentMsIdx << " by PsdReader " << PsdReader.EvHdrAb.ulMicroSlice
652 << "\n";
653
654 fuMsgsCntInMs += uNbMessages;
656 fuLostMsgsCntInMs += uNbMessages - PsdReader.GetTotalGbtWordsRead();
657
658 } //if(uNbMessages > 1)
659
660
663
664 break;
665 } // case 0
666 // --------------------------------------------------------------------------------------------------
667
668 } // switch
669
671 else {
674 }
675
676 return kTRUE;
677}
678
680{
681 std::string sFolder = "MoniPsd";
682 std::string sFitFolder = "PronyFit";
683 LOG(info) << "create Histos for PSD monitoring ";
684
686 uint32_t iNbBinsLog = 0;
688 std::vector<double> dBinsLogVector = GenerateLogBinArray(2, 3, 1, iNbBinsLog);
689 double* dBinsLog = dBinsLogVector.data();
690
691 fhHitChargeMap = new TH2I("hHitChargeMap", "Map of hits charges in PSD detector; Chan; Charge [mV]", kuNbChanPsd, 0.,
693 fhHitMapEvo = new TH2I("hHitMapEvo",
694 "Map of hits in PSD detector electronics vs time in "
695 "run; Chan; Time in run [s]; Hits Count []",
697 fhChanHitMapEvo = new TH2I("hChanHitMapEvo",
698 "Map of hits in PSD detector vs time in run; "
699 "Chan; Time in run [s]; Hits Count []",
701
702
703 fhMissedData = new TH1I("hMissedData", "PSD Missed data", 2, 0, 2);
704
705 fhAdcTime = new TH1I("hAdcTime", "ADC time; Adc time []", 100, 0, 160000);
706
707 fhMsLengthEvo = new TH2I("hMsLengthEvo", "Evolution of MS length vs time in run; Time in run [s]; MS length [ns]",
708 fuHistoryHistoSize, 0, fuHistoryHistoSize, (Int_t) 1e2, 0, 1e8);
709
710 fhMsgsCntPerMsEvo = new TH2I("hMsgsCntPerMsEvo",
711 "Evolution of TotalMsgs counts, per MS vs time in run; Time in "
712 "run [s]; TotalMsgs Count/MS []; MS",
713 fuHistoryHistoSize, 0, fuHistoryHistoSize, iNbBinsLog, dBinsLog);
714 fhReadMsgsCntPerMsEvo = new TH2I("ReadMsgsCntPerMsEvo",
715 "Evolution of ReadMsgs counts, per MS vs time in run; Time in run "
716 "[s]; ReadMsgs Count/MS []; MS",
717 fuHistoryHistoSize, 0, fuHistoryHistoSize, iNbBinsLog, dBinsLog);
718 fhLostMsgsCntPerMsEvo = new TH2I("hLostMsgsCntPerMsEvo",
719 "Evolution of LostMsgs counts, per MS vs time in run; Time in run "
720 "[s]; LostMsgs Count/MS []; MS",
721 fuHistoryHistoSize, 0, fuHistoryHistoSize, iNbBinsLog, dBinsLog);
722 fhReadEvtsCntPerMsEvo = new TH2I("hReadEvtCntPerMsEvo",
723 "Evolution of ReadEvents counts, per MS vs time in run; Time in "
724 "run [s]; ReadEvents Count/MS []; MS",
725 fuHistoryHistoSize, 0, fuHistoryHistoSize, iNbBinsLog, dBinsLog);
726
731
733 AddHistoToVector(fhAdcTime, sFolder);
735
740
741 /*******************************************************************/
742 if (fbMonitorChanMode) {
743
744 for (UInt_t uChan = 0; uChan < kuNbChanPsd; ++uChan) {
745
746 fvhHitZLChanEvo[uChan] = new TH2I(
747 Form("hHitZLChanEvo%03u", uChan),
748 Form("Hits ZeroLevel evolution for channel %03u; Time in run [s]; ZeroLevel [adc counts]", uChan),
750 fvhHitZLChanEvo[uChan]->SetMarkerColor(kRed);
751 fvhHitLPChanEvo[uChan] = new TH2I(
752 Form("hHitLPChanEvo%03u", uChan),
753 Form("Hits LastPoint evolution for channel %03u; Time in run [s]; ZeroLevel [adc counts]", uChan),
755 fvhHitLPChanEvo[uChan]->SetMarkerColor(kBlue);
756 fvhHitFAChanEvo[uChan] = new TH2I(
757 Form("hHitFAChanEvo%03u", uChan),
758 Form("Hits FeeAccumulator evolution for channel %03u; Time in run [s]; ZeroLevel [adc counts]", uChan),
760 fvhHitFAChanEvo[uChan]->SetMarkerColor(kOrange);
761
762
763 fvhHitChargeChan[uChan] = new TH1I(Form("hHitChargeChan%03u", uChan),
764 Form("Hits charge distribution for channel %03u; Charge [mV]", uChan),
766
767 fvhHitZeroLevelChan[uChan] =
768 new TH1I(Form("hHitZeroLevelChan%03u", uChan),
769 Form("Hits zero level distribution for channel %03u; ZeroLevel [adc counts]", uChan),
770 fviHistoZLArgs.at(0), fviHistoZLArgs.at(1), fviHistoZLArgs.at(2));
771
772 fvhHitAmplChan[uChan] = new TH1F(Form("hHitAmplChan%03u", uChan),
773 Form("Hits amplitude distribution for channel %03u; Amplitude [mV]", uChan),
775
776 fvhHitChargeByWfmChan[uChan] =
777 new TH1I(Form("hHitChargeByWfmChan%03u", uChan),
778 Form("Hits charge by waveform distribution for channel %03u; "
779 "Charge [mV]",
780 uChan),
782
783
784 AddHistoToVector(fvhHitZLChanEvo[uChan], sFolder);
785 AddHistoToVector(fvhHitLPChanEvo[uChan], sFolder);
786 AddHistoToVector(fvhHitFAChanEvo[uChan], sFolder);
787 AddHistoToVector(fvhHitChargeChan[uChan], sFolder);
788 AddHistoToVector(fvhHitZeroLevelChan[uChan], sFolder);
789 AddHistoToVector(fvhHitAmplChan[uChan], sFolder);
791
792 if (fbMonitorWfmMode) {
793 fvhHitWfmChan[uChan] = new TH1I(Form("hHitWfmChan%03u", uChan), Form("HitWfmChan%03u", uChan), 32, 0, 32);
794 fvhHitWfmChan[uChan]->SetMarkerStyle(31);
795 fvhHitWfmChan[uChan]->SetMarkerSize(0.5);
796
797 for (UInt_t uWfmRangeIter = 0; uWfmRangeIter < kuNbWfmRanges; uWfmRangeIter++) {
798 for (UInt_t uWfmExampleIter = 0; uWfmExampleIter < kuNbWfmExamples; uWfmExampleIter++) {
799 UInt_t uFlatIndex = uWfmExampleIter * kuNbWfmRanges * kuNbChanPsd + uWfmRangeIter * kuNbChanPsd + uChan;
800 fv3hHitWfmFlattenedChan[uFlatIndex] =
801 new TH1I(Form("hHitWfmChan%03uRange%02uExample%02u", uChan, uWfmRangeIter, uWfmExampleIter),
802 Form("HitWfmChan%03uRange%02uExample%02u", uChan, uWfmRangeIter, uWfmExampleIter), 32, 0, 32);
803
804 } // for( UInt_t uWfmRangeIter = 0; uWfmRangeIter < kuNbWfmRanges; uWfmRangeIter ++)
805 } // for( UInt_t uWfmExampleIter = 0; uWfmExampleIter < kuNbWfmExamples; uWfmExampleIter ++)
806 } // if(fbMonitorWfmMode)
807
808 if (fbMonitorFitMode) {
809
810 fvhHitFitWfmChan[uChan] =
811 new TH1I(Form("hHitFitWfmChan%03u", uChan), Form("HitFitWfmChan%03u", uChan), 32, 0, 32);
812 fvhHitFitWfmChan[uChan]->SetLineColor(kRed);
813 fvhHitFitWfmChan[uChan]->SetLineWidth(2);
814
815 fvhFitHarmonic1Chan[uChan] = new TH2I(
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);
818 fvhFitHarmonic1Chan[uChan]->SetMarkerColor(kRed);
819
820 fvhFitHarmonic2Chan[uChan] = new TH2I(
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);
823 fvhFitHarmonic2Chan[uChan]->SetMarkerColor(kBlue);
824
825 fvhFitQaChan[uChan] = new TH2I(
826 Form("hFitQaChan%03u", uChan), Form("Waveform fit QA for channel %03u; Integral [adc counts]; R2 []", uChan),
827 fviHistoChargeArgs.at(0), fviHistoChargeArgs.at(1), fviHistoChargeArgs.at(2), 500, 0, 1);
828
829 AddHistoToVector(fvhFitHarmonic1Chan[uChan], sFitFolder);
830 AddHistoToVector(fvhFitHarmonic2Chan[uChan], sFitFolder);
831 AddHistoToVector(fvhFitQaChan[uChan], sFitFolder);
832
833 } // if(fbMonitorFitMode)
834 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; ++uChan )
835
836 } // if (fbMonitorChanMode)
837 /*******************************************************************/
838
840 Double_t w = 10;
841 Double_t h = 10;
842
843 /*******************************************************************/
845 fcHitMaps = new TCanvas("cHitMaps", "Hit maps", w, h);
846 fcHitMaps->Divide(2);
847
848 fcHitMaps->cd(1);
849 gPad->SetGridx();
850 gPad->SetGridy();
851 gPad->SetLogz();
852 fhChanHitMapEvo->Draw("colz");
853
854 fcHitMaps->cd(2);
855 gPad->SetGridx();
856 gPad->SetGridy();
857 gPad->SetLogz();
858 fhHitChargeMap->Draw("colz");
859
860 AddCanvasToVector(fcHitMaps, "canvases");
861 /*******************************************************************/
862
863 /*******************************************************************/
865 fcSummary = new TCanvas("cSummary", "Hit maps, Hit rate, Error fraction", w, h);
866 fcSummary->Divide(2, 2);
867
868 fcSummary->cd(1);
869 gPad->SetGridx();
870 gPad->SetGridy();
871 gPad->SetLogz();
872 fhHitChargeMap->Draw("colz");
873
874 fcSummary->cd(2);
875 gPad->SetGridx();
876 gPad->SetGridy();
877 gPad->SetLogz();
878 fhChanHitMapEvo->Draw("colz");
879
880 fcSummary->cd(3);
881 gPad->SetGridx();
882 gPad->SetGridy();
883 gPad->SetLogy();
884 fhMissedData->Draw();
885
886 fcSummary->cd(4);
887 gPad->SetGridx();
888 gPad->SetGridy();
889 gPad->SetLogy();
890 gPad->SetLogz();
891 fhMsLengthEvo->Draw("colz");
892
893 AddCanvasToVector(fcSummary, "canvases");
894 /*******************************************************************/
895
896 /*******************************************************************/
898 fcGenCntsPerMs = new TCanvas("cGenCntsPerMs", "Messages and hit cnt per MS, Error and Evt Loss Fract. per MS ", w, h);
899 fcGenCntsPerMs->Divide(2, 2);
900
901 fcGenCntsPerMs->cd(1);
902 gPad->SetGridx();
903 gPad->SetGridy();
904 gPad->SetLogy();
905 gPad->SetLogz();
906 fhMsgsCntPerMsEvo->Draw("colz");
907
908 fcGenCntsPerMs->cd(2);
909 gPad->SetGridx();
910 gPad->SetGridy();
911 gPad->SetLogy();
912 gPad->SetLogz();
913 fhReadMsgsCntPerMsEvo->Draw("colz");
914
915 fcGenCntsPerMs->cd(3);
916 gPad->SetGridx();
917 gPad->SetGridy();
918 gPad->SetLogy();
919 gPad->SetLogz();
920 fhReadEvtsCntPerMsEvo->Draw("colz");
921
922 fcGenCntsPerMs->cd(4);
923 gPad->SetGridx();
924 gPad->SetGridy();
925 gPad->SetLogy();
926 gPad->SetLogz();
927 fhLostMsgsCntPerMsEvo->Draw("colz");
928
930 /*******************************************************************/
931
932 if (fbMonitorChanMode) {
933
934 /*******************************************************************/
936 fcZLevo = new TCanvas("cZLevo", "ZeroLevel evolaution in all channels", w, h);
937 fcZLevo->DivideSquare(kuNbChanPsd);
938
939 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
940 fcZLevo->cd(1 + uChan);
941 fvhHitZLChanEvo[uChan]->Draw();
942 fvhHitLPChanEvo[uChan]->Draw("same");
943 fvhHitFAChanEvo[uChan]->Draw("same");
944 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; uChan ++)
945
946 AddCanvasToVector(fcZLevo, "canvases");
947 /*******************************************************************/
948
949 /*******************************************************************/
951 fcChargesFPGA = new TCanvas("cChargesFPGA", "Charges spectra in all channels calculated by FPGA", w, h);
952 fcChargesFPGA->DivideSquare(kuNbChanPsd);
953
954 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
955 fcChargesFPGA->cd(1 + uChan)->SetLogy();
956 fvhHitChargeChan[uChan]->Draw();
957 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; uChan ++)
958
959 AddCanvasToVector(fcChargesFPGA, "canvases");
960 /*******************************************************************/
961
962 /*******************************************************************/
964 fcChargesWfm = new TCanvas("cChargesWfm", "Charges spectra in all channels calculated over waveform", w, h);
965 fcChargesWfm->DivideSquare(kuNbChanPsd);
966
967 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
968 fcChargesWfm->cd(1 + uChan)->SetLogy();
969 fvhHitChargeByWfmChan[uChan]->Draw();
970 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; uChan ++)
971
972 AddCanvasToVector(fcChargesWfm, "canvases");
973 /*******************************************************************/
974
975 /*******************************************************************/
977 fcAmplitudes = new TCanvas("cAmplitudes", "Amplitude spectra in all channels", w, h);
978 fcAmplitudes->DivideSquare(kuNbChanPsd);
979
980 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
981 fcAmplitudes->cd(1 + uChan)->SetLogy();
982 fvhHitAmplChan[uChan]->Draw();
983 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; uChan ++)
984
985 AddCanvasToVector(fcAmplitudes, "canvases");
986 /*******************************************************************/
987
988 /*******************************************************************/
990 fcZeroLevels = new TCanvas("cZeroLevels", "Zero Level spectra in all channels", w, h);
991 fcZeroLevels->DivideSquare(kuNbChanPsd);
992
993 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
994 fcZeroLevels->cd(1 + uChan);
995 fvhHitZeroLevelChan[uChan]->Draw();
996 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; uChan ++)
997
998 AddCanvasToVector(fcZeroLevels, "canvases");
999 /*******************************************************************/
1000
1001 if (fbMonitorWfmMode) {
1002
1003 /*******************************************************************/
1005 fcWfmsAllChannels = new TCanvas("cWfmsAllChannels", "Last waveforms in PSD fired channels", w, h);
1006 fcWfmsAllChannels->DivideSquare(kuNbChanPsd);
1007
1008 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
1009 fcWfmsAllChannels->cd(1 + uChan);
1010 if (!fbMonitorFitMode) fvhHitWfmChan[uChan]->Draw("HIST LP");
1011 if (fbMonitorFitMode) {
1012 fvhHitWfmChan[uChan]->Draw("HIST P");
1013 fvhHitFitWfmChan[uChan]->Draw("L SAME");
1014 }
1015 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; uChan ++)
1016
1018 /*******************************************************************/
1019
1020 /*******************************************************************/
1022 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
1023 fvcWfmsChan[uChan] =
1024 new TCanvas(Form("cWfmsChan%03u", uChan), Form("Canvas with last waveforms in channel %03u", uChan), w, h);
1025 fvcWfmsChan[uChan]->Divide(kuNbWfmExamples, kuNbWfmRanges);
1026 UInt_t uHisto = 0;
1027
1028 for (UInt_t uWfmRangeIter = 0; uWfmRangeIter < kuNbWfmRanges; uWfmRangeIter++) {
1029 for (UInt_t uWfmExampleIter = 0; uWfmExampleIter < kuNbWfmExamples; uWfmExampleIter++) {
1030 fvcWfmsChan[uChan]->cd(1 + uHisto);
1031 UInt_t uFlatIndex = uWfmExampleIter * kuNbWfmRanges * kuNbChanPsd + uWfmRangeIter * kuNbChanPsd + uChan;
1032 fv3hHitWfmFlattenedChan[uFlatIndex]->Draw("HIST LP");
1033 uHisto++;
1034 } // for( UInt_t uWfmRangeIter = 0; uWfmRangeIter < kuNbWfmRanges; uWfmRangeIter ++)
1035 } // for( UInt_t uWfmExampleIter = 0; uWfmExampleIter < kuNbWfmExamples; uWfmExampleIter ++)
1036
1037 AddCanvasToVector(fvcWfmsChan[uChan], "waveforms");
1038 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; uChan ++)
1039
1040 /*******************************************************************/
1041
1042 } // if (fbMonitorWfmMode)
1043
1044 if (fbMonitorFitMode) {
1045
1046 fcPronyFit = new TCanvas("cPronyFit", "Prony wfm fitting", w, h);
1047 fcPronyFit->Divide(2);
1048
1049 fcPronyFit->cd(1);
1050 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
1051 fvhFitHarmonic1Chan[uChan]->Draw("same");
1052 fvhFitHarmonic2Chan[uChan]->Draw("same");
1053 }
1054
1055 fcPronyFit->cd(2);
1056 for (UInt_t uChan = 0; uChan < kuNbChanPsd; uChan++) {
1057 fvhFitQaChan[uChan]->Draw("same");
1058 }
1059
1060 AddCanvasToVector(fcPronyFit, "PronyFit");
1061
1062 /*******************************************************************/
1063
1064 } // if (fbMonitorFitMode)
1065
1066 } // if (fbMonitorChanMode)
1067
1068 return kTRUE;
1069}
1070
1085
1087{
1088
1089 if (fbMonitorChanMode) {
1090 for (UInt_t uChan = 0; uChan < kuNbChanPsd; ++uChan) {
1091 fvhHitZLChanEvo[uChan]->Reset();
1092 fvhHitLPChanEvo[uChan]->Reset();
1093 fvhHitFAChanEvo[uChan]->Reset();
1094 fvhHitChargeChan[uChan]->Reset();
1095 fvhHitZeroLevelChan[uChan]->Reset();
1096 fvhHitAmplChan[uChan]->Reset();
1097 fvhHitChargeByWfmChan[uChan]->Reset();
1098 if (fbMonitorWfmMode) fvhHitWfmChan[uChan]->Reset();
1099
1100 if (fbMonitorFitMode) {
1101 fvhHitFitWfmChan[uChan]->Reset();
1102 fvhFitHarmonic1Chan[uChan]->Reset();
1103 fvhFitHarmonic2Chan[uChan]->Reset();
1104 fvhFitQaChan[uChan]->Reset();
1105 } // if (fbMonitorFitMode)
1106 } // for( UInt_t uChan = 0; uChan < kuNbChanPsd; ++uChan )
1107 } // if(fbMonitorChanMode)
1108
1109 if (fbMonitorWfmMode) {
1110 for (UInt_t uFlatIndex = 0; uFlatIndex < kuNbChanPsd * kuNbWfmRanges * kuNbWfmExamples; ++uFlatIndex)
1111 fv3hHitWfmFlattenedChan[uFlatIndex]->Reset();
1112 for (UInt_t uWfmIndex = 0; uWfmIndex < kuNbChanPsd * kuNbWfmRanges; ++uWfmIndex)
1113 kvuWfmInRangeToChangeChan[uWfmIndex] = 0;
1114 } // if(fbMonitorWfmMode)
1115
1117 fhHitChargeMap->Reset();
1118 fhHitMapEvo->Reset();
1119 fhChanHitMapEvo->Reset();
1120
1121 fhMissedData->Reset();
1122 fhAdcTime->Reset();
1123 fhMsLengthEvo->Reset();
1124
1125 fhMsgsCntPerMsEvo->Reset();
1126 fhReadMsgsCntPerMsEvo->Reset();
1127 fhLostMsgsCntPerMsEvo->Reset();
1128 fhReadEvtsCntPerMsEvo->Reset();
1129
1130 if (kTRUE == bResetTime) {
1132 fdStartTime = -1.0;
1133 } // if( kTRUE == bResetTime )
1134
1135
1136 return kTRUE;
1137}
1138
1139// -------------------------------------------------------------------------
std::vector< double > GenerateLogBinArray(uint32_t uNbDecadesLog, uint32_t uNbStepsDecade, uint32_t uNbSubStepsInStep, uint32_t &uNbBinsLog, int32_t iStartExp, bool bAddZeroStart)
std::string FormatMsHeaderPrintout(const fles::MicrosliceDescriptor &msDescriptor)
float Float_t
int Int_t
bool Bool_t
UInt_t fuNrOfChannelsPerGdpb
Number of channels in each FEE.
std::vector< UInt_t > kvuWfmInRangeToChangeChan
UInt_t fuMsIndex
Start Time in ns of previous MS from its index field in header.
std::vector< Bool_t > fvbMaskedComponents
static constexpr UInt_t GetNbChanPsd()
Double_t fdStartTime
Index of the DPB from which the MS currently unpacked is coming.
Bool_t fbFirstPackageError
Switch ON the filling of a additional set of histograms.
std::vector< TH1 * > fvhHitFitWfmChan
Waveform fitting.
UInt_t fuCurrDpbId
Current equipment ID, tells from which DPB the current MS is originating.
CbmMcbm2018PsdPar * fUnpackPar
Settings from parameter file.
UInt_t fuNrOfChannelsPerFee
Number of FEBs per GDPB.
std::vector< TH1 * > fvhHitChargeByWfmChan
Bool_t ProcessTs(const fles::Timeslice &ts)
UInt_t fuCurrentEquipmentId
Index of current MS within the TS.
UInt_t fuCurrDpbIdx
Temp holder until Current equipment ID is properly filled in MS.
std::vector< TH2 * > fvhHitZLChanEvo
Channel rate plots.
UInt_t fuHistoryHistoSize
Histograms related variables.
Bool_t ProcessMs(const fles::Timeslice &ts, size_t uMsCompIdx, size_t uMsIdx)
Double_t fdPrevMsTime
Start Time in ns of current MS from its index field in header.
Bool_t fbMonitorFitMode
Switch ON the filling waveforms histograms.
Bool_t fbMonitorChanMode
Switch ON the filling of a minimal set of histograms.
std::vector< TCanvas * > fvcWfmsChan
UInt_t fuNrOfFeePerGdpb
gDPB ID to index map
Double_t fdMsTime
Time in ns of current TS from the index of the first MS first component.
void AddMsComponentToList(size_t component, UShort_t usDetectorId)
std::map< UInt_t, UInt_t > fGdpbIdIndexMap
Total number of GDPBs in the system.
Bool_t fbMonitorWfmMode
Switch ON the filling channelwise histograms.
Bool_t ResetHistograms(Bool_t bResetTime=kTRUE)
std::vector< TH1 * > fv3hHitWfmFlattenedChan
void AddHistoToVector(TNamed *pointer, std::string sFolder="")
std::vector< size_t > fvMsComponentsList
void AddCanvasToVector(TCanvas *pointer, std::string sFolder="")
Data class with information on a STS local track.
std::vector< PsdHitData > VectHitData
std::vector< PsdHitHeader > VectHitHdr
std::vector< struct PsdPackHeader > VectPackHdr
std::vector< struct PsdHitData > VectHitData
std::vector< struct PsdHitHeader > VectHitHdr
void SetSignalBegin(int SignalBeg)
void SetExternalHarmonics(std::complex< float > z1, std::complex< float > z2)
std::vector< uint16_t > GetFitWfm()
Definition PronyFitter.h:73
float GetRSquare(int gate_beg, int gate_end)
std::complex< float > * GetHarmonics()
int ChooseBestSignalBeginHarmonics(int first_sample, int last_sample)
void SetDebugMode(bool IsDebug)
Definition PronyFitter.h:49
void SetWaveform(std::vector< uint16_t > &uWfm, uint16_t uZeroLevel)
int ChooseBestSignalBegin(int first_sample, int last_sample)
float GetIntegral(int gate_beg, int gate_end)
uint64_t ulMicroSlice
Total number of hits.