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