ATLAS Offline Software
LArAutoCorrMaker.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 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  sc=evtStore()->retrieve( eventInfo );
96  if (sc.isFailure()) {
97  ATH_MSG_ERROR( "Failed to retrieve EventInfo object!" );
98  return sc;
99  }
100 
102  const BunchCrossingCondData* bunchCrossing=*bccd;
103  if (!bunchCrossing) {
104  ATH_MSG_ERROR("Failed to retrieve Bunch Crossing obj");
105  return StatusCode::FAILURE;
106  }
107 
108  uint32_t bcid = eventInfo->bcid();
109  const int nBCsFromFront=bunchCrossing->distanceFromFront(bcid,BunchCrossingCondData:: BunchCrossings);
110  if (nBCsFromFront < m_bunchCrossingsFromFront) {
111  ATH_MSG_DEBUG("BCID " << bcid << " only " << nBCsFromFront << " BCs from front of BunchTrain. Event ignored. (min=" <<m_bunchCrossingsFromFront
112  << ", type= " << bunchCrossing->bcType(bcid) << ")" );
113  return StatusCode::SUCCESS; //Ignore this event
114  }
115  else
116  ATH_MSG_DEBUG("BCID " << bcid << " is " << nBCsFromFront << " BCs from front of BunchTrain. Event accepted.(min=" <<m_bunchCrossingsFromFront << ")");
117  }
118 
119  const LArDigitContainer* larDigitContainer = nullptr;
120 
121  for (const std::string& key : m_keylist) {
122  ATH_MSG_DEBUG("Reading LArDigitContainer from StoreGate! key=" << key);
123  sc= evtStore()->retrieve(larDigitContainer,key);
124  if (sc.isFailure() || !larDigitContainer) {
125  ATH_MSG_DEBUG("Cannot read LArDigitContainer from StoreGate! key=" << key);
126  continue;
127  }
128  if(larDigitContainer->empty()) {
129  ATH_MSG_DEBUG("Got empty LArDigitContainer (key=" << key << ").");
130  continue;
131  }
132  ATH_MSG_DEBUG("Got LArDigitContainer with key " << key <<", size=" << larDigitContainer->size());
133  ++m_nEvents;
134  m_nsamples = (*larDigitContainer->begin())->nsamples();
135  ATH_MSG_DEBUG("NSAMPLES (from digit container) = " << m_nsamples );
136 
137  for (const LArDigit* digit : *larDigitContainer) {
138  const HWIdentifier chid=digit->hardwareID();
139  const CaloGain::CaloGain gain=digit->gain();
140  if (gain<0 || gain>CaloGain::LARNGAIN) {
141  ATH_MSG_ERROR( "Found odd gain number ("<< (int)gain <<")" );
142  return StatusCode::FAILURE;
143  }
144  const std::vector<short> & samples = digit->samples();
145  // LArAutoCorr& thisAC=m_autocorr[gain][chid];
146  LArAutoCorr& thisAC=m_autocorr.get(chid,gain);
147 
148  if(thisAC.get_max()!=-1){ //Have already boundaries set
149  std::vector<short>::const_iterator s_it=samples.begin();
150  std::vector<short>::const_iterator s_it_e=samples.end();
151  const short & min = thisAC.get_min();
152  const short & max = thisAC.get_max();
153 
154  for (;s_it!=s_it_e && *s_it>=min && *s_it<=max;++s_it)
155  ;
156  if (s_it==s_it_e)
157  thisAC.add(samples,m_nsamples);
158  }
159  else {
160  thisAC.add(samples,m_nsamples);
161  if (thisAC.get_nentries()==m_nref && m_nref>0) { //Set window size
162  // Define the window (min, max)according to pedestal and noise
163  // computed for a number of events = m_nref
164  const double mean = thisAC.get_mean();
165  const double noise = thisAC.get_rms();
166  const short min = (short)floor(mean - m_rms_cut*noise);
167  const short max = (short)ceil(mean + m_rms_cut*noise);
168  thisAC.set_min(min);
169  thisAC.set_max(max);
170  thisAC.correl_zero();
171  } //end if nentries==m_nref
172  } // end else
173  }//End loop over all cells
174  }// End loop over all containers
175  return StatusCode::SUCCESS;
176 }
177 
178 
179 //---------------------------------------------------------------------------
181  //---------------------------------------------------------------------------
182 {
183  StatusCode sc;
184  ATH_MSG_INFO( ">>> Stop()" );
185 
186  if (m_keylist.empty()) {
187  ATH_MSG_ERROR( "Key list is empty! No containers processed!" );
188  return StatusCode::FAILURE;
189  }
190 
191  // Create the LArAutoCorrComplete object
192  LArAutoCorrComplete* larAutoCorrComplete = new LArAutoCorrComplete();
193 
194  sc=larAutoCorrComplete->setGroupingType(m_groupingType,msg());
195  if (sc.isFailure()) {
196  ATH_MSG_ERROR( "Failed to set groupingType for LArAutoCorrComplete object" );
197  return sc;
198  }
199 
200  sc=larAutoCorrComplete->initialize();
201  if (sc.isFailure()) {
202  ATH_MSG_ERROR( "Failed initialize LArAutoCorrComplete object" );
203  return sc;
204  }
205 
206  for (int gain=0;gain<(int)CaloGain::LARNGAIN;gain++) {
209 
210  //Inner loop goes over the cells.
211  for (;cell_it!=cell_it_e;cell_it++) {
212  LArAutoCorr autocorr = *cell_it;
213  // Check number of entries
214  if(autocorr.get_nentries()==0) continue;
215 
216  // Get the autocorrelation matrix
217 
218 
219  //MGV implement normalization switch
220  const std::vector<double> & cov = autocorr.get_cov(m_normalize,m_physics);
221 
222  //The AutoCorr is stored as float -> convert
223  std::vector<float> cov_flt;
224  cov_flt.reserve(cov.size());
225  std::vector<double>::const_iterator it=cov.begin();
226  std::vector<double>::const_iterator it_e=cov.end();
227  for (;it!=it_e;++it)
228  cov_flt.push_back((float)*it);
229  HWIdentifier ch_id = cell_it.channelId();
230 
231  // Fill the data class with autocorrelation elements
232  if (ch_id!=0) {
233  larAutoCorrComplete->set(ch_id,gain,cov_flt);
234  }
235  }
236  }
237 
238  ATH_MSG_INFO( "AutoCorrelation based on " << m_nEvents << " events." );
239  ATH_MSG_INFO( " Summary : Number of cells with a autocorr value computed : " << larAutoCorrComplete->totalNumberOfConditions() );
240  ATH_MSG_INFO( " Summary : Number of Barrel PS cells side A or C (connected+unconnected): 4096 " );
241  ATH_MSG_INFO( " Summary : Number of Barrel cells side A or C (connected+unconnected): 53248 " );
242  ATH_MSG_INFO( " Summary : Number of EMEC cells side A or C (connected+unconnected): 35328 " );
243  ATH_MSG_INFO( " Summary : Number of HEC cells side A or C (connected+unconnected): 3072 ");
244  ATH_MSG_INFO( " Summary : Number of FCAL cells side A or C (connected+unconnected): 1792 " );
245 
246  // Record LArAutoCorrComplete
247  sc = detStore()->record(larAutoCorrComplete,m_keyoutput);
248  if (sc != StatusCode::SUCCESS) {
249  ATH_MSG_ERROR( " Cannot store LArAutoCorrComplete in DetectorStore " );
250  return sc;
251  }
252 
253  // Make symlink
254  sc = detStore()->symLink(larAutoCorrComplete, (ILArAutoCorr*)larAutoCorrComplete);
255  if (sc != StatusCode::SUCCESS) {
256  ATH_MSG_ERROR( " Cannot make link for Data Object " );
257  return sc;
258  }
259 
260  return StatusCode::SUCCESS;
261 }
262 
263 
264 
265 
266 
267 
268 
269 
LArConditionsContainerDB::iteratorT::channelId
HWIdentifier channelId() const
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
BunchCrossingCondData
Definition: BunchCrossingCondData.h:23
LArAutoCorrMaker::m_rms_cut
int m_rms_cut
Definition: LArAutoCorrMaker.h:94
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
LArConditionsContainerBase::SingleGroup
@ SingleGroup
Definition: LArConditionsContainerBase.h:46
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
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
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
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:110
skel.it
it
Definition: skel.GENtoEVGEN.py:396
plotBeamSpotVxVal.cov
cov
Definition: plotBeamSpotVxVal.py:201
LArAutoCorrMaker::m_nsamples
int m_nsamples
Definition: LArAutoCorrMaker.h:95
LArAutoCorrComplete::set
void set(const HWIdentifier &CellID, int gain, const std::vector< float > &vAutoCorr)
Definition: LArAutoCorrComplete.cxx:13
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
ILArAutoCorr
This class defines the interface for accessing AutoCorrelation parameters for each channel @stereotyp...
Definition: ILArAutoCorr.h:29
LArConditionsContainer::totalNumberOfConditions
unsigned int totalNumberOfConditions() const
Statistics: total number of conditions.
LArAutoCorrComplete
This class implements the ILArAutoCorr interface.
Definition: LArAutoCorrComplete.h:26
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
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
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:228
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
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:180
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