ATLAS Offline Software
Loading...
Searching...
No Matches
ZDCTriggerSim.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
10
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
23namespace ZDCTriggerSim {
25
26const std::vector<std::string> TypeStrings = {"CombLUTOutput", "CombLUTInput",
27 "SideLUTsInput", "ModAmplsInput", "FADCInput"};
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//
56template <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 strm << "Data for Type: " << Type << ": ";
125 for (auto datum : m_data) {
126 strm << doConvTrunc(datum) << " ";
127 }
128 strm << std::endl;
129 }
130};
131
132namespace ZDCTriggerSim {
133// The usual way we provide the module amplitudes
134//
135
136// It's easier to input the FADC data as a single vector of 8 channels * NBCID* 8 samples/BCID 12-bit data
137// For physics data, we usually read 3 BCIDs
138//
140
143
144// The usual way we provide the module amplitudes
145//
147
148// The usual way we provide input to the side LUTs
149//
151
152// In case we want to be able to convert from energies or other floating input
153//
155
156// The "usual" way we provide inputs to the combined LUT -- with unsigned
157// integers
158//
160
161// In case we want to be able to convert from energies or other float
162// to the integer inputs to the combined LUT
163//
164// typedef ZDCTriggerSimData<float, 2, 4> CombLUTInputsFloat;
165
166// The combined LUT produces 3 output bits
167//
169
170typedef std::shared_ptr<const ZDCTriggerSimDataBase> SimDataCPtr;
171typedef std::shared_ptr<ZDCTriggerSimDataBase> SimDataPtr;
172} // namespace ZDCTriggerSim
173
174// Base class for the ZDC trigger simulation.
175//
176// It is an abstract base that also provides the stack holding the intermediate
177// results
178//
179//
181 typedef std::list<ZDCTriggerSim::SimDataCPtr> SimStack;
182
183private:
185
186 protected:
187 void stackClear() { m_stack.clear(); }
188
190 m_stack.push_back(SimStack::value_type(ptr));
191 }
192
194 return m_stack.back();
195 }
196
197 // Take the data on the "top" of the stack and use it as input, adding new
198 // data to the stack
199 //
200 virtual void doSimStage() = 0;
201
202 public:
203 ZDCTriggerSimBase() = default;
204 virtual ~ZDCTriggerSimBase() = default;
205
206 // Every implementation of the base should ultimately produce the L1 bits
207 // possibly (usually) through recursion
208 //
209 virtual unsigned int simLevel1Trig(
211
212 SimStack::const_iterator stackBottom() const
213 {
214 return m_stack.begin();
215 }
216
217 SimStack::const_reverse_iterator stackTop() const {
218 return m_stack.rbegin();
219 }
220
221 void dump(std::ostream& strm) const;
222};
223
225 std::array<unsigned int, 256> m_combLUT{};
226
227 protected:
228 //
229 // The data on the top of the stack should be the two 4 bit inputs
230 // to the combined LUT. The output is the combined LUT output
231 //
232 virtual void doSimStage() override;
233
234 public:
235 ZDCTriggerSimCombLUT(const std::array<unsigned int, 256>& inLUT)
236 : m_combLUT(inLUT) {}
237
238 virtual unsigned int simLevel1Trig(
239 const ZDCTriggerSim::SimDataCPtr& inputBits) override {
240 stackClear();
241 stackPush(inputBits);
242
243 doSimStage();
244 return stackTopData()->getValueTrunc();
245 }
246};
247
249 public ZDCTriggerSimCombLUT {
250 std::array<unsigned int, 4096> m_LUTA{};
251 std::array<unsigned int, 4096> m_LUTC{};
252
253 protected:
254 //
255 // The data on the top of the stack should be the two 12 bit inputs
256 // to each of the side LUT. The output is the two side LUT outputs.
257 //
258 // After we excute the side LUT, we call the CombLUT doSimStage();
259 //
260 virtual void doSimStage() override;
261
262 public:
263 ZDCTriggerSimAllLUTs(const std::array<unsigned int, 4096>& sideALUT,
264 const std::array<unsigned int, 4096>& sideCLUT,
265 const std::array<unsigned int, 256>& inCombLUT)
266 : ZDCTriggerSimCombLUT(inCombLUT), m_LUTA(sideALUT), m_LUTC(sideCLUT) {}
267
268 virtual unsigned int simLevel1Trig(
269 const ZDCTriggerSim::SimDataCPtr& inputData) override {
270 stackClear();
271 stackPush(inputData);
272
273 doSimStage();
274 return stackTopData()->getValueTrunc();
275 }
276};
277
279 public ZDCTriggerSimAllLUTs {
280 protected:
281 //
282 // The data on the top of the stack should be the 8 module amplitudes
283 // four for each ZDC. From these we obtain the module sums divided by four
284 //
285 // After we evalute the per-side sums, we call the AllLUTs doSimStage();
286 //
287 virtual void doSimStage() override;
288
289 public:
290 ZDCTriggerSimModuleAmpls(const std::array<unsigned int, 4096>& sideALUT,
291 const std::array<unsigned int, 4096>& sideCLUT,
292 const std::array<unsigned int, 256>& inCombLUT)
293 : ZDCTriggerSimAllLUTs(sideALUT, sideCLUT, inCombLUT) {}
294
295 virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr& inputData) override {
296 stackClear();
297 stackPush(inputData);
298
299 doSimStage();
300 return stackTopData()->getValueTrunc();
301 }
302};
303
306{
307 std::array<std::array<unsigned int, 4>, 2> m_deriv2ndThresholds;
308 unsigned int m_minSampleAna{};
309 unsigned int m_maxSampleAna{};
310 unsigned int m_baselineDelta{};
311
312 std::array<std::array<int, 4>, 2> m_maxNegDeriv2nd{};
313 std::array<std::array<unsigned int, 4>, 2> m_maxADC{};
314 std::array<std::array<unsigned int, 4>, 2> m_baseline{};
315
316protected:
317 //
318 // The data on the top of the stack should be the FADC data for
319 // the eight ZDC channels. There should be a total of 8*3*8 samples
320 //
321 // After we excute
322 //
323 virtual void doSimStage() override;
324
325 std::vector<unsigned int> CalculateNeg2ndDerivatives(const std::vector<unsigned int>& samples, unsigned int step);
326
327 public:
328 ZDCTriggerSimFADC(const std::array<unsigned int, 4096>& sideALUT,
329 const std::array<unsigned int, 4096>& sideCLUT,
330 const std::array<unsigned int, 256>& inCombLUT,
331 const std::array<std::array<unsigned int, 4>, 2>& negDeriv2ndThresh,
332 unsigned int minSampleAna, unsigned int maxSampleAna, unsigned int baselineDelta) :
333 ZDCTriggerSimModuleAmpls(sideALUT, sideCLUT, inCombLUT),
334 m_deriv2ndThresholds(negDeriv2ndThresh),
335 m_minSampleAna(minSampleAna),
336 m_maxSampleAna(maxSampleAna),
337 m_baselineDelta(baselineDelta)
338 {}
339
340 virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr& inputData) override {
341 stackClear();
342 stackPush(inputData);
343
344 doSimStage();
345 return stackTopData()->getValueTrunc();
346 }
347
348
349 const auto& getMaxNegDeriv2nds() const {return m_maxNegDeriv2nd;}
350 const auto& getMaxADCs() const {return m_maxADC;}
351 const auto& getBaselines() const {return m_baseline;}
352};
353
354
355#endif
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
virtual void doSimStage() override
ZDCTriggerSimAllLUTs(const std::array< unsigned int, 4096 > &sideALUT, const std::array< unsigned int, 4096 > &sideCLUT, const std::array< unsigned int, 256 > &inCombLUT)
std::array< unsigned int, 4096 > m_LUTA
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &inputData) override
std::array< unsigned int, 4096 > m_LUTC
std::list< ZDCTriggerSim::SimDataCPtr > SimStack
virtual ~ZDCTriggerSimBase()=default
const ZDCTriggerSim::SimDataCPtr & stackTopData() const
SimStack::const_reverse_iterator stackTop() const
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &data)=0
ZDCTriggerSimBase()=default
SimStack::const_iterator stackBottom() const
void stackPush(const ZDCTriggerSim::SimDataCPtr &ptr)
virtual void doSimStage()=0
ZDCTriggerSimCombLUT(const std::array< unsigned int, 256 > &inLUT)
std::array< unsigned int, 256 > m_combLUT
virtual void doSimStage() override
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &inputBits) override
virtual ZDCTriggerSim::DataType getType() const =0
virtual unsigned int getNumData() const =0
virtual void dump(std::ostream &strm) const =0
virtual ~ZDCTriggerSimDataBase()=default
virtual unsigned int getValueTrunc(unsigned int idx=0) const =0
virtual unsigned int getNumBits() const =0
ZDCTriggerSimData(const std::vector< float > &conversionFactors)
virtual ZDCTriggerSim::DataType getType() const override
unsigned int getNumBits() const override
void setData(const std::vector< T > &inData)
virtual void dump(std::ostream &strm) const override
unsigned int getNumData() const override
void setDatum(T datum)
unsigned int doConvTrunc(const T &inValue) const
virtual unsigned int getValueTrunc(unsigned int idx=0) const override
virtual ~ZDCTriggerSimData() override
std::vector< unsigned int > CalculateNeg2ndDerivatives(const std::vector< unsigned int > &samples, unsigned int step)
std::array< std::array< int, 4 >, 2 > m_maxNegDeriv2nd
std::array< std::array< unsigned int, 4 >, 2 > m_deriv2ndThresholds
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &inputData) override
unsigned int m_maxSampleAna
ZDCTriggerSimFADC(const std::array< unsigned int, 4096 > &sideALUT, const std::array< unsigned int, 4096 > &sideCLUT, const std::array< unsigned int, 256 > &inCombLUT, const std::array< std::array< unsigned int, 4 >, 2 > &negDeriv2ndThresh, unsigned int minSampleAna, unsigned int maxSampleAna, unsigned int baselineDelta)
const auto & getMaxNegDeriv2nds() const
std::array< std::array< unsigned int, 4 >, 2 > m_maxADC
virtual void doSimStage() override
std::array< std::array< unsigned int, 4 >, 2 > m_baseline
const auto & getMaxADCs() const
unsigned int m_minSampleAna
unsigned int m_baselineDelta
const auto & getBaselines() const
ZDCTriggerSimModuleAmpls(const std::array< unsigned int, 4096 > &sideALUT, const std::array< unsigned int, 4096 > &sideCLUT, const std::array< unsigned int, 256 > &inCombLUT)
virtual unsigned int simLevel1Trig(const ZDCTriggerSim::SimDataCPtr &inputData) override
virtual void doSimStage() override
ZDCTriggerSimData< unsigned int, 8, 12, TModAmplsInput > ModuleAmplInputsInt
const std::vector< std::string > TypeStrings
ZDCTriggerSimData< unsigned int, 2, 12, TSideLUTsInput > SideLUTInputsInt
ZDCTriggerSimData< unsigned int, 2, 4, TCombLUTInput > CombLUTInputsInt
ZDCTriggerSimData< unsigned int, 1, 3, TCombLUTOutput > CombLUTOutput
ZDCTriggerSimData< float, 8, 12, TModAmplsInput > ModuleAmplInputsFloat
ZDCTriggerSimData< unsigned int, 8 *24, 12, TFADCInputs > FADCInputs
ZDCTriggerSimData< float, 2, 12, TSideLUTsInput > SideLUTInputsFloat
std::shared_ptr< const ZDCTriggerSimDataBase > SimDataCPtr
std::shared_ptr< ZDCTriggerSimDataBase > SimDataPtr
-event-from-file