33 ISvcLocator* pSvcLocator)
47 return StatusCode::SUCCESS;
60 if ( not noise_per_cell_handle.
isValid() ) {
61 ATH_MSG_DEBUG(
"Found invalid read handle for CaloNoiseSigmaDiff");
62 return StatusCode::FAILURE;
64 noise_per_cell = noise_per_cell_handle.
cptr();
71 if ( not caloLumiBCIDHandle.
isValid() ) {
72 ATH_MSG_DEBUG(
"Found invalid read handle for CaloBCIDAverage");
73 return StatusCode::FAILURE;
75 caloLumiBCID = caloLumiBCIDHandle.
cptr();
90 if ( not cellsHandle.isValid() ) {
92 return StatusCode::FAILURE;
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);
106 for (
const CaloCell* cell : *cells) {
117 assert (hash < energies.size() );
118 float pedestalshift = 0.0;
120 energies[hash] += cell->energy() + pedestalshift;
123 sigma_noise_per_scell[hash]+=(*noise_per_cell)[cell_hash];
125 uint16_t prov = cell->provenance();
126 if ( ((prov & 0x2000) == 0x2000) && (cell->et()>50) ) {
128 timeDef[hash] =
true;
129 enForTime[hash] += cell->energy();
130 enTime[hash] += cell->energy()*cell->time();
133 gains[hash] = std::max(gains[hash],(uint16_t)cell->gain());
134 if (
qualities[hash] + (
int) cell->quality() > 65535 ){
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);
174 energies[hash1] += cell->energy()*0.5;
175 energies[hash2] += cell->energy()*0.5;
182 auto superCellContainer = std::make_unique<CaloCellContainer> ();
187 superCellContainer->reserve(energies.size());
189 std::default_random_engine generator;
190 for (
unsigned int i=0; i < energies.size(); i++) {
199 float add_noise = 0.0;
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);
205 energies[i]+=add_noise;
210 ss->setEnergy( energies[i] );
213 float time = enTime[i] / enForTime[i];
219 }
else ss->setTime( 999.0 );
224 ss->setProvenance( 0 );
229 ss->setProvenance( prov );
232 superCellContainer->push_back(
ss);
235 ATH_CHECK( scellContainerHandle.
record( std::move(superCellContainer) ) );
237 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
Helper class for offline supercell identifiers.
Definition of CaloDetDescrManager.
std::vector< float > CaloNoiseSigmaDiff
NAME : CaloNoiseSigmaDiff.h PACKAGE : Calorimeter/CaloConditions.
static const std::vector< std::string > qualities
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.
Helper class for offline supercell identifiers.
Data object for each calorimeter readout cell.
This class groups all DetDescr information related to a CaloCell.
IdentifierHash calo_hash() const
cell calo hash
bool is_tile() const
cell belongs to Tile
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
a typed memory pool that saves time spent allocation small object.
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.
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.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Extra patterns decribing particle interation process.