ATLAS Offline Software
Loading...
Searching...
No Matches
LArCalibDigitMaker.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
7
8#include "GaudiKernel/ToolHandle.h"
9
11
12#include "CLHEP/Units/SystemOfUnits.h"
13
16
17#include <algorithm>
18#include <sstream>
19
20
21using CLHEP::ns;
22
23
24LArCalibDigitMaker::LArCalibDigitMaker(const std::string& name, ISvcLocator* pSvcLocator)
25 : AthAlgorithm(name, pSvcLocator),
26 m_nTrigger(0)
27{
28 declareProperty("KeyList",m_keylist);
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
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 }
59 ATH_CHECK( m_calibMapSCKey.initialize(m_isSC) );
60 ATH_CHECK( m_calibMapKey.initialize(!m_isSC) );
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
116StatusCode LArCalibDigitMaker::execute(const EventContext& ctx) {
117
118 if (m_dontRun) return StatusCode::SUCCESS;
119
120
121
122 const LArCalibLineMapping *clcabling=nullptr;
123 if(m_isSC) {
124 ATH_MSG_DEBUG ( "======== LArCalibDigitMaker: using SC calib line map" );
126 clcabling=*clHdl;
127 } else {
129 clcabling=*clHdl;
130 }
131
132
133 if(!clcabling) {
134 ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_calibMapKey.key() );
135 return StatusCode::FAILURE;
136 }
137
138 const unsigned eventNb=(ctx.eventID().event_number())&0xffffff ; // Are we sure?
139
140 ATH_MSG_DEBUG ( "======== executing event "<< eventNb << " ========" );
141
142 const LArCalibParams* calibParams = nullptr;
143 ATH_CHECK( detStore()->retrieve(calibParams,"LArCalibParams") );
144
145 for (const std::string& key : m_keylist) { //Loop over all containers that are to be processed (e.g. different gains)
146 ATH_MSG_DEBUG ( "Retrieving LArDigitContainer. Key= " << key );
147 const LArDigitContainer* larDigitCont;
148 StatusCode sc = evtStore()->retrieve(larDigitCont,key);
149 if (sc.isFailure()) {
150 ATH_MSG_DEBUG ( "Cannot read LArDigitContainer from StoreGate! key=" << key );
151 continue; //Try next container
152 }
153 if (larDigitCont->empty()) {
154 ATH_MSG_DEBUG ( "LArDigitContainer with key '" << key << "' is empty. Ignored." );
155 continue; //Try next container
156 }
157 if (!m_pulsedChids.empty()) m_pulsedChids.clear();
158 //Iterate over LArDigitContainer and build LArCalibDigitContainer
159 auto calibDigitContainer=std::make_unique<LArCalibDigitContainer>();
160 calibDigitContainer->setDelayScale(m_delayScale);
161 for (const LArDigit* digit : *larDigitCont) {
162 HWIdentifier chid=digit->hardwareID();
163
164 if(std::find(m_pulsedChids.begin(), m_pulsedChids.end(), chid) != m_pulsedChids.end()) {
165 if(m_skipDuplicates) continue; // skip this channel if it was already pulsed
166 m_pulsedChids.push_back(chid);
167 }
168
169 //Get data members of LArDigit
170 const std::vector<short>& samples=digit->samples();
171 CaloGain::CaloGain gain=digit->gain();
172 const std::vector<HWIdentifier>& calibChannelIDs=clcabling->calibSlotLine(chid);
173 if (calibChannelIDs.empty()) {
174 continue; //Disconnected channel
175 }
176 //For the time being, I assume we are in H8 and have only one calib channel per FEB channel
177 std::vector<HWIdentifier>::const_iterator csl_it=calibChannelIDs.begin();
178 //Now the CalibBoard settings:
179 //Get data to build LArCalibDigit:
180 unsigned ddac=calibParams->DAC(eventNb,*csl_it);
181 if(ddac==kmaxDAC) {
182 ATH_MSG_WARNING("SKIP "<<chid<<" "<<gain<<" "<<ddac<<" event no "<<eventNb);
183 continue;
184 }
185 uint16_t dac=ddac;
186 uint16_t delay=calibParams->Delay(eventNb,*csl_it);
187
188 bool ispulsed=false;
189 for(; csl_it != calibChannelIDs.end(); ++csl_it) {
190 if(calibParams->isPulsed(eventNb,*csl_it)){
191 ispulsed=true;
192 break;
193 }
194 }
195 //build LArCalibDigit:
196 if ( ispulsed ){
197 ATH_MSG_VERBOSE("HERE!! "<<chid<<" "<<gain<<" "<<dac<<" "<<delay<<" "<<ispulsed<<" event no "<<eventNb<<" "<<calibChannelIDs.size()<<" calib lines, first is "<<*csl_it);
198
199 }
200 LArCalibDigit* calibDigit=new LArCalibDigit(chid,gain, samples, dac, delay, ispulsed);
201 calibDigitContainer->push_back(calibDigit);
202 } //End iteration to build calibDigits
203 ATH_MSG_DEBUG("Trying to store with key "<<key);
204 ATH_CHECK( evtStore()->record(std::move(calibDigitContainer),key) );
205 ATH_MSG_DEBUG ("LArCalibDigitContainer recorded to StoreGate. key=" << key );
206 } //End loop key list
207 return StatusCode::SUCCESS;
208}
209
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double delay(std::size_t d)
#define kmaxDAC
This class contains the LAr Calibration Board settings and a set of functions to decoded them.
static Double_t sc
size_t size() const
Number of registered mappings.
static const Attributes_t empty
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
bool empty() const noexcept
Returns true if the collection is empty.
std::vector< unsigned > m_vDelay
std::vector< std::vector< double > > m_vDAC
std::vector< std::vector< double > > m_vPattern
std::vector< int > m_nPatterns
SG::ReadCondHandleKey< LArCalibLineMapping > m_calibMapKey
std::vector< HWIdentifier > m_pulsedChids
LArCalibDigitMaker(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< std::string > m_keylist
StatusCode execute(const EventContext &ctx)
Execute method.
SG::ReadCondHandleKey< LArCalibLineMapping > m_calibMapSCKey
std::vector< std::vector< double > > m_vBoardIDs
Base class for LArDigits taken during calibration runs.
const std::vector< HWIdentifier > & calibSlotLine(const HWIdentifier id) const
unsigned Delay(const unsigned event, const HWIdentifier calibLineID) const
bool isPulsed(const unsigned event, const HWIdentifier calibLineID) const
unsigned DAC(const unsigned event, const HWIdentifier calibLineID) const
Container class for LArDigit.
Liquid Argon digit base class.
Definition LArDigit.h:25