ATLAS Offline Software
Loading...
Searching...
No Matches
LArAutoCorrMaker.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5/********************************************************************
6
7 NAME: LArAutoCorrMaker.cxx
8 PACKAGE: offline/LArCalorimeter/LArCalibUtils
9
10 AUTHORS: M. AHARROUCHE
11 CREATED: Dec. 16, 2003
12
13 PURPOSE: Selects the good events and computes the autocorrelation
14 matrix for each cell. It processes all the gains
15 simultaneously.
16 In fact only the last (m_nsamples-1) elements of the
17 first line (or column) of autocorrelation matrix are
18 computed and stored in TDS, for these reasons:
19 - symetrie of autocorrelation matrix
20 - equivalence of autocorrelation elements:
21 B(n,n+i)\eq B(m,m+i) (eg B12 \eq B23).
22
23 HISTORY:
24 - Dec. 16, 2003: M. Aharrouche: creation
25 - March 1st, 2004: S. Laplace: write result into DB instead of ASCII file
26
27********************************************************************/
28
29// Include files
34
35#include <cmath>
36#include <unistd.h>
37
39
40
41LArAutoCorrMaker::LArAutoCorrMaker(const std::string& name, ISvcLocator* pSvcLocator)
42 : AthAlgorithm(name, pSvcLocator),
43 m_groupingType("ExtendedSubDetector"), // SubDetector, Single, FeedThrough
44 m_nEvents(0)
45{
47 declareProperty("KeyOutput", m_keyoutput="LArAutoCorr");
48 declareProperty("events_ref", m_nref=50);
49 declareProperty("nsigma", m_rms_cut=5);
50 declareProperty("normalize", m_normalize=1);
51 declareProperty("physics", m_physics=0);
52 declareProperty("GroupingType", m_groupingType);
54}
55
56
58= default;
59
61
62 ATH_MSG_INFO( ">>> Initialize" );
63
64 if (m_keylistproperty.empty()) // Not key list given
65 {m_keylistproperty.emplace_back("HIGH");
66 m_keylistproperty.emplace_back("MEDIUM");
67 m_keylistproperty.emplace_back("LOW");
68 m_keylistproperty.emplace_back("FREE"); // For H6...
69 }
70
72 if (m_keylist.empty()) {
73 ATH_MSG_ERROR( "Key list is empty!" );
74 return StatusCode::FAILURE;
75 }
76
78 StatusCode sc=m_autocorr.initialize();
79 if (sc.isFailure()) {
80 ATH_MSG_ERROR( "Failed initialize intermediate AutoCorr object" );
81 return sc;
82 }
83
84 return StatusCode::SUCCESS;
85}
86
87
88//---------------------------------------------------------------------------
90 //---------------------------------------------------------------------------
91{
92 StatusCode sc;
94 const xAOD::EventInfo* eventInfo = nullptr;
95 ATH_CHECK( evtStore()->retrieve( eventInfo ) );
96
98 const BunchCrossingCondData* bunchCrossing=*bccd;
99 if (!bunchCrossing) {
100 ATH_MSG_ERROR("Failed to retrieve Bunch Crossing obj");
101 return StatusCode::FAILURE;
102 }
103
104 uint32_t bcid = eventInfo->bcid();
105 const int nBCsFromFront=bunchCrossing->distanceFromFront(bcid,BunchCrossingCondData:: BunchCrossings);
106 if (nBCsFromFront < m_bunchCrossingsFromFront) {
107 ATH_MSG_DEBUG("BCID " << bcid << " only " << nBCsFromFront << " BCs from front of BunchTrain. Event ignored. (min=" <<m_bunchCrossingsFromFront
108 << ", type= " << bunchCrossing->bcType(bcid) << ")" );
109 return StatusCode::SUCCESS; //Ignore this event
110 }
111 else
112 ATH_MSG_DEBUG("BCID " << bcid << " is " << nBCsFromFront << " BCs from front of BunchTrain. Event accepted.(min=" <<m_bunchCrossingsFromFront << ")");
113 }
114
115 const LArDigitContainer* larDigitContainer = nullptr;
116
117 for (const std::string& key : m_keylist) {
118 ATH_MSG_DEBUG("Reading LArDigitContainer from StoreGate! key=" << key);
119 sc= evtStore()->retrieve(larDigitContainer,key);
120 if (sc.isFailure() || !larDigitContainer) {
121 ATH_MSG_DEBUG("Cannot read LArDigitContainer from StoreGate! key=" << key);
122 continue;
123 }
124 if(larDigitContainer->empty()) {
125 ATH_MSG_DEBUG("Got empty LArDigitContainer (key=" << key << ").");
126 continue;
127 }
128 ATH_MSG_DEBUG("Got LArDigitContainer with key " << key <<", size=" << larDigitContainer->size());
129 ++m_nEvents;
130 m_nsamples = (*larDigitContainer->begin())->nsamples();
131 ATH_MSG_DEBUG("NSAMPLES (from digit container) = " << m_nsamples );
132
133 for (const LArDigit* digit : *larDigitContainer) {
134 const HWIdentifier chid=digit->hardwareID();
135 const CaloGain::CaloGain gain=digit->gain();
136 if (gain<0 || gain>CaloGain::LARNGAIN) {
137 ATH_MSG_ERROR( "Found odd gain number ("<< (int)gain <<")" );
138 return StatusCode::FAILURE;
139 }
140 const std::vector<short> & samples = digit->samples();
141 // LArAutoCorr& thisAC=m_autocorr[gain][chid];
142 LArAutoCorr& thisAC=m_autocorr.get(chid,gain);
143
144 if(thisAC.get_max()!=-1){ //Have already boundaries set
145 std::vector<short>::const_iterator s_it=samples.begin();
146 std::vector<short>::const_iterator s_it_e=samples.end();
147 const short & min = thisAC.get_min();
148 const short & max = thisAC.get_max();
149
150 for (;s_it!=s_it_e && *s_it>=min && *s_it<=max;++s_it)
151 ;
152 if (s_it==s_it_e)
153 thisAC.add(samples,m_nsamples);
154 }
155 else {
156 thisAC.add(samples,m_nsamples);
157 if (thisAC.get_nentries()==m_nref && m_nref>0) { //Set window size
158 // Define the window (min, max)according to pedestal and noise
159 // computed for a number of events = m_nref
160 const double mean = thisAC.get_mean();
161 const double noise = thisAC.get_rms();
162 const short min = (short)floor(mean - m_rms_cut*noise);
163 const short max = (short)ceil(mean + m_rms_cut*noise);
164 thisAC.set_min(min);
165 thisAC.set_max(max);
166 thisAC.correl_zero();
167 } //end if nentries==m_nref
168 } // end else
169 }//End loop over all cells
170 }// End loop over all containers
171 return StatusCode::SUCCESS;
172}
173
174
175//---------------------------------------------------------------------------
177 //---------------------------------------------------------------------------
178{
179 StatusCode sc;
180 ATH_MSG_INFO( ">>> Stop()" );
181
182 if (m_keylist.empty()) {
183 ATH_MSG_ERROR( "Key list is empty! No containers processed!" );
184 return StatusCode::FAILURE;
185 }
186
187 // Create the LArAutoCorrComplete object
188 auto larAutoCorrComplete = std::make_unique<LArAutoCorrComplete>();
189
190 sc=larAutoCorrComplete->setGroupingType(m_groupingType,msg());
191 if (sc.isFailure()) {
192 ATH_MSG_ERROR( "Failed to set groupingType for LArAutoCorrComplete object" );
193 return sc;
194 }
195
196 sc=larAutoCorrComplete->initialize();
197 if (sc.isFailure()) {
198 ATH_MSG_ERROR( "Failed initialize LArAutoCorrComplete object" );
199 return sc;
200 }
201
202 for (int gain=0;gain<(int)CaloGain::LARNGAIN;gain++) {
205
206 //Inner loop goes over the cells.
207 for (;cell_it!=cell_it_e;cell_it++) {
208 LArAutoCorr autocorr = *cell_it;
209 // Check number of entries
210 if(autocorr.get_nentries()==0) continue;
211
212 // Get the autocorrelation matrix
213
214
215 //MGV implement normalization switch
216 const std::vector<double> & cov = autocorr.get_cov(m_normalize,m_physics);
217
218 //The AutoCorr is stored as float -> convert
219 std::vector<float> cov_flt;
220 cov_flt.reserve(cov.size());
221 std::vector<double>::const_iterator it=cov.begin();
222 std::vector<double>::const_iterator it_e=cov.end();
223 for (;it!=it_e;++it)
224 cov_flt.push_back((float)*it);
225 HWIdentifier ch_id = cell_it.channelId();
226
227 // Fill the data class with autocorrelation elements
228 if (ch_id!=0) {
229 larAutoCorrComplete->set(ch_id,gain,cov_flt);
230 }
231 }
232 }
233
234 ATH_MSG_INFO( "AutoCorrelation based on " << m_nEvents << " events." );
235 ATH_MSG_INFO( " Summary : Number of cells with a autocorr value computed : " << larAutoCorrComplete->totalNumberOfConditions() );
236 ATH_MSG_INFO( " Summary : Number of Barrel PS cells side A or C (connected+unconnected): 4096 " );
237 ATH_MSG_INFO( " Summary : Number of Barrel cells side A or C (connected+unconnected): 53248 " );
238 ATH_MSG_INFO( " Summary : Number of EMEC cells side A or C (connected+unconnected): 35328 " );
239 ATH_MSG_INFO( " Summary : Number of HEC cells side A or C (connected+unconnected): 3072 ");
240 ATH_MSG_INFO( " Summary : Number of FCAL cells side A or C (connected+unconnected): 1792 " );
241
242 // Record LArAutoCorrComplete
243 ATH_CHECK( detStore()->record(std::move(larAutoCorrComplete),m_keyoutput) );
244 return StatusCode::SUCCESS;
245}
246
247
248
249
250
251
252
253
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
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
MsgStream & msg() const
int distanceFromFront(const bcid_type bcid, const BunchDistanceType type=NanoSec) const
The distance of the specific bunch crossing from the front of the train.
@ BunchCrossings
Distance in units of 25 nanoseconds.
BunchCrossingType bcType(const bcid_type bcid) const
Convenience function for the type of the specific bunch crossing.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
std::vector< std::string > m_keylistproperty
std::string m_groupingType
std::vector< std::string > m_keylist
LArAutoCorrMaker(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadCondHandleKey< BunchCrossingCondData > m_bcDataKey
StatusCode initialize()
std::string m_keyoutput
const std::vector< double > & get_cov(int m_normalize, int m_phys)
void add(const std::vector< short > &samples, size_t maxnsamples)
Container class for LArDigit.
Liquid Argon digit base class.
Definition LArDigit.h:25
uint32_t bcid() const
The bunch crossing ID of the event.
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
@ LARNGAIN
Definition CaloGain.h:19
EventInfo_v1 EventInfo
Definition of the latest event info version.