ATLAS Offline Software
LArReadSC.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 #include "LArCafJobs/LArReadSC.h"
6 
8 
9 #include "Identifier/Identifier.h"
11 
12 #include "CaloGeoHelpers/CaloSampling.h"
13 #include "CaloUtils/CaloCellList.h"
16 #include "GaudiKernel/ITHistSvc.h"
17 #include "GaudiKernel/ServiceHandle.h"
18 
20 
21 
22 
23 LArReadSC::LArReadSC( const std::string& name, ISvcLocator* pSvcLocator ) : AthAlgorithm( name, pSvcLocator ){
24  m_ECell.reserve(35000);
25  m_EtaCell.reserve(35000);
26  m_PhiCell.reserve(35000);
27  m_LayerCell.reserve(35000);
28  m_ProvCell.reserve(35000);
29  m_ChidCell.reserve(35000);
30  m_HwidCell.reserve(35000);
31  m_ADC.reserve(35000);
32  m_TCell.reserve(35000);
33  m_ErecoCell.reserve(35000);
34 }
35 
36 
38 
39 
41  ATH_MSG_INFO ("Initializing " << name() << "...");
42 
43  ServiceHandle<ITHistSvc> histSvc("THistSvc",name());
44  CHECK( histSvc.retrieve() );
45  m_tree = new TTree("myTree","myTree");
46  std::string out("/"+m_outStream+"/myTree");
47  CHECK( histSvc->regTree(out.c_str(),m_tree) );
48  ATH_MSG_INFO("Registered tree: " << out);
49  m_tree->Branch("RunNumber",&m_runNumber,"RunNumber/I");
50  m_tree->Branch("LBNumber",&m_lbNumber,"LBNumber/I");
51  m_tree->Branch("EventNumber",&m_eventNumber,"EventNumber/I");
52  m_tree->Branch("BCID",&m_bcid,"BCID/I");
53  m_tree->Branch("LArError",&m_error,"LArError/I");
54  m_tree->Branch("ncells",&m_ncells,"ncells/I");
55  m_tree->Branch("ECell",m_ECell.data(),"eCell[ncells]/F");
56  m_tree->Branch("EtaCell",m_EtaCell.data(),"etaCell[ncells]/F");
57  m_tree->Branch("PhiCell",m_PhiCell.data(),"phiCell[ncells]/F");
58  m_tree->Branch("LayerCell",m_LayerCell.data(),"layerCell[ncells]/I");
59  m_tree->Branch("ProvCell", m_ProvCell.data(),"provCell[ncells]/I");
60  m_tree->Branch("ChidCell", m_ChidCell.data(),"chidCell[ncells]/I");
61  m_tree->Branch("HwidCell", m_HwidCell.data(),"hwidCell[ncells]/I");
62  if(m_contKey.key().size()) m_tree->Branch("ADC",m_ADC.data(),"ADC[ncells][32]/F");
63  if(m_SCRecoKey.key().size()) {
64  m_tree->Branch("TCell",m_TCell.data(),"tCell[ncells]/F");
65  m_tree->Branch("ErecoCell",m_ErecoCell.data(),"ErecoCell[ncells]/F");
66  }
67 
68  const CaloIdManager* caloIdMgr = nullptr;
69  ATH_CHECK(detStore()->retrieve(caloIdMgr));
70  m_calo_id = caloIdMgr->getCaloCell_SuperCell_ID();
71  ATH_CHECK( detStore()->retrieve(m_lar_online_id, "LArOnline_SuperCellID") );
72 
76 
80 
81  ATH_MSG_INFO("Energy cut for time computation: " << m_etcut);
82 
83  return StatusCode::SUCCESS;
84 }
85 
87  ATH_MSG_INFO ("Finalizing " << name() << "...");
88 
89  return StatusCode::SUCCESS;
90 }
91 
93  ATH_MSG_DEBUG ("Executing " << name() << "...");
94  const EventContext& ctx = Gaudi::Hive::currentContext();
95 
97  const LArOnOffIdMapping* cabling=*cablingHdl;
98  if(!cabling) {
99  ATH_MSG_ERROR( "Do not have cabling object LArOnOffIdMapping" );
100  return StatusCode::FAILURE;
101  }
102 
104  const CaloSuperCellDetDescrManager* caloDDMgr = *caloMgrHandle;
105 
106  //Get Conditions input
108  const ILArPedestal* larPedestal=*pedHdl;
109 
110 
111  const xAOD::EventInfo* eventInfo = nullptr;
112  ATH_CHECK( evtStore()->retrieve( eventInfo) );
113 
114  m_runNumber = eventInfo->runNumber();
115  m_eventNumber = eventInfo->eventNumber();
116  m_lbNumber = eventInfo->lumiBlock();
117  m_bcid = eventInfo->bcid();
118  m_error = 0;
120 
121  std::vector<const LArDigit*> IndexDigit;
122  int nCell = m_calo_id->calo_cell_hash_max();
123  IndexDigit.resize(nCell,nullptr);
124 
125  const LArDigitContainer* digit_container=nullptr;
126  if( m_contKey.key().size() ) { // fill from standard digits
128  if(!hdlDigit.isValid()) {
129  ATH_MSG_WARNING( "Unable to retrieve LArDigitContainer with key " << m_contKey.key() << " from EventStore. " );
130  } else {
131  digit_container = hdlDigit.cptr();
132  }
133  }
134 
135  if(digit_container) { // build digits index
136  LArDigitContainer::const_iterator first_digit = digit_container->begin();
137  LArDigitContainer::const_iterator end_digit = digit_container->end();
138  for (; first_digit != end_digit; ++first_digit) {
139  HWIdentifier hwid = (*first_digit)->hardwareID();
140  Identifier id = cabling->cnvToIdentifier(hwid);
141  int index = (int) (m_calo_id->calo_cell_hash(id));
142  if (index>=0 && index<nCell) IndexDigit[index]=(*first_digit);
143  }
144  }
145 
146 
148  if(!cells.isValid()){
149  ATH_MSG_ERROR("Could not get SC container with key "<<m_SCKey.key());
150  return StatusCode::FAILURE;
151  }
152  const CaloCellContainer* cell_container=cells.cptr();
153 
154  const CaloCellContainer* recocell_container=nullptr;
155  if(m_SCRecoKey.key().size()){
157  if(recocells.isValid()) recocell_container=recocells.cptr();
158  }
159 
160  std::vector<int> iflag_cell;
161  iflag_cell.resize(nCell,0);
162 
163  CaloCellList myList(caloDDMgr, cell_container);
164 
165  m_ncells=0;
166  for (CaloCellContainer::const_iterator cell = cell_container->begin();
167  cell != cell_container->end(); ++cell) {
168  Identifier cellID = (*cell)->ID();
169  int index = (int) (m_calo_id->calo_cell_hash(cellID));
170  double et = (*cell)->et();
171 
172  if (et > m_etcut ){
173  iflag_cell[index]=1;
174 
175 
176  myList.select((*cell)->eta(),(*cell)->phi(),0.10);
177  for (const CaloCell* cell : myList) {
178  Identifier cellID2 =cell->ID();
179  int index2 = (int)(m_calo_id->calo_cell_hash(cellID2));
180  iflag_cell[index2]=1;
181  }
182  }// above first etcut
183  }// over cells
184 
185  for (CaloCellContainer::const_iterator cell = cell_container->begin();
186  cell != cell_container->end(); ++cell) {
187 
188  Identifier cellID = (*cell)->ID();
189  IdentifierHash hcell=m_calo_id->calo_cell_hash(cellID);
190  unsigned int index = hcell.value();
191 
192  if (iflag_cell[index]==1 ){
193  m_ECell[m_ncells]= (*cell)->energy();
194  m_EtaCell[m_ncells]= (*cell)->eta();
195  m_PhiCell[m_ncells]= (*cell)->phi();
197  m_ProvCell[m_ncells]=(*cell)->provenance();
198 
199  HWIdentifier hwid=cabling->createSignalChannelID(cellID);
202 
203  if(m_contKey.key().size()) { // fill samples
204  for (int i=0;i<32;i++) m_ADC[m_ncells][i]=0.;
205  float pedestal=0.;
206  if (larPedestal) {
207  pedestal = larPedestal->pedestal(hwid,(*cell)->gain());
208  }
209 
210  unsigned int index = (m_calo_id->calo_cell_hash(cellID)).value();
211  if (IndexDigit[index]) {
212  const std::vector<short>& vSamples=(IndexDigit[index])->samples();
213  int nsamples = vSamples.size();
214  for (int i=0;i<std::min(32,nsamples);i++) {
215  m_ADC[m_ncells][i]=(float)(vSamples[i])-pedestal;
216  }
217  }
218  } // samples
219  m_TCell[m_ncells]=0.;
220  m_ErecoCell[m_ncells]=0.;
221  if(recocell_container) {
222  const CaloCell *rcell= recocell_container->findCell(hcell);
223  if(rcell) {
224  m_TCell[m_ncells]=rcell->time();
225  m_ErecoCell[m_ncells]=rcell->energy();
226  }
227  }
228  m_ncells++;
229  }// iflag
230  } // over cells
231 
232  ATH_MSG_INFO("Number of cells read " << m_ncells );
233 
234  m_tree->Fill();
235 
236  return StatusCode::SUCCESS;
237 }
238 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
ILArPedestal::pedestal
virtual float pedestal(const HWIdentifier &id, int gain) const =0
LArReadSC::m_bcid
int m_bcid
Definition: LArReadSC.h:53
RunTileCalibRec.cells
cells
Definition: RunTileCalibRec.py:281
LArReadSC::m_ncells
int m_ncells
Definition: LArReadSC.h:55
et
Extra patterns decribing particle interation process.
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
CaloCellList
Definition: CaloCellList.h:40
CaloCell_Base_ID::calo_cell_hash
IdentifierHash calo_cell_hash(const Identifier cellId) const
create hash id from 'global' cell id
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
LArReadSC::m_ProvCell
std::vector< int > m_ProvCell
Definition: LArReadSC.h:60
SG::ReadCondHandle
Definition: ReadCondHandle.h:40
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
CaloCellList::select
void select(double eta, double phi, double deta, double dphi)
Definition: CaloCellList.cxx:89
xAOD::EventInfo_v1::eventNumber
uint64_t eventNumber() const
The current event's event number.
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
LArReadSC::finalize
virtual StatusCode finalize()
Definition: LArReadSC.cxx:86
LArReadSC::m_error
int m_error
Definition: LArReadSC.h:54
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
index
Definition: index.py:1
CaloCellList.h
LArReadSC::initialize
virtual StatusCode initialize()
Definition: LArReadSC.cxx:40
ILArPedestal
Definition: ILArPedestal.h:12
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
LArReadSC::m_lar_online_id
const LArOnline_SuperCellID * m_lar_online_id
Definition: LArReadSC.h:39
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:70
Identifier::get_identifier32
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
LArReadSC::m_runNumber
int m_runNumber
Definition: LArReadSC.h:50
athena.value
value
Definition: athena.py:124
CaloCell_Base_ID::calo_sample
int calo_sample(const Identifier id) const
returns an int taken from Sampling enum and describing the subCalo to which the Id belongs.
Definition: CaloCell_Base_ID.cxx:140
LArReadSC::m_SCKey
SG::ReadHandleKey< CaloCellContainer > m_SCKey
Definition: LArReadSC.h:46
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
CaloCell::time
float time() const
get time (data member)
Definition: CaloCell.h:368
HWIdentifier
Definition: HWIdentifier.h:13
xAOD::EventInfo_v1::LAr
@ LAr
The LAr calorimeter.
Definition: EventInfo_v1.h:335
LArReadSC::m_eventNumber
int m_eventNumber
Definition: LArReadSC.h:52
Identifier32::get_compact
value_type get_compact() const
Get the compact id.
Definition: Identifier32.h:44
LArReadSC::m_ChidCell
std::vector< int > m_ChidCell
Definition: LArReadSC.h:61
xAOD::EventInfo_v1::runNumber
uint32_t runNumber() const
The current event's run number.
LArReadSC::m_PhiCell
std::vector< float > m_PhiCell
Definition: LArReadSC.h:58
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
CaloCell::energy
double energy() const
get energy (data member)
Definition: CaloCell.h:327
xAOD::EventInfo_v1::Error
@ Error
The sub-detector issued an error.
Definition: EventInfo_v1.h:349
CaloSuperCellDetDescrManager
Definition: CaloDetDescrManager.h:486
LArReadSC::m_contKey
SG::ReadHandleKey< LArDigitContainer > m_contKey
Definition: LArReadSC.h:45
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
LArReadSC::m_ErecoCell
std::vector< float > m_ErecoCell
Definition: LArReadSC.h:65
LArReadSC::m_TCell
std::vector< float > m_TCell
Definition: LArReadSC.h:64
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CaloIdManager
This class initializes the Calo (LAr and Tile) offline identifiers.
Definition: CaloIdManager.h:45
CaloCell_Base_ID::calo_cell_hash_max
size_type calo_cell_hash_max() const
cell 'global' hash table max size
LArReadSC::~LArReadSC
virtual ~LArReadSC()
Definition: LArReadSC.cxx:37
lumiFormat.i
int i
Definition: lumiFormat.py:85
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
LArReadSC::m_etcut
Gaudi::Property< double > m_etcut
Definition: LArReadSC.h:35
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
LArReadSC.h
MuonSegmentReaderConfig.histSvc
histSvc
Definition: MuonSegmentReaderConfig.py:96
CaloCell_SuperCell_ID.h
Helper class for offline supercell identifiers.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
LArReadSC::execute
virtual StatusCode execute()
Definition: LArReadSC.cxx:92
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
xAOD::EventInfo_v1::lumiBlock
uint32_t lumiBlock() const
The current event's luminosity block number.
AthAlgorithm
Definition: AthAlgorithm.h:47
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
CaloCellContainer::findCell
const CaloCell * findCell(const IdentifierHash theHash) const
fast find method given identifier hash.
Definition: CaloCellContainer.cxx:345
Trk::index2
@ index2
Definition: BoundarySurfaceFace.h:49
HWIdentifier.h
LArReadSC::m_SCRecoKey
SG::ReadHandleKey< CaloCellContainer > m_SCRecoKey
Definition: LArReadSC.h:47
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
LArReadSC::m_lbNumber
int m_lbNumber
Definition: LArReadSC.h:51
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
LArReadSC::LArReadSC
LArReadSC(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArReadSC.cxx:23
IdentifierHash::value
value_type value() const
CaloCellContainer
Container class for CaloCell.
Definition: CaloCellContainer.h:55
LArReadSC::m_ECell
std::vector< float > m_ECell
Definition: LArReadSC.h:56
LArReadSC::m_pedestalKey
SG::ReadCondHandleKey< ILArPedestal > m_pedestalKey
Definition: LArReadSC.h:42
EventInfo.h
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
ReadOfcFromCool.nsamples
nsamples
Definition: ReadOfcFromCool.py:115
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
LArReadSC::m_ADC
std::vector< std::array< float,32 > > m_ADC
Definition: LArReadSC.h:63
DeMoScan.index
string index
Definition: DeMoScan.py:362
LArReadSC::m_EtaCell
std::vector< float > m_EtaCell
Definition: LArReadSC.h:57
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
ILArPedestal.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LArReadSC::m_LayerCell
std::vector< int > m_LayerCell
Definition: LArReadSC.h:59
LArReadSC::m_caloMgrKey
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_caloMgrKey
Definition: LArReadSC.h:43
CaloIdManager::getCaloCell_SuperCell_ID
const CaloCell_SuperCell_ID * getCaloCell_SuperCell_ID(void) const
Definition: CaloIdManager.cxx:110
xAOD::EventInfo_v1::errorState
EventFlagErrorState errorState(EventFlagSubDet subDet) const
Get the error state for a particular sub-detector.
Definition: EventInfo_v1.cxx:817
LArDigitContainer
Container class for LArDigit.
Definition: LArDigitContainer.h:24
LArReadSC::m_calo_id
const CaloCell_SuperCell_ID * m_calo_id
Definition: LArReadSC.h:38
CaloIdManager.h
LArReadSC::m_cablingKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Definition: LArReadSC.h:41
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
LArReadSC::m_tree
TTree * m_tree
Definition: LArReadSC.h:49
xAOD::EventInfo_v1::bcid
uint32_t bcid() const
The bunch crossing ID of the event.
LArReadSC::m_HwidCell
std::vector< int > m_HwidCell
Definition: LArReadSC.h:62
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:66
ServiceHandle< ITHistSvc >
LArOnOffIdMapping
Definition: LArOnOffIdMapping.h:20
LArReadSC::m_outStream
Gaudi::Property< std::string > m_outStream
Definition: LArReadSC.h:36
Identifier
Definition: IdentifierFieldParser.cxx:14