ATLAS Offline Software
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 {
24 public:
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 
32 private:
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 
41  ZDCModuleBoolArray m_moduleEnabled{};
42  std::array<std::array<std::unique_ptr<ZDCPulseAnalyzer>, 4>, 2> m_moduleAnalyzers{};
43 
44  int m_eventCount{0};
45 
46  ZDCModuleFloatArray m_HGGains{};
47  ZDCModuleFloatArray m_pedestals{};
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};
58  ZDCModuleFloatArray m_currentECalibCoeff{};
59  ZDCModuleFloatArray m_currentT0OffsetsHG{};
60  ZDCModuleFloatArray m_currentT0OffsetsLG{};
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 
93 public:
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 
222  void disableFADCCorrections();
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
ZDCDataAnalyzer::GetSideCalibBkgdFrac
float GetSideCalibBkgdFrac(size_t side) const
Definition: ZDCDataAnalyzer.h:142
ZDCDataAnalyzer::GetPulseAnalyzer
ZDCPulseAnalyzer * GetPulseAnalyzer(size_t side, size_t module)
Definition: ZDCDataAnalyzer.h:164
ZDCDataAnalyzer::GetModuleStatus
float GetModuleStatus(size_t side, size_t module) const
Definition: ZDCDataAnalyzer.h:159
ZDCDataAnalyzer::GetModuleSumPreSample
float GetModuleSumPreSample(size_t side) const
Definition: ZDCDataAnalyzer.h:148
ZDCDataAnalyzer::GetModuleTime
float GetModuleTime(size_t side, size_t module) const
Definition: ZDCDataAnalyzer.h:154
ZDCDataAnalyzer::GetModuleChisq
float GetModuleChisq(size_t side, size_t module) const
Definition: ZDCDataAnalyzer.h:155
ATLAS_NOT_THREAD_SAFE
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
Definition: checker_macros.h:212
ZDCPulseAnalyzer.h
ZDCDataAnalyzer::ZDCModuleFloatArray
std::array< std::array< float, 4 >, 2 > ZDCModuleFloatArray
Definition: ZDCDataAnalyzer.h:25
ZDCDataAnalyzer::SideFailed
bool SideFailed(size_t side) const
Definition: ZDCDataAnalyzer.h:151
ZDCDataAnalyzer::GetdelayedBS
float GetdelayedBS(size_t side, size_t module) const
Definition: ZDCDataAnalyzer.h:161
ZDCDataAnalyzer::ZDCModuleIntArray
std::array< std::array< int, 4 >, 2 > ZDCModuleIntArray
Definition: ZDCDataAnalyzer.h:27
ZDCDataAnalyzer::invokeAll
void invokeAll(T functor)
Definition: ZDCDataAnalyzer.h:111
ZDCDataAnalyzer::GetNLcalibModuleSumErr
float GetNLcalibModuleSumErr(size_t side) const
Definition: ZDCDataAnalyzer.h:146
Root::AND
@ AND
Definition: TGRLCollection.h:32
athena.value
value
Definition: athena.py:124
ZDCPulseAnalyzer
Definition: ZDCPulseAnalyzer.h:24
ZDCJSONConfig::JSONParamList
std::map< std::string, JSONParamDescr > JSONParamList
Definition: ZDCJSONConfig.h:20
ZDCDataAnalyzer::GetModuleAmplitude
float GetModuleAmplitude(size_t side, size_t module) const
Definition: ZDCDataAnalyzer.h:153
ZDCDataAnalyzer::m_msgFunc_p
ZDCMsg::MessageFunctionPtr m_msgFunc_p
Definition: ZDCDataAnalyzer.h:33
ZDCDataAnalyzer::GetCalibModuleSumErr
float GetCalibModuleSumErr(size_t side) const
Definition: ZDCDataAnalyzer.h:141
ZDCDataAnalyzer::JSON
ZDCJSONConfig::JSON JSON
Definition: ZDCDataAnalyzer.h:29
ZDCDataAnalyzer::GetModuleCalibTime
float GetModuleCalibTime(size_t side, size_t module) const
Definition: ZDCDataAnalyzer.h:158
TRT::Hit::side
@ side
Definition: HitInfo.h:83
ZDCDataAnalyzer::GetModuleMask
unsigned int GetModuleMask() const
Definition: ZDCDataAnalyzer.h:134
ZDCDataAnalyzer
Definition: ZDCDataAnalyzer.h:23
ZDCDataAnalyzer::GetSideBkgdFrac
float GetSideBkgdFrac(size_t side) const
Definition: ZDCDataAnalyzer.h:138
python.PyAthena.module
module
Definition: PyAthena.py:131
ZDCMsg::Verbose
@ Verbose
Definition: ZDCMsg.h:18
checkTP.save
def save(self, fileName="./columbo.out")
Definition: checkTP.py:176
ZDCJSONConfig.h
ZDCDataAnalyzer::GetModuleSumErr
float GetModuleSumErr(size_t side) const
Definition: ZDCDataAnalyzer.h:137
ZDCJSONConfig::JSON
nlohmann::json JSON
Definition: ZDCJSONConfig.h:18
ZDCDataAnalyzer::GetModuleSum
float GetModuleSum(size_t side) const
Definition: ZDCDataAnalyzer.h:136
ZDCDataAnalyzer::GetModuleCalibAmplitude
float GetModuleCalibAmplitude(size_t side, size_t module) const
Definition: ZDCDataAnalyzer.h:157
ZDCDataAnalyzer::LoadT0Calibrations
void LoadT0Calibrations(std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > &&T0HGOffsetSplines, std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > &&T0LGOffsetSplines)
Definition: ZDCDataAnalyzer.h:232
Preparation.mode
mode
Definition: Preparation.py:107
ZDCDataAnalyzer::LoadEnergyCalibrations
void LoadEnergyCalibrations(std::array< std::array< std::unique_ptr< TSpline >, 4 >, 2 > &&calibSplines)
Definition: ZDCDataAnalyzer.h:224
ZDCPulseAnalyzer::TimingCorrMode
TimingCorrMode
Definition: ZDCPulseAnalyzer.h:61
ZDCDataAnalyzer::moduleEnabled
bool moduleEnabled(unsigned int side, unsigned int module) const
Definition: ZDCDataAnalyzer.h:132
ZDCMsg.h
lumiFormat.array
array
Definition: lumiFormat.py:91
tolerance
Definition: suep_shower.h:17
ZDCDataAnalyzer::GetPulseAnalyzer
const ZDCPulseAnalyzer * GetPulseAnalyzer(size_t side, size_t module) const
Definition: ZDCDataAnalyzer.h:163
ZDCMsg::MessageFunctionPtr
std::shared_ptr< MessageFunction > MessageFunctionPtr
Definition: ZDCMsg.h:14
python.PyKernel.init
def init(v_theApp, v_rootStream=None)
Definition: PyKernel.py:45
ZDCDataAnalyzer::GetCalibModuleSum
float GetCalibModuleSum(size_t side) const
Definition: ZDCDataAnalyzer.h:140
JSON
ZDCJSONConfig::JSON JSON
Definition: ZDCPulseAnalyzer.cxx:20
ZDCDataAnalyzer::~ZDCDataAnalyzer
~ZDCDataAnalyzer()
Definition: ZDCDataAnalyzer.h:104
ZDCDataAnalyzer::ZDCModuleBoolArray
std::array< std::array< bool, 4 >, 2 > ZDCModuleBoolArray
Definition: ZDCDataAnalyzer.h:26
ZDCPulseAnalyzer::LGModeNormal
@ LGModeNormal
Definition: ZDCPulseAnalyzer.h:56
get
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition: hcg.cxx:130
ZDCDataAnalyzer::getPulseAnalyzerGlobalPar
bool getPulseAnalyzerGlobalPar(const std::string &key, T &value)
Definition: ZDCDataAnalyzer.h:106
LArCellBinning.step
step
Definition: LArCellBinning.py:158
ZDCDataAnalyzer::ModuleDisabled
bool ModuleDisabled(unsigned int side, unsigned int module) const
Definition: ZDCDataAnalyzer.h:131
xAOD::lumiBlock
setTeId lumiBlock
Definition: L2StandAloneMuon_v1.cxx:328
checker_macros.h
Define macros for attributes used to control the static checker.
ZDCDataAnalyzer::SetSaveFitFunc
void SetSaveFitFunc(bool save)
ZDCDataAnalyzer::GetNLcalibModuleSum
float GetNLcalibModuleSum(size_t side) const
Definition: ZDCDataAnalyzer.h:145
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
ZDCDataAnalyzer::GetAverageTime
float GetAverageTime(size_t side) const
Definition: ZDCDataAnalyzer.h:150
ZDCDataAnalyzer::JSONConfigParams
static const ZDCJSONConfig::JSONParamList JSONConfigParams
Definition: ZDCDataAnalyzer.h:30
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37