ATLAS Offline Software
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 
41 LArAutoCorrMaker::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);
53  declareProperty("MinBCFromFront",m_bunchCrossingsFromFront=0);
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 
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 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
LArConditionsContainerDB::iteratorT::channelId
HWIdentifier channelId() const
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:12
BunchCrossingCondData
Definition: BunchCrossingCondData.h:23
LArAutoCorrMaker::m_rms_cut
int m_rms_cut
Definition: LArAutoCorrMaker.h:94
SG::ReadCondHandle
Definition: ReadCondHandle.h:40
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
LArConditionsContainerBase::SingleGroup
@ SingleGroup
Definition: LArConditionsContainerBase.h:46
LArAutoCorrMaker::m_nref
int m_nref
Definition: LArAutoCorrMaker.h:91
LArAutoCorr::correl_zero
void correl_zero()
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:248
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
xAOD::short
short
Definition: Vertex_v1.cxx:165
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
LArConditionsContainerDB::iteratorT
Declaration of const iterator.
Definition: LArConditionsContainerDB.h:72
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
skel.it
it
Definition: skel.GENtoEVGEN.py:407
plotBeamSpotVxVal.cov
cov
Definition: plotBeamSpotVxVal.py:200
LArAutoCorrMaker::m_nsamples
int m_nsamples
Definition: LArAutoCorrMaker.h:95
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
LArAutoCorr::get_max
const short & get_max() const
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:126
LArAutoCorrMaker::m_nEvents
unsigned m_nEvents
Definition: LArAutoCorrMaker.h:108
HWIdentifier
Definition: HWIdentifier.h:13
CaloGain::LARNGAIN
@ LARNGAIN
Definition: CaloGain.h:19
LArAutoCorr::get_cov
const std::vector< double > & get_cov(int m_normalize, int m_phys)
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:149
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
LArAutoCorrMaker::m_autocorr
LARACMAP m_autocorr
Definition: LArAutoCorrMaker.h:104
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
LArAutoCorrMaker::m_keylist
std::vector< std::string > m_keylist
Definition: LArAutoCorrMaker.h:84
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
LArAutoCorrMaker::m_bcDataKey
SG::ReadCondHandleKey< BunchCrossingCondData > m_bcDataKey
Definition: LArAutoCorrMaker.h:79
LArAutoCorr::set_max
void set_max(const short max)
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:104
LArAutoCorrMaker::execute
StatusCode execute()
Definition: LArAutoCorrMaker.cxx:89
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
LArAutoCorrMaker::~LArAutoCorrMaker
~LArAutoCorrMaker()
LArAutoCorrMaker::initialize
StatusCode initialize()
Definition: LArAutoCorrMaker.cxx:60
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
LArConditionsContainer::get
ConstReference get(const HWIdentifier id, unsigned int gain=0) const
get data with online identifier
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Definition: AthCommonDataStore.h:145
LArAutoCorr::set_min
void set_min(const short min)
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:97
BunchCrossingCondData::BunchCrossings
@ BunchCrossings
Distance in units of 25 nanoseconds.
Definition: BunchCrossingCondData.h:132
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
LArAutoCorrMaker::m_keyoutput
std::string m_keyoutput
Definition: LArAutoCorrMaker.h:85
LArAutoCorr::add
void add(const std::vector< short > &samples, size_t maxnsamples)
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:222
LArAutoCorrMaker::m_physics
int m_physics
Definition: LArAutoCorrMaker.h:101
LArAutoCorr::get_nentries
int get_nentries() const
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:111
LArAutoCorrComplete.h
LArAutoCorrMaker::m_groupingType
std::string m_groupingType
Definition: LArAutoCorrMaker.h:88
AthAlgorithm
Definition: AthAlgorithm.h:47
LArAutoCorr::get_mean
double get_mean() const
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:134
BunchCrossingCondData::distanceFromFront
int distanceFromFront(const bcid_type bcid, const BunchDistanceType type=NanoSec) const
The distance of the specific bunch crossing from the front of the train.
Definition: BunchCrossingCondData.cxx:38
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
LArAutoCorr::get_min
const short & get_min() const
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:119
xAOD::bcid
setEventNumber setTimeStamp bcid
Definition: EventInfo_v1.cxx:133
LArDigitContainer.h
EventInfo.h
CaloGain::CaloGain
CaloGain
Definition: CaloGain.h:11
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
ReadOfcFromCool.nsamples
nsamples
Definition: ReadOfcFromCool.py:115
LArAutoCorrMaker::LArAutoCorrMaker
LArAutoCorrMaker(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArAutoCorrMaker.cxx:41
LArAutoCorr
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:27
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
LArAutoCorrMaker::m_normalize
int m_normalize
Definition: LArAutoCorrMaker.h:98
LArConditionsContainer::initialize
virtual StatusCode initialize()
Initialization done after creation or read back - derived classes may augment the functionality.
BunchCrossingCondData::bcType
BunchCrossingType bcType(const bcid_type bcid) const
Convenience function for the type of the specific bunch crossing.
Definition: BunchCrossingCondData.cxx:198
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
LArAutoCorr::get_rms
double get_rms() const
Definition: LArCalibUtils/LArCalibUtils/LArAutoCorr.h:199
LArAutoCorrMaker::m_keylistproperty
std::vector< std::string > m_keylistproperty
Definition: LArAutoCorrMaker.h:84
xAOD::EventInfo_v1::bcid
uint32_t bcid() const
The bunch crossing ID of the event.
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
LArAutoCorrMaker::stop
StatusCode stop()
Definition: LArAutoCorrMaker.cxx:176
LArAutoCorrMaker::m_bunchCrossingsFromFront
int m_bunchCrossingsFromFront
Definition: LArAutoCorrMaker.h:81
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
LArAutoCorrMaker.h
WriteCellNoiseToCool.noise
noise
Definition: WriteCellNoiseToCool.py:380
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
LArOnlineID.h
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37