ATLAS Offline Software
LArCalibDigitMaker.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 
7 #include "GaudiKernel/ToolHandle.h"
8 
10 
11 #include "CLHEP/Units/SystemOfUnits.h"
12 
15 
16 #include <algorithm>
17 #include <sstream>
18 
19 
20 using CLHEP::ns;
21 
22 
23 LArCalibDigitMaker::LArCalibDigitMaker(const std::string& name, ISvcLocator* pSvcLocator)
24  : AthAlgorithm(name, pSvcLocator),
25  m_nTrigger(0)
26 {
27  //declareProperty("DigitKey",m_key="");
28  declareProperty("KeyList",m_keylist);
29  declareProperty("DAC",m_vDAC);
30  declareProperty("Delay",m_vDelay);
31  declareProperty("Pattern",m_vPattern);
32  declareProperty("nPattern",m_nPatterns);
33  declareProperty("NTrigger",m_nTrigger);
34  declareProperty("BoardIDs",m_vBoardIDs);
35  declareProperty("DelayScale",m_delayScale=(25./240.)*ns);
36  declareProperty("DontRun",m_dontRun=false); //Put only Board configuration in DetectorStore
37  declareProperty("isSC",m_isSC=false);
38  declareProperty("skipDuplicates",m_skipDuplicates=false);
39 }
40 
42 {//empty
43 }
44 
46 {
47 
48  //m_oldeventNb=-999;
49  m_eventNb=-1;
50 
51  ATH_MSG_DEBUG ( "======== LArCalibDigitMaker Initialize ========" );
52  // bool containsKeySC = false;
53  for (unsigned int i = 0; i < m_keylist.size(); ++i) {
54  if (m_keylist.at(i).compare("SC") == 0) {
55  m_isSC = true;
56  ATH_MSG_DEBUG ( "======== LArCalibDigitMaker isSC is True ========" );
57  }
58  }
61 
62  //if we have calib board params as jobOpts, set them
63 
64  std::vector<std::vector<unsigned>> theseBoardIDs;
65  std::vector<std::vector<unsigned>> thesePatterns;
66  std::vector<std::vector<unsigned>> theseDACs;
67  theseBoardIDs.reserve(m_vBoardIDs.size());
68  thesePatterns.reserve(m_vPattern.size());
69  theseDACs.reserve(m_vDAC.size());
70  for (const auto& elem : m_vBoardIDs) {
71  theseBoardIDs.emplace_back(elem.begin(), elem.end());
72  }
73  for (const auto& elem : m_vPattern) {
74  thesePatterns.emplace_back(elem.begin(), elem.end());
75  }
76  for (const auto& elem : m_vDAC) {
77  theseDACs.emplace_back(elem.begin(), elem.end());
78  }
79  std::vector<unsigned> cutPattern;
80 
81  auto calibParams = std::make_unique<LArCalibParams>();
82  ATH_CHECK( calibParams->initialize() );
83  for( long unsigned int i=0; i < theseBoardIDs.size(); i++ ){
84  if (!theseBoardIDs[i].empty() && !m_vDAC[i].empty() && !m_vDelay.empty() && !thesePatterns[i].empty() && m_nTrigger) {
85  cutPattern = thesePatterns[i];
86 
87  if (thesePatterns[i].size() != ((unsigned int)m_nPatterns[i])){
88  ATH_MSG_WARNING("Going to change pattern length from "<<thesePatterns[i].size()<<" to "<<m_nPatterns[i]);
89  cutPattern.resize(m_nPatterns[i]);
90  }
91  if (thesePatterns[i].size()%4) {
92  ATH_MSG_ERROR ( "Problem with jobOptions! One Pattern must conists of 4 32bit values! Pattern "<< i );
93  return StatusCode::FAILURE;
94  }
95  for (unsigned id : theseBoardIDs[i]) {
96  const HWIdentifier calibBoardHWID(id);
97  calibParams->set(calibBoardHWID,m_nTrigger,cutPattern,theseDACs[i],m_vDelay);
98  }
99  }
100  }
101 
102  ATH_CHECK( detStore()->record(std::move(calibParams),"LArCalibParams") );
103  // End set calib board parameters
104 
105  if (m_keylist.empty()) {
106  m_keylist.emplace_back("HIGH");
107  m_keylist.emplace_back("MEDIUM");
108  m_keylist.emplace_back("LOW");
109  }
110 
111  ATH_MSG_DEBUG ( "======== LArCalibDigitMaker initialize successfully ========" );
112  return StatusCode::SUCCESS;
113 }
114 
115 
117 
118  if (m_dontRun) return StatusCode::SUCCESS;
119 
120  const EventContext& ctx = Gaudi::Hive::currentContext();
121 
122 
123  const LArCalibLineMapping *clcabling=nullptr;
124  if(m_isSC) {
125  ATH_MSG_DEBUG ( "======== LArCalibDigitMaker: using SC calib line map" );
127  clcabling=*clHdl;
128  } else {
130  clcabling=*clHdl;
131  }
132 
133 
134  if(!clcabling) {
135  ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_calibMapKey.key() );
136  return StatusCode::FAILURE;
137  }
138 
139  const unsigned eventNb=(ctx.eventID().event_number())&0xffffff ; // Are we sure?
140 
141  ATH_MSG_DEBUG ( "======== executing event "<< eventNb << " ========" );
142 
143  const LArCalibParams* calibParams = nullptr;
144  ATH_CHECK( detStore()->retrieve(calibParams,"LArCalibParams") );
145 
146  for (const std::string& key : m_keylist) { //Loop over all containers that are to be processed (e.g. different gains)
147  ATH_MSG_DEBUG ( "Retrieving LArDigitContainer. Key= " << key );
148  const LArDigitContainer* larDigitCont;
149  StatusCode sc = evtStore()->retrieve(larDigitCont,key);
150  if (sc.isFailure()) {
151  ATH_MSG_DEBUG ( "Cannot read LArDigitContainer from StoreGate! key=" << key );
152  continue; //Try next container
153  }
154  if (larDigitCont->empty()) {
155  ATH_MSG_DEBUG ( "LArDigitContainer with key '" << key << "' is empty. Ignored." );
156  continue; //Try next container
157  }
158  if (!m_pulsedChids.empty()) m_pulsedChids.clear();
159  //Iterate over LArDigitContainer and build LArCalibDigitContainer
160  auto calibDigitContainer=std::make_unique<LArCalibDigitContainer>();
161  calibDigitContainer->setDelayScale(m_delayScale);
162  for (const LArDigit* digit : *larDigitCont) {
163  HWIdentifier chid=digit->hardwareID();
164 
165  if(std::find(m_pulsedChids.begin(), m_pulsedChids.end(), chid) != m_pulsedChids.end()) {
166  if(m_skipDuplicates) continue; // skip this channel if it was already pulsed
167  m_pulsedChids.push_back(chid);
168  }
169 
170  //Get data members of LArDigit
171  const std::vector<short>& samples=digit->samples();
172  CaloGain::CaloGain gain=digit->gain();
173  const std::vector<HWIdentifier>& calibChannelIDs=clcabling->calibSlotLine(chid);
174  if (calibChannelIDs.empty()) {
175  continue; //Disconnected channel
176  }
177  //For the time being, I assume we are in H8 and have only one calib channel per FEB channel
178  std::vector<HWIdentifier>::const_iterator csl_it=calibChannelIDs.begin();
179  //Now the CalibBoard settings:
180  //Get data to build LArCalibDigit:
181  unsigned ddac=calibParams->DAC(eventNb,*csl_it);
182  if(ddac==kmaxDAC) {
183  ATH_MSG_WARNING("SKIP "<<chid<<" "<<gain<<" "<<ddac<<" event no "<<eventNb);
184  continue;
185  }
186  uint16_t dac=ddac;
187  uint16_t delay=calibParams->Delay(eventNb,*csl_it);
188 
189  bool ispulsed=false;
190  for(; csl_it != calibChannelIDs.end(); ++csl_it) {
191  if(calibParams->isPulsed(eventNb,*csl_it)){
192  ispulsed=true;
193  break;
194  }
195  }
196  //build LArCalibDigit:
197  if ( ispulsed ){
198  ATH_MSG_VERBOSE("HERE!! "<<chid<<" "<<gain<<" "<<dac<<" "<<delay<<" "<<ispulsed<<" event no "<<eventNb<<" "<<calibChannelIDs.size()<<" calib lines, first is "<<*csl_it);
199 
200  }
201  LArCalibDigit* calibDigit=new LArCalibDigit(chid,gain, samples, dac, delay, ispulsed);
202  calibDigitContainer->push_back(calibDigit);
203  } //End iteration to build calibDigits
204  ATH_MSG_DEBUG("Trying to store with key "<<key);
205  ATH_CHECK( evtStore()->record(std::move(calibDigitContainer),key) );
206  ATH_MSG_DEBUG ("LArCalibDigitContainer recorded to StoreGate. key=" << key );
207  } //End loop key list
208  return StatusCode::SUCCESS;
209 }
210 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
LArCalibDigitContainer.h
LArCalibDigitMaker::m_pulsedChids
std::vector< HWIdentifier > m_pulsedChids
Definition: LArCalibDigitMaker.h:39
LArCalibDigitMaker::m_nPatterns
std::vector< int > m_nPatterns
Definition: LArCalibDigitMaker.h:31
LArCalibDigitMaker::m_vBoardIDs
std::vector< std::vector< double > > m_vBoardIDs
Definition: LArCalibDigitMaker.h:32
LArCalibDigitMaker::m_dontRun
bool m_dontRun
Definition: LArCalibDigitMaker.h:35
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LArCalibLineMapping::calibSlotLine
const std::vector< HWIdentifier > & calibSlotLine(const HWIdentifier id) const
Definition: LArCalibLineMapping.cxx:15
LArCalibLineMapping
Definition: LArCalibLineMapping.h:17
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
LArCalibParams
Definition: LArCalibParams.h:28
LArCalibDigitMaker::m_delayScale
double m_delayScale
Definition: LArCalibDigitMaker.h:34
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
HWIdentifier
Definition: HWIdentifier.h:13
empty
bool empty(TH1 *h)
Definition: computils.cxx:294
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
LArCalibDigitMaker::m_skipDuplicates
bool m_skipDuplicates
Definition: LArCalibDigitMaker.h:38
LArCalibDigitMaker::LArCalibDigitMaker
LArCalibDigitMaker(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArCalibDigitMaker.cxx:23
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
kmaxDAC
#define kmaxDAC
This class contains the LAr Calibration Board settings and a set of functions to decoded them.
Definition: LArCalibParams.h:26
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
LArDigit
Liquid Argon digit base class.
Definition: LArDigit.h:25
lumiFormat.i
int i
Definition: lumiFormat.py:92
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
LArCalibDigitMaker::m_vDAC
std::vector< std::vector< double > > m_vDAC
Definition: LArCalibDigitMaker.h:29
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
01SubmitToGrid.samples
samples
Definition: 01SubmitToGrid.py:58
LArCalibDigitMaker.h
LArCalibDigitMaker::m_isSC
bool m_isSC
Definition: LArCalibDigitMaker.h:36
LArCalibParams::isPulsed
bool isPulsed(const unsigned event, const HWIdentifier calibLineID) const
Definition: LArCalibParams.cxx:167
LArCalibDigitMaker::execute
StatusCode execute()
Definition: LArCalibDigitMaker.cxx:116
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
delay
double delay(std::size_t d)
Definition: JetTrigTimerTest.cxx:14
LArCalibDigitMaker::~LArCalibDigitMaker
~LArCalibDigitMaker()
Definition: LArCalibDigitMaker.cxx:41
AthAlgorithm
Definition: AthAlgorithm.h:47
integrator_ascii2db.dac
dac
Definition: integrator_ascii2db.py:126
LArCalibDigitMaker::m_calibMapKey
SG::ReadCondHandleKey< LArCalibLineMapping > m_calibMapKey
Definition: LArCalibDigitMaker.h:25
LArCalibDigitMaker::m_vPattern
std::vector< std::vector< double > > m_vPattern
Definition: LArCalibDigitMaker.h:28
LArCalibParams::DAC
unsigned DAC(const unsigned event, const HWIdentifier calibLineID) const
Definition: LArCalibParams.cxx:147
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
LArCalibDigit
Base class for LArDigits taken during calibration runs.
Definition: LArCalibDigit.h:29
LArCalibParams::Delay
unsigned Delay(const unsigned event, const HWIdentifier calibLineID) const
Definition: LArCalibParams.cxx:128
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
EventInfo.h
CaloGain::CaloGain
CaloGain
Definition: CaloGain.h:11
LArCalibDigitMaker::m_vDelay
std::vector< unsigned > m_vDelay
Definition: LArCalibDigitMaker.h:30
LArCalibParams.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LArDigitContainer
Container class for LArDigit.
Definition: LArDigitContainer.h:24
python.SystemOfUnits.ns
int ns
Definition: SystemOfUnits.py:130
LArCalibDigitMaker::initialize
StatusCode initialize()
Definition: LArCalibDigitMaker.cxx:45
LArCalibDigitMaker::m_keylist
std::vector< std::string > m_keylist
Definition: LArCalibDigitMaker.h:27
LArCalibDigitMaker::m_nTrigger
unsigned m_nTrigger
Definition: LArCalibDigitMaker.h:33
LArCalibDigitMaker::m_eventNb
int m_eventNb
Definition: LArCalibDigitMaker.h:37
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
LArCalibDigitMaker::m_calibMapSCKey
SG::ReadCondHandleKey< LArCalibLineMapping > m_calibMapSCKey
Definition: LArCalibDigitMaker.h:26