ATLAS Offline Software
Loading...
Searching...
No Matches
LArSCSimpleMaker.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// +======================================================================+
6// + +
7// + Author ........: Denis Oliveira Damazio +
8// + Institute .....: BNL +
9// + Creation date .: 17/06/2012 +
10// + Moved to MT : 20/02/2021
11// + +
12// +======================================================================+
13//
14// ........ includes
15//
16#include "LArSCSimpleMaker.h"
23#include <cmath>
25#include <random>
26
27#include <mutex>
28
32LArSCSimpleMaker::LArSCSimpleMaker(const std::string& name,
33 ISvcLocator* pSvcLocator)
34 : AthReentrantAlgorithm(name, pSvcLocator),
35 m_calo_id_manager(nullptr)
36{
37}
38
40 ATH_CHECK( m_cellContainerKey.initialize() );
41 ATH_CHECK( m_sCellContainerKey.initialize() );
42 ATH_CHECK( m_scidtool.retrieve() );
43 ATH_CHECK( m_caloSuperCellMgrKey.initialize() );
44 ATH_CHECK( detStore()->retrieve (m_calo_id_manager, "CaloIdManager") );
46 ATH_CHECK( m_bcidAvgKey.initialize(m_addBCID) );
47 return StatusCode::SUCCESS;
48}
49
53StatusCode LArSCSimpleMaker::execute(const EventContext& context) const
54{
55
56 // conditions
57 const CaloNoiseSigmaDiff* noise_per_cell = nullptr;
58 if ( m_compNoise ){
60 if ( not noise_per_cell_handle.isValid() ) {
61 ATH_MSG_DEBUG("Found invalid read handle for CaloNoiseSigmaDiff");
62 return StatusCode::FAILURE;
63 }
64 noise_per_cell = noise_per_cell_handle.cptr();
65 } // end of if n_compNoise
66
67 // Not really a condition, but almost
68 const CaloBCIDAverage* caloLumiBCID = nullptr;
69 if (m_addBCID ) {
70 SG::ReadHandle<CaloBCIDAverage> caloLumiBCIDHandle(m_bcidAvgKey, context);
71 if ( not caloLumiBCIDHandle.isValid() ) {
72 ATH_MSG_DEBUG("Found invalid read handle for CaloBCIDAverage");
73 return StatusCode::FAILURE;
74 }
75 caloLumiBCID = caloLumiBCIDHandle.cptr();
76 } // end of if m_addBCID
77
78 const CaloCell_SuperCell_ID * calo_sc_id = m_calo_id_manager->getCaloCell_SuperCell_ID();
79 const CaloCell_ID * calo_cell_id = m_calo_id_manager->getCaloCell_ID();
80
81 const Tile_SuperCell_ID * tile_sc_id = m_calo_id_manager->getTile_SuperCell_ID();
82 const TileID * tile_cell_id = m_calo_id_manager->getTileID();
83
84 int hash_max = calo_sc_id->calo_cell_hash_max();
85 DataPool<CaloCell> dataPool;
86 if (dataPool.allocated()==0)
87 dataPool.reserve (hash_max);
88
89 auto cellsHandle = SG::makeHandle( m_cellContainerKey, context );
90 if ( not cellsHandle.isValid() ) {
91 ATH_MSG_ERROR("Did not get CaloCellContainer input");
92 return StatusCode::FAILURE;
93 }
94
95 const CaloCellContainer* cells = cellsHandle.cptr();
96 ATH_MSG_DEBUG("Got a CaloCellContainer input");
97
98 std::vector<float> energies (hash_max,0);
99 std::vector<float> enTime (hash_max,0);
100 std::vector<float> enForTime (hash_max,0);
101 std::vector<bool> timeDef (hash_max,false);
102 std::vector<uint16_t> gains (hash_max,0);
103 std::vector<uint16_t> qualities (hash_max,0);
104 std::vector<float> sigma_noise_per_scell(hash_max,0);
105
106 for (const CaloCell* cell : *cells) {
107 Identifier cell_id = cell->ID();
108 Identifier sCellID = m_scidtool->offlineToSuperCellID (cell_id);
109
110 if (!sCellID.is_valid()) {
111 // ATH_MSG_WARNING( " SC ID not valid " << sCellID.get_identifier32().get_compact() << " offline id = " << cell->ID().get_identifier32().get_compact() );
112 // calo_sc_id->print(cell->ID());
113 continue;
114 }
115 IdentifierHash hash, cell_hash;
116 hash = calo_sc_id->calo_cell_hash (sCellID);
117 assert (hash < energies.size() );
118 float pedestalshift = 0.0;
119 if ( m_addBCID ) pedestalshift = caloLumiBCID->average(cell_id);
120 energies[hash] += cell->energy() + pedestalshift;
121 if ( m_compNoise && cell->gain() == CaloGain::LARHIGHGAIN ){
122 cell_hash = calo_cell_id->calo_cell_hash(cell_id);
123 sigma_noise_per_scell[hash]+=(*noise_per_cell)[cell_hash];
124 }
125 uint16_t prov = cell->provenance();
126 if ( ((prov & 0x2000) == 0x2000) && (cell->et()>50) ) {
127 // time defined for one of the cells
128 timeDef[hash] = true;
129 enForTime[hash] += cell->energy();
130 enTime[hash] += cell->energy()*cell->time();
131 }
132
133 gains[hash] = std::max(gains[hash],(uint16_t)cell->gain());
134 if ( qualities[hash] + (int) cell->quality() > 65535 ){
135 qualities[hash] = 65535 ;
136 }else
137 {
138 qualities[hash] += cell->quality();
139 }
140
141 if ( calo_cell_id->is_tile(cell_id) && tile_cell_id->sampling(cell_id)==TileID::SAMP_D){
142 // Special case for SAMP_D in tile. Signal is split into two SCs
143 int section = tile_cell_id->section (cell_id);
144 int side = tile_cell_id->side (cell_id);
145 int module = tile_cell_id->module (cell_id);
146 int tower = tile_cell_id->tower (cell_id);
147
148 int section1 = section;
149 int section2 = section;
150 int side1 = side;
151 int side2 = side;
152 int tower1= tower;
153 int tower2= tower-1;
154
155 if (tower ==0){
156 side1 = -1;
157 side2 = 1;
158 tower1=0;
159 tower2=0;
160 }
161 if (tower==10){
162 section2 = TileID::BARREL;
163 section1 = TileID::EXTBAR;
164 }
165
166
167 Identifier sc_id1 = tile_sc_id->cell_id(section1,side1,module,tower1,0);
168 Identifier sc_id2 = tile_sc_id->cell_id(section2,side2,module,tower2,0);
169
170
171 int hash1 = calo_sc_id->calo_cell_hash (sc_id1);
172 int hash2 = calo_sc_id->calo_cell_hash (sc_id2);
173
174 energies[hash1] += cell->energy()*0.5;
175 energies[hash2] += cell->energy()*0.5;
176 }
177
178
179 }
180
181 SG::WriteHandle<CaloCellContainer> scellContainerHandle( m_sCellContainerKey, context);
182 auto superCellContainer = std::make_unique<CaloCellContainer> ();
183
185 const CaloSuperCellDetDescrManager* caloMgr = *caloSuperCellMgrHandle;
186
187 superCellContainer->reserve(energies.size());
188
189 std::default_random_engine generator;
190 for (unsigned int i=0; i < energies.size(); i++) {
191
192 const CaloDetDescrElement* dde = caloMgr->get_element (i);
193 if (!dde) {
194 // ATH_MSG_WARNING( " Not valid DDE, hash index = "<< i );
195 continue;
196 }
197
198 // More noise
199 float add_noise = 0.0;
200 IdentifierHash hash = dde->calo_hash();
201 if ( (!dde->is_tile()) && (sigma_noise_per_scell[hash] > 0.0) ){
202 std::normal_distribution<double> distribution(0.0,sigma_noise_per_scell[hash] );
203 add_noise = distribution(generator);
204 }
205 energies[i]+=add_noise;
206
207 //CaloCell* ss = dataPool.nextElementPtr();
208 CaloCell* ss = new CaloCell();
209 ss->setCaloDDE( caloMgr->get_element (i));
210 ss->setEnergy( energies[i] );
211 uint16_t prov (0);
212 if ( timeDef[i] ){
213 float time = enTime[i] / enForTime[i]; // if timeDef is true, enForTime is > 10
214 float et = ss->et();
215 ss->setTime( time );
216 prov = LArProv::QTPRESENT;// 0x2000;
217 if(et>10e3 && time>-8 && time<16) prov |= LArProv::SCTIMEPASS;//0x200;
218 else if(et<=10e3 && std::abs(time)<8) prov |= LArProv::SCTIMEPASS;//0x200;
219 } else ss->setTime( 999.0 ); // makes sure it will fail some BCID
220
221 ss->setQuality( qualities[i] );
222 if (calo_sc_id->is_tile(ss->ID()))
223 {
224 ss->setProvenance( 0 );
225 ss->setGain( (CaloGain::CaloGain) 0 );
226 }
227 else
228 {
229 ss->setProvenance( prov );
230 ss->setGain( CaloGain::LARHIGHGAIN );
231 }
232 superCellContainer->push_back(ss);
233
234 }
235 ATH_CHECK( scellContainerHandle.record( std::move(superCellContainer) ) );
236
237 return StatusCode::SUCCESS;
238}
239
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
Helper class for offline supercell identifiers.
Definition of CaloDetDescrManager.
std::vector< float > CaloNoiseSigmaDiff
NAME : CaloNoiseSigmaDiff.h PACKAGE : Calorimeter/CaloConditions.
static Double_t ss
static const std::vector< std::string > qualities
void section(const std::string &sec)
const ServiceHandle< StoreGateSvc > & detStore() const
An algorithm that can be simultaneously executed in multiple threads.
float average(const Identifier &id) const
Container class for CaloCell.
size_type calo_cell_hash_max() const
cell 'global' hash table max size
bool is_tile(const Identifier id) const
test if the id belongs to the Tiles
IdentifierHash calo_cell_hash(const Identifier cellId) const
create hash id from 'global' cell id
Helper class for offline cell identifiers.
Definition CaloCell_ID.h:34
Helper class for offline supercell identifiers.
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
This class groups all DetDescr information related to a CaloCell.
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
a typed memory pool that saves time spent allocation small object.
Definition DataPool.h:63
void reserve(unsigned int size)
Set the desired capacity.
unsigned int allocated()
return size already allocated OK
This is a "hash" representation of an Identifier.
bool is_valid() const
Check if id is in a valid state.
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_caloSuperCellMgrKey
Gaudi::Property< bool > m_addBCID
SG::WriteHandleKey< CaloCellContainer > m_sCellContainerKey
Property: SG key for the output supercell LAr channel container.
StatusCode execute(const EventContext &context) const
Algorithm execute method.
SG::ReadHandleKey< CaloCellContainer > m_cellContainerKey
Property: SG key for the input calorimeter cell container.
ToolHandle< ICaloSuperCellIDTool > m_scidtool
Property: Offline / supercell mapping tool.
StatusCode initialize()
Standard Gaudi initialize method.
const CaloIdManager * m_calo_id_manager
Entry point for calorimeter ID helpers.
SG::ReadCondHandleKey< CaloNoiseSigmaDiff > m_noise_per_cell_Key
Property SG Key for the Expected Noise Sigma diff in diff gains.
SG::ReadHandleKey< CaloBCIDAverage > m_bcidAvgKey
Property SG Key for the CaloLumiBCID.
LArSCSimpleMaker(const std::string &name, ISvcLocator *pSvcLocator)
Standard Gaudi algorithm constructor.
Gaudi::Property< bool > m_compNoise
const_pointer_type cptr()
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
Helper class for TileCal offline identifiers.
Definition TileID.h:67
int tower(const Identifier &id) const
Identifier cell_id(const Identifier &any_id) const
int side(const Identifier &id) const
int section(const Identifier &id) const
int sampling(const Identifier &id) const
Helper class for Tile offline identifiers for supercells.
@ LARHIGHGAIN
Definition CaloGain.h:18
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Extra patterns decribing particle interation process.