14 {
"moduleEnabled", {JSON::value_t::array, 4,
true,
false}},
15 {
"iterativeCalibCorr", {JSON::value_t::array, 4,
true,
false}},
16 {
"delayedOrder", {JSON::value_t::array, 4,
true,
false}}
24 unsigned int LGMode) :
55 for (
size_t side : {0, 1}) {
56 for (
size_t module : {0, 1, 2, 3}) {
57 std::string moduleTag=
"_s" + std::to_string(side) +
"_m" +std::to_string(module);
60 peak2ndDerivMinSamples[side][module],
61 peak2ndDerivMinThresholdsHG[side][module],
62 peak2ndDerivMinThresholdsLG[side][module]);
85 JSON DAconfig = configJSON[
"DataAnalyzer"];
86 if (DAconfig.is_null()) {
87 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"JSON configuration object for ZDCDataAnalyzer not found");
93 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"Error parsing ZDCDataAnalyzer JSON config, error = " + resultStr);
99 for (
size_t side : {0, 1}) {
100 for (
size_t module : {0, 1, 2, 3}) {
107 JSON modEnable = sideConfig[
"moduleEnabled"];
108 JSON delayedOrder = sideConfig[
"delayedOrder"];
109 if (!modEnable.is_null()) {
110 if (modEnable.size() != 4) {
111 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"Error parsing ZDCDataAnalyzer JSON config, incorrect size of moduleEnabled");
115 for (
size_t module : {0, 1, 2, 3}) {
119 if (!delayedOrder.is_null()) {
120 if (delayedOrder.size() != 4) {
121 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"Error parsing ZDCDataAnalyzer JSON config, incorrect size of delayedOrder");
125 for (
size_t module : {0, 1, 2, 3}) {
131 for (
size_t side : {0, 1}) {
132 for (
size_t module : {0, 1, 2, 3}) {
136 "Setting up ZDCPulseAnalyzer for side " + std::to_string(side) +
137 ", module " + std::to_string(module) +
139 ", delayedOrder = " +
148 JSON PAconfig = configJSON[
"PulseAnalyzer"];
149 if (PAconfig.is_null()) {
150 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"JSON configuration object for ZDCPulseAnalyzer not found");
158 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"Error parsing ZDCPulseAnalyzer JSON config, error = " + resultStr2);
164 for (
size_t side : {0, 1}) {
165 for (
size_t module : {0, 1, 2, 3}) {
167 (*m_msgFunc_p)(
ZDCMsg::Info,
"Setting up ZDCPulseAnalyzer for side " + std::to_string(side) +
168 ", module " + std::to_string(module));
175 std::ostringstream ostr;
176 ostr <<
"JSON configuration for ZDC pulse analyyzer for side " << std::to_string(side)
177 <<
", module " << std::to_string(module) <<
"\n" << moduleConfig.dump(2);
182 m_moduleAnalyzers[side][module] = std::make_unique<ZDCPulseAnalyzer>(msgFunc_p, moduleConfig);
184 (*m_msgFunc_p)(
ZDCMsg::Info,
"Finished constructing ZDCPulseAnalyzer for side " + std::to_string(side) +
185 ", module " + std::to_string(module));
194 (*m_msgFunc_p)(
ZDCMsg::Info,
"ZDCDataAnalyzer construction complete");
199 for (
size_t side : {0, 1}) {
211 for (
size_t module : {0, 1, 2, 3}) {
229 {{ {{0,0,0,0,0,0}},{{0,0,0,0,0,0}},{{0,0,0,0,0,0}} }},
230 {{ {{0,0,0,0,0,0}},{{0,0,0,0,0,0}},{{0,0,0,0,0,0}} }} }};
236 if (side < 2 && module < 4) {
253 int delayedOrder = deltaT < 0 ? -1 : 1;
254 for (
size_t side : {0, 1}) {
255 for (
size_t module : {0, 1, 2, 3}) {
257 m_moduleAnalyzers[side][module]->enableDelayed(std::abs(deltaT), undelayedDelayedPedestalDiff[side][module]);
264 for (
size_t side : {0, 1}) {
265 for (
size_t module : {0, 1, 2, 3}) {
266 if (delayDeltaTArray[side][module] < 0)
m_delayedOrder[side][module] = -1;
269 (*m_msgFunc_p)(
ZDCMsg::Verbose,
"Enabling use of delayed samples on side, module = " + std::to_string(side) +
", " +
270 std::to_string(module) +
", delta t = " + std::to_string(delayDeltaTArray[side][module]));
272 m_moduleAnalyzers[side][module]->enableDelayed(std::abs(delayDeltaTArray[side][module]), undelayedDelayedPedestalDiff[side][module]);
279 for (
size_t side : {0, 1}) {
280 for (
size_t module : {0, 1, 2, 3}) {
281 m_moduleAnalyzers[side][module]->enablePreExclusion(maxSamplesExcl, HGADCThresh[side][module], LGADCThresh[side][module]);
288 for (
size_t side : {0, 1}) {
289 for (
size_t module : {0, 1, 2, 3}) {
290 m_moduleAnalyzers[side][module]->enablePreExclusion(maxSamplesExcl, HGADCThresh, LGADCThresh);
297 for (
size_t side : {0, 1}) {
298 for (
size_t module : {0, 1, 2, 3}) {
299 m_moduleAnalyzers[side][module]->enablePostExclusion(maxSamplesExcl, HGADCThresh[side][module], LGADCThresh[side][module]);
306 for (
size_t side : {0, 1}) {
307 for (
size_t module : {0, 1, 2, 3}) {
308 m_moduleAnalyzers[side][module]->enablePostExclusion(maxSamplesExcl, HGADCThresh, LGADCThresh);
317 for (
size_t side : {0, 1}) {
318 for (
size_t module : {0, 1, 2, 3}) {
319 m_moduleAnalyzers[side][module]->enableRepass(peak2ndDerivMinRepassHG[side][module], peak2ndDerivMinRepassLG[side][module]);
326 for (
size_t side : {0, 1}) {
327 for (
size_t module : {0, 1, 2, 3}) {
335 for (
size_t side : {0, 1}) {
336 for (
size_t module : {0, 1, 2, 3}) {
344 for (
size_t side : {0, 1}) {
345 for (
size_t module : {0, 1, 2, 3}) {
353 for (
size_t side : {0, 1}) {
354 for (
size_t module : {0, 1, 2, 3}) {
355 m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorsHG[side][module], gainFactorsLG[side][module]);
361 for (
size_t side : {0, 1}) {
362 for (
size_t module : {0, 1, 2, 3}) {
370 for (
size_t side : {0, 1}) {
371 for (
size_t module : {0, 1, 2, 3}) {
383 for (
size_t side : {0, 1}) {
384 for (
size_t module : {0, 1, 2, 3}) {
385 m_moduleAnalyzers[side][module]->SetTauT0Values(fixTau1[side][module], fixTau2[side][module],
386 tau1[side][module], tau2[side][module], t0HG[side][module], t0LG[side][module]);
393 for (
size_t side : {0, 1}) {
394 for (
size_t module : {0, 1, 2, 3}) {
395 m_moduleAnalyzers[side][module]->SetNoiseSigmas(noiseSigmasHG[side][module], noiseSigmasLG[side][module]);
401 for (
size_t side : {0, 1}) {
402 for (
size_t module : {0, 1, 2, 3}) {
411 for (
size_t side : {0, 1}) {
412 for (
size_t module : {0, 1, 2, 3}) {
413 m_moduleAnalyzers[side][module]->SetFitMinMaxAmp(minAmpHG[side][module], minAmpLG[side][module],
414 maxAmpHG[side][module], maxAmpLG[side][module]);
422 for (
size_t side : {0, 1}) {
423 for (
size_t module : {0, 1, 2, 3}) {
432 for (
size_t side : {0, 1}) {
433 for (
size_t module : {0, 1, 2, 3}) {
434 m_moduleAnalyzers[side][module]->SetADCOverUnderflowValues(HGOverflowADC[side][module], HGUnderflowADC[side][module], LGOverflowADC[side][module]);
443 for (
size_t side : {0, 1}) {
444 for (
size_t module : {0, 1, 2, 3}) {
445 m_moduleAnalyzers[side][module]->SetCutValues(chisqDivAmpCutHG[side][module], chisqDivAmpCutLG[side][module],
446 deltaT0MinHG[side][module], deltaT0MaxHG[side][module],
447 deltaT0MinLG[side][module], deltaT0MaxLG[side][module]);
453 const std::array<std::array<std::vector<float>, 4>, 2>& HGParamArr,
454 const std::array<std::array<std::vector<float>, 4>, 2>& LGParamArr)
456 for (
size_t side : {0, 1}) {
457 for (
size_t module : {0, 1, 2, 3}) {
459 HGParamArr.at(side).at(module), LGParamArr.at(side).at(module));
466 const std::array<std::array<std::vector<float>, 4>, 2>& HGNonlinCorrParams,
467 const std::array<std::array<std::vector<float>, 4>, 2>& LGNonlinCorrParams)
469 for (
size_t side : {0, 1}) {
470 for (
size_t module : {0, 1, 2, 3}) {
472 HGNonlinCorrParams[side][module],
473 LGNonlinCorrParams[side][module]);
480 for (
size_t side: {0,1})
482 for (
size_t module: {0,1,2})
484 for (
size_t val: {0,1,2,3,4,5})
494 std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& corrHistHG,
495 std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& corrHistLG)
497 if (correctPerSample)
498 (*m_msgFunc_p)(
ZDCMsg::Info,
"ZDCDataAnalyzer::enabling FADC Corrections per sample");
502 for (
size_t side : {0, 1}) {
503 for (
size_t module : {0, 1, 2, 3}) {
504 m_moduleAnalyzers[side][module]->enableFADCCorrections(correctPerSample, corrHistHG[side][module], corrHistLG[side][module]);
511 for (
size_t side : {0, 1}) {
512 for (
size_t module : {0, 1, 2, 3}) {
519 const std::array<std::array<std::vector<double>, 4>, 2>& parsHGArr,
520 const std::array<std::array<std::vector<double>, 4>, 2>& parsLGArr)
522 for (
size_t side : {0, 1}) {
523 for (
size_t module : {0, 1, 2, 3}) {
524 m_moduleAnalyzers[side][module]->enableTimeSigCut(AND, sigCut, TF1String, parsHGArr[side][module], parsLGArr[side][module]);
547 (*m_msgFunc_p)(
ZDCMsg::Verbose, (
"Starting new luminosity block " + std::to_string(lumiBlock)));
551 std::to_string(lumiBlock)));
553 for (
size_t side : {0, 1}) {
554 for (
size_t module : {0, 1, 2, 3}) {
558 if (lumiBlock >= splineLBMin && lumiBlock <= splineLBMax) {
561 else if (lumiBlock < splineLBMin) {
572 (*m_msgFunc_p)(
ZDCMsg::Verbose, (
"Loading timing calibrations for event " + std::to_string(
m_eventCount) +
", lumi block " + std::to_string(lumiBlock)));
574 for (
size_t side : {0, 1}) {
575 for (
size_t module : {0, 1, 2, 3}) {
579 if (lumiBlock >= splineLBMin && lumiBlock <= splineLBMax) {
583 else if (lumiBlock < splineLBMin) {
598 for (
size_t side : {0, 1}) {
599 for (
size_t module : {0, 1, 2, 3}) {
634 (*m_msgFunc_p)(
ZDCMsg::Verbose, (
"Skipping analysis of disabled module for event index " + std::to_string(
m_eventCount) +
", side, module = " + std::to_string(side) +
", " + std::to_string(module)));
639 (*m_msgFunc_p)(
ZDCMsg::Verbose, (
"/n Loading data for event index " + std::to_string(
m_eventCount) +
", side, module = " + std::to_string(side) +
", " + std::to_string(module)));
642 pulseAna_p->LoadAndAnalyzeData(HGSamples, LGSamples);
645 if (pulseAna_p->failed()) {
646 (*m_msgFunc_p)(
ZDCMsg::Debug, (
"ZDCPulseAnalyzer::LoadData() returned fail for event " + std::to_string(
m_eventCount) +
", side, module = " + std::to_string(side) +
", " + std::to_string(module)));
655 const std::vector<float>& HGSamplesDelayed,
const std::vector<float>& LGSamplesDelayed)
660 (*m_msgFunc_p)(
ZDCMsg::Debug, (
"Skipping analysis of disabled mofule for event index " + std::to_string(
m_eventCount) +
", side, module = " + std::to_string(side) +
", " + std::to_string(module)));
666 (*m_msgFunc_p)(
ZDCMsg::Error, (
"Handling of delayed pulses not enabled, on side, module = " + std::to_string(side) +
", " + std::to_string(module) +
", skipping processing for event index " + std::to_string(
m_eventCount)));
670 (*m_msgFunc_p)(
ZDCMsg::Verbose, (
"Loading undelayed and delayed data for event index " + std::to_string(
m_eventCount) +
", side, module = " + std::to_string(side) +
", " + std::to_string(module)));
674 pulseAna_p->LoadAndAnalyzeData(HGSamples, LGSamples, HGSamplesDelayed, LGSamplesDelayed);
677 pulseAna_p->LoadAndAnalyzeData(HGSamplesDelayed, LGSamplesDelayed, HGSamples, LGSamples);
681 if (pulseAna_p->failed()) {
682 (*m_msgFunc_p)(
ZDCMsg::Debug, (
"ZDCPulseAnalyzer::LoadData() returned fail for event " + std::to_string(
m_eventCount) +
", side, module = " + std::to_string(side) +
", " + std::to_string(module)));
694 unsigned int sideNPulsesMod[2] = {0, 0};
696 for (
size_t side : {0, 1}) {
697 for (
size_t module : {0, 1, 2, 3}) {
707 for (
size_t side : {0, 1}) {
708 if (sideNPulsesMod[side] == 0)
continue;
710 for (
size_t module : {0, 1, 2, 3}) {
718 (*m_msgFunc_p)(
ZDCMsg::Debug, (
"ZDCPulseAnalyzer:: performing a repass on data for side, module = " + std::to_string(side) +
", " + std::to_string(module)));
728 for (
size_t side : {0, 1}) {
729 float tempFraction = 1.0;
730 double sumAmpTimesBkgdFrac = 0.0;
731 double sumCalibAmpTimesBkgdFrac = 0.0;
733 for (
size_t module : {0, 1, 2, 3}) {
737 int moduleMaskBit = 4 * side + module;
748 float timeCalib = pulseAna_p->
GetT0Corr();
756 sumAmpTimesBkgdFrac += amplitude*bkgdFraction;
764 sumCalibAmpTimesBkgdFrac += amplitude*bkgdFraction;
786 if (tempFraction < 1.0) {
m_moduleSum[side] /= tempFraction;}
799 for (
int iside:{0,1})
807 float EMCorrFact = 0;
814 float Had1CorrFact = 0;
820 float Had2CorrFact = 0;
826 std::ostringstream ostr;
827 ostr <<
"ZDCDataAnalyzer: " <<
m_calibModuleSum[iside] <<
" " << EMCorrFact <<
" " << Had1CorrFact <<
" " << Had2CorrFact << std::endl;
831 float ECorrEMHad1 = ECorrEM/Had1CorrFact;
832 float ECorrEMHad1Had2 = ECorrEMHad1/Had2CorrFact;
std::unique_ptr< ZDCJSONConfig > m_dataAnalyzerConfig
void enablePreExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray &HGADCThresh, const ZDCModuleIntArray &LGADCThresh)
void SetNoiseSigmas(const ZDCModuleFloatArray &noiseSigmasHG, const ZDCModuleFloatArray &noiseSigmasLG)
void SetCutValues(const ZDCModuleFloatArray &chisqDivAmpCutHG, const ZDCModuleFloatArray &chisqDivAmpCutLG, const ZDCModuleFloatArray &deltaT0MinHG, const ZDCModuleFloatArray &deltaT0MaxHG, const ZDCModuleFloatArray &deltaT0MinLG, const ZDCModuleFloatArray &deltaT0MaxLG)
void enablePostExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray &HGADCThresh, const ZDCModuleIntArray &LGADCThresh)
void SetFitTimeMax(float tmax)
ZDCMsg::MessageFunctionPtr m_msgFunc_p
std::array< std::array< std::unique_ptr< ZDCPulseAnalyzer >, 4 >, 2 > m_moduleAnalyzers
void enableFADCCorrections(bool correctPerSample, std::array< std::array< std::unique_ptr< const TH1 >, 4 >, 2 > &correHistHG, std::array< std::array< std::unique_ptr< const TH1 >, 4 >, 2 > &correHistLG)
std::array< float, 2 > m_NLcalibModSumBkgdFrac
std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > m_T0LGOffsetSplines
std::array< std::array< bool, 4 >, 2 > ZDCModuleBoolArray
void LoadAndAnalyzeData(size_t side, size_t module, const std::vector< float > &HGSamples, const std::vector< float > &LGSamples)
ZDCModuleFloatArray m_pedestals
std::array< std::array< float, 4 >, 2 > m_calibAmplitude
std::array< float, 2 > m_moduleSumPreSample
ZDCModuleBoolArray m_moduleEnabled
std::array< std::array< float, 4 >, 2 > ZDCModuleFloatArray
std::array< float, 2 > m_calibModSumBkgdFrac
ZDCDataAnalyzer(ZDCMsg::MessageFunctionPtr messageFunc_p, int nSample, float deltaTSample, size_t preSampleIdx, std::string fitFunction, const ZDCModuleIntArray &peak2ndDerivMinSamples, const ZDCModuleFloatArray &peak2ndDerivMinThresholdsHG, const ZDCModuleFloatArray &peak2ndDerivMinThresholdsLG, unsigned int LGMode=ZDCPulseAnalyzer::LGModeNormal)
ZDCModuleFloatArray m_currentECalibCoeff
bool disableModule(size_t side, size_t module)
std::unique_ptr< ZDCJSONConfig > m_pulseAnalyzerConfig
void SetTauT0Values(const ZDCModuleBoolArray &fxiTau1, const ZDCModuleBoolArray &fxiTau2, const ZDCModuleFloatArray &tau1, const ZDCModuleFloatArray &tau2, const ZDCModuleFloatArray &t0HG, const ZDCModuleFloatArray &t0LG)
std::array< float, 2 > m_averageTime
void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG)
std::array< std::array< int, 4 >, 2 > ZDCModuleIntArray
void SetModuleAmpFractionLG(const ZDCDataAnalyzer::ZDCModuleFloatArray &moduleAmpFractionLG)
void setMinimumSignificance(float sigMinHG, float sigMinLG)
std::array< std::array< bool, 4 >, 2 > m_dataLoaded
void enableRepass(const ZDCModuleFloatArray &peak2ndDerivMinRepassHG, const ZDCModuleFloatArray &peak2ndDerivMinRepassLG)
unsigned int m_moduleMask
std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > m_LBDepEcalibSplines
std::array< bool, 2 > m_fail
void enableTimeSigCut(bool AND, float sigCut, const std::string &TF1String, const std::array< std::array< std::vector< double >, 4 >, 2 > &parsHGArr, const std::array< std::array< std::vector< double >, 4 >, 2 > &parsLGArr)
std::array< std::array< std::array< float, 6 >, 3 >, 2 > m_NLcalibFactors
std::array< std::array< float, 4 >, 2 > m_calibTime
void SetPeak2ndDerivMinTolerances(size_t tolerance)
std::array< std::array< float, 4 >, 2 > m_moduleAmpFractionLG
std::array< float, 2 > m_moduleSumErrSq
std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > m_T0HGOffsetSplines
ZDCModuleFloatArray m_HGGains
std::array< float, 2 > m_moduleSum
std::array< float, 2 > m_NLcalibModuleSum
std::array< float, 2 > m_calibModuleSumErrSq
std::array< float, 2 > m_calibModuleSum
void DoNLcalibModuleSum()
std::array< std::array< int, 4 >, 2 > m_delayedOrder
void SetNLcalibParams(std::array< std::array< std::array< float, 6 >, 3 >, 2 > &nlcalibParams)
void SetADCOverUnderflowValues(const ZDCModuleFloatArray &HGOverflowADC, const ZDCModuleFloatArray &HGUnderflowADC, const ZDCModuleFloatArray &LGOverflowADC)
void enableDelayed(float deltaT, const ZDCModuleFloatArray &undelayedDelayedPedestalDiff)
void set2ndDerivStep(size_t step)
std::array< float, 2 > m_moduleSumBkgdFrac
void disableFADCCorrections()
bool getPulseAnalyzerGlobalPar(const std::string &key, T &value)
std::array< float, 2 > m_NLcalibModuleSumErrSq
ZDCModuleFloatArray m_currentT0OffsetsHG
void StartEvent(int lumiBlock)
static const ZDCJSONConfig::JSONParamList JSONConfigParams
void SetFitMinMaxAmpValues(const ZDCModuleFloatArray &minAmpHG, const ZDCModuleFloatArray &minAmpLG, const ZDCModuleFloatArray &maxAmpHG, const ZDCModuleFloatArray &maxAmpLG)
void SetTimingCorrParams(ZDCPulseAnalyzer::TimingCorrMode mode, float refADC, float refScale, const std::array< std::array< std::vector< float >, 4 >, 2 > &HGParamArr, const std::array< std::array< std::vector< float >, 4 >, 2 > &LGParamArr)
void SetNonlinCorrParams(float refADC, float refScale, const std::array< std::array< std::vector< float >, 4 >, 2 > &HGNonlinCorrParams, const std::array< std::array< std::vector< float >, 4 >, 2 > &LHGNonlinCorrParams)
ZDCModuleFloatArray m_currentT0OffsetsLG
std::array< std::array< unsigned int, 4 >, 2 > m_moduleStatus
std::map< std::string, JSONParamDescr > JSONParamList
float GetAmpError() const
float GetAmplitude() const
bool armSumInclude() const
unsigned int GetStatusMask() const
float GetPreSampleAmp() const
static const ZDCJSONConfig::JSONParamList JSONConfigParams
float GetBkgdMaxFraction() const
std::shared_ptr< MessageFunction > MessageFunctionPtr
Tell the compiler to optimize assuming that FP may trap.
#define CXXUTILS_TRAPPING_FP