ATLAS Offline Software
ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
11 #ifndef ZDCTRIGVALID__ZDCTriggerSim__h
12 #define ZDCTRIGVALID__ZDCTriggerSim__h
13 
14 #include <array>
15 #include <cmath>
16 #include <list>
17 #include <memory>
18 #include <ostream>
19 #include <stdexcept>
20 #include <type_traits>
21 #include <vector>
22 
23 namespace ZDCTriggerSim {
25 
26 const std::vector<std::string> TypeStrings = {"CombLUTOutput", "CombLUTInput",
27  "SideLUTsInput", "ModAmplsInput"};
28 } // namespace ZDCTriggerSim
29 
30 //
31 // Base class for simulation data. Primarily defines interface and virtual
32 // destructor
33 //
35  public:
36  virtual ~ZDCTriggerSimDataBase() = default;
37 
38  virtual unsigned int getNumBits() const = 0;
39  virtual unsigned int getNumData() const = 0;
40  virtual ZDCTriggerSim::DataType getType() const = 0;
41 
42  virtual unsigned int getValueTrunc(unsigned int idx = 0) const = 0;
43  virtual void dump(std::ostream& strm) const = 0;
44 };
45 
46 // Template class that defines data of type T -- usually but not always unsigned
47 // integer
48 // with NData different values and which will be truncated to NBits
49 //
50 // The class also allows the use of conversion factors that are applied to the
51 // input values
52 // when the data is actually used. This allows translation between (e.g.)
53 // energies and ADC values or any other kind of required conversion.
54 //
55 //
56 template <typename T, unsigned int NData, unsigned int NBits,
60  std::vector<float> m_convertFactors;
61 
62  std::vector<T> m_data;
63  bool m_haveData;
64 
65  unsigned int doConvTrunc(const T& inValue) const {
66  unsigned int value = inValue;
67 
68  if (m_doConvert) {
69  value = std::floor(inValue * m_convertFactors.at(0));
70  }
71 
72  unsigned int valueTruncZero = std::max(static_cast<unsigned int>(0), value);
73  unsigned int valueTruncBits =
74  std::min(valueTruncZero, static_cast<unsigned int>((1 << NBits) - 1));
75  return valueTruncBits;
76  }
77 
78  // static const unsigned int maskBits = (2<<NBits) - 1;
79  public:
81  : m_doConvert(false), m_data(NData, 0), m_haveData(false) {
82  static_assert(NData > 0, "ZDCTriggerSimData requires at least one datum");
83  static_assert(NBits > 0, "ZDCTriggerSimData requires at least 1 bit");
84  }
85 
86  ZDCTriggerSimData(const std::vector<float>& conversionFactors)
87  : m_doConvert(true),
88  m_convertFactors(conversionFactors),
89  m_data(NData, 0),
90  m_haveData(false) {
91  static_assert(NData > 0, "ZDCTriggerSimData requires at least one datum");
92  static_assert(NBits > 0, "ZDCTriggerSimData requires at least 1 bit");
93  }
94 
95  virtual ~ZDCTriggerSimData() override {}
96 
97  unsigned int getNumBits() const override { return NBits; }
98  unsigned int getNumData() const override { return NData; }
99  virtual ZDCTriggerSim::DataType getType() const override { return Type; }
100 
101  virtual unsigned int getValueTrunc(unsigned int idx = 0) const override {
102  if (!m_haveData)
103  throw std::logic_error("No data available for ZDCTriggerSimData");
104  return doConvTrunc(m_data.at(idx));
105  }
106 
107  void setDatum(T datum) {
108  if (NData != 1)
109  throw std::logic_error(
110  "ZDCTriggerSimData setDatum called with NData > 1");
111  ;
112  m_haveData = true;
113  m_data[0] = datum;
114  }
115 
116  void setData(const std::vector<T>& inData) {
117  m_data = inData;
118  m_haveData = true;
119  }
120 
121  void clearData() { m_haveData = false; }
122 
123  virtual void dump(std::ostream& strm) const override {
124  for (auto datum : m_data) {
125  strm << doConvTrunc(datum) << " ";
126  }
127  }
128 };
129 
130 namespace ZDCTriggerSim {
131 // The usual way we provide the module amplitudes
132 //
135 
136 // The usual way we provide the module amplitudes
137 //
139 
140 // The usual way we provide input to the side LUTs
141 //
143 
144 // In case we want to be able to convert from energies or other floating input
145 //
147 
148 // The "usual" way we provide inputs to the combined LUT -- with unsigned
149 // integers
150 //
152 
153 // In case we want to be able to convert from energies or other float
154 // to the integer inputs to the combined LUT
155 //
156 // typedef ZDCTriggerSimData<float, 2, 4> CombLUTInputsFloat;
157 
158 // The combined LUT produces 3 output bits
159 //
161 
162 typedef std::shared_ptr<const ZDCTriggerSimDataBase> SimDataCPtr;
163 typedef std::shared_ptr<ZDCTriggerSimDataBase> SimDataPtr;
164 } // namespace ZDCTriggerSim
165 
166 // Base class for the ZDC trigger simulation.
167 //
168 // It is an abstract base that also provides the stack holding the intermediate
169 // results
170 //
171 //
173  private:
174  typedef std::list<ZDCTriggerSim::SimDataCPtr> SimStack;
175 
177 
178  protected:
179  void stackClear() { m_stack.clear(); }
180 
182  m_stack.push_back(SimStack::value_type(ptr));
183  }
184 
186  return m_stack.back();
187  }
188 
189  // Take the data on the "top" of the stack and use it as input, adding new
190  // data to the stack
191  //
192  virtual void doSimStage() = 0;
193 
194  public:
195  ZDCTriggerSimBase() = default;
196  virtual ~ZDCTriggerSimBase() = default;
197 
198  // Every implementation of the base should ultimately produce the L1 bits
199  // possibly (usually) through recursion
200  //
201  virtual unsigned int simLevel1Trig(
202  const ZDCTriggerSim::SimDataCPtr& data) = 0;
203 
204  void dump(std::ostream& strm) const;
205 };
206 
207 class ZDCTriggerSimCombLUT : virtual public ZDCTriggerSimBase {
208  std::array<unsigned int, 256> m_combLUT;
209 
210  protected:
211  //
212  // The data on the top of the stack should be the two 4 bit inputs
213  // to the combined LUT. The output is the combined LUT output
214  //
215  virtual void doSimStage() override;
216 
217  public:
218  ZDCTriggerSimCombLUT(const std::array<unsigned int, 256>& inLUT)
219  : m_combLUT(inLUT) {}
220 
221  virtual unsigned int simLevel1Trig(
222  const ZDCTriggerSim::SimDataCPtr& inputBits) override {
223  stackClear();
224  stackPush(inputBits);
225 
226  doSimStage();
227  return stackTopData()->getValueTrunc();
228  }
229 };
230 
232  public ZDCTriggerSimCombLUT {
233  std::array<unsigned int, 4096> m_LUTA;
234  std::array<unsigned int, 4096> m_LUTC;
235 
236  protected:
237  //
238  // The data on the top of the stack should be the two 12 bit inputs
239  // to each of the side LUT. The output is the two side LUT outputs.
240  //
241  // After we excute the side LUT, we call the CombLUT doSimStage();
242  //
243  virtual void doSimStage() override;
244 
245  public:
246  ZDCTriggerSimAllLUTs(const std::array<unsigned int, 4096>& sideALUT,
247  const std::array<unsigned int, 4096>& sideCLUT,
248  const std::array<unsigned int, 256>& inCombLUT)
249  : ZDCTriggerSimCombLUT(inCombLUT), m_LUTA(sideALUT), m_LUTC(sideCLUT) {}
250 
251  virtual unsigned int simLevel1Trig(
252  const ZDCTriggerSim::SimDataCPtr& inputData) override {
253  stackClear();
254  stackPush(inputData);
255 
256  doSimStage();
257  return stackTopData()->getValueTrunc();
258  }
259 };
260 
262  public ZDCTriggerSimAllLUTs {
263  protected:
264  //
265  // The data on the top of the stack should be the two 12 bit inputs
266  // to each of the side LUT. The output is the two side LUT outputs.
267  //
268  // After we excute the side LUT, we call the CombLUT doSimStage();
269  //
270  virtual void doSimStage() override;
271 
272  public:
273  ZDCTriggerSimModuleAmpls(const std::array<unsigned int, 4096>& sideALUT,
274  const std::array<unsigned int, 4096>& sideCLUT,
275  const std::array<unsigned int, 256>& inCombLUT)
276  : ZDCTriggerSimAllLUTs(sideALUT, sideCLUT, inCombLUT) {}
277 
278  virtual unsigned int simLevel1Trig(
279  const ZDCTriggerSim::SimDataCPtr& inputData) override {
280  stackClear();
281  stackPush(inputData);
282 
283  doSimStage();
284  return stackTopData()->getValueTrunc();
285  }
286 };
287 #endif
ZDCTriggerSimModuleAmpls::doSimStage
virtual void doSimStage() override
Definition: ForwardDetectors/ZDC/ZdcUtils/Root/ZDCTriggerSim.cxx:66
ZDCTriggerSim::TModAmplsInput
@ TModAmplsInput
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:24
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
ZDCTriggerSimBase::m_stack
SimStack m_stack
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:176
max
#define max(a, b)
Definition: cfImp.cxx:41
ZDCTriggerSimDataBase::getNumData
virtual unsigned int getNumData() const =0
ZDCTriggerSimData::getType
virtual ZDCTriggerSim::DataType getType() const override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:99
ZDCTriggerSim::TCombLUTOutput
@ TCombLUTOutput
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:24
ZDCTriggerSimBase::simLevel1Trig
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &data)=0
ZDCTriggerSimData::getNumData
unsigned int getNumData() const override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:98
ZDCTriggerSimBase::stackClear
void stackClear()
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:179
ZDCTriggerSimAllLUTs::simLevel1Trig
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &inputData) override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:251
ZDCTriggerSimData::ZDCTriggerSimData
ZDCTriggerSimData()
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:80
ZDCTriggerSimDataBase::getValueTrunc
virtual unsigned int getValueTrunc(unsigned int idx=0) const =0
ZDCTriggerSimData::getValueTrunc
virtual unsigned int getValueTrunc(unsigned int idx=0) const override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:101
ZDCTriggerSim::ModuleAmplInputsFloat
ZDCTriggerSimData< float, 8, 12, TModAmplsInput > ModuleAmplInputsFloat
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:138
ZDCTriggerSim::TSideLUTsInput
@ TSideLUTsInput
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:24
athena.value
value
Definition: athena.py:122
ZDCTriggerSimData::ZDCTriggerSimData
ZDCTriggerSimData(const std::vector< float > &conversionFactors)
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:86
ZDCTriggerSim
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:23
ZDCTriggerSim::SideLUTInputsFloat
ZDCTriggerSimData< float, 2, 12, TSideLUTsInput > SideLUTInputsFloat
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:146
ZDCTriggerSimAllLUTs::doSimStage
virtual void doSimStage() override
Definition: ForwardDetectors/ZDC/ZdcUtils/Root/ZDCTriggerSim.cxx:42
ZDCTriggerSimData::m_data
std::vector< T > m_data
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:62
ZDCTriggerSimData::doConvTrunc
unsigned int doConvTrunc(const T &inValue) const
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:65
ZDCTriggerSimModuleAmpls::simLevel1Trig
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &inputData) override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:278
ZDCTriggerSimModuleAmpls
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:262
ZDCTriggerSim::TypeStrings
const std::vector< std::string > TypeStrings
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:26
ZDCTriggerSimBase::~ZDCTriggerSimBase
virtual ~ZDCTriggerSimBase()=default
ZDCTriggerSimData::m_haveData
bool m_haveData
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:63
ZDCTriggerSimData::getNumBits
unsigned int getNumBits() const override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:97
ZDCTriggerSimDataBase
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:34
ZDCTriggerSimBase::SimStack
std::list< ZDCTriggerSim::SimDataCPtr > SimStack
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:174
ZDCTriggerSimData::dump
virtual void dump(std::ostream &strm) const override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:123
ZDCTriggerSimAllLUTs
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:232
ZDCTriggerSimBase::stackTopData
const ZDCTriggerSim::SimDataCPtr & stackTopData() const
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:185
ZDCTriggerSimDataBase::getType
virtual ZDCTriggerSim::DataType getType() const =0
ZDCTriggerSimData::clearData
void clearData()
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:121
Type
RootType Type
Definition: TrigTSerializer.h:30
ZDCTriggerSimDataBase::dump
virtual void dump(std::ostream &strm) const =0
ZDCTriggerSimCombLUT::simLevel1Trig
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &inputBits) override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:221
ZDCTriggerSimCombLUT::ZDCTriggerSimCombLUT
ZDCTriggerSimCombLUT(const std::array< unsigned int, 256 > &inLUT)
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:218
ZDCTriggerSimData::~ZDCTriggerSimData
virtual ~ZDCTriggerSimData() override
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:95
ZDCTriggerSim::CombLUTInputsInt
ZDCTriggerSimData< unsigned int, 2, 4, TCombLUTInput > CombLUTInputsInt
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:151
ZDCTriggerSim::SimDataCPtr
std::shared_ptr< const ZDCTriggerSimDataBase > SimDataCPtr
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:162
ZDCTriggerSim::SimDataPtr
std::shared_ptr< ZDCTriggerSimDataBase > SimDataPtr
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:163
ZDCTriggerSimDataBase::~ZDCTriggerSimDataBase
virtual ~ZDCTriggerSimDataBase()=default
xAODType
Definition: ObjectType.h:13
ZDCTriggerSimCombLUT::doSimStage
virtual void doSimStage() override
Definition: ForwardDetectors/ZDC/ZdcUtils/Root/ZDCTriggerSim.cxx:20
ZDCTriggerSimBase::stackPush
void stackPush(const ZDCTriggerSim::SimDataCPtr &ptr)
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:181
min
#define min(a, b)
Definition: cfImp.cxx:40
ZDCTriggerSimBase::doSimStage
virtual void doSimStage()=0
ZDCTriggerSimBase
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:172
ZDCTriggerSimAllLUTs::m_LUTC
std::array< unsigned int, 4096 > m_LUTC
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:234
ZDCTriggerSimData
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:58
ZDCTriggerSimCombLUT::m_combLUT
std::array< unsigned int, 256 > m_combLUT
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:208
ZDCTriggerSim::TCombLUTInput
@ TCombLUTInput
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:24
ZDCTriggerSimModuleAmpls::ZDCTriggerSimModuleAmpls
ZDCTriggerSimModuleAmpls(const std::array< unsigned int, 4096 > &sideALUT, const std::array< unsigned int, 4096 > &sideCLUT, const std::array< unsigned int, 256 > &inCombLUT)
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:273
ZDCTriggerSim::DataType
DataType
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:24
ZDCTriggerSim::SideLUTInputsInt
ZDCTriggerSimData< unsigned int, 2, 12, TSideLUTsInput > SideLUTInputsInt
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:142
ZDCTriggerSimData::m_convertFactors
std::vector< float > m_convertFactors
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:60
ZDCTriggerSim::CombLUTOutput
ZDCTriggerSimData< unsigned int, 1, 3, TCombLUTOutput > CombLUTOutput
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:160
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
ZDCTriggerSimBase::ZDCTriggerSimBase
ZDCTriggerSimBase()=default
ZDCTriggerSimBase::dump
void dump(std::ostream &strm) const
Definition: ForwardDetectors/ZDC/ZdcUtils/Root/ZDCTriggerSim.cxx:11
ZDCTriggerSimData::m_doConvert
bool m_doConvert
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:59
ZDCTriggerSimData::setData
void setData(const std::vector< T > &inData)
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:116
ZDCTriggerSim::ModuleAmplInputsInt
ZDCTriggerSimData< unsigned int, 8, 12, TModAmplsInput > ModuleAmplInputsInt
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:134
ZDCTriggerSimData::setDatum
void setDatum(T datum)
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:107
ZDCTriggerSimAllLUTs::m_LUTA
std::array< unsigned int, 4096 > m_LUTA
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:233
ZDCTriggerSimCombLUT
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:207
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
ZDCTriggerSimDataBase::getNumBits
virtual unsigned int getNumBits() const =0
ZDCTriggerSimAllLUTs::ZDCTriggerSimAllLUTs
ZDCTriggerSimAllLUTs(const std::array< unsigned int, 4096 > &sideALUT, const std::array< unsigned int, 4096 > &sideCLUT, const std::array< unsigned int, 256 > &inCombLUT)
Definition: ForwardDetectors/ZDC/ZdcUtils/ZdcUtils/ZDCTriggerSim.h:246