ATLAS Offline Software
Loading...
Searching...
No Matches
LArPedestalMaker.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5/********************************************************************
6
7 NAME: LArPedestalMaker.cxx
8 PACKAGE: offline/LArCalorimeter/LArCalibUtils
9
10 AUTHORS: M. AHARROUCHE
11 CREATED: Jan. 12, 2004
12 UPDATED: Mar. 10, 2004 by Remi Lafaye and later
13
14 PURPOSE: Computes the pedestal and rms for each cell
15 at each gain and records them in the TDS
16 HISTORY:
17 - Jen. 12, 2003: M. Aharrouche: creation
18 - March 1st, 2004: S. Laplace: write result into DB instead of ASCII file
19 - October 4th, 2007: M. Delmastro: removed NovaDB support
20
21********************************************************************/
22
23// Include files
25
27
28#include <cmath>
29#include <unistd.h>
30#include <vector>
31
32
33LArPedestalMaker::LArPedestalMaker(const std::string& name, ISvcLocator* pSvcLocator)
34 : AthAlgorithm(name, pSvcLocator),
35 m_groupingType("SubDetector") // SubDetector, Single, FeedThrough
36{
37 m_nref = 50;
38 m_rms_cut = 5.0;
39 declareProperty("KeyList", m_keylist);
40 declareProperty("KeyOutput", m_keyoutput="LArPedestal");
41 declareProperty("events_ref", m_nref);
42 declareProperty("nsigma", m_rms_cut);
43 declareProperty("which_sample", m_which_sample=-1);
44 declareProperty("sample_min", m_sample_min=-1);
45 declareProperty("sample_max", m_sample_max=-1);
46 declareProperty("GroupingType", m_groupingType);
47}
48
50= default;
51
53{
54 ATH_MSG_INFO ( ">>> Initialize" );
55
56 m_mean.resize(1);
57 m_rms.resize(1);
58
59 // m_fullFolderName="/lar/"+m_folderName+"/LArPedestal";
60 if (m_keylist.empty()) // Not key list given
61 {m_keylist.emplace_back("HIGH");
62 m_keylist.emplace_back("MEDIUM");
63 m_keylist.emplace_back("LOW");
64 m_keylist.emplace_back("FREE"); //For H6....
65 }
66 //m_EventCounters.resize(CaloGain::LARNGAIN,0); //Initialize Event counters, one per container
68 ATH_CHECK( m_pedestal.initialize() );
69 return StatusCode::SUCCESS;
70}
71
72
73//---------------------------------------------------------------------------
75//---------------------------------------------------------------------------
76{
77 if (m_keylist.empty()) {
78 ATH_MSG_ERROR ( "Key list is empty! No containers to process!" );
79 return StatusCode::FAILURE;
80 }
81 const LArDigitContainer* larDigitContainer = nullptr;
82
83 for (const std::string& key : m_keylist) {
84 StatusCode sc= evtStore()->retrieve(larDigitContainer,key);
85 if (sc.isFailure() || !larDigitContainer) {
86 ATH_MSG_DEBUG ( "Cannot read LArCalibDigitContainer from StoreGate! key=" << key );
87 continue;
88 }
89 if(larDigitContainer->empty()) {
90 ATH_MSG_DEBUG ( "Got empty LArDigitContainer (key=" << key << ")." );
91 continue;
92 }
93 for (const LArDigit* digit : *larDigitContainer) {
94 const HWIdentifier chid=digit->hardwareID();
95 const CaloGain::CaloGain gain=digit->gain();
96 //LArPedestal& thisPed=m_pedestal[gain][chid];
97 LArPedestal& thisPed=m_pedestal.get(chid,gain);
98 //log << MSG::DEBUG << "Cell: " << icell << " with gain " << gain << endmsg;
99 if (gain<0 || gain>CaloGain::LARNGAIN) {
100 ATH_MSG_ERROR ( "Found odd gain number ("<< (int)gain <<")" );
101 return StatusCode::FAILURE;
102 }
103 const std::vector<short> & samples = digit->samples();
104 if (thisPed.get_max()!=-1) //Have already boundaries set
105 {//Check samples are in range
106 std::vector<short>::const_iterator s_it=samples.begin();
107 std::vector<short>::const_iterator s_it_e=samples.end();
108 const short& min=thisPed.get_min();
109 const short& max=thisPed.get_max();
110 for (;s_it!=s_it_e && *s_it>=min && *s_it<=max;++s_it)
111 ; //Loop over samples to check....
112 if (s_it==s_it_e) //Reached end of loop?
113 thisPed.add(samples);
114 }
115 else {//number of entries smaller or equal to than m_nref
116 thisPed.add(samples);
117 if (thisPed.get_nentries()==m_nref && m_nref>0) { //Set window size
118 const double mean = thisPed.get_mean();
119 const double noise = thisPed.get_rms();
120 const short min = (short)floor(mean - m_rms_cut*noise);
121 const short max = (short)ceil(mean + m_rms_cut*noise);
122 thisPed.set_min(min);
123 thisPed.set_max(max);
124 thisPed.zero();
125 } //end if nentries==m_nref
126 } // end else
127 }//End loop over all cells
128 }// End loop over all containers
129 return StatusCode::SUCCESS;
130}
131
132
133//---------------------------------------------------------------------------
135//---------------------------------------------------------------------------
136{
137 ATH_MSG_INFO ( ">>> Stop" );
138
139 if (m_keylist.empty()) {
140 ATH_MSG_ERROR ( "Key list is empty! No containers processed!" );
141 return StatusCode::FAILURE;
142 }
143
144 // Create the LArPedestalComplete object
145 auto larPedestalComplete = std::make_unique<LArPedestalComplete>();
146
147 ATH_CHECK( larPedestalComplete->setGroupingType(m_groupingType,msg()) );
148 ATH_CHECK( larPedestalComplete->initialize() );
149
150 //Outermost loop goes over all gains (different containers).
151 for (int gain=0;gain<(int)CaloGain::LARNGAIN;gain++) {
152 //log << MSG::INFO << "Gain " << gain << ", m_pedestal size for this gain = " << m_pedestal[gain].size() << endmsg;
153
156
157 //Inner loop goes over the cells.
158 int n_zero,n_min, n_max, n_cur;
159 n_zero=0; n_max=n_min=-1;
160 for (;cell_it!=cell_it_e;cell_it++) {
161 // Check number of entries
162 LArPedestal thisPed=*cell_it;
163 if(thisPed.get_nentries()==0) { n_zero++; continue; }
164 // Get the mean and rms
165 if (m_sample_min >=0 ) {
167 m_rms[0] = thisPed.get_rms(m_sample_max, m_sample_max);
168 }
169 else if (m_which_sample==-1 || m_which_sample>=(int)thisPed.get_nsamples()) {
170 m_mean[0] = thisPed.get_mean();
171 m_rms[0] = thisPed.get_rms();
172 }
173 else {
174 m_mean[0] = thisPed.get_mean(m_which_sample);
175 m_rms[0] = thisPed.get_rms(m_which_sample);
176 }
177 n_cur = thisPed.get_nentries();
178 if(n_cur<n_min || n_min<0) n_min=n_cur;
179 if(n_cur>n_max || n_max<0) n_max=n_cur;
180
181 HWIdentifier ch_id = cell_it.channelId();
182
183 // Fill the data class with pedestal and rms values
184 if (ch_id!=0)
185 larPedestalComplete->set(ch_id,gain,m_mean[0],m_rms[0]);
186 }
187
188 ATH_MSG_INFO ( "Gain " << gain << " Number of cells with 0 events to compute pedestal: " << n_zero );
189 ATH_MSG_INFO ( "Gain " << gain << " Minimum number of events|samples to compute pedestal: " << n_min );
190 ATH_MSG_INFO ( "Gain " << gain << " Maximum number of events|samples to compute pedestal: " << n_max );
191 }
192
193 ATH_MSG_INFO ( " Summary : Number of cells with a pedestal value computed : " << larPedestalComplete->totalNumberOfConditions() );
194 ATH_MSG_INFO ( " Summary : Number of Barrel PS cells side A or C (connected+unconnected): 4096 " );
195 ATH_MSG_INFO ( " Summary : Number of Barrel cells side A or C (connected+unconnected): 53248 " );
196 ATH_MSG_INFO ( " Summary : Number of EMEC cells side A or C (connected+unconnected): 35328 " );
197 ATH_MSG_INFO ( " Summary : Number of HEC cells side A or C (connected+unconnected): 3072 ");
198 ATH_MSG_INFO ( " Summary : Number of FCAL cells side A or C (connected+unconnected): 1792 " );
199
200 // Record LArPedestalComplete
201 ATH_CHECK( detStore()->record(std::move(larPedestalComplete),m_keyoutput) );
202
203 ATH_MSG_INFO ( ">>> End of finalize" );
204 return StatusCode::SUCCESS;
205}
206
#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
bool empty() const noexcept
Returns true if the collection is empty.
void set(const std::string &id)
build from a string form - hexadecimal
Container class for LArDigit.
Liquid Argon digit base class.
Definition LArDigit.h:25
LArPedestalMaker(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< float > m_rms
StatusCode initialize()
std::string m_groupingType
std::vector< float > m_mean
std::string m_keyoutput
std::vector< std::string > m_keylist
void add(const std::vector< short > &samples)
void set_max(const short max)
void set_min(const short min)
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