ATLAS Offline Software
Loading...
Searching...
No Matches
GepCellsHandlerAlg Class Reference

#include <GepCellsHandlerAlg.h>

Inheritance diagram for GepCellsHandlerAlg:
Collaboration diagram for GepCellsHandlerAlg:

Public Member Functions

 GepCellsHandlerAlg (const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode initialize () override
virtual StatusCode execute (const EventContext &) const override
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual unsigned int cardinality () const override
 Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
virtual void setFilterPassed (bool state, const EventContext &ctx) const
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

StatusCode setNumberOfEnergyBits (int value)
StatusCode setLeastSignificantBit (int value)
StatusCode setG (int value)
int getGepEnergy (float offline_et) const
std::vector< unsigned int > getNeighbours (const CaloCellContainer &allcells, const CaloCell *acell, const EventContext &) const
StatusCode removeCellsFromOverloadedFEB (std::vector< Gep::GepCaloCell > &cells) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

int m_nEnergyBits = -1
int m_valLeastSigBit = -1
int m_valG = -1
int m_readoutRanges [5] = {-1,-1,-1,-1,-1}
int m_stepsPerRange = -1
unsigned m_maxCellsPerFEB = -1
std::map< unsigned int, Gep::GepCaloCellm_gepCellsBase = {}
Gaudi::Property< std::string > m_GepEnergyEncodingScheme
Gaudi::Property< bool > m_doGepHardwareStyleEnergyEncoding
Gaudi::Property< bool > m_doTruncationOfOverflowingFEBs
Gaudi::Property< bool > m_writeAllCells
Gaudi::Property< std::string > m_LArCellMap
SG::ReadCondHandleKey< CaloNoisem_electronicNoiseKey {this, "electronicNoiseKey", "totalNoise", "SG Key of CaloNoise data object"}
 Key of the CaloNoise Conditions data object.
SG::ReadCondHandleKey< CaloNoisem_totalNoiseKey {this, "totalNoiseKey", "totalNoise", "SG Key of CaloNoise data object"}
SG::WriteHandleKey< Gep::GepCellMapm_outputGepCellsKey {this, "outputGepCellsKey", "", "Key for GepCell map"}
SG::ReadHandleKey< CaloCellContainerm_caloCellsKey {this, "caloCells", "AllCalo", "key to read in a CaloCell constainer"}
const CaloCell_IDm_CaloCell_ID {nullptr}
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 22 of file GepCellsHandlerAlg.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ GepCellsHandlerAlg()

GepCellsHandlerAlg::GepCellsHandlerAlg ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 14 of file GepCellsHandlerAlg.cxx.

14 :
15AthReentrantAlgorithm( name, pSvcLocator ){
16 }

Member Function Documentation

◆ cardinality()

unsigned int AthCommonReentrantAlgorithm< Gaudi::Algorithm >::cardinality ( ) const
overridevirtualinherited

Cardinality (Maximum number of clones that can exist) special value 0 means that algorithm is reentrant.

Override this to return 0 for reentrant algorithms.

Definition at line 75 of file AthCommonReentrantAlgorithm.cxx.

64{
65 return 0;
66}

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode GepCellsHandlerAlg::execute ( const EventContext & ctx) const
overridevirtual

Definition at line 125 of file GepCellsHandlerAlg.cxx.

125 {
126
127 // PS this function creates and stores a map which has Gep::GepCaloCells as its values
128 // The cells are made up of data which is invariant for all events, and dynamic
129 // data which varies with event.
130 // The invariant data should be setup in initialize(), and the dynamic
131 // data should be updated here in a way which is compatible with the const-ness of this
132 // function.
133 // This will be attended to in the future.
134
135 ATH_MSG_DEBUG ("Executing " << name() << "...");
136
137 // Read in a container containing (all) CaloCells
138 auto h_caloCells = SG::makeHandle(m_caloCellsKey, ctx);
139 CHECK(h_caloCells.isValid());
140 const auto & cells = *h_caloCells;
141
142 ATH_MSG_DEBUG("Read in " + std::to_string(h_caloCells->size()) + " cells");
143
144 SG::ReadCondHandle<CaloNoise> electronicNoiseHdl{m_electronicNoiseKey, ctx};
145 if (!electronicNoiseHdl.isValid()) {return StatusCode::FAILURE;}
146 const CaloNoise* electronicNoiseCDO = *electronicNoiseHdl;
147
148 SG::ReadCondHandle<CaloNoise> totalNoiseHdl{m_totalNoiseKey, ctx};
149 if (!totalNoiseHdl.isValid()) {return StatusCode::FAILURE;}
150 const CaloNoise* totalNoiseCDO = *totalNoiseHdl;
151
152 int idx = -1;
153 std::map<std::string,std::vector<Gep::GepCaloCell>> gepCellsPerFEB;
154
155 for(const auto *cell: cells){
156
157 Gep::GepCaloCell caloCell;
158 ++idx;
159
160 caloCell.id = (cell->ID().get_identifier32()).get_compact();
161 auto base_cell_itr = m_gepCellsBase.find(caloCell.id);
162 if (base_cell_itr != m_gepCellsBase.end()) caloCell = base_cell_itr->second;
163 else {
164 // Tile cells are not included in the cell base map
165 // In the future this might change, for now just setting FEB value to a dummy
166 caloCell.FEB = "Tile";
167 }
168
169 float electronicNoise = electronicNoiseCDO->getNoise(cell->ID(), cell->gain());
170 float totalNoise = totalNoiseCDO->getNoise(cell->ID(), cell->gain());
171
172 // Only send positive-energy 2sigma cells to the GEP
173 if (((cell->energy() / totalNoise) < 2.0) && !m_writeAllCells) continue;
174
175 // GEP will only have ET available for LAr cells, so convert to energy from ET
176 caloCell.offline_et = cell->energy() / TMath::CosH(cell->eta());
177 if (m_doGepHardwareStyleEnergyEncoding && !m_CaloCell_ID->is_tile(cell->ID())) {
178 caloCell.et = getGepEnergy(cell->energy() / TMath::CosH(cell->eta()));
179 caloCell.e = caloCell.et * TMath::CosH(cell->eta());
180 }
181 else {
182 caloCell.e = cell->energy();
183 caloCell.et = caloCell.offline_et;
184 }
185 caloCell.time = cell->time();
186 caloCell.quality = cell->quality();
187 caloCell.provenance = cell->provenance();
188
189 caloCell.totalNoise = totalNoise;
190 caloCell.electronicNoise = electronicNoise;
191 caloCell.sigma = cell->energy() / totalNoise;
192
193 caloCell.isBad = cell->badcell();
194 caloCell.eta = cell->eta();
195 caloCell.phi = cell->phi();
196 caloCell.sinTh = cell->sinTh();
197 caloCell.cosTh = cell->cosTh();
198 caloCell.sinPhi = cell->sinPhi();
199 caloCell.cosPhi = cell->cosPhi();
200 caloCell.cotTh = cell->cotTh();
201 caloCell.x = cell->x();
202 caloCell.y = cell->y();
203 caloCell.z = cell->z();
204
205 unsigned int samplingEnum = m_CaloCell_ID->calo_sample(cell->ID());
206
207 bool IsEM = m_CaloCell_ID->is_em(cell->ID());
208 bool IsEM_Barrel=false;
209 bool IsEM_EndCap=false;
210 bool IsEM_BarrelPos=false;
211 bool IsEM_BarrelNeg=false;
212 if(IsEM){
213 IsEM_Barrel=m_CaloCell_ID->is_em_barrel(cell->ID());
214 if(IsEM_Barrel){
215 if(m_CaloCell_ID->pos_neg(cell->ID())>0) IsEM_BarrelPos=true;
216 }
217 IsEM_EndCap=m_CaloCell_ID->is_em_endcap(cell->ID());
218 }
219
220 caloCell.isEM = IsEM;
221 caloCell.isEM_barrel = IsEM_Barrel;
222 caloCell.isEM_endCap = IsEM_EndCap;
223 caloCell.isEM_barrelPos = IsEM_BarrelPos;
224 caloCell.isEM_barrelNeg = IsEM_BarrelNeg; //always false?
225 caloCell.isFCAL = m_CaloCell_ID->is_fcal(cell->ID());
226 caloCell.isHEC = m_CaloCell_ID->is_hec(cell->ID());
227 caloCell.isTile = m_CaloCell_ID->is_tile(cell->ID());
228
229 caloCell.sampling = samplingEnum;
230 caloCell.detName = CaloSampling::getSamplingName(samplingEnum);
231
232 caloCell.neighbours = getNeighbours(cells, cell, ctx);
233 caloCell.id = (cell->ID().get_identifier32()).get_compact();
234
235 const CaloDetDescriptor *elt = cell->caloDDE()->descriptor();
236 caloCell.layer = cell->caloDDE()->getLayer();
237
238 float deta = elt->deta();
239 float dphi = elt->dphi();
240
241 float etamin = caloCell.eta - (0.5*deta);
242 float etamax = caloCell.eta + (0.5*deta);
243
244 float phimin = caloCell.phi - (0.5*dphi);
245 float phimax = caloCell.phi + (0.5*dphi);
246
247 caloCell.etaMin = etamin;
248 caloCell.etaMax = etamax;
249 caloCell.phiMin = phimin;
250 caloCell.phiMax = phimax;
251 caloCell.etaGranularity = deta;
252 caloCell.phiGranularity = dphi;
253
254 caloCell.index = idx;
255
256 // Fill cells into map according to FEB
257 auto feb_itr = gepCellsPerFEB.find(caloCell.FEB);
258 if (feb_itr != gepCellsPerFEB.end()) feb_itr->second.push_back(std::move(caloCell));
259 else {
260 std::vector<Gep::GepCaloCell> cellsThisFEB;
261 cellsThisFEB.push_back(caloCell);
262 gepCellsPerFEB.insert(std::pair<std::string,std::vector<Gep::GepCaloCell>>(caloCell.FEB,cellsThisFEB));
263 }
264 }
265
266 Gep::GepCellMap gepCellMap;
267
268 // do truncation
269 auto itr = gepCellsPerFEB.begin();
270 int nFeb2sInOverflow = 0;
271 for ( ;itr != gepCellsPerFEB.end(); ++itr) {
272
273 // LAr FEBs might overflow, so they will get truncated
274 if (m_doTruncationOfOverflowingFEBs && itr->second.size() > m_maxCellsPerFEB && itr->first != "Tile" && !m_writeAllCells) {
275 ATH_MSG_DEBUG("FEB " << itr->first << " is sending " << itr->second.size() << " cells, which is more cells than GEP can receive. Removing all but the possible " << m_maxCellsPerFEB << " cells.");
277 ++nFeb2sInOverflow;
278 }
279 for (const Gep::GepCaloCell& cell : itr->second)
280 gepCellMap.insert(cell.id, cell);
281 }
282 ATH_MSG_DEBUG("GEP is receiving a total of " << gepCellMap.size() << " cells in this event");
283 gepCellMap.setNumberOfOverflowingFEB2s(nFeb2sInOverflow);
284
285 SG::WriteHandle<Gep::GepCellMap> h_gepCellMap = SG::makeHandle(m_outputGepCellsKey, ctx);
286 ATH_CHECK( h_gepCellMap.record( std::make_unique<Gep::GepCellMap>(gepCellMap) ) );
287
288 return StatusCode::SUCCESS;
289}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
#define CHECK(...)
Evaluate an expression and check for errors.
double deta() const
delta eta
double dphi() const
delta phi
float getNoise(const IdentifierHash h, const int gain) const
Accessor by IdentifierHash and gain.
Definition CaloNoise.h:34
static std::string getSamplingName(CaloSample theSample)
Returns a string (name) for each CaloSampling.
std::map< unsigned int, Gep::GepCaloCell > m_gepCellsBase
Gaudi::Property< bool > m_doTruncationOfOverflowingFEBs
SG::ReadCondHandleKey< CaloNoise > m_totalNoiseKey
Gaudi::Property< bool > m_writeAllCells
SG::WriteHandleKey< Gep::GepCellMap > m_outputGepCellsKey
StatusCode removeCellsFromOverloadedFEB(std::vector< Gep::GepCaloCell > &cells) const
SG::ReadCondHandleKey< CaloNoise > m_electronicNoiseKey
Key of the CaloNoise Conditions data object.
int getGepEnergy(float offline_et) const
Gaudi::Property< bool > m_doGepHardwareStyleEnergyEncoding
SG::ReadHandleKey< CaloCellContainer > m_caloCellsKey
std::vector< unsigned int > getNeighbours(const CaloCellContainer &allcells, const CaloCell *acell, const EventContext &) const
const CaloCell_ID * m_CaloCell_ID
void setNumberOfOverflowingFEB2s(int n)
Definition GepCellMap.h:33
unsigned int size()
Definition GepCellMap.h:25
void insert(unsigned int id, const Gep::GepCaloCell &cell)
Definition GepCellMap.h:21
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
@ IsEM
cut-based identification for egamma objects (cluster and track-based)
unsigned int sampling
Definition GepCaloCell.h:49
unsigned int provenance
Definition GepCaloCell.h:19
unsigned int quality
Definition GepCaloCell.h:18
unsigned int id
Definition GepCaloCell.h:50
std::vector< unsigned int > neighbours
Definition GepCaloCell.h:57
std::string detName
Definition GepCaloCell.h:51
std::string FEB
Definition GepCaloCell.h:52

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonReentrantAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 94 of file AthCommonReentrantAlgorithm.cxx.

90{
91 // If we didn't find any symlinks to add, just return the collection
92 // from the base class. Otherwise, return the extended collection.
93 if (!m_extendedExtraObjects.empty()) {
95 }
97}
An algorithm that can be simultaneously executed in multiple threads.

◆ filterPassed()

virtual bool AthCommonReentrantAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Definition at line 96 of file AthCommonReentrantAlgorithm.h.

96 {
97 return execState( ctx ).filterPassed();
98 }
virtual bool filterPassed(const EventContext &ctx) const

◆ getGepEnergy()

int GepCellsHandlerAlg::getGepEnergy ( float offline_et) const
private

Definition at line 293 of file GepCellsHandlerAlg.cxx.

293 {
294
295 // If cell saturates readout range, largest possible value is send
296 if (offline_et > m_readoutRanges[4])
298
299 int readoutRange = 0;
300 for (int i = 1; i <= 3; ++i) {
301 if (offline_et > m_readoutRanges[i]) readoutRange = i;
302 }
303
304 float step = (static_cast<float>(m_readoutRanges[readoutRange+1]) - static_cast<float>(m_readoutRanges[readoutRange])) / m_stepsPerRange;
305 int gep_energy = -1;
306 for (int i = 0; i < m_stepsPerRange; ++i) {
307 gep_energy = m_readoutRanges[readoutRange]+(step*i);
308 if (offline_et < (m_readoutRanges[readoutRange]+(step*(i+1)))) break;
309 }
310
311 return gep_energy;
312}

◆ getNeighbours()

std::vector< unsigned int > GepCellsHandlerAlg::getNeighbours ( const CaloCellContainer & allcells,
const CaloCell * acell,
const EventContext &  ) const
private

Definition at line 317 of file GepCellsHandlerAlg.cxx.

319 {
320
321 // get all neighboring cells
322 std::vector<IdentifierHash> cellNeighbours;
323
324 IdentifierHash cellHashID = m_CaloCell_ID->calo_cell_hash(acell->ID());
325 m_CaloCell_ID->get_neighbours(cellHashID,LArNeighbours::super3D,cellNeighbours);
326
327 std::vector<unsigned int> neighbour_ids;
328 for (unsigned int iNeighbour = 0;
329 iNeighbour < cellNeighbours.size();
330 ++iNeighbour) {
331
332 const CaloCell* neighbour = allcells.findCell(cellNeighbours[iNeighbour]);
333 if (neighbour) {
334 neighbour_ids.push_back((neighbour->ID().get_identifier32()).get_compact());
335 } else {
336 ATH_MSG_ERROR("Couldn't access neighbour #" << iNeighbour
337 << " for cell ID "
338 << (acell->ID().get_identifier32()).get_compact());
339 }
340 }
341 return neighbour_ids;
342}
#define ATH_MSG_ERROR(x)
const CaloCell * findCell(const IdentifierHash theHash) const
fast find method given identifier hash.
Identifier ID() const
get ID (from cached data member) non-virtual and inline for fast access
Definition CaloCell.h:295
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.

◆ initialize()

StatusCode GepCellsHandlerAlg::initialize ( )
overridevirtual

Definition at line 19 of file GepCellsHandlerAlg.cxx.

19 {
20 ATH_MSG_INFO ("Initializing " << name() << "...");
21 ATH_MSG_INFO ("Target GepCell container name " << m_outputGepCellsKey);
22
23 // Retrieve AlgTools
24 ATH_CHECK(m_electronicNoiseKey.initialize());
25 ATH_CHECK(m_totalNoiseKey.initialize());
26
27 CHECK(m_caloCellsKey.initialize());
28 CHECK(m_outputGepCellsKey.initialize());
29
30 // CaloIndentifier
31 CHECK( detStore()->retrieve (m_CaloCell_ID, "CaloCell_ID") );
32
33 ATH_MSG_INFO("Hardware-style energy encoding for GEP cells has been set to " << m_doGepHardwareStyleEnergyEncoding.value());
34 if (!m_doGepHardwareStyleEnergyEncoding) ATH_MSG_WARNING("Hardware-style energy encoding for GEP cells has been disabled. Cell energies will have larger precision than realistically possible");
35
36 ATH_MSG_INFO("Truncation of Gep cells from FEBs which are overflowing has been set to " << m_doTruncationOfOverflowingFEBs.value());
37 if (!m_doTruncationOfOverflowingFEBs) ATH_MSG_WARNING("Truncation of GEP cells from overflowing FEBs has been disabled. More GEP cells will be send to algorithms than realistically possible");
38
39 ATH_MSG_INFO("Flag to enabling the writting of all cells has been set to " << m_writeAllCells.value());
40 if (!m_writeAllCells) ATH_MSG_WARNING("Will write all cells even if they would get truncated for GEP and/or are below the 2sigma threshold. This might lead to large output Ntuples and is not a realistic representation of GEP cells");
41
42 // Setting up GEP energy encoding scheme
44
45 // Read values of Gep readout scheme from argument
46 int GepScheme[3];
47 for (int i = 0; i < 3; ++i) {
48 GepScheme[i] = std::stoi(m_GepEnergyEncodingScheme.value().substr(0,m_GepEnergyEncodingScheme.value().find("-")));
49 m_GepEnergyEncodingScheme.value().erase(0, m_GepEnergyEncodingScheme.value().find("-")+1);
50 }
51
52 CHECK(setNumberOfEnergyBits(GepScheme[0]));
53 CHECK(setLeastSignificantBit(GepScheme[1]));
54 CHECK(setG(GepScheme[2]));
55
56 m_stepsPerRange = std::pow(2,m_nEnergyBits-2);
57
58 m_readoutRanges[0] = 0;
63
64 ATH_MSG_DEBUG("Readout scheme with " << m_nEnergyBits << "-bits provides the following four energy thresholds (with " << m_stepsPerRange << " discrete steps on each threshold)");
65 ATH_MSG_DEBUG("GEP cell energy range 0: min = " << m_readoutRanges[0] << " MeV -> max = " << m_readoutRanges[1] << " MeV");
66 ATH_MSG_DEBUG("GEP cell energy range 1: min = " << m_readoutRanges[1] + m_valLeastSigBit << " MeV -> max = " << m_readoutRanges[2] << " MeV");
67 ATH_MSG_DEBUG("GEP cell energy range 2: min = " << m_readoutRanges[2]+(m_valG*m_valLeastSigBit) << " MeV -> max = " << m_readoutRanges[3] << " MeV");
68 ATH_MSG_DEBUG("GEP cell energy range 3: min = " << m_readoutRanges[3]+(m_valG*m_valG*m_valLeastSigBit) << " MeV -> max = " << m_readoutRanges[4] << " MeV");
69 }
70
72 // Loading the invariant cell data and storing in m_gepCellsBase for later use on event-by-event basis
73 m_gepCellsBase.clear();
74
75 ATH_MSG_DEBUG("Loading cell map associating cells to FEBs");
76
77 std::string cellMapPath = PathResolverFindCalibFile(m_LArCellMap);
78 if(cellMapPath.empty()) ATH_MSG_ERROR("Could not find file with cell map data: " << m_LArCellMap.value());
79
80 std::ifstream file(cellMapPath.c_str());
81
82 unsigned n_cells = 0;
83
84 // Read input file
85 if (file.is_open()) {
86
87 int online_id, offline_id, ch, con_num, fbr;
88 std::string feb, con_type;
89
90 // Skipping header of file
91 std::getline(file, feb);
92
93 // start reading data
94 while (true) {
95
96 file >> offline_id >> online_id >> feb >> ch >> con_type >> con_num >> fbr;
97
98 if (file.eof()) break;
99
100 Gep::GepCaloCell caloCell;
101 caloCell.id = offline_id;
102 caloCell.FEB = feb;
103 caloCell.channel = ch;
104 caloCell.fiber = fbr;
105 caloCell.connection_type = con_type;
106 caloCell.connection_number = con_num;
107
108 m_gepCellsBase.insert(std::pair<unsigned int, Gep::GepCaloCell>(caloCell.id, caloCell));
109
110 ++n_cells;
111 }
112 }
113 else {
114 ATH_MSG_ERROR("Could not open file containing the cell to FEB association");
115 return StatusCode::FAILURE;
116 }
117
118 ATH_MSG_DEBUG("Loaded FEB information for " << n_cells << " cells");
119 }
120
121 return StatusCode::SUCCESS;
122}
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
const ServiceHandle< StoreGateSvc > & detStore() const
Gaudi::Property< std::string > m_GepEnergyEncodingScheme
Gaudi::Property< std::string > m_LArCellMap
StatusCode setG(int value)
StatusCode setNumberOfEnergyBits(int value)
StatusCode setLeastSignificantBit(int value)
std::string connection_type
Definition GepCaloCell.h:55
TFile * file

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ removeCellsFromOverloadedFEB()

