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#include <cmath> //for std::sqrt
19
21
22
24{
25public:
26 typedef std::array<std::array<float, 4>, 2> ZDCModuleFloatArray;
27 typedef std::array<std::array<bool, 4>, 2> ZDCModuleBoolArray;
28 typedef std::array<std::array<int, 4>, 2> ZDCModuleIntArray;
29
32
33private:
35 std::unique_ptr<ZDCJSONConfig> m_dataAnalyzerConfig{};
36 std::unique_ptr<ZDCJSONConfig> m_pulseAnalyzerConfig{};
37
38 bool m_repassEnabled{false};
39
40 std::array<std::array<int, 4>, 2> m_delayedOrder{};
41
43 std::array<std::array<std::unique_ptr<ZDCPulseAnalyzer>, 4>, 2> m_moduleAnalyzers{};
44
46
49
50 bool m_haveECalib{false};
51 bool m_haveT0Calib{false};
52 std::array<std::array<std::unique_ptr<TSpline>, 4>, 2> m_LBDepEcalibSplines{};
53 std::array<std::array<std::unique_ptr<TSpline>, 4>, 2> m_T0HGOffsetSplines{};
54 std::array<std::array<std::unique_ptr<TSpline>, 4>, 2> m_T0LGOffsetSplines{};
55
57 //
58 // Each element contains a module, a reference fraction, and then polynomial coefficients
59 //
60 std::array<std::vector<std::tuple<unsigned int, float, std::vector<float>>>, 2> m_iterCalibCorr;
61
62 // Transient data that is updated each LB or each event
63 //
64 int m_currentLB{-1};
68
69 std::array<std::array<bool, 4>, 2> m_dataLoaded{};
70
71 unsigned int m_moduleMask{0};
72
73 std::array<std::array<unsigned int, 4>, 2> m_moduleStatus{};
74 std::array<std::array<float, 4>, 2> m_calibAmplitude{};
75 std::array<std::array<float, 4>, 2> m_calibTime{};
76
77 std::array<float, 2> m_moduleSum{};
78 std::array<float, 2> m_moduleSumErrSq{};
79 std::array<float, 2> m_moduleSumPreSample{};
80 std::array<float, 2> m_moduleSumBkgdFrac{};
81
82 std::array<float, 2> m_calibModuleSum{};
83 std::array<float, 2> m_calibModuleSumErrSq{};
84 std::array<float, 2> m_calibModSumBkgdFrac{};
85
86 bool m_haveNLcalib{false};
87 std::array< std::array< std::vector<float>, 3>, 2> m_NLcalibFactors{}; // 3 POL5s for each side
88
89 std::array<float, 2> m_NLcalibModuleSum{};
90 std::array<float, 2> m_NLcalibModuleSumErrSq{};
91 std::array<float, 2> m_NLcalibModSumBkgdFrac{};
92
93 std::array<float, 2> m_averageTime{};
94 std::array<bool, 2> m_fail{};
95
96 std::array<std::array<float, 4>, 2> m_moduleAmpFractionLG{};
97
98 void init();
99
100public:
101
102 ZDCDataAnalyzer(ZDCMsg::MessageFunctionPtr messageFunc_p, int nSample, float deltaTSample,
103 size_t preSampleIdx, const std::string &fitFunction,
104 const ZDCModuleIntArray& peak2ndDerivMinSamples,
105 const ZDCModuleFloatArray& peak2ndDerivMinThresholdsHG,
106 const ZDCModuleFloatArray& peak2ndDerivMinThresholdsLG,
107 unsigned int LGMode = ZDCPulseAnalyzer::LGModeNormal);
108
109 ZDCDataAnalyzer(ZDCMsg::MessageFunctionPtr messageFunc_p, const JSON& configJSON);
110
112
113 template<typename T> bool getPulseAnalyzerGlobalPar(const std::string& key, T& value) {
114 if (m_pulseAnalyzerConfig.get()) return m_pulseAnalyzerConfig->getGlobalParam(key, value);
115 else return false;
116 }
117
118 template<typename T> void invokeAll(T functor)
119 {
120 for (size_t side : {0, 1}) {
121 for (size_t module : {0, 1, 2, 3}) {
122 functor(m_moduleAnalyzers[side][module].get());
123 }
124 }
125 }
126
127 void enableDelayed(float deltaT, const ZDCModuleFloatArray& undelayedDelayedPedestalDiff);
128 void enableDelayed(const ZDCModuleFloatArray& delayDeltaT, const ZDCModuleFloatArray& undelayedDelayedPedestalDiff);
129
130 void enableRepass(const ZDCModuleFloatArray& peak2ndDerivMinRepassHG, const ZDCModuleFloatArray& peak2ndDerivMinRepassLG);
131
132 void enablePreExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray& HGADCThresh, const ZDCModuleIntArray& LGADCThresh);
133 void enablePreExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh);
134
135 void enablePostExclusion(unsigned int maxSamplesExcl, const ZDCModuleIntArray& HGADCThresh, const ZDCModuleIntArray& LGADCThresh);
136 void enablePostExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh);
137
138 bool ModuleDisabled(unsigned int side, unsigned int module) const {return !m_moduleEnabled[side][module];}
139 bool moduleEnabled(unsigned int side, unsigned int module) const {return m_moduleEnabled[side][module];}
140
141 unsigned int GetModuleMask() const {return m_moduleMask;}
142
143 float GetModuleSum(size_t side) const {return m_moduleSum.at(side);}
144 float GetModuleSumErr(size_t side) const {return std::sqrt(m_moduleSumErrSq.at(side));}
145 float GetSideBkgdFrac(size_t side) const {return m_moduleSumBkgdFrac.at(side);}
146
147 //
148 float GetCalibModuleSum(size_t side) const {return m_calibModuleSum.at(side);}
149 float GetCalibModuleSumErr(size_t side) const {return std::sqrt(m_calibModuleSumErrSq.at(side));}
150 float GetSideCalibBkgdFrac(size_t side) const {return m_calibModSumBkgdFrac.at(side);}
151
152 void DoNLcalibModuleSum();
153 float GetNLcalibModuleSum(size_t side) const {return m_NLcalibModuleSum.at(side);}
154 float GetNLcalibModuleSumErr(size_t side) const {return std::sqrt(m_NLcalibModuleSumErrSq.at(side));}
155
156 float GetModuleSumPreSample(size_t side) const {return m_moduleSumPreSample.at(side);}
157
158 float GetAverageTime(size_t side) const {return m_averageTime.at(side);}
159 bool SideFailed(size_t side) const {return m_fail.at(side);}
160
161 float GetModuleAmplitude(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module)->GetAmplitude();}
162 float GetModuleTime(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module)->GetT0Corr();}
163 float GetModuleChisq(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module)->GetChisq();}
164
165 float GetModuleCalibAmplitude(size_t side, size_t module) const {return m_calibAmplitude.at(side).at(module);}
166 float GetModuleCalibTime(size_t side, size_t module) const {return m_calibTime.at(side).at(module);}
167 float GetModuleStatus(size_t side, size_t module) const {return m_moduleStatus.at(side).at(module);}
168
169 float GetdelayedBS(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module)->GetdelayBS();}
170
171 const ZDCPulseAnalyzer* GetPulseAnalyzer(size_t side, size_t module) const {return m_moduleAnalyzers.at(side).at(module).get();}
172 ZDCPulseAnalyzer* GetPulseAnalyzer(size_t side, size_t module) {return m_moduleAnalyzers.at(side).at(module).get();}
173
174 bool disableModule(size_t side, size_t module);
175
176 void set2ndDerivStep(size_t step);
177
178 void setMinimumSignificance(float sigMinHG, float sigMinLG);
179
180 void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG);
181
182 void SetGainFactorsHGLG(const ZDCModuleFloatArray& gainFactorsHG, const ZDCModuleFloatArray& gainFactorsLG);
183
184 void SetPeak2ndDerivMinTolerances(size_t tolerance);
185
186 void SetFitTimeMax(float tmax);
187
188 void SetADCOverUnderflowValues(const ZDCModuleFloatArray& HGOverflowADC, const ZDCModuleFloatArray& HGUnderflowADC,
189 const ZDCModuleFloatArray& LGOverflowADC);
190
191 void SetNoiseSigmas(const ZDCModuleFloatArray& noiseSigmasHG, const ZDCModuleFloatArray& noiseSigmasLG);
192
193 void setPerSampleNoiseSigmas(const std::array<std::array<std::vector<float>,4>,2>& sampleNoiseVecsHG,
194 const std::array<std::array<std::vector<float>,4>,2>& sampleNoiseVecsLG);
195
196 void SetTauT0Values(const ZDCModuleBoolArray& fxiTau1, const ZDCModuleBoolArray& fxiTau2,
197 const ZDCModuleFloatArray& tau1, const ZDCModuleFloatArray& tau2,
198 const ZDCModuleFloatArray& t0HG, const ZDCModuleFloatArray& t0LG);
199
200 void SetFitMinMaxAmpValues(const ZDCModuleFloatArray& minAmpHG, const ZDCModuleFloatArray& minAmpLG,
201 const ZDCModuleFloatArray& maxAmpHG, const ZDCModuleFloatArray& maxAmpLG);
202
203 void SetFitMinMaxAmpValues(float minHG, float minLG, float maxHG, float maxLG);
204
205 void SetCutValues(const ZDCModuleFloatArray& chisqDivAmpCutHG, const ZDCModuleFloatArray& chisqDivAmpCutLG,
206 const ZDCModuleFloatArray& deltaT0MinHG, const ZDCModuleFloatArray& deltaT0MaxHG,
207 const ZDCModuleFloatArray& deltaT0MinLG, const ZDCModuleFloatArray& deltaT0MaxLG);
208
209 void SetTimeCuts(const ZDCModuleFloatArray& deltaT0MinHG, const ZDCModuleFloatArray& deltaT0MaxHG,
210 const ZDCModuleFloatArray& deltaT0MinLG, const ZDCModuleFloatArray& deltaT0MaxLG);
211
212 void SetChisqCuts(const ZDCModuleFloatArray& chisqDivAmpCutHG, const ZDCModuleFloatArray& chisqDivAmpScaleHG,
213 const ZDCModuleFloatArray& chisqDivAmpOffsetHG, const ZDCModuleFloatArray& chisqDivAmpPowerHG,
214 const ZDCModuleFloatArray& chisqDivAmpCutLG, const ZDCModuleFloatArray& chisqDivAmpScaleLG,
215 const ZDCModuleFloatArray& chisqDivAmpOffsetLG, const ZDCModuleFloatArray& chisqDivAmpPowerLG);
216
217 void SetTimingCorrParams(ZDCPulseAnalyzer::TimingCorrMode mode, float refADC, float refScale,
218 const std::array<std::array<std::vector<float>, 4>, 2>& HGParamArr,
219 const std::array<std::array<std::vector<float>, 4>, 2>& LGParamArr);
220
221 void SetNonlinCorrParams(float refADC, float refScale,
222 const std::array<std::array<std::vector<float>, 4>, 2>& HGNonlinCorrParams,
223 const std::array<std::array<std::vector<float>, 4>, 2>& LHGNonlinCorrParams);
224
225 void SetNLcalibParams(std::array< std::array< std::vector<float>, 3>, 2>& nlcalibParams);
226
227 void SetModuleAmpFractionLG(const ZDCDataAnalyzer::ZDCModuleFloatArray& moduleAmpFractionLG);
228
229 void enablePostPulseCheck(unsigned int postPulseSampleDelta, float postPulseDerivMinSig, float postPulseAbsDer2ndMinSig, float minMainDer2ndRatio);
230
231 void enableTimeSigCut(bool AND, float sigCut, const std::string& TF1String,
232 const std::array<std::array<std::vector<double>, 4>, 2>& parsHGArr,
233 const std::array<std::array<std::vector<double>, 4>, 2>& parsLGArr);
234
235 void enableFADCCorrections(bool correctPerSample,
236 std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& correHistHG,
237 std::array<std::array<std::unique_ptr<const TH1>, 4>, 2>& correHistLG);
238
239 void disableFADCCorrections();
240
241 void LoadEnergyCalibrations(std::array<std::array<std::unique_ptr<TSpline>, 4>, 2>&& calibSplines)
242 {
243 (*m_msgFunc_p)(ZDCMsg::Verbose, "Loading energy calibrations");
244
245 m_LBDepEcalibSplines = std::move (calibSplines);
246 m_haveECalib = true;
247 }
248
249 void LoadT0Calibrations(std::array<std::array<std::unique_ptr<TSpline>, 4>, 2>&& T0HGOffsetSplines,
250 std::array<std::array<std::unique_ptr<TSpline>, 4>, 2>&& T0LGOffsetSplines)
251 {
252 (*m_msgFunc_p)(ZDCMsg::Verbose, "Loading timing calibrations");
253
254 m_T0HGOffsetSplines = std::move (T0HGOffsetSplines);
255 m_T0LGOffsetSplines = std::move (T0LGOffsetSplines);
256
257 m_haveT0Calib = true;
258 }
259
260 void StartEvent(int lumiBlock);
261
262 void LoadAndAnalyzeData(size_t side, size_t module, const std::vector<float>& HGSamples, const std::vector<float>& LGSamples);
263
264 void LoadAndAnalyzeData(size_t side, size_t module, const std::vector<float>& HGSamples, const std::vector<float>& LGSamples,
265 const std::vector<float>& HGSamplesDelayed, const std::vector<float>& LGSamplesDelayed);
266
267 bool FinishEvent();
268
269 void saveFitFunc(bool save);
270
271 void setQuietFits(bool quiet) {
272 if (quiet) invokeAll([](ZDCPulseAnalyzer* pa){pa->setQuietFits();});
273 else invokeAll([](ZDCPulseAnalyzer* pa){pa->setUnquietFits();});
274 }
275
276};
277#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
std::array< std::array< std::vector< float >, 3 >, 2 > m_NLcalibFactors
float GetAverageTime(size_t side) const
std::unique_ptr< ZDCJSONConfig > m_dataAnalyzerConfig
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
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
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
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)
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
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
std::array< float, 2 > m_moduleSumErrSq
unsigned int GetModuleMask() const
std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > m_T0HGOffsetSplines
void setQuietFits(bool quiet)
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< std::vector< std::tuple< unsigned int, float, std::vector< float > > >, 2 > m_iterCalibCorr
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
ZDCDataAnalyzer(ZDCMsg::MessageFunctionPtr messageFunc_p, int nSample, float deltaTSample, size_t preSampleIdx, const std::string &fitFunction, const ZDCModuleIntArray &peak2ndDerivMinSamples, const ZDCModuleFloatArray &peak2ndDerivMinThresholdsHG, const ZDCModuleFloatArray &peak2ndDerivMinThresholdsLG, unsigned int LGMode=ZDCPulseAnalyzer::LGModeNormal)
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
float GetModuleSumErr(size_t side) const
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:132
@ Verbose
Definition ZDCMsg.h:18
std::shared_ptr< MessageFunction > MessageFunctionPtr
Definition ZDCMsg.h:14