9#include "MicrosliceDescriptor.hpp"
11#include <FairRunOnline.h>
14#include <RtypesCore.h>
20#include <THttpServer.h>
22#include <TPaveStats.h>
65 TFile* oldFile = gFile;
66 TDirectory* oldDir = gDirectory;
78 std::vector<std::pair<TNamed*, std::string>> vHistos =
GetHistoVector();
81 std::vector<std::pair<TCanvas*, std::string>> vCanvases =
GetCanvasVector();
84 std::string sSystem =
"tof";
91 THttpServer* server = FairRunOnline::Instance()->GetHttpServer();
92 if (
nullptr != server) {
93 for (UInt_t uCanvas = 0; uCanvas < vCanvases.size(); ++uCanvas) {
94 server->Register(Form(
"/%s/%s", sSystem.data(), vCanvases[uCanvas].second.data()), vCanvases[uCanvas].first);
96 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
97 server->Register(Form(
"/%s/%s", sSystem.data(), vHistos[uHisto].second.data()), vHistos[uHisto].first);
112 std::string sSystem =
"tof";
134 if (uChanA < uChanB) {
136 new TH1I(Form(
"hTimeDiffPulser_g%02u_gbt%1u_f%1u_ch%02u_ch%02u",
fuCompA,
fuGbtxA,
fuFeeA, uChanA, uChanB),
137 Form(
"Time difference for pulser on gDPB %02u GBTx %02u FEE "
138 "%1u channels %02u and %02u; DeltaT [ps]; Counts",
143 new TH1I(Form(
"hTimeDiffPulser_g%02u_gbt%1u_f%1u_ch%02u_ch%02u",
fuCompB,
fuGbtxB,
fuFeeB, uChanA, uChanB),
144 Form(
"Time difference for pulser on gDPB %02u GBTx %02u FEE "
145 "%1u channels %02u and %02u; DeltaT [ps]; Counts",
155 new TH1I(Form(
"hTimeDiffPulser_g%02u_gbt%1u_f%1u_ch%02u_g%02u_gbt%1u_f%1u_ch%02u",
fuCompA,
fuGbtxA,
fuFeeA,
157 Form(
"Time difference for pulser on gDPB %02u GBTx %02u FEE %1u "
158 "channel %02u and gDPB %02u GBTx %02u FEE %1u channel %02u; "
159 "DeltaT [ps]; Counts",
167 "Time difference Mean for each channel pairs "
168 "in FEE A; Chan A; Chan B ; Mean [ps]",
172 "Time difference RMS for each channel pairs "
173 "in FEE A; Chan A; Chan B; RMS [ps]",
177 "Time difference RMS after zoom for each channel pairs in FEE A; "
178 "Chan A; Chan B; RMS [ps]",
182 "Time difference Res from fit for each channel pairs in FEE A; "
183 "Chan A; Chan B; Sigma [ps]",
189 "Time difference Mean for each channel pairs "
190 "in FEE B; Chan A; Chan B ; Mean [ps]",
194 "Time difference RMS for each channel pairs "
195 "in FEE B; Chan A; Chan B; RMS [ps]",
199 "Time difference RMS after zoom for each channel pairs in FEE B; "
200 "Chan A; Chan B; RMS [ps]",
204 "Time difference Res from fit for each channel pairs in FEE B; "
205 "Chan A; Chan B; Sigma [ps]",
211 "Time difference Mean for each channel pairs in FEE A & B; Chan "
212 "FEE A; Chan FEE B ; Mean [ps]",
216 "Time difference RMS for each channel pairs in FEE A & B; Chan "
217 "FEE A; Chan FEE B; RMS [ps]",
221 "Time difference RMS after zoom for each channel pairs in FEE A & "
222 "B; Chan FEE A; Chan FEE B; RMS [ps]",
226 "Time difference Res from fit for each channel pairs in FEE A & "
227 "B; Chan FEE A; Chan FEE B; Sigma [ps]",
232 fhChanTotFeeA =
new TH2D(
"hChanTotFeeA",
"TOT distribution per channel in FEE A; Chan FEE A; TOT [bin]; Counts []",
235 fhChanTotFeeB =
new TH2D(
"hChanTotFeeB",
"TOT distribution per channel in FEE B; Chan FEE B; TOT [bin]; Counts []",
241 uint32_t iNbBinsLog = 0;
244 double* dBinsLog = dBinsLogVector.data();
247 "Pulses time interval per channel in FEE A; Time interval [ns]; "
248 "Chan FEE A; Counts []",
251 "Pulses time interval per channel in FEE B; Time interval [ns]; "
252 "Chan FEE B; Counts []",
255 for (UInt_t uComp = 0; uComp <
fuNbOfComps; ++uComp) {
257 new TH2D(Form(
"hPulserCountEvoPerFeeComp%02u", uComp),
258 Form(
"Pulser count per FEE in gDPB %02u; time in run [s]; FEE []", uComp),
277 std::string sFolder =
"TofDt";
293 sFolder =
"TofPulse";
300 for (UInt_t uComp = 0; uComp <
fuNbOfComps; ++uComp) {
309 std::string sFolder =
"canvases";
312 fcPulserFeeA =
new TCanvas(
"cPulserFeeA",
"Time difference RMS for channels on FEE A");
339 fcPulserFeeB =
new TCanvas(
"cPulserFeeB",
"Time difference RMS for channels on FEE A");
366 fcPulserFeeFee =
new TCanvas(
"cPulserFeeFee",
"Time difference RMS for channels on FEE A VS FEE B");
393 fcPulseProp =
new TCanvas(
"cPulseProp",
"Pulse properties for each channel on FEE A and FEE B");
446 const uint32_t& uGet4Id,
const uint32_t& ,
447 const uint32_t& uRemapCh,
const uint32_t& uTot,
448 const double_t& dHitTime,
const uint32_t& ,
477 uRemappedChannelNrInFee);
482 uRemappedChannelNrInFee);
497 Bool_t bChanOkFeeA = kFALSE;
498 Bool_t bChanOkFeeB = kFALSE;
551 LOG(info) <<
"CbmTofUnpackMonitorTestFee::FinalizeTsHistos => Update pulser statistics ";
600 phTimeRmsZoom->Reset();
601 phTimeResFit->Reset();
608 if (NULL != phTimeDiff[uChanA][uChanB]) {
610 if (0 == phTimeDiff[uChanA][uChanB]->GetEntries()) {
611 phTimeRmsZoom->Fill(uChanA, uChanB, 0.0);
612 phTimeResFit->Fill(uChanA, uChanB, 0.0);
613 LOG(debug) <<
"CbmTofUnpackMonitorTestFee::UpdateZoomedFit => Empty input "
614 <<
"for Chan pair " << uChanA <<
" and " << uChanB <<
" !!! ";
619 Int_t iBinWithMax = phTimeDiff[uChanA][uChanB]->GetMaximumBin();
620 Double_t dNbCounts = phTimeDiff[uChanA][uChanB]->Integral();
623 Double_t dPeakPos = phTimeDiff[uChanA][uChanB]->GetXaxis()->GetBinCenter(iBinWithMax);
624 phTimeDiff[uChanA][uChanB]->GetXaxis()->SetRangeUser(dPeakPos -
fdFitZoomWidthPs,
628 Double_t dZoomCounts = phTimeDiff[uChanA][uChanB]->Integral();
629 if ((dZoomCounts / dNbCounts) < 0.99) {
630 phTimeRmsZoom->Fill(uChanA, uChanB, 0.0);
631 phTimeResFit->Fill(uChanA, uChanB, 0.0);
632 LOG(warning) <<
"CbmTofUnpackMonitorTestFee::UpdateZoomedFit => Zoom too strong, "
633 <<
"more than 1% loss for Chan pair " << uChanA <<
" and " << uChanB <<
" !!! ";
638 phTimeRmsZoom->Fill(uChanA, uChanB, phTimeDiff[uChanA][uChanB]->GetRMS());
643 fitFuncPairs[uChanA][uChanB] =
new TF1(Form(
"fPair_%02d_%02d", uChanA, uChanB),
"gaus",
646 fitFuncPairs[uChanA][uChanB]->SetParameter(0, dZoomCounts);
647 fitFuncPairs[uChanA][uChanB]->SetParameter(1, dPeakPos);
648 fitFuncPairs[uChanA][uChanB]->SetParameter(2, 200.0);
650 phTimeDiff[uChanA][uChanB]->Fit(Form(
"fPair_%02d_%02d", uChanA, uChanB),
"QRM0");
652 dRes = fitFuncPairs[uChanA][uChanB]->GetParameter(2);
654 delete fitFuncPairs[uChanA][uChanB];
656 phTimeResFit->Fill(uChanA, uChanB, dRes / TMath::Sqrt2());
659 LOG(debug) <<
"CbmTofUnpackMonitorTestFee::UpdateZoomedFit => "
660 <<
"For chan pair " << uChanA <<
" and " << uChanB
661 <<
" we have zoomed RMS = " << phTimeDiff[uChanA][uChanB]->GetRMS() <<
" and a resolution of "
662 << dRes / TMath::Sqrt2();
665 phTimeDiff[uChanA][uChanB]->GetXaxis()->UnZoom();
669 LOG(error) <<
"CbmTofUnpackMonitorTestFee::UpdateZoomedFit => Zoom width not defined, "
670 <<
"please use SetFitZoomWidthPs, e.g. in macro, before trying this "
679 LOG(fatal) <<
"SetBmonMode mode not available in CbmTofUnpackMonitorTestFee (forced off)";
684 LOG(fatal) <<
"SetBmonMicroSpillMode mode not available in CbmTofUnpackMonitorTestFee (forced off)";
689 LOG(fatal) <<
"SetBmonScvdMode mode not available in CbmTofUnpackMonitorTestFee (forced off)";
694 LOG(fatal) <<
"SetBmonQFactorMode mode not available in CbmTofUnpackMonitorTestFee (forced off)";
699 LOG(fatal) <<
"SetTofQFactorMode mode not available in CbmTofUnpackMonitorTestFee (forced off)";
ClassImp(CbmConverterManager)
static double dTsStartTime
TH2 * fhTimeMeanPulserFeeFee
[ Ch FEE A ][ Ch FEE B ]
TH2 * fhTimeRmsZoomFitPulsFeeA
const double_t kdMaxDtPulserPs
TH2 * fhTimeMeanPulserFeeB
[ Ch A ][ Ch B ]
void SetBmonMode(bool value)
TH2 * fhChanPulseIntervalFeeB
TH2 * fhTimeRmsPulserFeeFee
virtual Bool_t Init(CbmMcbm2018TofPar *digiParSet)
Init all required parameter informations and histograms.
std::vector< std::vector< UInt_t > > fvuFeeChanNbHitsLastMs
Buffer for pulser channels.
void SetBmonMicroSpillMode(bool value)
CbmTofUnpackMonitorTestFee()
TH2 * fhTimeRmsPulserFeeA
virtual ~CbmTofUnpackMonitorTestFee()
std::vector< std::vector< TH1 * > > fvhTimeDiffPulserFeeB
TH2 * fhChanPulseIntervalFeeA
void SetBmonScvdMode(bool value)
std::vector< TH2 * > fvhPulserCountEvoPerFeeComp
void SetBmonQFactorMode(bool value)
virtual void Finish()
Write all histograms and canvases to file.
void SetTofQFactorMode(bool value)
uint32_t fuNbOfFeePerComp
FIXME: recheck if OK and if not conflicting with fuNbOfFeePerComp!
uint32_t fuNbOfGet4PerFee
Max number of FEE per component.
virtual Bool_t CreateHistograms()
TH2 * fhTimeMeanPulserFeeA
[ Ch A ][ Ch B ]
void UpdateZoomedFit(std::vector< std::vector< TH1 * > > phTimeDiff, TH2 *phTimeRmsZoom, TH2 *phTimeResFit)
double_t fdFitZoomWidthPs
Settings and tracers.
TH2 * fhTimeResFitPulsFeeFee
virtual void FinalizeMsHistos()
Finalize pulser histograms.
virtual void FinalizeTsHistos(double_t dTsStartTime)
Finalize pulser histograms.
virtual Bool_t ResetHistograms()
virtual void FillHitMonitoringHistos(const double_t &dMsTime, const uint32_t &uCurrCompIdx, const uint32_t &uGet4Id, const uint32_t &uRawCh, const uint32_t &uRemapCh, const uint32_t &uTot, const double_t &dHitTime, const uint32_t &uFts, bool bDiamond=false)
Fill pulser histograms.
virtual void DrawCanvases()
TH2 * fhTimeRmsZoomFitPulsFeeFee
TH2 * fhTimeRmsPulserFeeB
uint32_t fuCompA
Number of channels in each FEE.
TCanvas * fcPulserFeeA
Canvases.
uint32_t fuNbOfChannelsPerFee
Max number of Get4 per FEE (has to match nb FEE and GET4 per comp)
const uint32_t kuNbBinsDt
std::vector< std::vector< TH1 * > > fvhTimeDiffPulserFeeA
[ fuFeeNr ][ ChanNr ]
uint32_t fuNbFeePlotsPerComp
TH2 * fhTimeResFitPulsFeeA
TH2 * fhTimeResFitPulsFeeB
double_t fdLastRmsUpdateTime
TH2 * fhTimeRmsZoomFitPulsFeeB
std::vector< std::vector< TH1 * > > fvhTimeDiffPulserFeeFee
std::vector< std::vector< Double_t > > fvdFeeChanMsLastPulserHit
[ fuFeeNr ][ ChanNr ]
void SetBmonMicroSpillMode(bool value)
Activate the BMon mode.
CbmMcbm2018TofPar * fUnpackPar
Settings from parameter file.
void AddHistoToVector(TNamed *pointer, std::string sFolder="")
std::vector< std::pair< TCanvas *, std::string > > GetCanvasVector()
UInt_t fuHistoryHistoSize
void AddCanvasToVector(TCanvas *pointer, std::string sFolder="")
void SetBmonMode(bool value)
Activate the BMon mode.
std::vector< std::pair< TNamed *, std::string > > GetHistoVector()
Double_t fdStartTime
Total/maximum number of Get4 in system.
void SetBmonQFactorMode(bool value)
Activate the Bmon QFactor mode.
UInt_t fuNbOfComps
Readout chain dimensions and mapping.
UInt_t fuNbOfGet4PerComp
Total number of Components in the system.
bool fBmonMode
Flag if debug mode is active or not.
UInt_t fuMinTotPulser
---> User settings: Data correction parameters
UInt_t fuNbOfChannelsPerComp
Number of channels per Get4, constant.
void SetBmonScvdMode(bool value)
Activate the BMon sCVD mode.
void SetTofQFactorMode(bool value)
Activate the Tof QFactor mode.
UInt_t fuNbOfChannelsPerGet4
Max number of Get4 per component.
void Finish()
Write all histograms and canvases to file.
UInt_t fuNbOfGet4InSyst
Number of channels per Component, recalculated.
const uint32_t kuTotCounterSize