StatusCode GepCellsHandlerAlg::removeCellsFromOverloadedFEB ( std::vector< Gep::GepCaloCell > & cells) const
private

Definition at line 346 of file GepCellsHandlerAlg.cxx.

346 {
347
348 std::map<int,Gep::GepCaloCell> orderedCells;
349 for (const Gep::GepCaloCell& cell : cells)
350 orderedCells.insert(std::pair<int,Gep::GepCaloCell>(cell.channel,cell));
351
352 cells.clear();
353
354 std::map<int,Gep::GepCaloCell>::iterator cell_itr = orderedCells.begin();
355 for ( ;cell_itr != orderedCells.end(); ++cell_itr) {
356 cells.push_back(cell_itr->second);
357 if (cells.size() == m_maxCellsPerFEB) break;
358 }
359
360 return StatusCode::SUCCESS;
361}

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonReentrantAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Definition at line 100 of file AthCommonReentrantAlgorithm.h.

100 {
102 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const

◆ setG()

StatusCode GepCellsHandlerAlg::setG ( int value)
inlineprivate

Definition at line 63 of file GepCellsHandlerAlg.h.

63 {
64 if (value < 1) {
65 ATH_MSG_FATAL("The value of G in the GEP energy encoding cannot be set to " << value);
66 return StatusCode::FAILURE;
67 }
68 ATH_MSG_INFO("Setting the value for G in the GEP energy encoding to " << value);
69 m_valG = value;
70
71 return StatusCode::SUCCESS;
72 }
#define ATH_MSG_FATAL(x)

◆ setLeastSignificantBit()

StatusCode GepCellsHandlerAlg::setLeastSignificantBit ( int value)
inlineprivate

Definition at line 52 of file GepCellsHandlerAlg.h.

52 {
53 if (value < 1) {
54 ATH_MSG_FATAL("The value of the least significant bit in the GEP energy encoding cannot be set to " << value);
55 return StatusCode::FAILURE;
56 }
57 ATH_MSG_INFO("Setting the value for the least significant bit in the GEP energy encoding to " << value << " MeV");
59
60 return StatusCode::SUCCESS;
61 }

◆ setNumberOfEnergyBits()

StatusCode GepCellsHandlerAlg::setNumberOfEnergyBits ( int value)
inlineprivate

Definition at line 33 of file GepCellsHandlerAlg.h.

33 {
34
35 // At the moment only have a detailed scheme for 6-10 bit readouts, thus rejecting any other value
36 switch(value) {
37 case 6: m_maxCellsPerFEB = 62; break;
38 case 7: m_maxCellsPerFEB = 54; break;
39 case 8: m_maxCellsPerFEB = 48; break;
40 case 9: m_maxCellsPerFEB = 43; break;
41 case 10: m_maxCellsPerFEB = 39; break;
42 default: ATH_MSG_FATAL("A GEP energy encoding scheme with " << value << " energy bits is currently not defined");
43 return StatusCode::FAILURE;
44 }
45
46 ATH_MSG_INFO("Setting GEP energy encoding to a " << value << "-bit scheme which allows for the sending of " << m_maxCellsPerFEB << " cells to GEP per FEB");
48
49 return StatusCode::SUCCESS;
50 }

◆ sysExecute()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Definition at line 85 of file AthCommonReentrantAlgorithm.cxx.

77{
78 return BaseAlg::sysExecute (ctx);
79}

◆ sysInitialize()

StatusCode AthCommonReentrantAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in HypoBase, and InputMakerBase.

Definition at line 61 of file AthCommonReentrantAlgorithm.cxx.

107 {
109
110 if (sc.isFailure()) {
111 return sc;
112 }
113
114 ServiceHandle<ICondSvc> cs("CondSvc",name());
115 for (auto h : outputHandles()) {
116 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
117 // do this inside the loop so we don't create the CondSvc until needed
118 if ( cs.retrieve().isFailure() ) {
119 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
120 return StatusCode::SUCCESS;
121 }
122 if (cs->regHandle(this,*h).isFailure()) {
124 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
125 << " with CondSvc");
126 }
127 }
128 }
129 return sc;
130}
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_CaloCell_ID

