ATLAS Offline Software
ZdcRecChannelToolLucrod.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 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"
19 #include "AthContainers/Accessor.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 
35 void 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 
139  const uint32_t chan_hash = chan_id.get_identifier32().get_compact();
140 
141 
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();
148  zdcModules->push_back(xAOD::ZdcModuleContainer::unique_type(new_mod));
149  digits_map.insert(std::pair<uint32_t,xAOD::ZdcModule*>(chan_hash,new_mod));
150  iter = digits_map.find(chan_hash);
151  (*iter).second->setZdcId(chan_hash);
152  (*iter).second->setZdcSide(side);
153  (*iter).second->setZdcModule(module);
154  (*iter).second->setZdcType(type);
155  (*iter).second->setZdcChannel(channel);
156 
157  // RPDs are labeled as type 1
158  //
159  if (type == 1) {
160  // Save the (nominal) positions of the sector relative to the RPD center
161  //
162  static const SG::Accessor<float_t> xposRelAcc ("xposRel");
163  static const SG::Accessor<float_t> yposRelAcc ("yposRel");
164  static const SG::Accessor<uint16_t> rowAcc ("row");
165  static const SG::Accessor<uint16_t> colAcc ("col");
166  xposRelAcc (*iter->second) = xpos;
167  yposRelAcc (*iter->second) = ypos;
168  rowAcc (*iter->second) = row;
169  colAcc (*iter->second) = col;
170  }
171  }
172 
173  if (iter != digits_map.end())
174  {
175 
176  ATH_MSG_DEBUG("adding waveform data for " << chan_id << " gain " << gain);
177 
178  if (gain==0)
179  {
180  (*iter).second->setWaveform("g0data",zlc.waveform);
181  }
182  if (gain==1)
183  {
184  (*iter).second->setWaveform("g1data",zlc.waveform);
185  }
186 
187  if (type == 0) {
188  if (gain ==0) {
189  static const SG::Accessor<uint16_t> LucrodTriggerAmpLGAcc ("LucrodTriggerAmpLG");
190  LucrodTriggerAmpLGAcc (*iter->second) = zlt.at(i);
191  }
192  else {
193  static const SG::Accessor<uint16_t> LucrodTriggerAmpAcc ("LucrodTriggerAmp");
194  LucrodTriggerAmpAcc (*iter->second) = zlt.at(i);
195  }
196  }
197  }
198 
199  }
200 
201  // Get the trigger information from ZDC lucrods
202  //
203  // Unfortunately, we have to hack a bit to get the information we want
204  //
205  int type = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["type"][0];
206  int gain = ZdcLucrodMapRun3::getInstance()->getLucrod(lucrod_id)["gain"][0];
207 
208  if (type == 0) {
209  std::string auxName = (gain == 0 ? "LucrodTriggerSideAmpLG" : "LucrodTriggerSideAmp");
210  static const SG::Accessor<uint16_t> auxNameAcc (auxName);
211  auxNameAcc ( *zdcSideSum_ptrs[0]) = zld->GetTrigAvgC();
212  auxNameAcc ( *zdcSideSum_ptrs[1]) = zld->GetTrigAvgA();
213  }
214  }
215 
216  xAOD::ZdcModule* global_sum = new xAOD::ZdcModule();
217  zdcSums->push_back(xAOD::ZdcModuleContainer::unique_type(global_sum));
218  global_sum->setZdcSide(0); // special "global" sum
219  static const SG::Accessor<std::vector<uint16_t> > rodBCIDAcc ("rodBCID");
220  rodBCIDAcc (*global_sum) = std::move (rodBCID);
221 
222  ATH_MSG_DEBUG("Done trying to convert!!");
223 
224  return Nchan;
225 
226 }
227 
228 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
query_example.row
row
Definition: query_example.py:24
ZdcLucrodChannelType
Definition: ZdcLucrodData.h:12
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:24
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
ZdcLucrodDataContainer
Definition: ZdcLucrodDataContainer.h:12
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
xAOD::ZdcModule_v1
Class containing ZDC Module information.
Definition: ZdcModule_v1.h:25
Identifier::get_identifier32
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
Identifier32::get_compact
value_type get_compact() const
Get the compact id.
Definition: Identifier32.h:44
ZdcLucrodMapRun3::getLucrod
const nlohmann::json & getLucrod(int i) const
Definition: ZdcLucrodMapRun3.h:23
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
ZdcID::channel_id
Identifier channel_id(int side, int module, int type, int channel) const
Definition: ZdcID.h:205
TRT::Hit::side
@ side
Definition: HitInfo.h:83
python.PyAthena.module
module
Definition: PyAthena.py:131
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:93
ZdcLucrodChannelType::waveform
std::vector< uint16_t > waveform
Definition: ZdcLucrodData.h:15
lumiFormat.i
int i
Definition: lumiFormat.py:85
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ZdcRecChannelToolLucrod::convertLucrod2ZM
int convertLucrod2ZM(const ZdcLucrodDataContainer *lucrodContainer, xAOD::ZdcModuleContainer *zdcModules, xAOD::ZdcModuleContainer *zdcSums) const
Definition: ZdcRecChannelToolLucrod.cxx:77
ZdcLucrodMapRun3.h
ZdcRecChannelToolLucrod::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: ZdcRecChannelToolLucrod.cxx:44
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
DataVector::unique_type
std::unique_ptr< base_value_type > unique_type
Type of a unique_ptr that can be used to insert elements into this container.
Definition: DataVector.h:828
ZdcRecChannelToolLucrod::finalize
virtual StatusCode finalize() override
Definition: ZdcRecChannelToolLucrod.cxx:70
xAOD::ZdcModule
ZdcModule_v1 ZdcModule
Definition: ZdcModule.h:15
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ZdcRecChannelToolLucrod::m_zdcId
const ZdcID * m_zdcId
Definition: ZdcRecChannelToolLucrod.h:46
Accessor.h
Helper class to provide type-safe access to aux data.
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
query_example.col
col
Definition: query_example.py:7
ZdcID.h
xAOD::ZdcModule_v1::setZdcSide
void setZdcSide(int)
ZdcLucrodData
Definition: ZdcLucrodData.h:20
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DEBUG
#define DEBUG
Definition: page_access.h:11
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
ZdcLucrodChannelType::id
unsigned int id
Definition: ZdcLucrodData.h:14
ZdcRecChannelToolLucrod::handle
virtual void handle(const Incident &) override
Definition: ZdcRecChannelToolLucrod.cxx:35
ZdcRecChannelToolLucrod::ZdcRecChannelToolLucrod
ZdcRecChannelToolLucrod(const std::string &name)
Definition: ZdcRecChannelToolLucrod.cxx:25
ZdcID
Definition: ZdcID.h:25
ZdcRecChannelToolLucrod.h
ServiceHandle< IIncidentSvc >
ZdcLucrodMapRun3::getInstance
static const ZdcLucrodMapRun3 * getInstance()
Definition: ZdcLucrodMapRun3.cxx:10
Identifier
Definition: IdentifierFieldParser.cxx:14