ATLAS Offline Software
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 
33 LArPedestalMaker::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
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 ) {
166  m_mean[0] = thisPed.get_mean(m_sample_min, m_sample_max);
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 
LArPedestal::get_rms
double get_rms() const
Definition: LArCalibUtils/src/LArPedestal.cxx:151
LArConditionsContainerDB::iteratorT::channelId
HWIdentifier channelId() const
LArPedestalMaker::m_mean
std::vector< float > m_mean
Definition: LArPedestalMaker.h:95
xAOD::short
short
Definition: Vertex_v1.cxx:165
mean
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="")
Definition: dependence.cxx:254
Identifier::set
void set(const std::string &id)
build from a string form - hexadecimal
Definition: Identifier.cxx:18
max
#define max(a, b)
Definition: cfImp.cxx:41
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
LArPedestal::get_mean
double get_mean() const
Definition: LArCalibUtils/src/LArPedestal.cxx:102
LArConditionsContainerBase::SingleGroup
@ SingleGroup
Definition: LArConditionsContainerBase.h:46
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
LArPedestal
Definition: LArCalibUtils/LArCalibUtils/LArPedestal.h:27
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LArConditionsContainerDB::iteratorT
Declaration of const iterator.
Definition: LArConditionsContainerDB.h:72
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
LArPedestalMaker::m_keyoutput
std::string m_keyoutput
Definition: LArPedestalMaker.h:72
LArPedestal::get_max
const short & get_max() const
Definition: LArCalibUtils/LArCalibUtils/LArPedestal.h:93
LArPedestal::add
void add(const std::vector< short > &samples)
Definition: LArCalibUtils/src/LArPedestal.cxx:170
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
HWIdentifier
Definition: HWIdentifier.h:13
CaloGain::LARNGAIN
@ LARNGAIN
Definition: CaloGain.h:19
LArPedestalMaker::m_sample_max
int m_sample_max
Definition: LArPedestalMaker.h:87
LArPedestal::get_min
const short & get_min() const
Definition: LArCalibUtils/LArCalibUtils/LArPedestal.h:90
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
LArPedestalMaker::execute
StatusCode execute()
Definition: LArPedestalMaker.cxx:74
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
LArPedestalMaker::stop
StatusCode stop()
Definition: LArPedestalMaker.cxx:134
LArPedestal::get_nsamples
unsigned get_nsamples() const
Definition: LArCalibUtils/LArCalibUtils/LArPedestal.h:87
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
LArPedestal::set_min
void set_min(const short min)
Definition: LArCalibUtils/src/LArPedestal.cxx:37
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LArConditionsContainer::end
ConstConditionsMapIterator end(unsigned int gain) const
end of all channels for this gain
LArDigit
Liquid Argon digit base class.
Definition: LArDigit.h:25
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
01SubmitToGrid.samples
samples
Definition: 01SubmitToGrid.py:58
LArConditionsContainer::get
ConstReference get(const HWIdentifier id, unsigned int gain=0) const
get data with online identifier
LArPedestalMaker::LArPedestalMaker
LArPedestalMaker(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArPedestalMaker.cxx:33
LArPedestalMaker.h
LArPedestalMaker::m_rms_cut
double m_rms_cut
Definition: LArPedestalMaker.h:81
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
LArPedestalMaker::m_nref
int m_nref
Definition: LArPedestalMaker.h:78
LArPedestalMaker::~LArPedestalMaker
~LArPedestalMaker()
LArPedestalMaker::m_sample_min
int m_sample_min
Definition: LArPedestalMaker.h:86
LArPedestal::set_max
void set_max(const short max)
Definition: LArCalibUtils/src/LArPedestal.cxx:44
AthAlgorithm
Definition: AthAlgorithm.h:47
min
#define min(a, b)
Definition: cfImp.cxx:40
LArPedestalMaker::m_keylist
std::vector< std::string > m_keylist
Definition: LArPedestalMaker.h:71
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
LArPedestalMaker::m_rms
std::vector< float > m_rms
Definition: LArPedestalMaker.h:96
CaloGain::CaloGain
CaloGain
Definition: CaloGain.h:11
LArPedestalMaker::initialize
StatusCode initialize()
Definition: LArPedestalMaker.cxx:52
LArPedestal::zero
void zero()
Definition: LArCalibUtils/src/LArPedestal.cxx:188
LArConditionsContainer::initialize
virtual StatusCode initialize()
Initialization done after creation or read back - derived classes may augment the functionality.
LArPedestalMaker::m_groupingType
std::string m_groupingType
Definition: LArPedestalMaker.h:75
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
LArConditionsContainer::begin
ConstConditionsMapIterator begin(unsigned int gain) const
get iterator for all channels for a gain
LArDigitContainer
Container class for LArDigit.
Definition: LArDigitContainer.h:24
LArPedestalMaker::m_which_sample
int m_which_sample
Definition: LArPedestalMaker.h:84
LArPedestalMaker::m_pedestal
LARPEDMAP m_pedestal
Definition: LArPedestalMaker.h:92
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
WriteCellNoiseToCool.noise
noise
Definition: WriteCellNoiseToCool.py:380
LArPedestal::get_nentries
int get_nentries() const
Definition: LArCalibUtils/LArCalibUtils/LArPedestal.h:70
LArOnlineID.h
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37