ATLAS Offline Software
Loading...
Searching...
No Matches
ZDCDataAnalyzer.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef ZDCANALYSIS_ZDCDataAnalyzer_h
6#define ZDCANALYSIS_ZDCDataAnalyzer_h
7
8#include "ZDCJSONConfig.h"
10#include "ZdcAnalysis/ZDCMsg.h"
11#include "TSpline.h"
12
13#include <array>
14#include <string>
15#include <memory>
16#include <cmath> //for std::sqrt
17#include <functional>
18
20
21
23{
24public:
25 typedef std::array<std::array<float, 4>, 2> ZDCModuleFloatArray;
26 typedef std::array<std::array<bool, 4>, 2> ZDCModuleBoolArray;
27 typedef std::array<std::array<int, 4>, 2> ZDCModuleIntArray;
28
31
32private:
34 std::unique_ptr<ZDCJSONConfig> m_dataAnalyzerConfig{};
35 std::unique_ptr<ZDCJSONConfig> m_pulseAnalyzerConfig{};
36
37 bool m_repassEnabled{false};
38
39 std::array<std::array<int, 4>, 2> m_delayedOrder{};
40
42 std::array<std::array<std::unique_ptr<ZDCPulseAnalyzer>, 4>, 2> m_moduleAnalyzers{};
43
45
48
49 bool m_haveECalib{false};
50 bool m_haveT0Calib{false};
51 std::array<std::array<std::unique_ptr<TSpline>, 4>, 2> m_LBDepEcalibSplines{};
52 std::array<std::array<std::unique_ptr<TSpline>, 4>, 2> m_T0HGOffsetSplines{};
53 std::array<std::array<std::unique_ptr<TSpline>, 4>, 2> m_T0LGOffsetSplines{};
54
55 // Transient data that is updated each LB or each event
56 //
57 int m_currentLB{-1};
61
62 std::array<std::array<bool, 4>, 2> m_dataLoaded{};
63
64 unsigned int m_moduleMask{0};
65
66 std::array<std::array<unsigned int, 4>, 2> m_moduleStatus{};
67 std::array<std::array<float, 4>, 2> m_calibAmplitude{};
68 std::array<std::array<float, 4>, 2> m_calibTime{};
69
70 std::array<float, 2> m_moduleSum{};
71 std::array<float, 2> m_moduleSumErrSq{};
72 std::array<float, 2> m_moduleSumPreSample{};
73 std::array<float, 2> m_moduleSumBkgdFrac{};
74
75 std::array<float, 2> m_calibModuleSum{};
76 std::array<float, 2> m_calibModuleSumErrSq{};
77 std::array<float, 2> m_calibModSumBkgdFrac{};
78
79 bool m_haveNLcalib{false};
80 std::array< std::array< std::array<float,6>, 3>, 2> m_NLcalibFactors{}; // 3 POL5s for each side
81
82 std::array<float, 2> m_NLcalibModuleSum{};
83 std::array<float, 2> m_NLcalibModuleSumErrSq{};
84 std::array<float, 2> m_NLcalibModSumBkgdFrac{};
85
86 std::array<float, 2> m_averageTime{};
87 std::array<bool, 2> m_fail{};
88
89 std::array<std::array<float, 4>, 2> m_moduleAmpFractionLG{};
90
91 void init();
92
93public:
94
95 ZDCDataAnalyzer(ZDCMsg::MessageFunctionPtr messageFunc_p, int nSample, float deltaTSample,
96 size_t preSampleIdx, std::string fitFunction,
97 const ZDCModuleIntArray& peak2ndDerivMinSamples,
98 const ZDCModuleFloatArray& peak2ndDerivMinThresholdsHG,
99 const ZDCModuleFloatArray& peak2ndDerivMinThresholdsLG,
100 unsigned int LGMode = ZDCPulseAnalyzer::LGModeNormal);
101
102 ZDCDataAnalyzer(ZDCMsg::MessageFunctionPtr messageFunc_p, const JSON& configJSON);
103
105
106 template<typename T> bool getPulseAnalyzerGlobalPar(const std::string& key, T& value) {
107 if (m_pulseAnalyzerConfig.get()) return m_pulseAnalyzerConfig->getGlobalParam(key, value);
108 else return false;
109 }
110
111 template<typename T> void invokeAll(T functor)
112 {
113 for (size_t side : {0, 1}) {
114 for (size_t module : {0, 1, 2, 3}) {
115 functor(m_moduleAnalyzers[side][module].get());
116 }
117 }
118 }
119
120 void enableDelayed(float deltaT, const ZDCModuleFloatArray& undelayedDelayedPedestalDiff);
121 void enableDelayed(const ZDCModuleFloatArray& delayDeltaT, const ZDCModuleFloatArray& undelayedDelayedPedestalDiff);
122
123 void enableRepass(const ZDCModuleFloatArray& peak2ndDerivMinRepassHG, const ZDCModuleFloatArray& peak2ndDerivMinRepassLG);
124
125 void enablePreExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray& HGADCThresh, const ZDCModuleIntArray& LGADCThresh);
126 void enablePreExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh);
127
128 void enablePostExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray& HGADCThresh, const ZDCModuleIntArray& LGADCThresh);
129 void enablePostExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh);
130
131 bool ModuleDisabled(unsigned int side, unsigned int module) const {return !m_moduleEnabled[side][module];}
132 bool moduleEnabled(unsigned int side, unsigned int module) const {return m_moduleEnabled[side][module];}
133
134 unsigned int GetModuleMask() const {return m_moduleMask;}
135
136 float GetModuleSum(size_t side) const {return m_moduleSum.at(side);}
137 float GetModuleSumErr(size_t side) const {return std::sqrt(m_moduleSumErrSq.at(side));}
138 float GetSideBkgdFrac(size_t side) const {return m_moduleSumBkgdFrac.at(side);}
139
140 float GetCalibModuleSum(size_t side) const {return m_calibModuleSum.at(side);}
141 float GetCalibModuleSumErr(size_t side) const {return std::sqrt(m_calibModuleSumErrSq.at(side));}
142 float GetSideCalibBkgdFrac(size_t side) const {return m_calibModSumBkgdFrac.at(side);}
143
144 void DoNLcalibModuleSum();
145 float GetNLcalibModuleSum(size_t side) const {return m_NLcalibModuleSum.at(side);}
146 float GetNLcalibModuleSumErr(size_t side) const {return std::sqrt(m_NLcalibModuleSumErrSq.at(side));}
147
148 float GetModuleSumPreSample(size_t side) const {return m_moduleSumPreSample.at(side);}
149
150 float GetAverageTime(size_t side) const {return m_averageTime.at(side);}
151 bool SideFailed(size_t side) const {return m_fail.at(side);}
152
153 float GetModuleAmplitude(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module)->GetAmplitude();}
154 float GetModuleTime(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module)->GetT0Corr();}
155 float GetModuleChisq(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module)->GetChisq();}
156
157 float GetModuleCalibAmplitude(size_t side, size_t module) const {return m_calibAmplitude.at(side).at(module);}
158 float GetModuleCalibTime(size_t side, size_t module) const {return m_calibTime.at(side).at(module);}
159 float GetModuleStatus(size_t side, size_t module) const {return m_moduleStatus.at(side).at(module);}
160
161 float GetdelayedBS(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module)->GetdelayBS();}
162
163 const ZDCPulseAnalyzer* GetPulseAnalyzer(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module).get();}
164 ZDCPulseAnalyzer* GetPulseAnalyzer(size_t side, size_t module) {return m_moduleAnalyzers.at(side).at(module).get();}
165
166 bool disableModule(size_t side, size_t module);
167
168 void set2ndDerivStep(size_t step);
169
170 void setMinimumSignificance(float sigMinHG, float sigMinLG);
171
172 void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG);
173
174 void SetGainFactorsHGLG(const ZDCModuleFloatArray& gainFactorsHG, const ZDCModuleFloatArray& gainFactorsLG);
175
176 void SetPeak2ndDerivMinTolerances(size_t tolerance);
177
178 void SetFitTimeMax(float tmax);
179
180 void SetSaveFitFunc(bool save);
181
182 void SetADCOverUnderflowValues(const ZDCModuleFloatArray& HGOverflowADC, const ZDCModuleFloatArray& HGUnderflowADC,
183 const ZDCModuleFloatArray& LGOverflowADC);
184
185 void SetNoiseSigmas(const ZDCModuleFloatArray& noiseSigmasHG, const ZDCModuleFloatArray& noiseSigmasLG);
186
187 void SetTauT0Values(const ZDCModuleBoolArray& fxiTau1, const ZDCModuleBoolArray& fxiTau2,
188 const ZDCModuleFloatArray& tau1, const ZDCModuleFloatArray& tau2,
189 const ZDCModuleFloatArray& t0HG, const ZDCModuleFloatArray& t0LG);
190
191 void SetFitMinMaxAmpValues(const ZDCModuleFloatArray& minAmpHG, const ZDCModuleFloatArray& minAmpLG,
192 const ZDCModuleFloatArray& maxAmpHG, const ZDCModuleFloatArray& maxAmpLG);
193
194 void SetFitMinMaxAmpValues(float minHG, float minLG, float maxHG, float maxLG);
195
196 void SetCutValues(const ZDCModuleFloatArray& chisqDivAmpCutHG, const ZDCModuleFloatArray& chisqDivAmpCutLG,
197 const ZDCModuleFloatArray& deltaT0MinHG, const ZDCModuleFloatArray& deltaT0MaxHG,
198 const ZDCModuleFloatArray& deltaT0MinLG, const ZDCModuleFloatArray& deltaT0MaxLG);
199
200
201 void SetTimingCorrParams(ZDCPulseAnalyzer::TimingCorrMode mode, float refADC, float refScale,
202 const std::array<std::array<std::vector<float>, 4>, 2>& HGParamArr,
203 const std::array<std::array<std::vector<float>, 4>, 2>& LGParamArr);
204
205 void SetNonlinCorrParams(float refADC, float refScale,
206 const std::array<std::array<std::vector<float>, 4>, 2>& HGNonlinCorrParams,
207 const std::array<std::array<std::vector<float>, 4>, 2>& LHGNonlinCorrParams);
208
209 void SetNLcalibParams(std::array< std::array< std::array<float,6>, 3>, 2>& nlcalibParams);
210
211 void SetModuleAmpFractionLG(const ZDCDataAnalyzer::ZDCModuleFloatArray& moduleAmpFractionLG);
212
213
214 void enableTimeSigCut(bool AND, float sigCut, const std::string& TF1String,
215 const std::array<std::array<std::vector<double>, 4>, 2>& parsHGArr,
216 const std::array<std::array<std::vector<double>, 4>, 2>& parsLGArr);
217
218 void enableFADCCorrections(bool correctPerSample,
219 std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& correHistHG,
220 std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& correHistLG);
221
223
224 void LoadEnergyCalibrations(std::array<std::array<std::unique_ptr<TSpline>, 4>, 2>&& calibSplines)
225 {
226 (*m_msgFunc_p)(ZDCMsg::Verbose, "Loading energy calibrations");
227
228 m_LBDepEcalibSplines = std::move (calibSplines);
229 m_haveECalib = true;
230 }
231
232 void LoadT0Calibrations(std::array<std::array<std::unique_ptr<TSpline>, 4>, 2>&& T0HGOffsetSplines,
233 std::array<std::array<std::unique_ptr<TSpline>, 4>, 2>&& T0LGOffsetSplines)
234 {
235 (*m_msgFunc_p)(ZDCMsg::Verbose, "Loading timing calibrations");
236
237 m_T0HGOffsetSplines = std::move (T0HGOffsetSplines);
238 m_T0LGOffsetSplines = std::move (T0LGOffsetSplines);
239
240 m_haveT0Calib = true;
241 }
242
243 void StartEvent(int lumiBlock);
244
245 void LoadAndAnalyzeData(size_t side, size_t module, const std::vector<float>& HGSamples, const std::vector<float>& LGSamples);
246
247 void LoadAndAnalyzeData(size_t side, size_t module, const std::vector<float>& HGSamples, const std::vector<float>& LGSamples,
248 const std::vector<float>& HGSamplesDelayed, const std::vector<float>& LGSamplesDelayed);
249
250 bool FinishEvent();
251
252};
253#endif
ZDCJSONConfig::JSON JSON
Define macros for attributes used to control the static checker.
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
float GetAverageTime(size_t side) const
std::unique_ptr< ZDCJSONConfig > m_dataAnalyzerConfig
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)
ZDCMsg::MessageFunctionPtr m_msgFunc_p
float GetModuleAmplitude(size_t side, size_t module) const
float GetNLcalibModuleSumErr(size_t side) const
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
float GetModuleStatus(size_t side, size_t module) const
std::array< std::array< bool, 4 >, 2 > ZDCModuleBoolArray
float GetNLcalibModuleSum(size_t side) const
float GetdelayedBS(size_t side, size_t module) const
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
void LoadT0Calibrations(std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > &&T0HGOffsetSplines, std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > &&T0LGOffsetSplines)
float GetModuleChisq(size_t side, size_t module) const
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)
bool SideFailed(size_t side) const
std::array< float, 2 > m_averageTime
float GetCalibModuleSumErr(size_t side) const
bool moduleEnabled(unsigned int side, unsigned int module) const
std::array< std::array< int, 4 >, 2 > ZDCModuleIntArray
void invokeAll(T functor)
void SetModuleAmpFractionLG(const ZDCDataAnalyzer::ZDCModuleFloatArray &moduleAmpFractionLG)
std::array< std::array< bool, 4 >, 2 > m_dataLoaded
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
float GetModuleSum(size_t side) const
void LoadEnergyCalibrations(std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > &&calibSplines)
std::array< std::array< float, 4 >, 2 > m_calibTime
std::array< std::array< float, 4 >, 2 > m_moduleAmpFractionLG
void SetSaveFitFunc(bool save)
std::array< float, 2 > m_moduleSumErrSq
unsigned int GetModuleMask() const
std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > m_T0HGOffsetSplines
ZDCModuleFloatArray m_HGGains
float GetModuleSumPreSample(size_t side) const
float GetSideCalibBkgdFrac(size_t side) const
std::array< float, 2 > m_moduleSum
float GetSideBkgdFrac(size_t side) const
ZDCPulseAnalyzer * GetPulseAnalyzer(size_t side, size_t module)
float GetModuleTime(size_t side, size_t module) const
std::array< float, 2 > m_NLcalibModuleSum
float GetModuleCalibAmplitude(size_t side, size_t module) const
std::array< float, 2 > m_calibModuleSumErrSq
float GetCalibModuleSum(size_t side) const
std::array< float, 2 > m_calibModuleSum
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)
bool ModuleDisabled(unsigned int side, unsigned int module) const
std::array< float, 2 > m_moduleSumBkgdFrac
bool getPulseAnalyzerGlobalPar(const std::string &key, T &value)
std::array< float, 2 > m_NLcalibModuleSumErrSq
ZDCModuleFloatArray m_currentT0OffsetsHG
float GetModuleCalibTime(size_t side, size_t module) const
const ZDCPulseAnalyzer * GetPulseAnalyzer(size_t side, size_t module) const
ZDCJSONConfig::JSON JSON
static const ZDCJSONConfig::JSONParamList JSONConfigParams
void SetFitMinMaxAmpValues(const ZDCModuleFloatArray &minAmpHG, const ZDCModuleFloatArray &minAmpLG, const ZDCModuleFloatArray &maxAmpHG, const ZDCModuleFloatArray &maxAmpLG)
float GetModuleSumErr(size_t side) const
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
nlohmann::json JSON
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130
@ Verbose
Definition ZDCMsg.h:18
std::shared_ptr< MessageFunction > MessageFunctionPtr
Definition ZDCMsg.h:14