ATLAS Offline Software
Loading...
Searching...
No Matches
LArDSPThresholdFillInline.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
9#include "CaloDetDescr/CaloDetDescrElement.h"
11#include "GaudiKernel/ThreadLocalContext.h"
12
13#include <fstream>
14
16#include "CoralBase/Blob.h"
17#include "CoralBase/Attribute.h"
18#include "CoralBase/AttributeList.h"
19#include "CoralBase/AttributeListSpecification.h"
20
22#include "CoolKernel/StorageType.h"
23
24LArDSPThresholdFillInline::LArDSPThresholdFillInline(const std::string& name, ISvcLocator* pSvcLocator) :
25 AthAlgorithm(name,pSvcLocator),
26 m_onlineID(0),
28{
29
30 declareProperty("Fill",m_fill=true);
31 declareProperty("NameOfSet",m_nameOfSet);
32 declareProperty("Key",m_key="DSPThresholds");
33 declareProperty("mode",m_mode="fixed",
34 "Select how to set thresholds. Allowed values are 'fixed','group' and 'noise'");
35
36 //For mode 'fixed'
37 declareProperty("tQThreshold",m_tqThrsh=250);
38 declareProperty("samplesThreshold",m_samplesThrsh=1000);
39
40 //For mode 'group'
41 declareProperty("ThresholdsPerCellGroup",m_cellGroupStr);
42
43 //For mode 'Noise'
44 declareProperty("sigmaNoiseSamples",m_sigmaNoiseSamples);
45 declareProperty("sigmaNoiseQt",m_sigmaNoiseQt);
46 declareProperty("usePileupNoiseSamples",m_usePileupNoiseSamples);
47 declareProperty("usePileupNoiseQt",m_usePileupNoiseQt);
48
49 //For channel masking
50 declareProperty("MaskBadChannels",m_maskBadChannels=false);
51 declareProperty("MaskedtQThreshold",m_maskedtqThrsh=static_cast<float>(0x7fffffff));
52 declareProperty("MaskedsamplesThreshold",m_maskedsamplesThrsh=static_cast<float>(0x7fffffff));
53
54 declareProperty("Dump",m_dump=false);
55 declareProperty("OutFile",m_outFileName="out.txt");
56}
57
59
60
62
63 ATH_MSG_DEBUG ( "start initialize()" );
64
65 ATH_CHECK( detStore()->retrieve(m_onlineID,"LArOnlineID") );
66 ATH_CHECK( m_cablingKey.initialize() );
67 ATH_CHECK( m_caloMgrKey.initialize() );
68
70 ATH_CHECK(m_bcMask.buildBitMask(m_problemsToMask,msg()));
71
72
73 if (m_mode.compare("fixed")==0) {
75 ATH_MSG_INFO ( "Will used fixed values defined by jobO "
76 << name() <<".tQThreshold and "
77 << name() << ".samplesThreshold for DSP thresholds" );
78 }
79 else if (m_mode.compare("group")==0) {
81 ATH_MSG_INFO ( "Will used cell groups defined in jobO " << name() << ".CellGroup for DSP thresholds" );
82 const CaloCell_ID* caloCellID = nullptr;
83 ATH_CHECK( detStore()->retrieve(caloCellID,"CaloCell_ID") );
84
85 if (m_thrPerCell.setDefinition(dynamic_cast<const CaloCell_Base_ID*>(caloCellID),m_cellGroupStr,msg())==false)
86 return StatusCode::FAILURE;
87 m_thrPerCell.printDef();
88
89 if (m_thrPerCell.getDefaults().size()!=2) {
90 ATH_MSG_ERROR ( "Expected 2 values per cell group, got " << m_thrPerCell.getDefaults().size() );
91 return StatusCode::FAILURE;
92 }
93 }
94 else if (m_mode.compare("noise")==0) {
96
98 ATH_MSG_INFO ( "Will used ICaloCellTool::totalNoiseRMS times " << name() << ".sigmaNoiseSamples and" );
99 else
100 ATH_MSG_INFO ( "Will used ICaloCellTool::elecNoiseRMS times " << name() << ".sigmaNoiseSamples and" );
101
103 ATH_MSG_INFO ( "ICaloCellTool::totalNoiseRMS times " << name() << ".sigmaNoiseQt for DSP thresholds" );
104 else
105 ATH_MSG_INFO ( "ICaloCellTool::elecNoiseRMS times " << name() << ".sigmaNoiseQt for DSP thresholds" );
106
107 }
108
109 ATH_CHECK( m_totalNoiseKey.initialize (m_workmode == NOISE) );
110 ATH_CHECK( m_elecNoiseKey.initialize (m_workmode == NOISE) );
111
112 return StatusCode::SUCCESS;
113}
114
116
117 ATH_MSG_DEBUG ( "start stop()" );
118 if( m_scaleIW > 0.) { ATH_MSG_INFO (" Scaling EMECIW by: "<<m_scaleIW);}
119
120 const EventContext& ctx = Gaudi::Hive::currentContext();
121
122 if (m_fill) {
123
124 ATH_MSG_INFO ( "Filling database" );
125
126 unsigned hashMax=m_onlineID->channelHashMax();
127
128 coral::AttributeListSpecification* spec = new coral::AttributeListSpecification();
129 spec->extend("tQThr", "blob");
130 spec->extend("samplesThr", "blob");
131 spec->extend("trigSumThr", "blob");
132 spec->extend("Name","string");
133
135
136
137 (*attr)["Name"].setValue(m_nameOfSet);
138 coral::Blob& tQThrBlob = (*attr)["tQThr"].data<coral::Blob>();
139 coral::Blob& samplesThrBlob = (*attr)["samplesThr"].data<coral::Blob>();
140 coral::Blob& trigSumThrBlob = (*attr)["trigSumThr"].data<coral::Blob>();
141
142 tQThrBlob.resize(hashMax*sizeof(float));
143 samplesThrBlob.resize(hashMax*sizeof(float));
144 trigSumThrBlob.resize(hashMax*sizeof(float));
145
146 float* ptQThrBlob=static_cast<float*>(tQThrBlob.startingAddress());
147 float* psamplesBlob=static_cast<float*>(samplesThrBlob.startingAddress());
148 float* ptrigSumBlob=static_cast<float*>(trigSumThrBlob.startingAddress());
149
150 ATH_CHECK( detStore()->record(attr,m_key) );
151
153 ATH_CHECK(caloMgrHandle.isValid());
154 const CaloDetDescrManager *theCaloDDM = *caloMgrHandle;
155 ATH_MSG_INFO ( "theCaloDDM retrieved" );
156
158 const LArOnOffIdMapping* cabling{*cablingHdl};
159 if(!cabling) {
160 ATH_MSG_ERROR("Do not have mapping object " << m_cablingKey.key());
161 return StatusCode::FAILURE;
162 }
163
164 const CaloNoise* totalNoise = nullptr;
165 const CaloNoise* elecNoise = nullptr;
166 if (m_workmode == NOISE) {
168 totalNoise = totalNoiseH.cptr();
170 elecNoise = elecNoiseH.cptr();
171 }
172
173 //retrieve BadChannel info:
174 const LArBadChannelCont* bcCont=nullptr;
175 if (m_maskBadChannels) {
177 bcCont=(*bcContHdl);
178 }
179
180
181 for (unsigned hs=0;hs<hashMax;++hs) {
182 const HWIdentifier chid=m_onlineID->channel_Id(hs);
183 const Identifier id=cabling->cnvToIdentifier(chid);
184 ATH_MSG_DEBUG ( "cell id: " << id << " " << cabling->isOnlineConnected(chid) );
185
186 if(!cabling->isOnlineConnected(chid)){
187 ATH_MSG_DEBUG ( "cell id: " << id << " not connected channel, skip " );
188 // Same (very high) thresholds for disconnected channels as masked channels
189 ptQThrBlob[hs]=m_maskedtqThrsh;
190 psamplesBlob[hs]=m_maskedsamplesThrsh;
191 ptrigSumBlob[hs]=m_maskedtqThrsh;
192 continue;
193 }
194
195 if(m_maskBadChannels && m_bcMask.cellShouldBeMasked(bcCont,chid)){ // Default gain is CaloGain::UNKNOWNGAIN
196 ATH_MSG_DEBUG ( "cell id: " << id << " is masked; set thresholds to " << m_maskedtqThrsh << ", " << m_maskedsamplesThrsh );
197 ptQThrBlob[hs]=m_maskedtqThrsh;
198 psamplesBlob[hs]=m_maskedsamplesThrsh;
199 ptrigSumBlob[hs]=m_maskedtqThrsh;
200 continue;
201 }
202
203 if (m_workmode==FIXED) {
204 ptQThrBlob[hs]=m_tqThrsh;
205 psamplesBlob[hs]=m_samplesThrsh;
206 ptrigSumBlob[hs]=m_tqThrsh;
207 }
208 else if (m_workmode==GROUP) {
209 const std::vector<float>& thrs=m_thrPerCell.valuesForCell(id);
210 if(thrs.size()!=2) std::cout << "len=" << thrs.size() << std::endl;
211 ptQThrBlob[hs]=thrs[0];
212 psamplesBlob[hs]=thrs[1];
213 ptrigSumBlob[hs]=thrs[0];
214 }
215 else if (m_workmode==NOISE) {
216 const CaloDetDescrElement *caloDDE = theCaloDDM->get_element(id);
217 if(!caloDDE){
218 ATH_MSG_ERROR ( "Failed to return CaloDetDescrElement" );
219 return StatusCode::FAILURE;
220 }
222
223 if(caloDDE->is_lar_fcal())
225 else
226 igain = CaloGain::LARHIGHGAIN;
227
228 ATH_MSG_DEBUG ( "hash, eta, phi: " << caloDDE->calo_hash() << ", " << caloDDE->eta() << ", " << caloDDE->phi() << "; noise: " << totalNoise->getNoise(id,igain) );
229
230 float samplesThr = 0.;
231 float QtThr = 0.;
232
234 samplesThr = totalNoise->getNoise(id,igain);
235 else
236 samplesThr = elecNoise->getNoise(id,igain);
237
239 QtThr = totalNoise->getNoise(id,igain);
240 else
241 QtThr = elecNoise->getNoise(id,igain);
242
243 ptQThrBlob[hs]=QtThr*m_sigmaNoiseQt;
244 psamplesBlob[hs]=samplesThr*m_sigmaNoiseSamples;
245 ptrigSumBlob[hs]=QtThr*m_sigmaNoiseQt;
246
247 }// end if NOISE
248
249 if( m_scaleIW > 0.) {
250 int slot = m_onlineID->slot(chid);
251 if (m_onlineID->isEMECIW(chid) ) {
252 ptQThrBlob[hs] *= m_scaleIW;
253 psamplesBlob[hs] *= m_scaleIW;
254 ptrigSumBlob[hs] *= m_scaleIW;
255 } else if ( (m_onlineID->isHECchannel(chid) && (slot==7 || slot==8) ) ||
256 (m_onlineID->isEMECchannel(chid) && (slot==12||slot==13)) ) {
257 ptQThrBlob[hs] *= m_scaleIW/2.;
258 psamplesBlob[hs] *= m_scaleIW/2.;
259 ptrigSumBlob[hs] *= m_scaleIW/2.;
260 }
261 } // scaling IW
262
263 }//end loop over cells
264 }//end if FILL
265
266 if (m_dump) {
267
268 const AthenaAttributeList* attr=0;
269
270 ATH_CHECK( detStore()->retrieve(attr,m_key) );
271
272 LArDSPThresholdsFlat cont(attr);
273 if (!cont.good()){
274 ATH_MSG_ERROR("LArDSPThresholdsFlat did not initialise.");
275 return StatusCode::FAILURE;
276 }
277 std::ofstream outfile;
278 if (!m_outFileName.size()) {
279 ATH_MSG_ERROR("No output file specified");
280 return StatusCode::FAILURE;
281 }
282 outfile.open(m_outFileName.c_str(),std::ios::out);
283 if (outfile.is_open()) {
284 ATH_MSG_INFO ( "Writing to file " << m_outFileName );
285 }
286 else {
287 ATH_MSG_ERROR ( "Failed to open file " << m_outFileName );
288 return StatusCode::FAILURE;
289 }
290
291 std::vector<HWIdentifier>::const_iterator chanIt=m_onlineID->channel_begin();
292 std::vector<HWIdentifier>::const_iterator chanIt_e=m_onlineID->channel_end ();
293 for (;chanIt!=chanIt_e;++chanIt) {
294 const HWIdentifier chid=*chanIt;
295 outfile << std::fixed << chid.get_compact() << " " << cont.tQThr(chid) << " " << cont.samplesThr(chid) << " " << cont.trigSumThr(chid)
296 << std::endl;
297
298 } //end if loop over channels
299
300 outfile.close();
301 }// end if m_dump
302
303 return StatusCode::SUCCESS;
304}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
LArBadXCont< LArBadChannel > LArBadChannelCont
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
MsgStream & msg() const
An AttributeList represents a logical row of attributes in a metadata table.
Helper base class for offline cell identifiers.
Helper class for offline cell identifiers.
Definition CaloCell_ID.h:34
This class groups all DetDescr information related to a CaloCell.
bool is_lar_fcal() const
cell belongs to FCAL
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
This class provides the client interface for accessing the detector description information common to...
float getNoise(const IdentifierHash h, const int gain) const
Accessor by IdentifierHash and gain.
Definition CaloNoise.h:35
value_type get_compact() const
Get the compact id.
Gaudi::Property< float > m_scaleIW
SG::ReadCondHandleKey< CaloNoise > m_totalNoiseKey
SG::ReadCondHandleKey< CaloNoise > m_elecNoiseKey
LArBadChannelMask m_bcMask
Handle to bad-channel mask.
std::vector< std::string > m_cellGroupStr
Gaudi::Property< std::vector< std::string > > m_problemsToMask
SG::ReadCondHandleKey< LArBadChannelCont > m_bcContKey
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
virtual StatusCode stop() override
LArDSPThresholdFillInline(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode initialize() override
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
float trigSumThr(const HWIdentifier &CellID) const
float samplesThr(const HWIdentifier &CellID) const
float tQThr(const HWIdentifier &CellID) const
const_pointer_type cptr()
@ LARMEDIUMGAIN
Definition CaloGain.h:18
@ INVALIDGAIN
Definition CaloGain.h:18
@ LARHIGHGAIN
Definition CaloGain.h:18