ATLAS Offline Software
CaloFCalRetriever.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 "CaloFCalRetriever.h"
6 
7 #include "AthenaKernel/Units.h"
8 
10 #include "CaloDetDescr/CaloDetDescrElement.h"
18 #include "GaudiKernel/ThreadLocalContext.h"
20 
21 using Athena::Units::GeV;
22 
23 namespace JiveXML {
24 
31  CaloFCalRetriever::CaloFCalRetriever(const std::string& type,const std::string& name,const IInterface* parent):
33  m_calocell_id(nullptr)
34  {
35  //Only declare the interface
36  declareInterface<IDataRetriever>(this);
37 
38  declareInterface<IDataRetriever>(this);
39  declareProperty("FCallCellThreshold", m_cellThreshold = 50.);
40  declareProperty("RetrieveFCal" , m_fcal = true);
41  declareProperty("DoBadFCal", m_doBadFCal = false);
42  declareProperty("DoFCalCellDetails", m_doFCalCellDetails = false);
43  declareProperty("CellConditionCut", m_cellConditionCut = false);
44  declareProperty("LArChannelsToIgnoreM5", m_LArChannelsToIgnoreM5);
45  declareProperty("DoMaskLArChannelsM5", m_doMaskLArChannelsM5 = false);
46 
47  declareProperty("CellEnergyPrec", m_cellEnergyPrec = 3);
48  declareProperty("CellTimePrec", m_cellTimePrec = 3);
49  }
50 
56 
57  ATH_MSG_DEBUG( "Initialising Tool" );
58  ATH_CHECK( detStore()->retrieve (m_calocell_id, "CaloCell_ID") );
59 
63 
64  return StatusCode::SUCCESS;
65  }
66 
70  StatusCode CaloFCalRetriever::retrieve(ToolHandle<IFormatTool> &FormatTool) {
71 
72  ATH_MSG_DEBUG( "in retrieve()" );
73 
75  if (!cellContainer.isValid()){
76  ATH_MSG_WARNING( "Could not retrieve Calorimeter Cells " );
77  }
78  else{
79  if(m_fcal){
80  DataMap data = getFCalData(&(*cellContainer));
81  ATH_CHECK( FormatTool->AddToEvent(dataTypeName(), m_sgKey.key(), &data) );
82  ATH_MSG_DEBUG( "FCal retrieved" );
83  }
84  }
85 
86  //FCal cells retrieved okay
87  return StatusCode::SUCCESS;
88  }
89 
90 
96 
97  ATH_MSG_DEBUG( "getFCalData()" );
98  const EventContext& ctx = Gaudi::Hive::currentContext();
99 
101 
102  DataVect x; x.reserve(cellContainer->size());
103  DataVect y; y.reserve(cellContainer->size());
104  DataVect z; z.reserve(cellContainer->size());
105  DataVect dx; dx.reserve(cellContainer->size());
106  DataVect dy; dy.reserve(cellContainer->size());
107  DataVect dz; dz.reserve(cellContainer->size());
108 
109  DataVect energy; energy.reserve(cellContainer->size());
110  DataVect idVec; idVec.reserve(cellContainer->size());
111  DataVect channel; channel.reserve(cellContainer->size());
112  DataVect feedThrough; feedThrough.reserve(cellContainer->size());
113  DataVect slot; slot.reserve(cellContainer->size());
114  DataVect sub; sub.reserve(cellContainer->size());
115 
116  DataVect cellTimeVec; cellTimeVec.reserve(cellContainer->size());
117  DataVect cellGain; cellGain.reserve(cellContainer->size());
118  DataVect cellPedestal; cellPedestal.reserve(cellContainer->size());
119  DataVect adc2Mev; adc2Mev.reserve(cellContainer->size());
120  DataVect BadCell; BadCell.reserve(cellContainer->size());
121 
122  char rndStr[30]; // for rounding (3 digit precision)
123 
126 
128  const LArOnOffIdMapping* cabling{*cablingHdl};
129 
130  if(!cabling) {
131  ATH_MSG_WARNING( "Do not have cabling mapping from key " << m_cablingKey.key() );
132  return DataMap;
133  }
134 
135  const ILArPedestal* larPedestal = nullptr;
137  if( detStore()->retrieve(larPedestal).isFailure() ){
138  ATH_MSG_ERROR( "in getFCalData(), Could not retrieve LAr Pedestal" );
139  }
140  }
141 
142  const LArOnlineID* onlineId;
143  if ( detStore()->retrieve(onlineId, "LArOnlineID").isFailure()) {
144  ATH_MSG_ERROR( "in getFCalData(),Could not get LArOnlineID!" );
145  }
146 
147  const LArADC2MeV* adc2mev = nullptr;
148  if (m_doFCalCellDetails) {
150  adc2mev = *adc2mevH;
151  }
152 
153  double energyGeV, xmm, ymm, zmm, dxmm, dymm, dzmm, cellTime;
154  double energyAllLArFcal = 0.;
155 
156  for(;it1!=it2;++it1){
157 
158  if((*it1)->badcell()) BadCell.push_back(1);
159  else if((*it1)->energy()>= m_cellThreshold) BadCell.push_back(0);
160  else BadCell.push_back(-1);
161 
162  if ((((*it1)->provenance()&0xFF)!=0xA5)&&m_cellConditionCut) continue; // check full conditions for FCal
163  Identifier cellid = (*it1)->ID();
164 
165  HWIdentifier LArhwid = cabling->createSignalChannelIDFromHash((*it1)->caloDDE()->calo_hash());
166 
167  //ignore FCal cells that are to be masked
169  bool maskChannel = false;
170  for (size_t i = 0; i < m_LArChannelsToIgnoreM5.size(); i++){
171  if (cellid == m_LArChannelsToIgnoreM5[i]){
172  maskChannel = true;
173  break; // exit loop over bad channels
174  }
175  }
176  if (maskChannel) continue; // continue loop over all channels
177  }
178 
179  energyGeV = (*it1)->energy()*(1./GeV);
180  energy.emplace_back( gcvt( energyGeV, m_cellEnergyPrec, rndStr) );
181  energyAllLArFcal += energyGeV;
182  idVec.emplace_back((Identifier::value_type)(*it1)->ID().get_compact() );
183 
184  xmm = (*it1)->x()*0.1;
185  ymm = (*it1)->y()*0.1;
186  zmm = (*it1)->z()*0.1;
187  x.emplace_back( gcvt( xmm, 4, rndStr) );
188  y.emplace_back( gcvt( ymm, 4, rndStr) );
189  z.emplace_back( gcvt( zmm, 4, rndStr) );
190 
191  channel.emplace_back(onlineId->channel(LArhwid));
192  feedThrough.emplace_back(onlineId->feedthrough(LArhwid));
193  slot.emplace_back(onlineId->slot(LArhwid));
194 
195  if ( m_doFCalCellDetails){
196  cellTime = (*it1)->time();
197  cellTimeVec.emplace_back( gcvt( cellTime, m_cellTimePrec, rndStr) );
198  cellGain.emplace_back( (*it1)->gain() );
199 
200  int fcalgain = (*it1)->gain();
201  float pedestal=larPedestal->pedestal(LArhwid,fcalgain);
202  float pedvalue=0;
203  if (pedestal >= (1.0+LArElecCalib::ERRORCODE)) pedvalue = pedestal;
204  else pedvalue = 0;
205  cellPedestal.emplace_back(pedvalue);
206 
207  LArVectorProxy polynom_adc2mev = adc2mev->ADC2MEV(cellid,fcalgain);
208  if (polynom_adc2mev.size()==0){ adc2Mev.emplace_back(-1); }
209  else{ adc2Mev.emplace_back(polynom_adc2mev[1]); }
210  }
211 
212  const CaloDetDescrElement* elt = (*it1)->caloDDE();
213 
214  dxmm = elt->dx()*0.1;
215  dymm = elt->dy()*0.1;
216  dzmm = elt->dz()*0.1;
217  dx.emplace_back( gcvt( dxmm, 4, rndStr) );
218  dy.emplace_back( gcvt( dymm, 4, rndStr) );
219  dz.emplace_back( gcvt( dzmm, 4, rndStr) );
220 
221  if(m_calocell_id->pos_neg(cellid)==2)
222  sub.emplace_back(1);
223  else
224  sub.emplace_back(0);
225  }
226 
227  ATH_MSG_DEBUG( " Total energy in FCAL (LAr) in GeV : " << energyAllLArFcal );
228 
229  // write values into DataMap
230  DataMap["x"] = x;
231  DataMap["y"] = std::move(y);
232  DataMap["z"] = std::move(z);
233  DataMap["dx"] = std::move(dx);
234  DataMap["dy"] = std::move(dy);
235  DataMap["dz"] = std::move(dz);
236  DataMap["energy"] = std::move(energy);
237  DataMap["id"] = std::move(idVec);
238  DataMap["channel"] = std::move(channel);
239  DataMap["feedThrough"] = std::move(feedThrough);
240  DataMap["slot"] = std::move(slot);
241  //Bad Cells
242  if (m_doBadFCal) {
243  DataMap["BadCell"] = std::move(BadCell);
244  } DataMap["sub"] = std::move(sub);
245 
246  // adc counts
247  if ( m_doFCalCellDetails){
248  DataMap["cellTime"] = std::move(cellTimeVec);
249  DataMap["cellGain"] = std::move(cellGain);
250  DataMap["cellPedestal"] = std::move(cellPedestal);
251  DataMap["adc2Mev"] = std::move(adc2Mev);
252  }
253  //Be verbose
254  ATH_MSG_DEBUG( dataTypeName() << " retrieved with " << x.size() << " entries" );
255 
256  //All collections retrieved okay
257  return DataMap;
258 
259  } // getFCalData
260 
261  //--------------------------------------------------------------------------
262 
263 } // JiveXML namespace
Identifier::value_type
IDENTIFIER_TYPE value_type
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:39
ILArPedestal::pedestal
virtual float pedestal(const HWIdentifier &id, int gain) const =0
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
CaloCell_Base_ID::LARFCAL
@ LARFCAL
Definition: CaloCell_Base_ID.h:46
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
CaloFCalRetriever.h
JiveXML::CaloFCalRetriever::m_cellThreshold
double m_cellThreshold
Definition: CaloFCalRetriever.h:77
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:28
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
JiveXML::CaloFCalRetriever::m_sgKey
SG::ReadHandleKey< CaloCellContainer > m_sgKey
for properties
Definition: CaloFCalRetriever.h:76
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
CaloCell_Base_ID::pos_neg
int pos_neg(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
CaloDetDescrElement
This class groups all DetDescr information related to a CaloCell. Provides a generic interface for al...
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:66
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:1961
JiveXML::CaloFCalRetriever::getFCalData
const DataMap getFCalData(const CaloCellContainer *cellContainer)
Retrieve FCal cell location and details.
Definition: CaloFCalRetriever.cxx:95
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
JiveXML::CaloFCalRetriever::m_cellTimePrec
int m_cellTimePrec
Definition: CaloFCalRetriever.h:79
HWIdentifier
Definition: HWIdentifier.h:13
x
#define x
ReadCondHandle.h
CaloCell_ID.h
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
JiveXML::CaloFCalRetriever::m_doBadFCal
bool m_doBadFCal
Definition: CaloFCalRetriever.h:85
CaloDetDescrElement::dz
float dz() const
cell dz
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:379
JiveXML::CaloFCalRetriever::m_cellEnergyPrec
int m_cellEnergyPrec
Definition: CaloFCalRetriever.h:78
JiveXML::CaloFCalRetriever::m_cellConditionCut
bool m_cellConditionCut
Definition: CaloFCalRetriever.h:82
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:1967
JiveXML::CaloFCalRetriever::m_doMaskLArChannelsM5
bool m_doMaskLArChannelsM5
Definition: CaloFCalRetriever.h:84
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:92
z
#define z
JiveXML::CaloFCalRetriever::dataTypeName
virtual std::string dataTypeName() const
Return the name of the data type.
Definition: CaloFCalRetriever.h:62
JiveXML::CaloFCalRetriever::m_fcal
bool m_fcal
Definition: CaloFCalRetriever.h:80
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
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
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
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
JiveXML::CaloFCalRetriever::m_cablingKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Definition: CaloFCalRetriever.h:70
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:21
JiveXML::CaloFCalRetriever::initialize
StatusCode initialize()
Default AthAlgTool methods.
Definition: CaloFCalRetriever.cxx:55
JiveXML::CaloFCalRetriever::CaloFCalRetriever
CaloFCalRetriever(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
Definition: CaloFCalRetriever.cxx:31
LArRawChannel.h
HWIdentifier.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
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
makeTRTBarrelCans.dy
tuple dy
Definition: makeTRTBarrelCans.py: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:1948
y
#define y
CaloDetDescrElement::dx
float dx() const
cell dx
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:375
ILArPedestal.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
makeTRTBarrelCans.dx
tuple dx
Definition: makeTRTBarrelCans.py:20
CaloCellContainer::endConstCalo
CaloCellContainer::const_iterator endConstCalo(CaloCell_ID::SUBCALO caloNum) const
Definition: CaloCellContainer.cxx:133
JiveXML::CaloFCalRetriever::m_LArChannelsToIgnoreM5
std::vector< Identifier::value_type > m_LArChannelsToIgnoreM5
Definition: CaloFCalRetriever.h:83
JiveXML::CaloFCalRetriever::m_calocell_id
const CaloCell_ID * m_calocell_id
Definition: CaloFCalRetriever.h:69
LArElecCalib::ERRORCODE
@ ERRORCODE
Definition: LArCalibErrorCode.h:17
JiveXML::CaloFCalRetriever::retrieve
virtual StatusCode retrieve(ToolHandle< IFormatTool > &FormatTool)
Retrieve all the data.
Definition: CaloFCalRetriever.cxx:70
SelectAllObject.h
JiveXML::CaloFCalRetriever::m_doFCalCellDetails
bool m_doFCalCellDetails
Definition: CaloFCalRetriever.h:81
AthAlgTool
Definition: AthAlgTool.h:26
CaloDetDescrElement::dy
float dy() const
cell dy
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:377
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
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
JiveXML::CaloFCalRetriever::m_adc2mevKey
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
Definition: CaloFCalRetriever.h:73