14 {
"moduleEnabled", {JSON::value_t::array, 4,
true,
false}},
15 {
"iterativeCalibCorr", {JSON::value_t::array, 4,
true,
false}}
23 unsigned int LGMode) :
54 for (
size_t side : {0, 1}) {
55 for (
size_t module : {0, 1, 2, 3}) {
56 std::string moduleTag=
"_s" + std::to_string(side) +
"_m" +std::to_string(module);
59 peak2ndDerivMinSamples[side][module],
60 peak2ndDerivMinThresholdsHG[side][module],
61 peak2ndDerivMinThresholdsLG[side][module]);
84 JSON DAconfig = configJSON[
"DataAnalyzer"];
85 if (DAconfig.is_null()) {
86 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"JSON configuration object for ZDCDataAnalyzer not found");
92 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"Error parsing ZDCDataAnalyzer JSON config, error = " + resultStr);
98 for (
size_t side : {0, 1}) {
99 for (
size_t module : {0, 1, 2, 3}) {
106 JSON modEnable = sideConfig[
"moduleEnabled"];
107 if (!modEnable.is_null()) {
108 if (modEnable.size() != 4) {
109 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"Error parsing ZDCDataAnalyzer JSON config, incorrect size of moduleEnabled");
113 for (
size_t module : {0, 1, 2, 3}) {
121 JSON PAconfig = configJSON[
"PulseAnalyzer"];
122 if (PAconfig.is_null()) {
123 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"JSON configuration object for ZDCPulseAnalyzer not found");
131 (*m_msgFunc_p)(
ZDCMsg::Fatal,
"Error parsing ZDCPulseAnalyzer JSON config, error = " + resultStr2);
137 for (
size_t side : {0, 1}) {
138 for (
size_t module : {0, 1, 2, 3}) {
140 (*m_msgFunc_p)(
ZDCMsg::Info,
"Setting up ZDCPulseAnalyzer for side " + std::to_string(side) +
141 ", module " + std::to_string(module));
148 std::ostringstream ostr;
149 ostr <<
"JSON configuration for ZDC pulse analyyzer for side " << std::to_string(side)
150 <<
", module " << std::to_string(module) <<
"\n" << moduleConfig.dump(2);
155 m_moduleAnalyzers[side][module] = std::make_unique<ZDCPulseAnalyzer>(msgFunc_p, moduleConfig);
157 (*m_msgFunc_p)(
ZDCMsg::Info,
"Finished constructing ZDCPulseAnalyzer for side " + std::to_string(side) +
158 ", module " + std::to_string(module));
167 (*m_msgFunc_p)(
ZDCMsg::Info,
"ZDCDataAnalyzer construction complete");
172 for (
size_t side : {0, 1}) {
184 for (
size_t module : {0, 1, 2, 3}) {
202 {{ {{0,0,0,0,0,0}},{{0,0,0,0,0,0}},{{0,0,0,0,0,0}} }},
203 {{ {{0,0,0,0,0,0}},{{0,0,0,0,0,0}},{{0,0,0,0,0,0}} }} }};
209 if (side < 2 && module < 4) {
226 int delayedOrder = deltaT < 0 ? -1 : 1;
227 for (
size_t side : {0, 1}) {
228 for (
size_t module : {0, 1, 2, 3}) {
230 m_moduleAnalyzers[side][module]->enableDelayed(std::abs(deltaT), undelayedDelayedPedestalDiff[side][module]);
237 for (
size_t side : {0, 1}) {
238 for (
size_t module : {0, 1, 2, 3}) {
239 if (delayDeltaTArray[side][module] < 0)
m_delayedOrder[side][module] = -1;
242 (*m_msgFunc_p)(
ZDCMsg::Verbose,
"Enabling use of delayed samples on side, module = " + std::to_string(side) +
", " +
243 std::to_string(module) +
", delta t = " + std::to_string(delayDeltaTArray[side][module]));
245 m_moduleAnalyzers[side][module]->enableDelayed(std::abs(delayDeltaTArray[side][module]), undelayedDelayedPedestalDiff[side][module]);
252 for (
size_t side : {0, 1}) {
253 for (
size_t module : {0, 1, 2, 3}) {
254 m_moduleAnalyzers[side][module]->enablePreExclusion(maxSamplesExcl, HGADCThresh[side][module], LGADCThresh[side][module]);
261 for (
size_t side : {0, 1}) {
262 for (
size_t module : {0, 1, 2, 3}) {
263 m_moduleAnalyzers[side][module]->enablePreExclusion(maxSamplesExcl, HGADCThresh, LGADCThresh);
270 for (
size_t side : {0, 1}) {
271 for (
size_t module : {0, 1, 2, 3}) {
272 m_moduleAnalyzers[side][module]->enablePostExclusion(maxSamplesExcl, HGADCThresh[side][module], LGADCThresh[side][module]);
279 for (
size_t side : {0, 1}) {
280 for (
size_t module : {0, 1, 2, 3}) {
281 m_moduleAnalyzers[side][module]->enablePostExclusion(maxSamplesExcl, HGADCThresh, LGADCThresh);
290 for (
size_t side : {0, 1}) {
291 for (
size_t module : {0, 1, 2, 3}) {
292 m_moduleAnalyzers[side][module]->enableRepass(peak2ndDerivMinRepassHG[side][module], peak2ndDerivMinRepassLG[side][module]);
299 for (
size_t side : {0, 1}) {
300 for (
size_t module : {0, 1, 2, 3}) {
308 for (
size_t side : {0, 1}) {
309 for (
size_t module : {0, 1, 2, 3}) {
317 for (
size_t side : {0, 1}) {
318 for (
size_t module : {0, 1, 2, 3}) {
326 for (
size_t side : {0, 1}) {
327 for (
size_t module : {0, 1, 2, 3}) {
328 m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorsHG[side][module], gainFactorsLG[side][module]);
334 for (
size_t side : {0, 1}) {
335 for (
size_t module : {0, 1, 2, 3}) {
343 for (
size_t side : {0, 1}) {
344 for (
size_t module : {0, 1, 2, 3}) {
356 for (
size_t side : {0, 1}) {
357 for (
size_t module : {0, 1, 2, 3}) {
358 m_moduleAnalyzers[side][module]->SetTauT0Values(fixTau1[side][module], fixTau2[side][module],
359 tau1[side][module], tau2[side][module], t0HG[side][module], t0LG[side][module]);
366 for (
size_t side : {0, 1}) {
367 for (
size_t module : {0, 1, 2, 3}) {
368 m_moduleAnalyzers[side][module]->SetNoiseSigmas(noiseSigmasHG[side][module], noiseSigmasLG[side][module]);
374 for (
size_t side : {0, 1}) {
375 for (
size_t module : {0, 1, 2, 3}) {
384 for (
size_t side : {0, 1}) {
385 for (
size_t module : {0, 1, 2, 3}) {
386 m_moduleAnalyzers[side][module]->SetFitMinMaxAmp(minAmpHG[side][module], minAmpLG[side][module],
387 maxAmpHG[side][module], maxAmpLG[side][module]);
395 for (
size_t side : {0, 1}) {
396 for (
size_t module : {0, 1, 2, 3}) {
405 for (
size_t side : {0, 1}) {
406 for (
size_t module : {0, 1, 2, 3}) {
407 m_moduleAnalyzers[side][module]->SetADCOverUnderflowValues(HGOverflowADC[side][module], HGUnderflowADC[side][module], LGOverflowADC[side][module]);
416 for (
size_t side : {0, 1}) {
417 for (
size_t module : {0, 1, 2, 3}) {
418 m_moduleAnalyzers[side][module]->SetCutValues(chisqDivAmpCutHG[side][module], chisqDivAmpCutLG[side][module],
419 deltaT0MinHG[side][module], deltaT0MaxHG[side][module],
420 deltaT0MinLG[side][module], deltaT0MaxLG[side][module]);
426 const std::array<std::array<std::vector<float>, 4>, 2>& HGParamArr,
427 const std::array<std::array<std::vector<float>, 4>, 2>& LGParamArr)
429 for (
size_t side : {0, 1}) {
430 for (
size_t module : {0, 1, 2, 3}) {
432 HGParamArr.at(side).at(module), LGParamArr.at(side).at(module));
439 const std::array<std::array<std::vector<float>, 4>, 2>& HGNonlinCorrParams,
440 const std::array<std::array<std::vector<float>, 4>, 2>& LGNonlinCorrParams)
442 for (
size_t side : {0, 1}) {
443 for (
size_t module : {0, 1, 2, 3}) {
445 HGNonlinCorrParams[side][module],
446 LGNonlinCorrParams[side][module]);
453 for (
size_t side: {0,1})
455 for (
size_t module: {0,1,2})
457 for (
size_t val: {0,1,2,3,4,5})
467 std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& corrHistHG,
468 std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& corrHistLG)
470 if (correctPerSample)
471 (*m_msgFunc_p)(
ZDCMsg::Info,
"ZDCDataAnalyzer::enabling FADC Corrections per sample");
475 for (
size_t side : {0, 1}) {
476 for (
size_t module : {0, 1, 2, 3}) {
477 m_moduleAnalyzers[side][module]->enableFADCCorrections(correctPerSample, corrHistHG[side][module], corrHistLG[side][module]);
484 for (
size_t side : {0, 1}) {
485 for (
size_t module : {0, 1, 2, 3}) {
492 const std::array<std::array<std::vector<double>, 4>, 2>& parsHGArr,
493 const std::array<std::array<std::vector<double>, 4>, 2>& parsLGArr)
495 for (
size_t side : {0, 1}) {
496 for (
size_t module : {0, 1, 2, 3}) {
497 m_moduleAnalyzers[side][module]->enableTimeSigCut(AND, sigCut, TF1String, parsHGArr[side][module], parsLGArr[side][module]);
520 (*m_msgFunc_p)(
ZDCMsg::Verbose, (
"Starting new luminosity block " + std::to_string(lumiBlock)));
524 std::to_string(lumiBlock)));
526 for (
size_t side : {0, 1}) {
527 for (
size_t module : {0, 1, 2, 3}) {
531 if (lumiBlock >= splineLBMin && lumiBlock <= splineLBMax) {
534 else if (lumiBlock < splineLBMin) {
545 (*m_msgFunc_p)(
ZDCMsg::Verbose, (
"Loading timing calibrations for event " + std::to_string(
m_eventCount) +
", lumi block " + std::to_string(lumiBlock)));
547 for (
size_t side : {0, 1}) {
548 for (
size_t module : {0, 1, 2, 3}) {
552 if (lumiBlock >= splineLBMin && lumiBlock <= splineLBMax) {
556 else if (lumiBlock < splineLBMin) {
571 for (
size_t side : {0, 1}) {
572 for (
size_t module : {0, 1, 2, 3}) {
607 (*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)));
612 (*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)));
615 pulseAna_p->LoadAndAnalyzeData(HGSamples, LGSamples);
618 if (pulseAna_p->failed()) {
619 (*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)));
628 const std::vector<float>& HGSamplesDelayed,
const std::vector<float>& LGSamplesDelayed)
633 (*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)));
639 (*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)));
643 (*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)));
647 pulseAna_p->LoadAndAnalyzeData(HGSamples, LGSamples, HGSamplesDelayed, LGSamplesDelayed);
650 pulseAna_p->LoadAndAnalyzeData(HGSamplesDelayed, LGSamplesDelayed, HGSamples, LGSamples);
654 if (pulseAna_p->failed()) {
655 (*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)));
667 unsigned int sideNPulsesMod[2] = {0, 0};
669 for (
size_t side : {0, 1}) {
670 for (
size_t module : {0, 1, 2, 3}) {
680 for (
size_t side : {0, 1}) {
681 if (sideNPulsesMod[side] == 0)
continue;
683 for (
size_t module : {0, 1, 2, 3}) {
691 (*m_msgFunc_p)(
ZDCMsg::Debug, (
"ZDCPulseAnalyzer:: performing a repass on data for side, module = " + std::to_string(side) +
", " + std::to_string(module)));
701 for (
size_t side : {0, 1}) {
702 float tempFraction = 1.0;
703 double sumAmpTimesBkgdFrac = 0.0;
704 double sumCalibAmpTimesBkgdFrac = 0.0;
706 for (
size_t module : {0, 1, 2, 3}) {
710 int moduleMaskBit = 4 * side + module;
721 float timeCalib = pulseAna_p->
GetT0Corr();
729 sumAmpTimesBkgdFrac += amplitude*bkgdFraction;
737 sumCalibAmpTimesBkgdFrac += amplitude*bkgdFraction;
759 if (tempFraction < 1.0) {
m_moduleSum[side] /= tempFraction;}
772 for (
int iside:{0,1})
780 float EMCorrFact = 0;
787 float Had1CorrFact = 0;
793 float Had2CorrFact = 0;
799 std::ostringstream ostr;
800 ostr <<
"ZDCDataAnalyzer: " <<
m_calibModuleSum[iside] <<
" " << EMCorrFact <<
" " << Had1CorrFact <<
" " << Had2CorrFact << std::endl;
804 float ECorrEMHad1 = ECorrEM/Had1CorrFact;
805 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