ATLAS Offline Software
Loading...
Searching...
No Matches
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
20using CLHEP::ns;
21
22
23LArCalibDigitMaker::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);
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
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
#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
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
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