ATLAS Offline Software
Loading...
Searching...
No Matches
ZdcRecChannelToolLucrod.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5/*
6 * ZdcRecChannelToolLucrod.cxx
7 *
8 * Created on: July 9, 2022
9 * Author: steinber
10 */
11
12
13#include "GaudiKernel/IInterface.h"
14#include "GaudiKernel/MsgStream.h"
15
18#include "ZdcIdentifier/ZdcID.h"
20
21// This will normally be one for HI running, but not for the LHCf run
22#define LUCROD_TRIG_ID 1
23
24//==================================================================================================
26 AsgTool(name)
27{
28 //Declare properties here...
29
30 declareInterface<ZdcRecChannelToolLucrod>(this);
31}
32//==================================================================================================
33
34
35void ZdcRecChannelToolLucrod::handle( const Incident& inc )
36{
37 if ( inc.type() == IncidentType::EndEvent) {
38
39 }
40}
41
42
43//==================================================================================================
45{
46 msg(MSG::INFO) << "Initializing " << name() << endmsg;
47
48 const ZdcID* zdcId = nullptr;
49 if (detStore()->retrieve( zdcId ).isFailure() ) {
50 msg(MSG::ERROR) << "execute: Could not retrieve ZdcID object from the detector store" << endmsg;
51 return StatusCode::FAILURE;
52 }
53 else {
54 msg(MSG::DEBUG) << "execute: retrieved ZdcID" << endmsg;
55 }
56 m_zdcId = zdcId;
57
58 ServiceHandle<IIncidentSvc> incidentSvc("IncidentSvc", name());
59 CHECK(incidentSvc.retrieve());
60 incidentSvc->addListener(this, IncidentType::EndEvent);
61
62 msg(MSG::DEBUG) << "--> ZDC : END OF MODIFICATION 0" << endmsg ;
63 return StatusCode::SUCCESS;
64
65}
66
67//==================================================================================================
68
69//==================================================================================================
71{
72 msg(MSG::INFO) << "Finalizing " << name() << endmsg;
73 return StatusCode::SUCCESS;
74}
75//==================================================================================================
76
78{
79
80 ATH_MSG_DEBUG("Trying to convert LUCROD to Modules!");
81
84
85 typedef std::map<uint32_t,xAOD::ZdcModule*> hashmapType;
86 hashmapType digits_map;
87 Identifier chan_id;
88
89 int Nchan = 0;
90
91 std::vector<uint16_t> rodBCID;
92 std::array<xAOD::ZdcModule*, 2> zdcSideSum_ptrs;
93
94 for (int iside = 0;iside<2;iside++)
95 {
96 xAOD::ZdcModule* new_sum = new xAOD::ZdcModule();
98 zdcSideSum_ptrs[iside] = new_sum;
99 new_sum->setZdcSide((iside==0) ? -1 : 1);
100 }
101
102
103 for (const ZdcLucrodData* zld : *lucrodCollection)
104 {
105 ATH_MSG_DEBUG("Next LUCROD...");
106 uint32_t lucrod_id = zld->GetLucrodID();
107 ATH_MSG_DEBUG("Unpacking LUCROD ID " << lucrod_id << " with BCID=" << zld->GetBCID());
108 rodBCID.push_back(zld->GetBCID());
109
110 const std::vector<uint16_t> zlt = zld->GetTrigData();
111
112 for (size_t i=0;i<zld->GetChanDataSize();i++)
113 {
114 ATH_MSG_DEBUG("Accessing LUCROD ID " << lucrod_id << " chan data " << i);
115 const ZdcLucrodChannel& zlc = zld->GetChanData(i);
116 uint16_t lucrod_channel = zlc.id;
117 ATH_MSG_DEBUG("lucrod_channel=" << lucrod_channel);
118 ATH_MSG_DEBUG("Accessing ZDC map");
119 int side = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["side"][lucrod_channel];
120 int module = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["module"][lucrod_channel];
121 int type = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["type"][lucrod_channel];
122 int channel = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["channel"][lucrod_channel];
123 int gain = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["gain"][lucrod_channel];
124 float xpos = 0;
125 float ypos = 0;
126 unsigned int row = -1;
127 unsigned int col = -1;
128 if (type == 1) // these variables are only defined for RPD in the json file
129 {
130 xpos = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["x"][lucrod_channel];
131 ypos = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["y"][lucrod_channel];
132 row = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["row"][lucrod_channel];
133 col = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["col"][lucrod_channel];
134 }
135
136 ATH_MSG_DEBUG("Done accessing ZDC map side " << side << " module " << module << " type " << type << " channel " << channel << " gain " << gain);
137
138 chan_id = m_zdcId->channel_id(side,module,type,channel);
139 const uint32_t chan_hash = chan_id.get_identifier32().get_compact();
140
141 //find is unnecessary here, should be revisited
142 hashmapType::iterator iter = digits_map.find(chan_hash);
143 if (iter == digits_map.end())
144 {
145 ATH_MSG_DEBUG("new channel for " << chan_id);
146 Nchan++;
147 xAOD::ZdcModule* new_mod = new xAOD::ZdcModule();
149 std::tie(iter, std::ignore) = digits_map.emplace(chan_hash,new_mod);
150 (*iter).second->setZdcId(chan_hash);
151 (*iter).second->setZdcSide(side);
152 (*iter).second->setZdcModule(module);
153 (*iter).second->setZdcType(type);
154 (*iter).second->setZdcChannel(channel);
155
156 // RPDs are labeled as type 1
157 //
158 if (type == 1) {
159 // Save the (nominal) positions of the sector relative to the RPD center
160 //
161 static const SG::Accessor<float_t> xposRelAcc ("xposRel");
162 static const SG::Accessor<float_t> yposRelAcc ("yposRel");
163 static const SG::Accessor<uint16_t> rowAcc ("row");
164 static const SG::Accessor<uint16_t> colAcc ("col");
165 xposRelAcc (*iter->second) = xpos;
166 yposRelAcc (*iter->second) = ypos;
167 rowAcc (*iter->second) = row;
168 colAcc (*iter->second) = col;
169 }
170 }
171
172 if (iter != digits_map.end())
173 {
174
175 ATH_MSG_DEBUG("adding waveform data for " << chan_id << " gain " << gain);
176
177 if (gain==0)
178 {
179 (*iter).second->setWaveform("g0data",zlc.waveform);
180 }
181 if (gain==1)
182 {
183 (*iter).second->setWaveform("g1data",zlc.waveform);
184 }
185
186 if (type == 0) {
187 if (gain ==0) {
188 static const SG::Accessor<uint16_t> LucrodTriggerAmpLGAcc ("LucrodTriggerAmpLG");
189 LucrodTriggerAmpLGAcc (*iter->second) = zlt.at(i);
190 }
191 else {
192 static const SG::Accessor<uint16_t> LucrodTriggerAmpAcc ("LucrodTriggerAmp");
193 LucrodTriggerAmpAcc (*iter->second) = zlt.at(i);
194 }
195 }
196 }
197
198 }
199
200 // Get the trigger information from ZDC lucrods
201 //
202 // Unfortunately, we have to hack a bit to get the information we want
203 //
204 int type = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["type"][0];
205 int gain = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["gain"][0];
206
207 if (type == 0) {
208 std::string auxName = (gain == 0 ? "LucrodTriggerSideAmpLG" : "LucrodTriggerSideAmp");
209 static const SG::Accessor<uint16_t> auxNameAcc (auxName);
210 auxNameAcc ( *zdcSideSum_ptrs[0]) = zld->GetTrigAvgC();
211 auxNameAcc ( *zdcSideSum_ptrs[1]) = zld->GetTrigAvgA();
212 }
213 }
214
215 xAOD::ZdcModule* global_sum = new xAOD::ZdcModule();
217 global_sum->setZdcSide(0); // special "global" sum
218 static const SG::Accessor<std::vector<uint16_t> > rodBCIDAcc ("rodBCID");
219 rodBCIDAcc (*global_sum) = std::move (rodBCID);
220
221 ATH_MSG_DEBUG("Done trying to convert!!");
222
223 return Nchan;
224
225}
226
227
#define endmsg
#define ATH_MSG_DEBUG(x)
Helper class to provide type-safe access to aux data.
#define CHECK(...)
Evaluate an expression and check for errors.
struct ZdcLucrodChannelType ZdcLucrodChannel
const ServiceHandle< StoreGateSvc > & detStore() const
value_type push_back(value_type pElem)
Add an element to the end of the collection.
std::unique_ptr< base_value_type > unique_type
Definition DataVector.h:829
value_type get_compact() const
Get the compact id.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
Helper class to provide type-safe access to aux data.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
Definition ZdcID.h:25
static const ZdcLucrodMapRun3 * getInstance()
const nlohmann::json & getLucrod(int i) const
virtual StatusCode finalize() override
int convertLucrod2ZM(const ZdcLucrodDataContainer *lucrodContainer, xAOD::ZdcModuleContainer *zdcModules, xAOD::ZdcModuleContainer *zdcSums) const
virtual void handle(const Incident &) override
ZdcRecChannelToolLucrod(const std::string &name)
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58
void setZdcSide(int)
ZdcModuleContainer_v1 ZdcModuleContainer
ZdcModule_v1 ZdcModule
Definition ZdcModule.h:15
std::vector< uint16_t > waveform
MsgStream & msg
Definition testRead.cxx:32