const CaloCell_ID* GepCellsHandlerAlg::m_CaloCell_ID {nullptr}
private

Definition at line 110 of file GepCellsHandlerAlg.h.

110{nullptr};

◆ m_caloCellsKey

SG::ReadHandleKey<CaloCellContainer> GepCellsHandlerAlg::m_caloCellsKey {this, "caloCells", "AllCalo", "key to read in a CaloCell constainer"}
private

Definition at line 108 of file GepCellsHandlerAlg.h.

108{this, "caloCells", "AllCalo", "key to read in a CaloCell constainer"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doGepHardwareStyleEnergyEncoding

Gaudi::Property<bool> GepCellsHandlerAlg::m_doGepHardwareStyleEnergyEncoding
private
Initial value:
{this, "HardwareStyleEnergyEncoding", false,
"Enabling or disabling the hardware-style energy encoding for the GEP"}

Definition at line 87 of file GepCellsHandlerAlg.h.

87 {this, "HardwareStyleEnergyEncoding", false,
88 "Enabling or disabling the hardware-style energy encoding for the GEP"};

◆ m_doTruncationOfOverflowingFEBs

Gaudi::Property<bool> GepCellsHandlerAlg::m_doTruncationOfOverflowingFEBs
private
Initial value:
{this, "TruncationOfOverflowingFEBs", false,
"Enabling or disabling the truncation of cells from FEBs with more than the maximum number of cells which can be send"}

Definition at line 90 of file GepCellsHandlerAlg.h.

90 {this, "TruncationOfOverflowingFEBs", false,
91 "Enabling or disabling the truncation of cells from FEBs with more than the maximum number of cells which can be send"};

◆ m_electronicNoiseKey

SG::ReadCondHandleKey<CaloNoise> GepCellsHandlerAlg::m_electronicNoiseKey {this, "electronicNoiseKey", "totalNoise", "SG Key of CaloNoise data object"}
private

Key of the CaloNoise Conditions data object.

Typical values are '"electronicNoise', 'pileupNoise', or '"totalNoise' (default)

Definition at line 102 of file GepCellsHandlerAlg.h.

102{this, "electronicNoiseKey", "totalNoise", "SG Key of CaloNoise data object"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonReentrantAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 114 of file AthCommonReentrantAlgorithm.h.

◆ m_gepCellsBase

std::map<unsigned int,Gep::GepCaloCell> GepCellsHandlerAlg::m_gepCellsBase = {}
private

Definition at line 82 of file GepCellsHandlerAlg.h.

82{};

◆ m_GepEnergyEncodingScheme

Gaudi::Property<std::string> GepCellsHandlerAlg::m_GepEnergyEncodingScheme
private
Initial value:
{this, "GEPEnergyEncodingScheme", "",
"String defining the GEP readout scheme according to number of readout bits + '-' + value of LSB in MeV + '-' + gain value"}

Definition at line 84 of file GepCellsHandlerAlg.h.

84 {this, "GEPEnergyEncodingScheme", "",
85 "String defining the GEP readout scheme according to number of readout bits + '-' + value of LSB in MeV + '-' + gain value"};

◆ m_LArCellMap

Gaudi::Property<std::string> GepCellsHandlerAlg::m_LArCellMap
private
Initial value:
{this, "LArCellMapFile", "UpgradePerformanceFunctions/LAr_Cell_Map_offlineID_0.csv",
"File associating LAr cells with readout FEBs and connection technology"}

Definition at line 96 of file GepCellsHandlerAlg.h.

96 {this, "LArCellMapFile", "UpgradePerformanceFunctions/LAr_Cell_Map_offlineID_0.csv",
97 "File associating LAr cells with readout FEBs and connection technology"};

◆ m_maxCellsPerFEB

unsigned GepCellsHandlerAlg::m_maxCellsPerFEB = -1
private

Definition at line 80 of file GepCellsHandlerAlg.h.

◆ m_nEnergyBits

int GepCellsHandlerAlg::m_nEnergyBits = -1
private

Definition at line 75 of file GepCellsHandlerAlg.h.

◆ m_outputGepCellsKey

SG::WriteHandleKey<Gep::GepCellMap> GepCellsHandlerAlg::m_outputGepCellsKey {this, "outputGepCellsKey", "", "Key for GepCell map"}
private

Definition at line 106 of file GepCellsHandlerAlg.h.

106{this, "outputGepCellsKey", "", "Key for GepCell map"};

◆ m_readoutRanges

int GepCellsHandlerAlg::m_readoutRanges[5] = {-1,-1,-1,-1,-1}
private

Definition at line 78 of file GepCellsHandlerAlg.h.

78{-1,-1,-1,-1,-1};

◆ m_stepsPerRange

int GepCellsHandlerAlg::m_stepsPerRange = -1
private

Definition at line 79 of file GepCellsHandlerAlg.h.

◆ m_totalNoiseKey

SG::ReadCondHandleKey<CaloNoise> GepCellsHandlerAlg::m_totalNoiseKey {this, "totalNoiseKey", "totalNoise", "SG Key of CaloNoise data object"}
private

Definition at line 104 of file GepCellsHandlerAlg.h.

104{this, "totalNoiseKey", "totalNoise", "SG Key of CaloNoise data object"};

◆ m_valG

int GepCellsHandlerAlg::m_valG = -1
private

Definition at line 77 of file GepCellsHandlerAlg.h.

◆ m_valLeastSigBit

int GepCellsHandlerAlg::m_valLeastSigBit = -1
private

Definition at line 76 of file GepCellsHandlerAlg.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_writeAllCells

Gaudi::Property<bool> GepCellsHandlerAlg::m_writeAllCells
private
Initial value:
{this, "WriteAllCells", false,
"If true, all cells are considered regardless whether they are truncated or below the 2sigma threshold"}

Definition at line 93 of file GepCellsHandlerAlg.h.

93 {this, "WriteAllCells", false,
94 "If true, all cells are considered regardless whether they are truncated or below the 2sigma threshold"};

The documentation for this class was generated from the following files: