ATLAS Offline Software
CaloCellsHandlerTool.cxx
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3  */
4 
5 #include <vector>
6 #include "TMath.h"
8 
10  const std::string& name,
11  const IInterface* parent): AthAlgTool(type, name, parent){
12 }
13 
15 
19 
20  // CaloIndentifier
21  CHECK( detStore()->retrieve (m_CaloCell_ID, "CaloCell_ID") );
22 
23  return StatusCode::SUCCESS;
24 }
25 
26 // Get calo cells map
27 
29  pGepCellMap& gepCellsMap,
30  const EventContext& ctx) const {
31 
32  // PS this function creates and returns a map which has Gep::GustomCells as its values
33  // The cells are made up of data which is envariant for all events, and dynamic
34  // data which varies with event.
35  // The invariant data should be setup in initialize(), and it the dynamic
36  // data should be updated here in a way which is compatible with the const-ness of this
37  // function.
38  // This will be attended to in the future.
39 
40  SG::ReadCondHandle<CaloNoise> electronicNoiseHdl{m_electronicNoiseKey, ctx};
41  if (!electronicNoiseHdl.isValid()) {return StatusCode::FAILURE;}
42  const CaloNoise* electronicNoiseCDO = *electronicNoiseHdl;
43 
45  if (!totalNoiseHdl.isValid()) {return StatusCode::FAILURE;}
46  const CaloNoise* totalNoiseCDO = *totalNoiseHdl;
47 
48  int idx = 0;
49 
50  for(const auto *cell: cells){
51  Gep::CustomCaloCell caloCell;
52 
53  caloCell.e = cell->energy();
54  caloCell.et = cell->energy() * 1.0/TMath::CosH(cell->eta());
55  caloCell.time = cell->time();
56  caloCell.quality = cell->quality();
57  caloCell.provenance = cell->provenance();
58 
59  float electronicNoise = electronicNoiseCDO->getNoise(cell->ID(), cell->gain());
60  float totalNoise = totalNoiseCDO->getNoise(cell->ID(), cell->gain());
61 
62  caloCell.totalNoise = totalNoise;
63  caloCell.electronicNoise = electronicNoise;
64  caloCell.sigma = caloCell.e / totalNoise;
65 
66  caloCell.isBad = cell->badcell();
67  caloCell.eta = cell->eta();
68  caloCell.phi = cell->phi();
69  caloCell.sinTh = cell->sinTh();
70  caloCell.cosTh = cell->cosTh();
71  caloCell.sinPhi = cell->sinPhi();
72  caloCell.cosPhi = cell->cosPhi();
73  caloCell.cotTh = cell->cotTh();
74  caloCell.x = cell->x();
75  caloCell.y = cell->y();
76  caloCell.z = cell->z();
77 
78  unsigned int samplingEnum = m_CaloCell_ID->calo_sample(cell->ID());
79 
80  bool IsEM = m_CaloCell_ID->is_em(cell->ID());
81  bool IsEM_Barrel=false;
82  bool IsEM_EndCap=false;
83  bool IsEM_BarrelPos=false;
84  bool IsEM_BarrelNeg=false;
85  if(IsEM){
86  IsEM_Barrel=m_CaloCell_ID->is_em_barrel(cell->ID());
87  if(IsEM_Barrel){
88  if(m_CaloCell_ID->pos_neg(cell->ID())>0) IsEM_BarrelPos=true;
89  }
90  IsEM_EndCap=m_CaloCell_ID->is_em_endcap(cell->ID());
91  }
92 
93  caloCell.isEM = IsEM;
94  caloCell.isEM_barrel = IsEM_Barrel;
95  caloCell.isEM_endCap = IsEM_EndCap;
96  caloCell.isEM_barrelPos = IsEM_BarrelPos;
97  caloCell.isEM_barrelNeg = IsEM_BarrelNeg; //always false?
98  caloCell.isFCAL = m_CaloCell_ID->is_fcal(cell->ID());
99  caloCell.isHEC = m_CaloCell_ID->is_hec(cell->ID());
100  caloCell.isTile = m_CaloCell_ID->is_tile(cell->ID());
101 
102  caloCell.sampling = samplingEnum;
103  caloCell.detName = CaloSampling::getSamplingName(samplingEnum);
104 
105  caloCell.neighbours = getNeighbours(cells, cell, ctx);
106  caloCell.id = (cell->ID().get_identifier32()).get_compact();
107 
108  const CaloDetDescriptor *elt = cell->caloDDE()->descriptor();
109  caloCell.layer = cell->caloDDE()->getLayer();
110 
111  float deta = elt->deta();
112  float dphi = elt->dphi();
113 
114  float etamin = caloCell.eta - (0.5*deta);
115  float etamax = caloCell.eta + (0.5*deta);
116 
117  float phimin = caloCell.phi - (0.5*dphi);
118  float phimax = caloCell.phi + (0.5*dphi);
119 
120  caloCell.etaMin = etamin;
121  caloCell.etaMax = etamax;
122  caloCell.phiMin = phimin;
123  caloCell.phiMax = phimax;
124  caloCell.etaGranularity = deta;
125  caloCell.phiGranularity = dphi;
126 
127  caloCell.index = idx;
128 
129  // store cells map
130  gepCellsMap->insert(std::pair<unsigned int, Gep::CustomCaloCell>(caloCell.id, caloCell));
131 
132  ++idx;
133  }
134 
135  return StatusCode::SUCCESS;
136 }
137 
138 
139 
140 // Get neighbours of a given calo cell
141 std::vector<unsigned int>
143  const CaloCell* acell,
144  const EventContext&) const {
145 
146  // get all neighboring cells
147  std::vector<IdentifierHash> cellNeighbours;
148 
149  IdentifierHash cellHashID = m_CaloCell_ID->calo_cell_hash(acell->ID());
150  m_CaloCell_ID->get_neighbours(cellHashID,LArNeighbours::super3D,cellNeighbours);
151 
152  std::vector<unsigned int> neighbour_ids;
153  for (unsigned int iNeighbour = 0;
154  iNeighbour < cellNeighbours.size();
155  ++iNeighbour) {
156 
157  const CaloCell* neighbour = allcells.findCell(cellNeighbours[iNeighbour]);
158  if (neighbour) {
159  neighbour_ids.push_back((neighbour->ID().get_identifier32()).get_compact());
160  } else {
161  ATH_MSG_ERROR("Couldn't access neighbour #" << iNeighbour
162  << " for cell ID "
163  << (acell->ID().get_identifier32()).get_compact());
164  }
165  }
166  return neighbour_ids;
167 }
168 
169 
170 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
Gep::CustomCaloCell::phiGranularity
float phiGranularity
Definition: CustomCaloCell.h:33
RunTileCalibRec.cells
cells
Definition: RunTileCalibRec.py:271
egammaPIDObs::IsEM
@ IsEM
cut-based identification for egamma objects (cluster and track-based)
Definition: egammaPIDdefsObs.h:55
Gep::CustomCaloCell::x
float x
Definition: CustomCaloCell.h:39
Gep::CustomCaloCell::detName
std::string detName
Definition: CustomCaloCell.h:53
Gep::CustomCaloCell::phi
float phi
Definition: CustomCaloCell.h:27
Gep::CustomCaloCell::sampling
unsigned int sampling
Definition: CustomCaloCell.h:51
Gep::CustomCaloCell::layer
int layer
Definition: CustomCaloCell.h:42
CaloCell_Base_ID::calo_cell_hash
IdentifierHash calo_cell_hash(const Identifier cellId) const
create hash id from 'global' cell id
Gep::CustomCaloCell::isEM_barrelNeg
bool isEM_barrelNeg
Definition: CustomCaloCell.h:47
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
Gep::CustomCaloCell::eta
float eta
Definition: CustomCaloCell.h:26
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
CaloCell_Base_ID::is_em_endcap
bool is_em_endcap(const Identifier id) const
test if the id belongs to the EM Endcap
Gep::CustomCaloCell::isTile
bool isTile
Definition: CustomCaloCell.h:50
Gep::CustomCaloCell::y
float y
Definition: CustomCaloCell.h:40
CaloCell_Base_ID::pos_neg
int pos_neg(const Identifier id) const
LAr field values (NOT_VALID == invalid request)
Gep::CustomCaloCell::isEM_endCap
bool isEM_endCap
Definition: CustomCaloCell.h:45
Gep::CustomCaloCell::isEM_barrelPos
bool isEM_barrelPos
Definition: CustomCaloCell.h:46
CaloDetDescriptor::dphi
double dphi() const
delta phi
Definition: CaloDetDescriptor.h:593
Gep::CustomCaloCell::cotTh
float cotTh
Definition: CustomCaloCell.h:38
Gep::CustomCaloCell::id
unsigned int id
Definition: CustomCaloCell.h:52
Gep::CustomCaloCell::isHEC
bool isHEC
Definition: CustomCaloCell.h:49
Identifier::get_identifier32
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
Gep::CustomCaloCell
Definition: CustomCaloCell.h:13
CaloCellsHandlerTool::m_electronicNoiseKey
SG::ReadCondHandleKey< CaloNoise > m_electronicNoiseKey
Key of the CaloNoise Conditions data object.
Definition: CaloCellsHandlerTool.h:48
Gep::CustomCaloCell::index
int index
Definition: CustomCaloCell.h:60
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:141
CaloCell_Base_ID::is_tile
bool is_tile(const Identifier id) const
test if the id belongs to the Tiles
CaloNoise::getNoise
float getNoise(const IdentifierHash h, const int gain) const
Accessor by IdentifierHash and gain.
Definition: CaloNoise.h:34
CaloCell_Base_ID::is_hec
bool is_hec(const Identifier id) const
test if the id belongs to the HEC
Gep::CustomCaloCell::time
float time
Definition: CustomCaloCell.h:19
Gep::CustomCaloCell::cosTh
float cosTh
Definition: CustomCaloCell.h:35
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
Gep::CustomCaloCell::quality
unsigned int quality
Definition: CustomCaloCell.h:20
CaloCellsHandlerTool::m_totalNoiseKey
SG::ReadCondHandleKey< CaloNoise > m_totalNoiseKey
Definition: CaloCellsHandlerTool.h:55
Gep::CustomCaloCell::sinPhi
float sinPhi
Definition: CustomCaloCell.h:36
Gep::CustomCaloCell::electronicNoise
float electronicNoise
Definition: CustomCaloCell.h:23
Gep::CustomCaloCell::z
float z
Definition: CustomCaloCell.h:41
CaloCell_Base_ID::is_em
bool is_em(const Identifier id) const
test if the id belongs to LArEM
Gep::CustomCaloCell::provenance
unsigned int provenance
Definition: CustomCaloCell.h:21
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
pGepCellMap
std::unique_ptr< GepCellMap > pGepCellMap
Definition: CaloCellsHandlerTool.h:23
CaloCell_Base_ID::is_fcal
bool is_fcal(const Identifier id) const
test if the id belongs to the FCAL - true also for MiniFCAL
Gep::CustomCaloCell::isEM
bool isEM
Definition: CustomCaloCell.h:43
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Gep::CustomCaloCell::totalNoise
float totalNoise
Definition: CustomCaloCell.h:22
Gep::CustomCaloCell::e
float e
Definition: CustomCaloCell.h:17
Gep::CustomCaloCell::etaMin
float etaMin
Definition: CustomCaloCell.h:28
Gep::CustomCaloCell::phiMin
float phiMin
Definition: CustomCaloCell.h:30
Gep::CustomCaloCell::etaMax
float etaMax
Definition: CustomCaloCell.h:29
Gep::CustomCaloCell::isFCAL
bool isFCAL
Definition: CustomCaloCell.h:48
test_pyathena.parent
parent
Definition: test_pyathena.py:15
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
Gep::CustomCaloCell::et
float et
Definition: CustomCaloCell.h:18
CaloCellsHandlerTool::getGepCellMap
StatusCode getGepCellMap(const CaloCellContainer &cells, pGepCellMap &, const EventContext &ctx) const
Definition: CaloCellsHandlerTool.cxx:28
CaloCellsHandlerTool.h
Gep::CustomCaloCell::sinTh
float sinTh
Definition: CustomCaloCell.h:34
CaloDetDescriptor::deta
double deta() const
delta eta
Definition: CaloDetDescriptor.h:588
LArNeighbours::super3D
@ super3D
Definition: LArNeighbours.h:29
CaloCellContainer::findCell
const CaloCell * findCell(const IdentifierHash theHash) const
fast find method given identifier hash.
Definition: CaloCellContainer.cxx:345
CaloNoise
Definition: CaloNoise.h:16
CaloCellsHandlerTool::CaloCellsHandlerTool
CaloCellsHandlerTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: CaloCellsHandlerTool.cxx:9
CaloCell_Base_ID::is_em_barrel
bool is_em_barrel(const Identifier id) const
test if the id belongs to the EM barrel
CaloCellsHandlerTool::~CaloCellsHandlerTool
virtual ~CaloCellsHandlerTool()
Definition: CaloCellsHandlerTool.cxx:14
Gep::CustomCaloCell::etaGranularity
float etaGranularity
Definition: CustomCaloCell.h:32
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
Gep::CustomCaloCell::phiMax
float phiMax
Definition: CustomCaloCell.h:31
CaloCell_Base_ID::get_neighbours
int get_neighbours(const IdentifierHash caloHash, const LArNeighbours::neighbourOption &option, std::vector< IdentifierHash > &neighbourList) const
access to hashes for neighbours return == 0 for neighbours found
Definition: CaloCell_Base_ID.cxx:190
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
CaloCell::ID
Identifier ID() const
get ID (from cached data member) non-virtual and inline for fast access
Definition: CaloCell.h:279
CaloCellContainer
Container class for CaloCell.
Definition: CaloCellContainer.h:55
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloDetDescriptor
This is a base class for LAr and Tile Descriptors The primary goal is to speed up loops over all the ...
Definition: CaloDetDescriptor.h:58
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
LArNewCalib_DelayDump_OFC_Cali.idx
idx
Definition: LArNewCalib_DelayDump_OFC_Cali.py:69
Gep::CustomCaloCell::cosPhi
float cosPhi
Definition: CustomCaloCell.h:37
CaloCellsHandlerTool::getNeighbours
std::vector< unsigned int > getNeighbours(const CaloCellContainer &allcells, const CaloCell *acell, const EventContext &) const
Definition: CaloCellsHandlerTool.cxx:142
CaloSampling::getSamplingName
static std::string getSamplingName(CaloSample theSample)
Returns a string (name) for each CaloSampling.
Definition: Calorimeter/CaloGeoHelpers/Root/CaloSampling.cxx:18
Gep::CustomCaloCell::neighbours
std::vector< unsigned int > neighbours
Definition: CustomCaloCell.h:54
Gep::CustomCaloCell::sigma
float sigma
Definition: CustomCaloCell.h:24
AthAlgTool
Definition: AthAlgTool.h:26
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
Gep::CustomCaloCell::isBad
bool isBad
Definition: CustomCaloCell.h:25
LArCellBinning.etamin
etamin
Definition: LArCellBinning.py:137
CaloCellsHandlerTool::m_CaloCell_ID
const CaloCell_ID * m_CaloCell_ID
Definition: CaloCellsHandlerTool.h:61
Gep::CustomCaloCell::isEM_barrel
bool isEM_barrel
Definition: CustomCaloCell.h:44
CaloCellsHandlerTool::initialize
StatusCode initialize()
Definition: CaloCellsHandlerTool.cxx:16