ATLAS Offline Software
Loading...
Searching...
No Matches
TrigT1Run3ZDC.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4#include "TrigT1Run3ZDC.h"
5
6#include <bitset>
7#include <fstream>
8#include <stdexcept>
9
11#include "ZdcIdentifier/ZdcID.h"
12
13using json = nlohmann::json;
14
15namespace LVL1 {
16
17//---------------------------------
18// initialise()
19//---------------------------------
20
22 ATH_CHECK(m_zdcCTPLocation.initialize());
24 ATH_CHECK(m_zldContainerName.initialize());
25 // Find the full path to filename:
27 ATH_MSG_INFO("Reading file " << file);
28 std::ifstream fin(file.c_str());
29 if (!fin) {
30 ATH_MSG_ERROR("Can not read file: " << file);
31 return StatusCode::FAILURE;
32 }
33 json data = json::parse(fin);
34
35 // Will eventually obtain LUTs from COOL, for now obtain them from calibration
36 // area A data member to hold the side A LUT values
37 std::array<unsigned int, 4096> sideALUTHG =
38 data["LucrodHighGain"]["LUTs"]["sideA"];
39 // A data member to hold the side C LUT values
40 std::array<unsigned int, 4096> sideCLUTHG =
41 data["LucrodHighGain"]["LUTs"]["sideC"];
42 // A data member to hold the Combined LUT values
43 std::array<unsigned int, 256> combLUTHG =
44 data["LucrodHighGain"]["LUTs"]["comb"];
45 // area A data member to hold the side A LUT values
46 std::array<unsigned int, 4096> sideALUTLG =
47 data["LucrodLowGain"]["LUTs"]["sideA"];
48 // A data member to hold the side C LUT values
49 std::array<unsigned int, 4096> sideCLUTLG =
50 data["LucrodLowGain"]["LUTs"]["sideC"];
51 // A data member to hold the Combined LUT values
52 std::array<unsigned int, 256> combLUTLG =
53 data["LucrodLowGain"]["LUTs"]["comb"];
54
55 // Access Raw Lucrod Data
56 const ZdcID *zdcId = nullptr;
57 if (detStore()->retrieve(zdcId).isFailure()) {
58 msg(MSG::ERROR)
59 << "execute: Could not retrieve ZdcID object from the detector store"
60 << endmsg;
61 return StatusCode::FAILURE;
62 } else {
63 msg(MSG::DEBUG) << "execute: retrieved ZdcID" << endmsg;
64 }
65 m_zdcId = zdcId;
66
67 std::array<std::array<unsigned int, 4>, 2> deriv2ndHGThresh;
68 std::array<std::array<unsigned int, 4>, 2> deriv2ndLGThresh;
69
70 for (unsigned int side : {0, 1}) {
71 for (unsigned int module : {0, 1, 2, 3}) {
72 deriv2ndHGThresh[side][module] = m_negHG2ndDerivThresh;
73 deriv2ndLGThresh[side][module] = m_negLG2ndDerivThresh;
74 }
75 }
76
77 // We disable the EM module in the LG trigger
78 //
79 deriv2ndLGThresh[0][0] = 4095;
80 deriv2ndLGThresh[1][0] = 4095;
81
82 std::cout << "Trigger simulation will use sample indices: " << m_minSampleAna
83 << " through " << m_maxSampleAna
84 << ", and baselinDelta = " << m_baselineDelta << std::endl;
85
86 // Construct Simulation Objects
87 m_triggerSimHGPtr = std::make_shared<ZDCTriggerSimFADC>(
88 ZDCTriggerSimFADC(sideALUTHG, sideCLUTHG, combLUTHG, deriv2ndHGThresh,
90
91 m_triggerSimLGPtr = std::make_shared<ZDCTriggerSimFADC>(
92 ZDCTriggerSimFADC(sideALUTLG, sideCLUTLG, combLUTLG, deriv2ndLGThresh,
94
96 std::make_shared<ZDCTriggerSim::FADCInputs>(ZDCTriggerSim::FADCInputs());
98 std::make_shared<ZDCTriggerSim::FADCInputs>(ZDCTriggerSim::FADCInputs());
99
100 ATH_MSG_DEBUG("TrigT1Run3ZDC initilized");
101 return StatusCode::SUCCESS;
102}
103
104//----------------------------------------------
105// execute() method called once per event
106//----------------------------------------------
107
108StatusCode TrigT1Run3ZDC::execute(const EventContext& ctx) const {
109
110 // create uints to hold trigger averages
111 unsigned int trigAvgAHG = 0;
112 unsigned int trigAvgCHG = 0;
113 unsigned int trigAvgALG = 0;
114 unsigned int trigAvgCLG = 0;
115
116 // create multi-dim array to store event by event flash ADC values
117 std::array<std::array<std::array<unsigned int, 24>, 4>, 2> FADCSamplesHG;
118 std::array<std::array<std::array<unsigned int, 24>, 4>, 2> FADCSamplesLG;
119
120 // create vectors to store flattened above multi
121 // dim arrays, in order to give the TriggerSimTool
122 // data in the proper format
123 std::vector<unsigned int> FADCFlattenedHG;
124 std::vector<unsigned int> FADCFlattenedLG;
125
126 // access LUCROD data
127
128 // use readhandle to retrieve lucrodCollection
130
131 for (const ZdcLucrodData *zld : *lucrodCollection) {
132
133 // get lucrod board number
134 uint32_t lucrod_id = zld->GetLucrodID();
135
136 // unpack data for each lucrod
137 for (size_t i = 0; i < zld->GetChanDataSize(); i++) {
138
139 // create channel object
140 const ZdcLucrodChannel &zlc = zld->GetChanData(i);
141
142 // figure out which channel we are reading out (0,1)
143 uint16_t lucrod_channel = zlc.id;
144
145 // variable to hold if it is a ZDC (0) or RPD (1) type
146 // lucrod
148 lucrod_id)["type"][lucrod_channel];
149
150 // trigger based on ZDC amplitudes, don't use
151 // RPD channels
152 if (type != 0) {
153 continue;
154 }
155
156 // retrieve what side, module, and gain we are reading out
158 lucrod_id)["side"][lucrod_channel];
160 lucrod_id)["module"][lucrod_channel];
162 lucrod_id)["gain"][lucrod_channel];
163
164 // Fill different flash ADC vectors for Low and High
165 // gain samples
166 if (gain == 0) {
167 unsigned int counter = 0;
168 for (const auto &sample : zlc.waveform) {
169 // fill low gain FADC samples
170 FADCSamplesLG.at((side == 1)).at(module).at(counter) = sample;
171 counter++;
172 }
173 } else if (gain == 1) {
174 unsigned int counter = 0;
175 for (const auto &sample : zlc.waveform) {
176 // fill high gain FADC samples
177 FADCSamplesHG.at((side == 1)).at(module).at(counter) = sample;
178 counter++;
179 }
180 }
181 // retrieve Trig Avg amp for debugging
182 // from both LG and HG modules
183 if (side * gain * module == 3) {
184 trigAvgAHG = zld->GetTrigAvgA();
185 trigAvgCHG = zld->GetTrigAvgC();
186 } else if (side * module == 3) {
187 trigAvgALG = zld->GetTrigAvgA();
188 trigAvgCLG = zld->GetTrigAvgC();
189 }
190 }
191 } // end lucrod loop
192
193 // unpack FADC data into one long vector for both
194 // high and low gain
195 for (int side : {1, 0}) {
196 for (int module : {0, 1, 2, 3}) {
197 for (const auto sample : FADCSamplesLG.at(side).at(module)) {
198 FADCFlattenedLG.push_back(sample);
199 }
200 }
201 }
202
203 for (int side : {1, 0}) {
204 for (int module : {0, 1, 2, 3}) {
205 for (const auto sample : FADCSamplesHG.at(side).at(module)) {
206 FADCFlattenedHG.push_back(sample);
207 }
208 }
209 }
210
211 // set data in Trigger Sim Object
212 m_hgFADC_ptr->setData(FADCFlattenedHG);
213 m_lgFADC_ptr->setData(FADCFlattenedLG);
214
215 // call ZDCTriggerSim to actually get L1 decisions
216 unsigned int wordOutHG = m_triggerSimHGPtr->simLevel1Trig(m_hgFADC_ptr);
217 unsigned int wordOutLG = m_triggerSimLGPtr->simLevel1Trig(m_lgFADC_ptr);
218
219 // convert int to bitset for ZDC Triggers
220 std::bitset<3> binhg(wordOutHG);
221
222 // convert int to bitset for ZDC ALT Trigggers
223 std::bitset<3> binlg(wordOutLG);
224
225 // ZDC L1 items are located on CTPIN SLOT 9
226 // Each slot holds 4 connectors that each carry a 32 bit trigger word
227 // ZDC HG items are located on Connector 1 (CTPCAL)
228 // at bits 25, 26, 27
229 // ZDC LG (UCC) items are located on Connector 3 (NIM3)
230 // at bits 28, 29, 30
231 // for more info see
232 // twiki.cern.ch/twiki/bin/view/Atlas/LevelOneCentralTriggerSetup#CTPIN_Slot_9
233
234 // load HG output into trigger word on correct bits
235 unsigned int word0 = 0;
236 word0 += (binhg[0] << 25);
237 word0 += (binhg[1] << 26);
238 word0 += (binhg[2] << 27);
239
240 // load LG output into trigger word on correct bits
241 unsigned int word1 = 0;
242 word1 += (binlg[0] << 28);
243 word1 += (binlg[1] << 29);
244 word1 += (binlg[2] << 30);
245
246 // form CTP obejct
248
249 // record CTP object
250 ATH_CHECK(zdcCTP.record(std::make_unique<ZdcCTP>(word0, word1)));
251
252 // debug output
254 "Stored ZDC CTP object with words "
255 << std::endl
256 << std::hex << word0 << " from hgLUTOutput: " << std::dec << wordOutHG
257 << " AvgAmpA: " << trigAvgAHG << " C: " << trigAvgCHG << std::endl
258 << std::hex << word1 << " from lgLUTOutput: " << std::dec << wordOutLG
259 << " AvgAmpA: " << trigAvgALG << " C: " << trigAvgCLG);
260
261 return StatusCode::SUCCESS;
262}
263} // namespace LVL1
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
nlohmann::json json
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
struct ZdcLucrodChannelType ZdcLucrodChannel
const ServiceHandle< StoreGateSvc > & detStore() const
Gaudi::Property< unsigned int > m_maxSampleAna
Gaudi::Property< unsigned int > m_negLG2ndDerivThresh
std::shared_ptr< ZDCTriggerSimFADC > m_triggerSimLGPtr
SG::ReadHandleKey< ZdcLucrodDataContainer > m_zldContainerName
virtual StatusCode initialize() override
Gaudi::Property< unsigned int > m_minSampleAna
SG::WriteHandleKey< ZdcCTP > m_zdcCTPLocation
std::shared_ptr< ZDCTriggerSimFADC > m_triggerSimHGPtr
Two data member to hold the ZDCTrigger Object that computes the LUT logic: shared ptr to ensure clean...
Gaudi::Property< std::string > m_lutFile
std::shared_ptr< ZDCTriggerSim::FADCInputs > m_hgFADC_ptr
A data member to hold the ZDCTrigger Object that stores flash ADC input values: shared ptr to ensure ...
Gaudi::Property< unsigned int > m_negHG2ndDerivThresh
const ZdcID * m_zdcId
SG::ReadDecorHandleKey< xAOD::ZdcModuleContainer > m_zdcModuleCalibEnergyKey
Gaudi::Property< unsigned int > m_baselineDelta
std::shared_ptr< ZDCTriggerSim::FADCInputs > m_lgFADC_ptr
virtual StatusCode execute(const EventContext &ctx) const override
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
Definition ZdcID.h:25
static const ZdcLucrodMapRun3 * getInstance()
const nlohmann::json & getLucrod(int i) const
eFexTowerBuilder creates xAOD::eFexTowerContainer from supercells (LATOME) and triggerTowers (TREX) i...
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
ZDCTriggerSimData< unsigned int, 8 *24, 12, TFADCInputs > FADCInputs
std::vector< uint16_t > waveform
TFile * file