ATLAS Offline Software
CaloLArRetriever.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 #include "CaloLArRetriever.h"
6 
7 #include "AthenaKernel/Units.h"
8 
10 
11 #include "CaloDetDescr/CaloDetDescrElement.h"
19 #include "GaudiKernel/ThreadLocalContext.h"
20 
21 using Athena::Units::GeV;
22 
23 namespace JiveXML {
24 
31  CaloLArRetriever::CaloLArRetriever(const std::string& type,const std::string& name,const IInterface* parent):
33  m_calocell_id(nullptr)
34  {
35 
36  //Only declare the interface
37  declareInterface<IDataRetriever>(this);
38 
39  declareInterface<IDataRetriever>(this);
40  declareProperty("LArlCellThreshold", m_cellThreshold = 50.);
41  declareProperty("RetrieveLAr" , m_lar = true);
42  declareProperty("DoBadLAr", m_doBadLAr = false);
43  declareProperty("DoLArCellDetails", m_doLArCellDetails = false);
44  declareProperty("CellConditionCut", m_cellConditionCut = false);
45  declareProperty("LArChannelsToIgnoreM5", m_LArChannelsToIgnoreM5);
46  declareProperty("DoMaskLArChannelsM5", m_doMaskLArChannelsM5 = false);
47 
48  declareProperty("CellEnergyPrec", m_cellEnergyPrec = 3);
49  declareProperty("CellTimePrec", m_cellTimePrec = 3);
50  }
51 
57 
58  ATH_MSG_DEBUG( "Initialising Tool" );
59  ATH_CHECK( detStore()->retrieve (m_calocell_id, "CaloCell_ID") );
60 
64 
65  return StatusCode::SUCCESS;
66  }
67 
71  StatusCode CaloLArRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
72 
73  ATH_MSG_DEBUG( "in retrieve()" );
74 
76  if (!cellContainer.isValid()){
77  ATH_MSG_WARNING( "Could not retrieve Calorimeter Cells " );
78  }
79  else{
80  if(m_lar){
81  DataMap data = getLArData(&(*cellContainer));
82  ATH_CHECK( FormatTool->AddToEvent(dataTypeName(), m_sgKey.key(), &data) );
83  ATH_MSG_DEBUG( "LAr retrieved" );
84  }
85  }
86 
87  //LAr cells retrieved okay
88  return StatusCode::SUCCESS;
89  }
90 
91 
97 
98  ATH_MSG_DEBUG( "getLArData()" );
99  const EventContext& ctx = Gaudi::Hive::currentContext();
100 
102 
103  DataVect phi; phi.reserve(cellContainer->size());
104  DataVect eta; eta.reserve(cellContainer->size());
105  DataVect energy; energy.reserve(cellContainer->size());
106  DataVect idVec; idVec.reserve(cellContainer->size());
107  DataVect channel; channel.reserve(cellContainer->size());
108  DataVect feedThrough; feedThrough.reserve(cellContainer->size());
109  DataVect slot; slot.reserve(cellContainer->size());
110 
111  DataVect cellTimeVec; cellTimeVec.reserve(cellContainer->size());
112  DataVect cellGain; cellGain.reserve(cellContainer->size());
113  DataVect cellPedestal; cellPedestal.reserve(cellContainer->size());
114  DataVect adc2Mev; adc2Mev.reserve(cellContainer->size());
115  DataVect BadCell; BadCell.reserve(cellContainer->size());
116 
117  char rndStr[30]; // for rounding (3 digit precision)
118 
121 
122 
123  const ILArPedestal* larPedestal = nullptr;
124  if(m_doLArCellDetails){
125  if( detStore()->retrieve(larPedestal).isFailure() ){
126  ATH_MSG_ERROR( "in getLArData(), Could not retrieve LAr Pedestal" );
127  }
128  }
129 
130  const LArOnlineID* onlineId = nullptr;
131  if ( detStore()->retrieve(onlineId, "LArOnlineID").isFailure()) {
132  ATH_MSG_ERROR( "in getLArData(),Could not get LArOnlineID!" );
133  }
134 
135  const LArADC2MeV* adc2mev = nullptr;
136  if (m_doLArCellDetails) {
138  adc2mev = *adc2mevH;
139  }
140 
141  double energyGeV,cellTime;
142  double energyAllLArBarrel = 0.;
143 
144  ATH_MSG_DEBUG( "Start iterator loop over cells" );
145 
147  const LArOnOffIdMapping* cabling{*cablingHdl};
148  if(!cabling) {
149  ATH_MSG_ERROR( "Do not have cabling mapping from key " << m_cablingKey.key() );
150  return dataMap;
151  }
152 
153 
154  for(;it1!=it2;++it1){
155  if ((*it1)->energy() < m_cellThreshold) continue; // skip to next cell if threshold not passed
156 
157  if((*it1)->badcell()){ BadCell.push_back(1); }
158  else{ BadCell.push_back(-1); }
159 
160  if ((((*it1)->provenance()&0xFF)!=0xA5)&&m_cellConditionCut) continue; // check full conditions for LAr
161  Identifier cellid = (*it1)->ID();
162 
163  HWIdentifier LArhwid = cabling->createSignalChannelIDFromHash((*it1)->caloDDE()->calo_hash());
164 
165  //ignore LAr cells that are to be masked
167  bool maskChannel = false;
168  for (size_t i = 0; i < m_LArChannelsToIgnoreM5.size(); i++){
169  if (cellid == m_LArChannelsToIgnoreM5[i]){
170  maskChannel = true;
171  break; // exit loop over bad channels
172  }
173  }
174  if (maskChannel) continue; // continue loop over all channels
175  }
176  energyGeV = (*it1)->energy()*(1./GeV);
177  if (energyGeV == 0) energyGeV = 0.001; // 1 MeV due to LegoCut > 0.0 (couldn't be >= 0.0)
178  energy.emplace_back( gcvt( energyGeV, m_cellEnergyPrec, rndStr) );
179  energyAllLArBarrel += energyGeV;
180 
181  idVec.emplace_back((Identifier::value_type)(*it1)->ID().get_compact() );
182  phi.emplace_back((*it1)->phi());
183  eta.emplace_back((*it1)->eta());
184  channel.emplace_back(onlineId->channel(LArhwid));
185  feedThrough.emplace_back(onlineId->feedthrough(LArhwid));
186  slot.emplace_back(onlineId->slot(LArhwid));
187 
188  if ( m_doLArCellDetails){
189  cellTime = (*it1)->time();
190  cellTimeVec.emplace_back( gcvt( cellTime, m_cellTimePrec, rndStr) );
191  cellGain.emplace_back( (*it1)->gain() );
192 
193  int largain = (*it1)->gain();
194  float pedestal=larPedestal->pedestal(LArhwid,largain);
195  float pedvalue=0;
196  if (pedestal >= (1.0+LArElecCalib::ERRORCODE)) pedvalue = pedestal;
197  else pedvalue = 0;
198  cellPedestal.emplace_back(pedvalue);
199  LArVectorProxy polynom_adc2mev = adc2mev->ADC2MEV(cellid,largain);
200  if (polynom_adc2mev.size()==0){ adc2Mev.emplace_back(-1); }
201  else{ adc2Mev.emplace_back(polynom_adc2mev[1]); }
202  }
203  }
204 
205  ATH_MSG_DEBUG( " Total energy in LAr barrel in GeV : " << energyAllLArBarrel );
206 
207  // write values into dataMap
208  const auto nEntries = phi.size() ;
209  dataMap["phi"] = std::move(phi);
210  dataMap["eta"] = std::move(eta);
211  dataMap["energy"] = std::move(energy);
212  dataMap["id"] = std::move(idVec);
213  dataMap["channel"] = std::move(channel);
214  dataMap["feedThrough"] = std::move(feedThrough);
215  dataMap["slot"] = std::move(slot);
216 
217  //Bad Cells
218  if (m_doBadLAr==true) {
219  dataMap["BadCell"] = std::move(BadCell);
220  }
221 
222  // adc counts
223  if ( m_doLArCellDetails){
224  dataMap["cellTime"] = std::move(cellTimeVec);
225  dataMap["cellGain"] = std::move(cellGain);
226  dataMap["cellPedestal"] = std::move(cellPedestal);
227  dataMap["adc2Mev"] = std::move(adc2Mev);
228  }
229  //Be verbose
230  ATH_MSG_DEBUG( dataTypeName() << " , collection: " << dataTypeName()
231  << " retrieved with " << nEntries << " entries" );
232 
233  //All collections retrieved okay
234  return dataMap;
235 
236  } // getLArData
237 
238  //--------------------------------------------------------------------------
239 
240 } // JiveXML namespace
ILArPedestal::pedestal
virtual float pedestal(const HWIdentifier &id, int gain) const =0
JiveXML::CaloLArRetriever::CaloLArRetriever
CaloLArRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: CaloLArRetriever.cxx:31
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
LArADC2MeV::ADC2MEV
const LArVectorProxy ADC2MEV(const HWIdentifier &id, int gain) const
Definition: LArADC2MeV.h:32
JiveXML::CaloLArRetriever::m_calocell_id
const CaloCell_ID * m_calocell_id
Definition: CaloLArRetriever.h:70
GeV
#define GeV
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:17
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
JiveXML::CaloLArRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: CaloLArRetriever.cxx:71
JiveXML::CaloLArRetriever::m_cablingKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Definition: CaloLArRetriever.h:71
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:24
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
CaloLArRetriever.h
JiveXML::CaloLArRetriever::initialize
StatusCode initialize()
Default AthAlgTool methods.
Definition: CaloLArRetriever.cxx:56
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
ILArPedestal
Definition: ILArPedestal.h:12
JiveXML::DataVect
std::vector< DataType > DataVect
Defines a map with a key and a vector of DataType objects e.g.
Definition: DataType.h:58
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
CaloCellContainer::beginConstCalo
CaloCellContainer::const_iterator beginConstCalo(CaloCell_ID::SUBCALO caloNum) const
get const iterators on cell of just one calo
Definition: CaloCellContainer.cxx:119
LArOnlineID_Base::slot
int slot(const HWIdentifier id) const
Return the slot number of a hardware cell identifier: slot = [1,15] Slot-ID in top part of the crat...
Definition: LArOnlineID_Base.cxx:1957
JiveXML::CaloLArRetriever::m_doMaskLArChannelsM5
bool m_doMaskLArChannelsM5
Definition: CaloLArRetriever.h:85
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
JiveXML::DataMap
std::map< std::string, DataVect > DataMap
Definition: DataType.h:59
HWIdentifier
Definition: HWIdentifier.h:13
ReadCondHandle.h
JiveXML::CaloLArRetriever::m_cellConditionCut
bool m_cellConditionCut
Definition: CaloLArRetriever.h:83
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
LArOnlineID_Base::channel
int channel(const HWIdentifier id) const
Return the channel number of a hardware cell identifier channel = [0,127] in all FEB.
Definition: LArOnlineID_Base.cxx:1963
JiveXML::CaloLArRetriever::m_lar
bool m_lar
Definition: CaloLArRetriever.h:81
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ParticleGun_FastCalo_ChargeFlip_Config.energy
energy
Definition: ParticleGun_FastCalo_ChargeFlip_Config.py:78
lumiFormat.i
int i
Definition: lumiFormat.py:85
LArHistMerge_trf.dataMap
dataMap
Definition: LArHistMerge_trf.py:218
JiveXML::CaloLArRetriever::m_doLArCellDetails
bool m_doLArCellDetails
Definition: CaloLArRetriever.h:82
DetDescrDictionaryDict::it1
std::vector< HWIdentifier >::iterator it1
Definition: DetDescrDictionaryDict.h:17
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
JiveXML::CaloLArRetriever::m_sgKey
SG::ReadHandleKey< CaloCellContainer > m_sgKey
for properties
Definition: CaloLArRetriever.h:77
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
JiveXML::CaloLArRetriever::m_cellEnergyPrec
int m_cellEnergyPrec
Definition: CaloLArRetriever.h:79
JiveXML::CaloLArRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: CaloLArRetriever.h:63
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
WriteCellNoiseToCool.cellGain
cellGain
Definition: WriteCellNoiseToCool.py:434
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
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
JiveXML
This header is shared inbetween the C-style server thread and the C++ Athena ServerSvc.
Definition: BadLArRetriever.cxx:22
JiveXML::CaloLArRetriever::m_cellThreshold
double m_cellThreshold
Definition: CaloLArRetriever.h:78
LArRawChannel.h
HWIdentifier.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
LArOnlineID
Definition: LArOnlineID.h:20
Units.h
Wrapper to avoid constant divisions when using units.
LArDigitContainer.h
CaloCellContainer
Container class for CaloCell.
Definition: CaloCellContainer.h:55
LArADC2MeV
Definition: LArADC2MeV.h:21
LArOnlineID_Base::feedthrough
int feedthrough(const HWIdentifier id) const
Return the feedthrough of a hardware cell identifier : feedthrough = [0,31] Barrel - A/C side or H/...
Definition: LArOnlineID_Base.cxx:1944
JiveXML::CaloLArRetriever::m_cellTimePrec
int m_cellTimePrec
Definition: CaloLArRetriever.h:80
ILArPedestal.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
JiveXML::CaloLArRetriever::m_adc2mevKey
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
Definition: CaloLArRetriever.h:74
JiveXML::CaloLArRetriever::m_doBadLAr
bool m_doBadLAr
Definition: CaloLArRetriever.h:86
CaloCellContainer::endConstCalo
CaloCellContainer::const_iterator endConstCalo(CaloCell_ID::SUBCALO caloNum) const
Definition: CaloCellContainer.cxx:133
Identifier::value_type
unsigned long long value_type
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:27
LArElecCalib::ERRORCODE
@ ERRORCODE
Definition: LArCalibErrorCode.h:17
SelectAllObject.h
JiveXML::CaloLArRetriever::m_LArChannelsToIgnoreM5
std::vector< Identifier::value_type > m_LArChannelsToIgnoreM5
Definition: CaloLArRetriever.h:84
AthAlgTool
Definition: AthAlgTool.h:26
CaloCell_Base_ID::LAREM
@ LAREM
Definition: CaloCell_Base_ID.h:46
dqBeamSpot.nEntries
int nEntries
Definition: dqBeamSpot.py:73
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
JiveXML::CaloLArRetriever::getLArData
const DataMap getLArData(const CaloCellContainer *cellContainer)
Retrieve LAr cell location and details.
Definition: CaloLArRetriever.cxx:96
LArRawChannelContainer.h
LArOnlineID.h
LArVectorProxy
Proxy for accessing a range of float values like a vector.
Definition: LArVectorProxy.h:38
LArOnOffIdMapping
Definition: LArOnOffIdMapping.h:20
Identifier
Definition: IdentifierFieldParser.cxx:14