ATLAS Offline Software
LArDigitsAccumulator.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 #include "LArDigitsAccumulator.h"
8 
9 #include "CLHEP/Units/SystemOfUnits.h"
10 #include <cmath>
11 #include <cstdint>
12 
13 LArDigitsAccumulator::LArDigitsAccumulator (const std::string& name, ISvcLocator* pSvcLocator):
14  AthAlgorithm(name, pSvcLocator),
15  m_onlineHelper(nullptr),
16  m_AccuDigitContainerName("LArAccumulatedDigits"),
17  m_NtriggersPerStep(100),
18  m_nStepTrigger(30)
19 {
20  declareProperty("LArAccuDigitContainerName",m_AccuDigitContainerName);
21  declareProperty("KeyList",m_keylist);
22  declareProperty("NTriggersPerStep",m_NtriggersPerStep);
23  declareProperty("StepOfTriggers",m_nStepTrigger);
24  declareProperty("DropPercentTrig",m_DropPercentTrig=10);
25  declareProperty("isSC",m_isSC=false);
26 
28 }
29 
30 
32 {
33  StatusCode sc;
34  if(m_isSC){
35  const LArOnline_SuperCellID *scid;
36  sc = detStore()->retrieve(scid, "LArOnline_SuperCellID");
37  if (sc.isFailure()) {
38  ATH_MSG_ERROR( "Could not get LArOnline_SuperCellID helper !" );
39  return sc;
40  } else {
41  m_onlineHelper = (const LArOnlineID_Base*)scid;
42  ATH_MSG_DEBUG("Found the LArOnlineID helper");
43  }
44  } else {
45  const LArOnlineID* ll;
46  sc = detStore()->retrieve(ll, "LArOnlineID");
47  if (sc.isFailure()) {
48  ATH_MSG_ERROR( "Could not get LArOnlineID helper !" );
49  return sc;
50  } else {
52  ATH_MSG_DEBUG(" Found the LArOnlineID helper. ");
53  }
54  } //m_isSC
55 
57  return StatusCode::SUCCESS;
58 }
59 
60 
61 
63 {
64  if ( m_event_counter < 100 || m_event_counter%100==0 )
65  ATH_MSG_INFO( "Processing event " << m_event_counter );
67 
68 
69  // pointer to input container
70  const LArDigitContainer* DigitContainer=nullptr;
71 
72 
73  // retrieve input Digits
74 
75  //Loop over all containers that are to be processed (e.g. different gains)
76  for (const std::string& key : m_keylist) {
77 
78  ATH_CHECK( evtStore()->retrieve(DigitContainer,key) );
79 
80  // store LArAccumulatedDigits
81  ACCUMDIGIT_VEC& vAccum = m_my_vec;
82  if(vAccum.empty()) vAccum.resize(m_onlineHelper->channelHashMax());
83 
84  // Loop over DigitContainer
85 
86  if(DigitContainer->empty()) {
87  ATH_MSG_DEBUG( "LArDigitContainer with key=" << key << " is empty " );
88  }else{
89  ATH_MSG_DEBUG( "LArDigitContainer with key=" << key << " has size = " << DigitContainer->size() );
90  }
91 
92  //unsigned int iStepTrigger=0;
93 
94  // output container
95  auto larAccuDigitContainer = std::make_unique<LArAccumulatedDigitContainer>(SG::VIEW_ELEMENTS);
96  //Loop over all cells
97  for (const LArDigit* digit : *DigitContainer) {
98 
99  // identificators
100  HWIdentifier chid=digit->hardwareID();
101  const IdentifierHash hashid = m_onlineHelper->channel_Hash(chid);
102 
103  if( m_isSC ){
105  bool hasInvalid=false;
106  for(auto s : digit->samples()){
107  if(s<0){
108  hasInvalid=true;
109  break;
110  }
111  }
112  if(hasInvalid) continue;
113  }
114 
115 
116  CaloGain::CaloGain gain=digit->gain();
117  if (gain<0 || gain>CaloGain::LARNGAIN)
118  {
119  ATH_MSG_ERROR( "Found not-matching gain number ("<< (int)gain <<")" );
120  return StatusCode::FAILURE;
121  }
122 
123  // object to be filled for each cell
124  LArAccumulated& cellAccumulated = m_Accumulated[hashid];
125  cellAccumulated.m_onlineId=chid.get_identifier32().get_compact();
126 
127  // trigger counter for each cell
128  cellAccumulated.m_ntrigger++;
129 
130  //ATH_MSG_DEBUG( "chid = " << chid << ", trigger = " << cellAccumulated.m_ntrigger << ", sample 0 = "<< digit->samples()[0] );
131 
132  // at first trigger, initialize vectors
133  unsigned int sizeSamples = digit->samples().size();
134  //ATH_MSG_DEBUG( "# of samples = " << sizeSamples );
135 
136  LArAccumulatedDigit* accuDigit;
137 
138  if(m_event_counter==1){
139  accuDigit = new LArAccumulatedDigit(chid);
140  vAccum[hashid]=accuDigit;
141  }
142 
143  if(cellAccumulated.m_ntrigger==1){
144  // std::cout << "resizing to 0 "<< std::endl;
145  cellAccumulated.m_samplesum.clear();
146  cellAccumulated.m_samplesum.resize(sizeSamples,0);
147  cellAccumulated.m_matrix.clear();
148  cellAccumulated.m_matrix.resize(sizeSamples,0);
149  }
150  accuDigit = m_my_vec[hashid];
151 
152  unsigned int l= 0;
153  for(unsigned int j=0;j<sizeSamples;j++){
154  cellAccumulated.m_samplesum[j] += digit->samples()[j];
155  for(unsigned int k=j;k<sizeSamples;k++)
156  {
157  l=k-j;
158  cellAccumulated.m_matrix[l] += digit->samples()[j]*digit->samples()[k];
159  // std::cout << "accumulation, l = "<< l << ", j = "<< j << ", k = "<< k << ", matrix = "<< cellAccumulated.m_matrix[l] <<", sum = "<< cellAccumulated.m_samplesum << std::endl;
160  l++;
161  }
162  }
163 
164  //ATH_MSG_DEBUG( "Sum = " << cellAccumulated.m_samplesum );
165  //ATH_MSG_DEBUG( "Matrix = " << cellAccumulated.m_matrix[0] );
166 
167  // when reached total number of triggers for this step, fill LArAccumulatedDigit and reset number of triggers
168 
169  unsigned int ntrigUsed = m_NtriggersPerStep;
170  if ( m_isSC && m_DropPercentTrig != 0 ){
171  ntrigUsed -= ntrigUsed*(m_DropPercentTrig/100);
172  }
173 
174  if(cellAccumulated.m_ntrigger==ntrigUsed){
175 
176  ATH_MSG_DEBUG( "filling LArAccumulatedDigit " );
177  ATH_MSG_DEBUG( "chid = " << chid << ", gain = " << gain << ", trigPerStep = " << m_NtriggersPerStep );
178 
179  accuDigit->setAddSubStep(gain,chid,cellAccumulated.m_samplesum,cellAccumulated.m_matrix,ntrigUsed);
180 
181  larAccuDigitContainer->push_back(accuDigit);
182 
183  cellAccumulated.m_nused = cellAccumulated.m_ntrigger;
184  cellAccumulated.m_ntrigger = 0;
185 
186  }
187 
188  }// loop over cells in container
189 
190  ATH_MSG_DEBUG( "Finished loop over channels " );
191 
192  const std::string SGkey=key+m_AccuDigitContainerName;
193  ATH_CHECK( evtStore()->record(std::move(larAccuDigitContainer),SGkey,false) );
194  ATH_MSG_INFO( "Recorded succesfully LArAccumulatedDigitContainer with key " << SGkey );
195 
196 
197  } // loop over key container
198  return StatusCode::SUCCESS;
199 }
200 
201 
203 
204  if ( !m_isSC ) return StatusCode::SUCCESS;
206  for(auto &sc : m_Accumulated){
207  if(sc.m_onlineId && sc.m_nused != ntrigUsed){
208  ATH_MSG_WARNING("Not enough triggers for channel OnlineID " << sc.m_onlineId << " ntriggers " << sc.m_ntrigger );
209  }
210  }
211 
212  return StatusCode::SUCCESS;
213 
214 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
LArDigitsAccumulator::LArAccumulated
Class of intermediate accumulations.
Definition: LArDigitsAccumulator.h:40
LArDigitsAccumulator.h
LArOnlineID_Base::channel_Hash
IdentifierHash channel_Hash(HWIdentifier channelId) const
Create channel_hash from channel_Id.
Definition: LArOnlineID_Base.cxx:1632
LArDigitsAccumulator::m_isSC
bool m_isSC
Tells you wether you run on SuperCells or Cells.
Definition: LArDigitsAccumulator.h:98
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
LArDigitsAccumulator::m_nStepTrigger
unsigned int m_nStepTrigger
Number of steps.
Definition: LArDigitsAccumulator.h:75
LArDigitsAccumulator::LArAccumulated::m_samplesum
std::vector< uint64_t > m_samplesum
Definition: LArDigitsAccumulator.h:45
detail::ll
long long ll
Definition: PrimitiveHelpers.h:47
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TBReadH8ByteStream-Monitor_jobOptions.SGkey
SGkey
Definition: TBReadH8ByteStream-Monitor_jobOptions.py:53
LArAccumulatedDigit::setAddSubStep
bool setAddSubStep(const CaloGain::CaloGain gain_value, const HWIdentifier chid, const std::vector< uint64_t > &sampleSum, const std::vector< uint64_t > &sampleSquare, const unsigned nTrigger)
Accumulate new values
Definition: LArAccumulatedDigit.cxx:113
SG::VIEW_ELEMENTS
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition: OwnershipPolicy.h:18
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
Identifier::get_identifier32
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
LArDigitsAccumulator::m_my_vec
ACCUMDIGIT_VEC m_my_vec
Definition: LArDigitsAccumulator.h:55
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
LArDigitsAccumulator::LArDigitsAccumulator
LArDigitsAccumulator(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArDigitsAccumulator.cxx:13
LArDigitsAccumulator::m_keylist
std::vector< std::string > m_keylist
list of key for input digit container (=gain)
Definition: LArDigitsAccumulator.h:65
LArDigitsAccumulator::LArAccumulated::m_matrix
std::vector< uint64_t > m_matrix
Definition: LArDigitsAccumulator.h:46
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
HWIdentifier
Definition: HWIdentifier.h:13
CaloGain::LARNGAIN
@ LARNGAIN
Definition: CaloGain.h:19
LArDigitsAccumulator::m_AccuDigitContainerName
std::string m_AccuDigitContainerName
LArAccumulatedDigitContainer name.
Definition: LArDigitsAccumulator.h:60
Identifier32::get_compact
value_type get_compact() const
Get the compact id.
Definition: Identifier32.h:44
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
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
LArDigitsAccumulator::execute
StatusCode execute()
Definition: LArDigitsAccumulator.cxx:62
LArDigitsAccumulator::LArAccumulated::m_nused
int m_nused
Definition: LArDigitsAccumulator.h:43
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
LArDigitsAccumulator::m_onlineHelper
const LArOnlineID_Base * m_onlineHelper
Definition: LArDigitsAccumulator.h:52
LArAccumulatedDigit
Data class for ADC samples and autocorr preprocessed by the DSP.
Definition: LArAccumulatedDigit.h:32
LArDigitsAccumulator::LArAccumulated::m_onlineId
unsigned int m_onlineId
Definition: LArDigitsAccumulator.h:44
LArDigitsAccumulator::m_NtriggersPerStep
unsigned int m_NtriggersPerStep
Number of triggers per step.
Definition: LArDigitsAccumulator.h:70
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LArDigitsAccumulator::ACCUMDIGIT_VEC
std::vector< LArAccumulatedDigit * > ACCUMDIGIT_VEC
Definition: LArDigitsAccumulator.h:54
LArDigitsAccumulator::finalize
StatusCode finalize()
Definition: LArDigitsAccumulator.cxx:202
LArDigit
Liquid Argon digit base class.
Definition: LArDigit.h:25
LArDigitsAccumulator::m_event_counter
unsigned int m_event_counter
Event counter.
Definition: LArDigitsAccumulator.h:93
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
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AthAlgorithm
Definition: AthAlgorithm.h:47
LArOnlineID_Base
Helper for the Liquid Argon Calorimeter cell identifiers.
Definition: LArOnlineID_Base.h:105
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
LArOnlineID_Base::channelHashMax
size_type channelHashMax(void) const
Define channel hash tables max size.
Definition: LArOnlineID_Base.cxx:1897
LArOnlineID
Definition: LArOnlineID.h:20
LArDigitsAccumulator::m_DropPercentTrig
double m_DropPercentTrig
Percentage of the used triggers that we will skip over at the end, in order ot ensure that the accumu...
Definition: LArDigitsAccumulator.h:82
LArOnline_SuperCellID
Definition: LArOnline_SuperCellID.h:20
CaloGain::CaloGain
CaloGain
Definition: CaloGain.h:11
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LArDigitsAccumulator::LArAccumulated::m_ntrigger
unsigned int m_ntrigger
Definition: LArDigitsAccumulator.h:42
LArDigitContainer
Container class for LArDigit.
Definition: LArDigitContainer.h:24
LArOnline_SuperCellID.h
LArDigitsAccumulator::m_Accumulated
std::vector< LArAccumulated > m_Accumulated
Vector (index=hash ID) of accumulation quantities.
Definition: LArDigitsAccumulator.h:88
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
LArDigitsAccumulator::initialize
StatusCode initialize()
Definition: LArDigitsAccumulator.cxx:31
DataVector::empty
bool empty() const noexcept
Returns true if the collection is empty.
fitman.k
k
Definition: fitman.py:528
LArOnlineID.h
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37