ATLAS Offline Software
LArCalibParams.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "GaudiKernel/Bootstrap.h"
7 #include "GaudiKernel/ISvcLocator.h"
11 
13  m_onlineHelper(nullptr),
14  m_uniqueConfig(false)
15 {}
16 
18 {
19  //Get online Helper via DetectorStore
20  ISvcLocator* svcLoc = Gaudi::svcLocator( );
22  MsgStream log(Athena::getMessageSvc(), "LArCalibParams");
23  StatusCode sc = svcLoc->service( "DetectorStore",detStore);
24  if (sc.isSuccess()) {
25  sc=detStore->retrieve(m_onlineHelper, "LArOnlineID");
26  if (sc.isFailure()) {
27  log << MSG::ERROR << "LArCalibParams: Can't get LArOnlineID" << endmsg;
28  return (StatusCode::FAILURE);
29  }
30  }
31  else {
32  log << MSG::ERROR << "LArCalibParams: Can't get DetectorStore" << endmsg;
33  return (StatusCode::FAILURE);
34  }
35 
36  return (StatusCode::SUCCESS);
37 
38 }
39 
40 
42 {
43  //std::cout << "Destructor of LArCalibParams" << std::endl;
44 }
45 
46 void LArCalibParams::set(const HWIdentifier CalibModuleID, const unsigned nTrigger,
47  const std::vector<unsigned>& Pattern, const std::vector<unsigned>& DAC, const std::vector<unsigned>& Delay)
48 
49 {if (m_uniqueConfig) //Had unique configuration before
50  {m_mCalibBoards.clear(); //Clear parameters
51  m_uniqueConfig=false;
52  }
53  m_mCalibBoards[CalibModuleID].m_nTrigger=nTrigger;
54  for (unsigned i=0;i<DAC.size();i++)
55  m_mCalibBoards[CalibModuleID].m_DAC.push_back(DAC[i]);
56  for (unsigned i=0;i<Delay.size();i++)
57  m_mCalibBoards[CalibModuleID].m_Delay.push_back(Delay[i]);
58  for (unsigned i=0;i<Pattern.size();i++) {
59  m_mCalibBoards[CalibModuleID].m_Pattern.push_back(Pattern[i]);
60  }
61  return;
62 }
63 
64 
65 void LArCalibParams::set(const unsigned nTrigger, const std::vector<unsigned>& Pattern,
66  const std::vector<unsigned>& DAC, const std::vector<unsigned>& Delay)
67 {// Assume only one set of parameters, valid for all boards.
68  m_mCalibBoards.clear();
69  m_uniqueConfig=true;
70  const HWIdentifier CalibModuleID(0);
71  m_mCalibBoards[CalibModuleID].m_nTrigger=nTrigger;
72  for (unsigned i=0;i<DAC.size();i++)
73  m_mCalibBoards[CalibModuleID].m_DAC.push_back(DAC[i]);
74  for (unsigned i=0;i<Delay.size();i++)
75  m_mCalibBoards[CalibModuleID].m_Delay.push_back(Delay[i]);
76  for (unsigned i=0;i<Pattern.size();i++)
77  m_mCalibBoards[CalibModuleID].m_Pattern.push_back(Pattern[i]);
78  return;
79 }
80 
81 
82 /* We assume that calib-board configuration is set in the following order:
83 1) Trigger
84 2) Pattern
85 3) Delay
86 4) DAC
87 
88 */
89 
90 bool LArCalibParams::CalibBoard::isPulsed(const unsigned event, const unsigned short lineNumber) const
91 { //The pattern is changed after nTrigger events.
92  const unsigned PatternStepSize=m_nTrigger;
93  unsigned iPattern=(event/PatternStepSize)%(m_Pattern.size()/4);
94  iPattern*=4; //A pattern consists of 4 words (4*32bit= 128 bit)
95  const unsigned nWord=lineNumber>>5; //lineNumber/32;
96  const unsigned Pattern=m_Pattern[iPattern+nWord];
97  const unsigned nBit=lineNumber&0x1f; //lineNumber%32;
98  return Pattern>>nBit & 0x1;
99 }
100 
101 
102 unsigned LArCalibParams::CalibBoard::Delay(const unsigned event) const
103 { //The delay value is changed after nTrigger*nPattern events
104  const unsigned DelayStepSize=m_nTrigger*m_Pattern.size()/4; //1 pattern = 4 words
105  const unsigned iDelay=(event/DelayStepSize)%m_Delay.size();
106  return m_Delay[iDelay];
107 }
108 
109 
110 unsigned LArCalibParams::CalibBoard::DAC(const unsigned event) const
111 { //The DAC is changed after nTrigger*nDelay*nPattern events
112  const unsigned DACStepSize=m_nTrigger*m_Delay.size()*m_Pattern.size()/4; //1 pattern = 4 words
113  const unsigned iDAC=event/DACStepSize;
114  if (iDAC<m_DAC.size()) {
115  //std::cout << "CalibBoard Returning DAC=" << m_DAC[iDAC] << " Index=" << iDAC << " Stepsize=" << DACStepSize << std::endl;
116  return m_DAC[iDAC];
117  }
118  else {
119  MsgStream log(Athena::getMessageSvc(), "LArCalibParams::DAC");
120  log << MSG::ERROR << "Event #" << event << ": DAC index out of range! ("
121  << iDAC << "max=" << m_DAC.size() << "). Return kmaxDAC" << endmsg;
122  return kmaxDAC;
123  }
124 }
125 
126 
127 
128 unsigned LArCalibParams::Delay(const unsigned event, const HWIdentifier calibLineID) const
129 {if (calibLineID.get_compact()==0) return 0; //Disconnected channel
130  if (m_uniqueConfig && !m_mCalibBoards.empty())
131  return m_mCalibBoards.begin()->second.Delay(event);
132  else {
133  if (!m_onlineHelper) {
134  MsgStream log(Athena::getMessageSvc(), "LArCalibParams::Delay");
135  log << MSG::ERROR << "LArOnlineID not defined! Can't determine Delay value." << endmsg;
136  return 0;
137  }
138  const HWIdentifier calibModuleID=m_onlineHelper->calib_module_Id(calibLineID);
139  const std::map<HWIdentifier, CalibBoard>::const_iterator map_it=m_mCalibBoards.find(calibModuleID);
140  if (map_it==m_mCalibBoards.end())
141  return 0; //Can't find Board configuration -> Assume board is not configured.
142  else
143  return map_it->second.Delay(event);
144  }
145 }
146 
147 unsigned LArCalibParams::DAC(const unsigned event, const HWIdentifier calibLineID) const
148 {if (calibLineID.get_compact()==0) return 0; //Disconnected channel
149  if (m_uniqueConfig && !m_mCalibBoards.empty())
150  return m_mCalibBoards.begin()->second.DAC(event);
151  else {
152  if (!m_onlineHelper) {
153  MsgStream log(Athena::getMessageSvc(), "LArCalibParams::DAC");
154  log << MSG::ERROR << "LArOnlineID not defined! Can't determine DAC value." << endmsg;
155  return 0;
156  }
157  const HWIdentifier calibModuleID=m_onlineHelper->calib_module_Id(calibLineID);
158  const std::map<HWIdentifier, CalibBoard>::const_iterator map_it=m_mCalibBoards.find(calibModuleID);
159  if (map_it==m_mCalibBoards.end())
160  return 0; //Can't find Board configuration -> Assume board is not configured.
161  else
162  return map_it->second.DAC(event);
163  }
164 }
165 
166 
167 bool LArCalibParams::isPulsed(const unsigned event, const HWIdentifier calibLineID) const
168 {
169  if (calibLineID.get_compact()==0) return false; //Disconnected channel
170  if (!m_onlineHelper) {
171  MsgStream log(Athena::getMessageSvc(), "LArCalibParams::isPulsed");
172  log << MSG::ERROR << "LArOnlineID not defined! Can't determine isPulsed value." << endmsg;
173  return false;
174  }
175  const int line=m_onlineHelper->channel(calibLineID);
176  if (m_uniqueConfig && !m_mCalibBoards.empty())
177  return m_mCalibBoards.begin()->second.isPulsed(event, line);
178  else
179  {const HWIdentifier calibModuleID=m_onlineHelper->calib_module_Id(calibLineID);
180  const std::map<HWIdentifier, CalibBoard>::const_iterator map_it=m_mCalibBoards.find(calibModuleID);
181  if (map_it==m_mCalibBoards.end()) {
182  return false;//Can't find Board configuration -> Assume board is not configured.
183  }
184  else
185  return map_it->second.isPulsed(event,line);
186  }
187 }
188 
189 
190 unsigned LArCalibParams::getNumberConfig(const HWIdentifier calibModuleID) const
191 { //Number of configurations is nDAC*nDelay*nPattern
192  if (m_uniqueConfig && !m_mCalibBoards.empty()) {
193  const unsigned nConfig=m_mCalibBoards.begin()->second.m_DAC.size()*
194  m_mCalibBoards.begin()->second.m_Delay.size()*m_mCalibBoards.begin()->second.m_Pattern.size()/4;
195  return nConfig;
196  }
197  else {
198  const std::map<HWIdentifier, CalibBoard>::const_iterator map_it=m_mCalibBoards.find(calibModuleID);
199  if (map_it==m_mCalibBoards.end())
200  return 1; //Can't find Board configuration -> Assume board is not configured.(always the same values)
201  else {
202  const unsigned nConfig=map_it->second.m_DAC.size()*
203  map_it->second.m_Delay.size()*map_it->second.m_Pattern.size()/4;
204  return nConfig;
205  }
206  }
207 }
208 
209 
210 
211 unsigned LArCalibParams::NTrigger(const HWIdentifier calibModuleID) const
212 {
213  if (m_uniqueConfig && !m_mCalibBoards.empty())
214  return m_mCalibBoards.begin()->second.m_nTrigger;
215  else {
216  const std::map<HWIdentifier, CalibBoard>::const_iterator map_it=m_mCalibBoards.find(calibModuleID);
217  if (map_it==m_mCalibBoards.end())
218  return 0xFFFFFFFF; //Can't find Board configuration -> Assume board is not configured.(nothing ever changes)
219  else
220  return map_it->second.m_nTrigger;
221  }
222 }
223 /*
224 const CalibBoard& LArCalibParams::getCalibBoardParams(const HWIdentifier calibModuleID) const
225 {
226  if (m_uniqueConfig && m_mCalibBoards.size()==1)
227  return m_mCalibBoards.begin()->second;
228  else
229  return m_mCalibBoards[calibModuleID]; //Find would be better....
230 }
231 */
232 
233 unsigned LArCalibParams::getNumberPatterns(const HWIdentifier calibModuleID) const
234 { //Number of configurations is nDAC*nDelay*nPattern
235  if ((m_uniqueConfig && m_mCalibBoards.size()==1) || // one calib board configured
236  calibModuleID == HWIdentifier(0)) { // assuming equal config for all b. boards configured
237  const unsigned nPatt = m_mCalibBoards.begin()->second.m_Pattern.size()/4;
238  return nPatt;
239  }
240  else {
241  const std::map<HWIdentifier, CalibBoard>::const_iterator map_it=m_mCalibBoards.find(calibModuleID);
242  if (map_it==m_mCalibBoards.end())
243  return 0; //Can't find Board configuration -> Assume board is not configured.
244  else {
245  const unsigned nPatt = map_it->second.m_Pattern.size()/4;
246  return nPatt;
247  }
248  }
249 }
250 
251 
checkFileSG.line
line
Definition: checkFileSG.py:75
LArCalibParams::getNumberPatterns
unsigned getNumberPatterns(const HWIdentifier calibModuleID) const
Definition: LArCalibParams.cxx:233
getMessageSvc.h
singleton-like access to IMessageSvc via open function and helper
LArCalibParams::CalibBoard::Delay
unsigned Delay(const unsigned event) const
Definition: LArCalibParams.cxx:102
LArCalibParams::NTrigger
unsigned NTrigger(const HWIdentifier calibModuleID) const
Definition: LArCalibParams.cxx:211
LArCalibParams::m_uniqueConfig
bool m_uniqueConfig
Definition: LArCalibParams.h:74
LArOnlineID_Base::calib_module_Id
HWIdentifier calib_module_Id(int barrel_ec, int pos_neg, int feedthrough, int slot) const
Build calibration module identifier from fields.
Definition: LArOnlineID_Base.h:573
HWIdentifier
Definition: HWIdentifier.h:13
LArCalibParams::m_mCalibBoards
std::map< HWIdentifier, CalibBoard > m_mCalibBoards
Definition: LArCalibParams.h:72
Athena::getMessageSvc
IMessageSvc * getMessageSvc(bool quiet=false)
Definition: getMessageSvc.cxx:20
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
LArCalibParams::CalibBoard::m_Pattern
std::vector< unsigned > m_Pattern
Definition: LArCalibParams.h:62
LArCalibParams::LArCalibParams
LArCalibParams()
Definition: LArCalibParams.cxx:12
LArCalibParams::~LArCalibParams
virtual ~LArCalibParams()
Definition: LArCalibParams.cxx:41
kmaxDAC
#define kmaxDAC
This class contains the LAr Calibration Board settings and a set of functions to decoded them.
Definition: LArCalibParams.h:26
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
LArOnlineID_Base::channel
int channel(const HWIdentifier id) const
Return the channel number of a hardware cell identifier channel = [0,127] in all FEB.
Definition: LArOnlineID_Base.cxx:1967
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
lumiFormat.i
int i
Definition: lumiFormat.py:92
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
LArCalibParams::isPulsed
bool isPulsed(const unsigned event, const HWIdentifier calibLineID) const
Definition: LArCalibParams.cxx:167
LArCalibParams::m_onlineHelper
const LArOnlineID * m_onlineHelper
Definition: LArCalibParams.h:73
LArCalibParams::CalibBoard::m_nTrigger
unsigned m_nTrigger
Definition: LArCalibParams.h:61
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
LArCalibParams::DAC
unsigned DAC(const unsigned event, const HWIdentifier calibLineID) const
Definition: LArCalibParams.cxx:147
LArCalibParams::CalibBoard::DAC
unsigned DAC(const unsigned event) const
Definition: LArCalibParams.cxx:110
LArCalibParams::Delay
unsigned Delay(const unsigned event, const HWIdentifier calibLineID) const
Definition: LArCalibParams.cxx:128
LArCalibParams::getNumberConfig
unsigned getNumberConfig(const HWIdentifier calibModuleID) const
Definition: LArCalibParams.cxx:190
LArCalibParams::CalibBoard::isPulsed
bool isPulsed(const unsigned event, const unsigned short calibLine) const
Definition: LArCalibParams.cxx:90
LArCalibParams.h
Trk::Pattern
@ Pattern
Definition: ParametersCommon.h:29
Identifier::get_compact
value_type get_compact(void) const
Get the compact id.
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
LArCalibParams::initialize
virtual StatusCode initialize()
Definition: LArCalibParams.cxx:17
StoreGateSvc.h
LArCalibParams::set
void set(const HWIdentifier CalibModuleID, const unsigned nTrigger, const std::vector< unsigned > &Pattern, const std::vector< unsigned > &DAC, const std::vector< unsigned > &Delay)
Definition: LArCalibParams.cxx:46
LArOnlineID.h