9#include "GaudiKernel/MsgStream.h"
12#include "GaudiKernel/SystemOfUnits.h"
20using Gaudi::Units::GeV;
109 return StatusCode::SUCCESS;
117 const EventContext& ctx = Gaudi::Hive::currentContext();
121 if(!caloSCMgrHandle.
isValid()) {
123 return StatusCode::FAILURE;
132 return StatusCode::FAILURE;
146 return StatusCode::SUCCESS;
156 if(!cablingHdl.isValid()) {
158 return StatusCode::FAILURE;
168 return StatusCode::FAILURE;
175 if(!pedHdl.isValid()){
177 return StatusCode::FAILURE;
183 if(!noiseHdl.isValid()){
185 return StatusCode::FAILURE;
193 if(!acorrHdl.isValid()){
195 return StatusCode::FAILURE;
201 if(!ofcHdl.isValid()){
203 return StatusCode::FAILURE;
210 if(!shapeHdl.isValid()){
212 return StatusCode::FAILURE;
219 if(!fsamplHdl.isValid()){
221 return StatusCode::FAILURE;
228 if(!minbiasHdl.isValid()){
230 return StatusCode::FAILURE;
240 std::unique_ptr<CaloNoise> pileupNoiseObj=std::make_unique<CaloNoise>(
m_LArHashMax,
m_nGains, 0,4,
243 auto& elecnoise = elecNoiseObj->larStorage();
244 auto& pileupnoise = pileupNoiseObj->larStorage();
253 for (
unsigned igain=0;igain<
m_nGains;++igain) {
254 elecnoise[igain][ihash] = elec3gains[igain];
255 pileupnoise[igain][ihash] = pns;
261 ATH_MSG_INFO(
"recorded new CaloNoise object with key " << writeElecHandle.
key() <<
" and range " << writeElecHandle.
getRange());
264 ATH_MSG_INFO(
"recorded new CaloNoise object with key " << writePileupHandle.
key() <<
" and range " << writePileupHandle.
getRange());
266 return StatusCode::SUCCESS;
291 return StatusCode::SUCCESS;
301 static_cast<unsigned int> (-1));
340 regId =
m_lar_em_id->region_id(abs(barrel_ec),sampling,region);
352 regId =
m_lar_hec_id->region_id(abs(pos_neg),sampling,region);
388 else idSymmCaloHash=idCaloHash;
419 return StatusCode::SUCCESS;
457 if (sc.isFailure()) {
464 for(
int igain=0;igain<maxgain;++igain)
467 for(
int i=0;i<5000;++i)
m_nReason[i][igain]=0;
488 return StatusCode::SUCCESS;
507 adc2mevVector.reserve (maxgain);
508 for(
unsigned int igain=0;igain<maxgain;++igain)
510 auto polynom_adc2mev =
adc2mev->ADC2MEV(
id,igain);
511 if(polynom_adc2mev.size()==0)
512 adc2mevVector.push_back(0.);
514 adc2mevVector.push_back(polynom_adc2mev[1]);
520 return StatusCode::SUCCESS;
532 MsgStream log( msgSvc(), name() );
546 for(
int igain=0;igain<maxgain;++igain)
549 ATH_MSG_INFO(
"===== Diagnostic for gain "<<igain<<
" =====");
553 log<<MSG::DEBUG<<
m_idHash[i][igain]<<
" "
558 log << MSG::DEBUG<<
endmsg;
562 for(
int i=0;i<10;++i)
568 return StatusCode::SUCCESS;
587 return StatusCode::SUCCESS;
614 std::vector<float> sigmaVector (maxgain,
BADVALUE);
619 for(
int igain=0;igain<maxgain;++igain)
626 std::vector<bool> retrieve(
nDATABASE,
false);
647 float OFC_AC_OFC,OFC_OFC;
651 float REST = OFC_OFC*(1./12.);
654 if(sigma>0) sigma=std::sqrt(sigma);
657 sigma=-std::sqrt(-sigma);
669 if(noiseOK && sigma<0)
681 sigmaVector[igain]=sigma;
693 const float &Nminbias)
695 if(Nminbias<=0.000001)
return 0.;
716 std::vector<bool> retrieve(
nDATABASE,
false);
724 if(
sc.isFailure())
return 0.;
739 float OFC_AC_OFC,OFC_OFC;
747 PileUp*=std::sqrt(OFC_AC_OFC);
764 if(i==j)
m_c[i][j] = 1.;
777 for (
int k=0;k<nsize;k++) {
778 if ((j-i+k)>=0 && (j-i+k)<nsize) {
811 std::vector<bool> &retrieve)
818 int index=this->index(idCaloHash);
859 for(
unsigned int i=0;i<
m_OFC.size();++i)
870 for(
unsigned int i=0;i<
m_Shape.size();++i)
898 StatusCode StatusDatabase=StatusCode::SUCCESS;
900 ATH_MSG_DEBUG(
"checkCellDatabase starts for "<<
id.get_identifier32().get_compact()<<
" gain: "<<igain);
906 StatusDatabase=StatusCode::FAILURE;
916 StatusDatabase=StatusCode::FAILURE;
929 StatusDatabase=StatusCode::FAILURE;
933 StatusDatabase=StatusCode::FAILURE;
947 StatusDatabase=StatusCode::FAILURE;
951 StatusDatabase=StatusCode::FAILURE;
957 unsigned int n_OFCnull=0;
958 for(
auto ofc :
m_OFC)
959 if(std::fabs(ofc)<0.000001) ++n_OFCnull;
972 StatusDatabase=StatusCode::FAILURE;
979 StatusDatabase=StatusCode::FAILURE;
985 unsigned int n_SHAPEnull=0;
987 if(std::fabs(shp)<0.000001) ++n_SHAPEnull;
988 if(n_SHAPEnull==
m_Shape.size())
999 ATH_MSG_DEBUG(
"AutoCorr and OFC vectors have not the same " <<
"number of elements" <<
" ("<<
m_AutoCorr.size()<<
"/"<<
m_OFC.size() <<
" ) => will take into account only " <<
m_nsamples <<
" samples !" );
1006 for(
unsigned int i=0;i<
m_Shape.size();++i)
1019 StatusDatabase=StatusCode::FAILURE;
1024 ATH_MSG_DEBUG(
"checkCellDatabase "<<
id.get_identifier32().get_compact()<<
" status: "<<StatusDatabase);
1025 return StatusDatabase;
1034 if (nTmp >= 5000)
return;
1036 if (nr >= 10)
return;
1063 int index=this->index(idCaloHash);
1066 int igain=
static_cast<int>(gain);
1081 igain=
static_cast<int>(convertedGain);
1085 ATH_MSG_WARNING(
" ask noise for invalid/unknown gain, will return noise for high gain " );
1089 if (iCalo<0 ||
index<0)
1096 const std::vector<float>* sigmaVector = 0;
1101 int gain_wanted=igain;
1102 int gain_shifted=gain_wanted;
1109 gain_shifted=gain_wanted-shift_gain;
1111 sigma = (*sigmaVector)[gain_shifted];
1118 if(shift_gain<=igain) retry=
true;
1119 ATH_MSG_WARNING(
"noise is missing for this cell " <<
m_lar_em_id->show_to_string(caloDDE->
identify()) <<
" at this gain (" <<gain_wanted<<
"), return the noise at next gain (" <<gain_shifted<<
")" );
1133 std::vector<float> sigma;
1135 sigma.reserve (maxgain);
1136 for(
int igain=0;igain<maxgain;++igain)
1137 sigma.push_back(this->elecNoiseRMS(caloDDE,
1139 for(
int igain=0;igain<maxgain;++igain)
1142 sigma[igain]=sigma[igain-1];
1159 const float Nminbias) {
1167 const float Nminbias) {
1169 float pileupNoiseRMS_tmp = this->
pileupNoiseRMS(theCell,Nminbias);
1171 if(elecNoiseRMS_tmp>=0)
1172 return std::sqrt((elecNoiseRMS_tmp*elecNoiseRMS_tmp) + (pileupNoiseRMS_tmp*pileupNoiseRMS_tmp));
1182 const float Nminbias)
1192 int index=this->index(idCaloHash);
1213 const float Nminbias)
1215 float elecNoiseRMS_tmp = this->
elecNoiseRMS(caloDDE,gain);
1216 float pileupNoiseRMS_tmp = this->
pileupNoiseRMS(caloDDE,Nminbias);
1221 if(elecNoiseRMS_tmp>0)
1222 totalNoiseRMS= std::sqrt((elecNoiseRMS_tmp*elecNoiseRMS_tmp) + (pileupNoiseRMS_tmp*pileupNoiseRMS_tmp) );
1231 const float Nminbias)
1240 const float Nminbias)
1244 if (iCalo == CaloCell_ID::SUBCALO::NOT_VALID){
1245 throw std::runtime_error(
"Invalid CaloID in CaloNoiseCompCondAlg::totalNoiseRMSHighestGain");
1266 int index=this->index(idCaloHash);
1271 int index=this->index(idCaloHash);
1277 ATH_MSG_WARNING(
"CaloNoiseCompCondAlg::adc2mev(id,gain) : NOT IMPLEMENTED !" <<
"for TILE (-> returns 1. for the moment)" );
1282 MsgStream log( msgSvc(), name() );
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Helper class for offline supercell identifiers.
const ServiceHandle< StoreGateSvc > & detStore() const
Base class for conditions algorithms.
CaloCell_Base_ID::SUBCALO SUBCALO
Data object for each calorimeter readout cell.
const CaloDetDescrElement * caloDDE() const
get pointer to CaloDetDescrElement (data member)
CaloGain::CaloGain gain() const
get gain (data member )
This class groups all DetDescr information related to a CaloCell.
IdentifierHash calo_hash() const
cell calo hash
CaloCell_ID::SUBCALO getSubCalo() const
cell subcalo
Identifier identify() const override final
cell identifier
virtual StatusCode stop() override final
CaloGain::CaloGain m_highestGain[m_nCalos]
const ILArNoise * m_noise
void commonCalculations(float &OFC_AC_OFC, float &OFC_OFC, int icase, unsigned int firstSample=0)
StatusCode checkCellDatabase(const Identifier &id, int igain, std::vector< bool > &retrieve)
float adc2mev(const CaloDetDescrElement *caloDDE, const CaloGain::CaloGain gain)
float pileupNoiseRMS(const CaloCell *caloCell, const float Nminbias=-1)
virtual StatusCode initialize() override final
standard Athena-Algorithm method
StatusCode initData(const LArADC2MeV *adc2mev)
BooleanProperty m_DiagnosticLG
LArVectorProxy m_AutoCorr
StatusCode retrieveCellDatabase(const IdentifierHash &idCaloHash, const Identifier &id, int igain, std::vector< bool > &retrieve)
int m_itReason[10][m_nGains]
IdentifierHash m_LArHashMax
const ILArPedestal * m_ped
std::vector< float > calculateElecNoiseForLAR(const IdentifierHash &idCaloHash)
std::string m_reasonName[10]
SG::ReadCondHandleKey< CaloSuperCellDetDescrManager > m_caloSCMgrKey
StatusCode initPileUpNoise()
int index(const IdentifierHash &idCaloHash)
std::vector< float > elecNoiseRMS3gains(const CaloDetDescrElement *caloDDE)
SG::ReadCondHandleKey< LArADC2MeV > m_adc2mevKey
void updateDiagnostic(int reason, const std::string &reason_name, int igain, bool &noiseOK)
int m_reason[5000][10][m_nGains]
float totalNoiseRMS(const CaloCell *caloCell, const float Nminbias=-1)
IdentifierHash m_CaloHashMin
SG::WriteCondHandleKey< CaloNoise > m_outputPileupKey
int m_nReason[5000][m_nGains]
const ILArAutoCorr * m_acorr
VectorContainer m_elecNoiseCELLContainer
VectorContainer m_adc2mevContainer
float m_HighGainThresh[m_nCalos]
const ILArOFC * m_ofccond
StatusCode initContainers()
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
IdentifierHash m_CaloHashMax
SG::ReadCondHandleKey< ILArNoise > m_noiseKey
const ILArfSampl * m_fsamplcond
SG::ReadCondHandleKey< ILArAutoCorr > m_acorrKey
SG::ReadCondHandleKey< ILArShape > m_shapeKey
int m_idHash[5000][m_nGains]
const LArOnOffIdMapping * m_cabling
StatusCode initAdc2MeV(const LArADC2MeV *adc2mev)
std::vector< IdentifierHash > m_idSymmCaloHashContainer
VectorContainer m_elecNoiseRAWContainer
float m_LowGainThresh[m_nCalos]
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
UnsignedIntegerProperty m_firstSample
SG::ReadCondHandleKey< ILArOFC > m_LArOFCObjKey
int m_nCellsWithProblem[m_nGains]
const LArEM_Base_ID * m_lar_em_id
bool m_diagnostic[m_nGains]
const AtlasDetectorID * m_atlas_id
const ILArMinBias * m_minbias
static constexpr int m_nGains
SingleContainer m_pileupNoiseContainer
SG::WriteCondHandleKey< CaloNoise > m_outputElecKey
CaloCell_ID::SUBCALO caloNum(const IdentifierHash idCaloHash)
CaloNoiseCompCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Standard Athena-Algorithm Constructor.
const CaloIdManager * m_calo_id_man
BooleanProperty m_DiagnosticHG
const ILArShape * m_shapecond
const CaloDetDescrManager_Base * m_calo_dd_man
float totalNoiseRMSHighestGain(const CaloCell *caloCell, const float Nminbias=-1)
SG::ReadCondHandleKey< ILArPedestal > m_pedestalKey
SG::ReadCondHandleKey< ILArMinBias > m_LArMinBiasObjKey
const LArFCAL_Base_ID * m_lar_fcal_id
bool checkIfConnected(const Identifier &id)
bool isBadValue(float tested_value)
std::vector< IdentifierHash > m_indexContainer
const CaloCell_SuperCell_ID * m_calosupercell_id
const CaloCell_Base_ID * m_calocell_id
SG::ReadCondHandleKey< ILArfSampl > m_fSamplKey
StatusCode initElecNoise()
float calculatePileUpNoise(const IdentifierHash &idCaloHash, const float &Nminbias)
const LArHEC_Base_ID * m_lar_hec_id
IntegerProperty m_deltaBunch
BooleanProperty m_DiagnosticMG
float elecNoiseRMS(const CaloCell *caloCell)
BooleanProperty m_UseSymmetry
static EventIDRange infiniteMixed()
Produces an mixed EventIDRange that is infinite in Time and RunLumi.
This is a "hash" representation of an Identifier.
This class factors out code common between LArEM_ID and LArEM_SuperCell_ID.
This class factors out code common between LArEM_ID and LArEM_SuperCell_ID.
Exception class for LAr Identifiers.
const std::string & key() const
void addDependency(const EventIDRange &range)
const EventIDRange & getRange() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED