ATLAS Offline Software
Loading...
Searching...
No Matches
LArDigitsAccumulator.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
8
9#include "CLHEP/Units/SystemOfUnits.h"
10#include <cmath>
11#include <cstdint>
12
13LArDigitsAccumulator::LArDigitsAccumulator (const std::string& name, ISvcLocator* pSvcLocator):
14 AthAlgorithm(name, pSvcLocator),
15 m_onlineHelper(nullptr),
16 m_AccuDigitContainerName("LArAccumulatedDigits"),
19{
20 declareProperty("LArAccuDigitContainerName",m_AccuDigitContainerName);
21 declareProperty("KeyList",m_keylist);
22 declareProperty("NTriggersPerStep",m_NtriggersPerStep);
23 declareProperty("StepOfTriggers",m_nStepTrigger);
24 declareProperty("DropPercentTrig",m_DropPercentTrig=10);
25 declareProperty("isSC",m_isSC=false);
26
28}
29
30
32{
33 StatusCode sc;
34 if(m_isSC){
35 const LArOnline_SuperCellID *scid;
36 sc = detStore()->retrieve(scid, "LArOnline_SuperCellID");
37 if (sc.isFailure()) {
38 ATH_MSG_ERROR( "Could not get LArOnline_SuperCellID helper !" );
39 return sc;
40 } else {
41 m_onlineHelper = static_cast<const LArOnlineID_Base*>(scid);
42 ATH_MSG_DEBUG("Found the LArOnlineID helper");
43 }
44 } else {
45 const LArOnlineID* ll;
46 sc = detStore()->retrieve(ll, "LArOnlineID");
47 if (sc.isFailure()) {
48 ATH_MSG_ERROR( "Could not get LArOnlineID helper !" );
49 return sc;
50 } else {
51 m_onlineHelper = static_cast<const LArOnlineID_Base*>(ll);
52 ATH_MSG_DEBUG(" Found the LArOnlineID helper. ");
53 }
54 } //m_isSC
55
56 m_Accumulated.resize(m_onlineHelper->channelHashMax());
57 return StatusCode::SUCCESS;
58}
59
60
61
63{
64 if ( m_event_counter < 100 || m_event_counter%100==0 )
65 ATH_MSG_INFO( "Processing event " << m_event_counter );
67
68
69 // pointer to input container
70 const LArDigitContainer* DigitContainer=nullptr;
71
72
73 // retrieve input Digits
74
75 //Loop over all containers that are to be processed (e.g. different gains)
76 for (const std::string& key : m_keylist) {
77
78 ATH_CHECK( evtStore()->retrieve(DigitContainer,key) );
79
80 // store LArAccumulatedDigits
81 ACCUMDIGIT_VEC& vAccum = m_my_vec;
82 if(vAccum.empty()) vAccum.resize(m_onlineHelper->channelHashMax());
83
84 // Loop over DigitContainer
85
86 if(DigitContainer->empty()) {
87 ATH_MSG_DEBUG( "LArDigitContainer with key=" << key << " is empty " );
88 }else{
89 ATH_MSG_DEBUG( "LArDigitContainer with key=" << key << " has size = " << DigitContainer->size() );
90 }
91
92 //unsigned int iStepTrigger=0;
93
94 // output container
95 auto larAccuDigitContainer = std::make_unique<LArAccumulatedDigitContainer>(SG::VIEW_ELEMENTS);
96 //Loop over all cells
97 for (const LArDigit* digit : *DigitContainer) {
98
99 // identificators
100 HWIdentifier chid=digit->hardwareID();
101 const IdentifierHash hashid = m_onlineHelper->channel_Hash(chid);
102
103 if( m_isSC ){
105 bool hasInvalid=false;
106 for(auto s : digit->samples()){
107 if(s<0){
108 hasInvalid=true;
109 break;
110 }
111 }
112 if(hasInvalid) continue;
113 }
114
115
116 CaloGain::CaloGain gain=digit->gain();
117 if (gain<0 || gain>CaloGain::LARNGAIN)
118 {
119 ATH_MSG_ERROR( "Found not-matching gain number ("<< (int)gain <<")" );
120 return StatusCode::FAILURE;
121 }
122
123 // object to be filled for each cell
124 LArAccumulated& cellAccumulated = m_Accumulated[hashid];
125 cellAccumulated.m_onlineId=chid.get_identifier32().get_compact();
126
127 // trigger counter for each cell
128 cellAccumulated.m_ntrigger++;
129
130 //ATH_MSG_DEBUG( "chid = " << chid << ", trigger = " << cellAccumulated.m_ntrigger << ", sample 0 = "<< digit->samples()[0] );
131
132 // at first trigger, initialize vectors
133 unsigned int sizeSamples = digit->samples().size();
134 //ATH_MSG_DEBUG( "# of samples = " << sizeSamples );
135
136 LArAccumulatedDigit* accuDigit;
137
138 if(m_event_counter==1){
139 accuDigit = new LArAccumulatedDigit(chid);
140 vAccum[hashid]=accuDigit;
141 }
142
143 if(cellAccumulated.m_ntrigger==1){
144 // std::cout << "resizing to 0 "<< std::endl;
145 cellAccumulated.m_samplesum.clear();
146 cellAccumulated.m_samplesum.resize(sizeSamples,0);
147 cellAccumulated.m_matrix.clear();
148 cellAccumulated.m_matrix.resize(sizeSamples,0);
149 }
150 accuDigit = m_my_vec[hashid];
151
152 unsigned int l= 0;
153 for(unsigned int j=0;j<sizeSamples;j++){
154 cellAccumulated.m_samplesum[j] += digit->samples()[j];
155 for(unsigned int k=j;k<sizeSamples;k++)
156 {
157 l=k-j;
158 cellAccumulated.m_matrix[l] += digit->samples()[j]*digit->samples()[k];
159 // std::cout << "accumulation, l = "<< l << ", j = "<< j << ", k = "<< k << ", matrix = "<< cellAccumulated.m_matrix[l] <<", sum = "<< cellAccumulated.m_samplesum << std::endl;
160 l++;
161 }
162 }
163
164 //ATH_MSG_DEBUG( "Sum = " << cellAccumulated.m_samplesum );
165 //ATH_MSG_DEBUG( "Matrix = " << cellAccumulated.m_matrix[0] );
166
167 // when reached total number of triggers for this step, fill LArAccumulatedDigit and reset number of triggers
168
169 unsigned int ntrigUsed = m_NtriggersPerStep;
170 if ( m_isSC && m_DropPercentTrig != 0 ){
171 ntrigUsed -= ntrigUsed*(m_DropPercentTrig/100);
172 }
173
174 if(cellAccumulated.m_ntrigger==ntrigUsed){
175
176 ATH_MSG_DEBUG( "filling LArAccumulatedDigit " );
177 ATH_MSG_DEBUG( "chid = " << chid << ", gain = " << gain << ", trigPerStep = " << m_NtriggersPerStep );
178
179 accuDigit->setAddSubStep(gain,chid,cellAccumulated.m_samplesum,cellAccumulated.m_matrix,ntrigUsed);
180
181 larAccuDigitContainer->push_back(accuDigit);
182
183 cellAccumulated.m_nused = cellAccumulated.m_ntrigger;
184 cellAccumulated.m_ntrigger = 0;
185
186 }
187
188 }// loop over cells in container
189
190 ATH_MSG_DEBUG( "Finished loop over channels " );
191
192 const std::string SGkey=key+m_AccuDigitContainerName;
193 ATH_CHECK( evtStore()->record(std::move(larAccuDigitContainer),SGkey,false) );
194 ATH_MSG_INFO( "Recorded succesfully LArAccumulatedDigitContainer with key " << SGkey );
195
196
197 } // loop over key container
198 return StatusCode::SUCCESS;
199}
200
201
203
204 if ( !m_isSC ) return StatusCode::SUCCESS;
206 for(auto &sc : m_Accumulated){
207 if(sc.m_onlineId && sc.m_nused != ntrigUsed){
208 ATH_MSG_WARNING("Not enough triggers for channel OnlineID " << sc.m_onlineId << " ntriggers " << sc.m_ntrigger );
209 }
210 }
211
212 return StatusCode::SUCCESS;
213
214}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
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
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
value_type get_compact() const
Get the compact id.
This is a "hash" representation of an Identifier.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
Data class for ADC samples and autocorr preprocessed by the DSP.
bool setAddSubStep(const CaloGain::CaloGain gain_value, const HWIdentifier chid, const std::vector< uint64_t > &sampleSum, const std::vector< uint64_t > &sampleSquare, const unsigned nTrigger)
Accumulate new values.
Container class for LArDigit.
Liquid Argon digit base class.
Definition LArDigit.h:25
Class of intermediate accumulations.
std::vector< std::string > m_keylist
list of key for input digit container (=gain)
std::vector< LArAccumulated > m_Accumulated
Vector (index=hash ID) of accumulation quantities.
LArDigitsAccumulator(const std::string &name, ISvcLocator *pSvcLocator)
bool m_isSC
Tells you wether you run on SuperCells or Cells.
std::string m_AccuDigitContainerName
LArAccumulatedDigitContainer name.
unsigned int m_event_counter
Event counter.
unsigned int m_NtriggersPerStep
Number of triggers per step.
const LArOnlineID_Base * m_onlineHelper
unsigned int m_nStepTrigger
Number of steps.
double m_DropPercentTrig
Percentage of the used triggers that we will skip over at the end, in order ot ensure that the accumu...
std::vector< LArAccumulatedDigit * > ACCUMDIGIT_VEC
Helper for the Liquid Argon Calorimeter cell identifiers.
@ LARNGAIN
Definition CaloGain.h:19
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts