ATLAS Offline Software
Loading...
Searching...
No Matches
LArCaliWaves2Ntuple.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
7
8LArCaliWaves2Ntuple::LArCaliWaves2Ntuple(const std::string& name, ISvcLocator* pSvcLocator): LArWaves2Ntuple(name, pSvcLocator)
9{
10 m_keylist.clear() ;
11 declareProperty("KeyList", m_keylist);
12 declareProperty("DACSaturSkip", m_dacSaturSkip=false);
13 declareProperty("SaveJitter", m_saveJitter=false);
14 declareProperty("NtupleName", m_ntName="DELAYS");
15 declareProperty("NtupleFile", m_ntFile= "FILE1");
16 m_dacSaturLayer0.resize(0);
17 m_dacSaturLayer1.resize(0);
18 m_dacSaturLayer2.resize(0);
19 m_dacSaturLayer3.resize(0);
20 declareProperty("DACSaturPS", m_dacSaturLayer0);
21 declareProperty("DACSaturStrips",m_dacSaturLayer1);
22 declareProperty("DACSaturMiddle",m_dacSaturLayer2);
23 declareProperty("DACSaturBack", m_dacSaturLayer3);
24 declareProperty("AddCorrUndo", m_addCorrUndo=true);
25 declareProperty("ApplyCorrection",m_applyCorr=false);
26
27
28}
29
31 m_ntTitle="Calibration Wave";
32 m_ntpath=std::string("/NTUPLES/")+m_ntFile+std::string("/")+m_ntName;
33
34 if (! m_addCalib) {
35 //This dumper needs the calib-line-map anyway, even if the calib-line id is not dumped to the ntuple
36 //init the handle from the base-class here ... if not done by the base-class
37 ATH_CHECK( m_calibMapSCKey.initialize(m_isSC));
38 ATH_CHECK( m_calibMapKey.initialize(!m_isSC));
39 }
40
41
43}
44
46= default;
47
48StatusCode LArCaliWaves2Ntuple::stop ATLAS_NOT_THREAD_SAFE ()
49{
50
51 // Check DACSatur jobOption consistency, in case setup default values
52 if ( m_dacSaturSkip && m_dacSaturLayer0.size()<3 ) {
53 ATH_MSG_WARNING( "DACSaturPS jobOption has wrong size. Will use default." ) ;
54 m_dacSaturLayer0.resize(3);
55 m_dacSaturLayer0[0] = 15000 ;
56 m_dacSaturLayer0[1] = 50000 ;
57 m_dacSaturLayer0[2] = 65000 ;
58 }
59 if ( m_dacSaturSkip && m_dacSaturLayer1.size()<3 ) {
60 ATH_MSG_WARNING( "DACSaturStrips jobOption has wrong size. Will use default." ) ;
61 m_dacSaturLayer1.resize(3);
62 m_dacSaturLayer1[0] = 800 ;
63 m_dacSaturLayer1[1] = 8000 ;
64 m_dacSaturLayer1[2] = 65000 ;
65 }
66 if ( m_dacSaturSkip && m_dacSaturLayer2.size()<3 ) {
67 ATH_MSG_WARNING( "DACSaturMiddle jobOption has wrong size. Will use default." ) ;
68 m_dacSaturLayer2.resize(3);
69 m_dacSaturLayer2[0] = 1000 ;
70 m_dacSaturLayer2[1] = 10000 ;
71 m_dacSaturLayer2[2] = 65000 ;
72 }
73 if ( m_dacSaturSkip && m_dacSaturLayer3.size()<3 ) {
74 ATH_MSG_WARNING( "DACSaturBack jobOption has wrong size. Will use default." ) ;
75 m_dacSaturLayer3.resize(3);
76 m_dacSaturLayer3[0] = 800 ;
77 m_dacSaturLayer3[1] = 8000 ;
78 m_dacSaturLayer3[2] = 65000 ;
79 }
80
81 StatusCode sc;
82 sc=m_nt->addItem("DAC",m_dac,0,600000);
83 if (sc!=StatusCode::SUCCESS) {
84 ATH_MSG_ERROR( "addItem 'DAC' failed" );
85 return StatusCode::FAILURE;
86 }
87
88 sc=m_nt->addItem("gain",m_gain,0,3);
89 if (sc!=StatusCode::SUCCESS) {
90 ATH_MSG_ERROR( "addItem 'gain' failed" );
91 return StatusCode::FAILURE;
92 }
93
94 if (m_addCalib) {
95 sc=m_nt->addItem("nPulsedCalibLines",m_nPulsedCalibLines,0,4);
96 if (sc!=StatusCode::SUCCESS) {
97 ATH_MSG_ERROR( "addItem 'nPulsedCalibLines' failed" );
98 return StatusCode::FAILURE;
99 }
100
101 sc=m_nt->addItem("pulsedCalibLines",4,m_pulsedCalibLines);
102 if (sc!=StatusCode::SUCCESS) {
103 ATH_MSG_ERROR( "addItem 'pulsedCalibLines' failed" );
104 return StatusCode::FAILURE;
105 }
106 }
107
108 if (m_saveJitter) {
109 sc=m_nt->addItem("Jitter",m_jitter,0.,1.);
110 if (sc!=StatusCode::SUCCESS) {
111 ATH_MSG_ERROR( "addItem 'Jitter' failed" );
112 return StatusCode::FAILURE;
113 }
114 }
115
116 if (m_addCorrUndo) {
117 sc=m_nt->addItem("corrUndo",m_corrUndo,0,1);
118 if (sc!=StatusCode::SUCCESS) {
119 ATH_MSG_ERROR( "addItem 'corrUndo' failed" );
120 return StatusCode::FAILURE;
121 }
122 }
123
124
125 const LArCalibLineMapping *clCont=nullptr;
126 if(m_isSC) {
127 ATH_MSG_DEBUG( "LArCaliWaves2Ntuple: using SC calib map" );
128 SG::ReadCondHandle<LArCalibLineMapping> clHdl{m_calibMapSCKey};
129 clCont=*clHdl;
130 } else {
131 SG::ReadCondHandle<LArCalibLineMapping> clHdl{m_calibMapKey};
132 clCont=*clHdl;
133 }
134
135 if(!clCont) {
136 ATH_MSG_WARNING( "Do not have calib line mapping !!!" );
137 return StatusCode::FAILURE;
138 }
139
140 for ( unsigned k=0 ; k<m_keylist.size() ; k++ ) {
141 const std::string& key = m_keylist[k] ;
142
143
144 ATH_MSG_INFO( "Processing WaveContainer from StoreGate! key=" << m_keylist[k] );
145 const LArCaliWaveContainer* caliWaveContainer = nullptr;
146 StatusCode sc = m_detStore->retrieve(caliWaveContainer,key);
147 if (sc.isFailure()) {
148 ATH_MSG_ERROR( "Cannot read LArCaliWaveContainer from StoreGate! key=" << key );
149 return StatusCode::FAILURE;
150 } else
151 ATH_MSG_INFO( "Read LArCaliWaveContainer from StoreGate! key= " << key );
152 LArCaliWaveContainer* caliWaveContainer_nc=nullptr;
153 if (m_applyCorr) {
154 if (!caliWaveContainer->correctionsApplied()) {
155 caliWaveContainer_nc=const_cast<LArCaliWaveContainer*>(caliWaveContainer);
156 sc=caliWaveContainer_nc->applyCorrections();
157 if (sc.isFailure()) {
158 ATH_MSG_ERROR( "Failed to apply corrections to LArCaliWaveContainer!" );
159 }
160 else
161 ATH_MSG_INFO( "Applied corrections to LArCaliWaveContainer" );
162 }
163 else {
164 ATH_MSG_WARNING( "Corrections already applied. Can't apply twice!" );
165 }
166 }// end if applyCorr
167
168
169 for (unsigned igain=CaloGain::LARHIGHGAIN;igain<CaloGain::LARNGAIN ;++igain){
170 for (const HWIdentifier chid: m_onlineId->channel_range()) {
171 m_gain=(long)igain;
172 const LArCaliWaveVec& cwv = caliWaveContainer->get(chid,igain);
173 if (cwv.empty()) continue;
174
175 LArCaliWaveVec::const_iterator cwv_it=cwv.begin();
176 LArCaliWaveVec::const_iterator cwv_it_e=cwv.end();
177 for (;cwv_it!=cwv_it_e;++cwv_it) {
178 const LArCaliWave& wave=*cwv_it;
179 if (wave.isEmpty()) continue;
180 if (m_addCorrUndo) m_corrUndo=0;
181 bool skip=writeEntry(chid,igain,wave,clCont);
182 if (skip) continue;
183 sc=ntupleSvc()->writeRecord(m_nt);
184 if (sc!=StatusCode::SUCCESS) {
185 ATH_MSG_ERROR( "writeRecord failed" );
186 return sc;
187 }
188 }//End loop over DAC
189 }//end loop over identifiers
190 }//end loop over gains
191
192
193 if (m_addCorrUndo) {
194 for (unsigned igain=CaloGain::LARHIGHGAIN;igain<CaloGain::LARNGAIN ;++igain) {
195 LArCaliWaveContainer::ConstCorrectionIt itUndo=caliWaveContainer->undoCorrBegin(igain);
196 LArCaliWaveContainer::ConstCorrectionIt itUndo_e=caliWaveContainer->undoCorrEnd(igain);
197 for(;itUndo!=itUndo_e;itUndo++) {
198 const HWIdentifier chid(itUndo->first);
199 const LArCaliWaveVec& cwv = itUndo->second;
200 LArCaliWaveVec::const_iterator cwv_it=cwv.begin();
201 LArCaliWaveVec::const_iterator cwv_it_e=cwv.end();
202 for (;cwv_it!=cwv_it_e;++cwv_it) {
203 const LArCaliWave& wave=*cwv_it;
204 m_gain = (long)igain;
205 m_corrUndo = 1;
206 bool skip=writeEntry(chid,igain,wave,clCont);
207 if (skip) continue;
208 sc=ntupleSvc()->writeRecord(m_nt);
209 if (sc!=StatusCode::SUCCESS) {
210 ATH_MSG_ERROR( "writeRecord failed" );
211 return sc;
212 }
213 }//end loop over DAC
214 }//end loop over corrections
215 }//end loop over gain
216 }//end if addUndoCorr
217 if (caliWaveContainer_nc) {
218 ATH_CHECK(caliWaveContainer_nc->undoCorrections());
219 ATH_MSG_INFO("Reverted corrections of CaliWave container");
220 }
221 }
222 ATH_MSG_INFO( "LArWave2Ntuple has finished." );
223 return StatusCode::SUCCESS;
224} // end finalize-method.
225
226
227
228bool LArCaliWaves2Ntuple::writeEntry(const HWIdentifier chid, const unsigned gain, const LArCaliWave& wave,const LArCalibLineMapping *clCont) {
229 //call fill method of base-class
230 fillWave(chid,wave);
231 m_dac = wave.getDAC();
232 int DACSatur = 100000;
233 if (m_dacSaturSkip) {
234 switch (m_layer) {
235 case 0:
236 DACSatur = m_dacSaturLayer0[gain];
237 break;
238 case 1:
239 DACSatur = m_dacSaturLayer1[gain];
240 break;
241 case 2:
242 DACSatur = m_dacSaturLayer2[gain];
243 break;
244 case 3:
245 DACSatur = m_dacSaturLayer3[gain];
246 break;
247 }
248 if (m_dac > DACSatur ) return true;
249 }
250
251
253 if ( !m_isSC && m_addCalib) {
254 const std::vector<HWIdentifier>& calibLineV = clCont->calibSlotLine(chid);
255 if ( !calibLineV.empty() ) {
256 ATH_MSG_DEBUG( "wave.getIsPulsedInt() " << wave.getIsPulsedInt()<<" : "<< calibLineV.size());
257 for(int i=0;i<4;i++) {
259 }
260 std::vector<HWIdentifier>::const_iterator calibLineIt = calibLineV.begin();
261 unsigned iCalibLine=0;
263 for(calibLineIt = calibLineV.begin(); calibLineIt != calibLineV.end();++calibLineIt) {
264 if ( (wave.getIsPulsedInt()>>iCalibLine) & 1 ){
265 m_pulsedCalibLines[iCalibLine] = m_onlineId->channel(*calibLineIt);
266 if (m_pulsedCalibLines[iCalibLine]>=0) m_calibLine = m_onlineId->channel(*calibLineIt);
268 }
269 iCalibLine++;
270 }
271 ATH_MSG_DEBUG( "m_pulsedCalibLines: "<<m_pulsedCalibLines[0]<<"/"<<m_pulsedCalibLines[1]<<"/"<<m_pulsedCalibLines[2]<<"/"<<m_pulsedCalibLines[3]);
272 } // else if calibLineV.size()>0
273 else {
276 }
277 }//end if !m_isSC && m_addCalib
278
279 // Jitter
280 if ( m_saveJitter ) {
281 m_jitter = m_waveHelper.getJitter(wave);
282 }
283
284 return false;
285}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
StatusCode LArCaliWaves2Ntuple::stop ATLAS_NOT_THREAD_SAFE()
Install fatal handler with default options.
static Double_t sc
INTupleSvc * ntupleSvc()
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
Liquid Argon Cumulative Wave Container.
int getIsPulsedInt() const
isPulsed value
int getDAC() const
DAC value.
std::vector< unsigned > m_dacSaturLayer2
NTuple::Item< long > m_nPulsedCalibLines
std::vector< unsigned > m_dacSaturLayer3
NTuple::Array< int > m_pulsedCalibLines
virtual StatusCode initialize() override
LArCaliWaves2Ntuple(const std::string &name, ISvcLocator *pSvcLocator)
std::vector< unsigned > m_dacSaturLayer0
NTuple::Item< double > m_jitter
bool writeEntry(const HWIdentifier chid, const unsigned gain, const LArCaliWave &wave, const LArCalibLineMapping *clCont)
std::vector< unsigned > m_dacSaturLayer1
std::vector< std::string > m_keylist
NTuple::Item< long > m_dac
const std::vector< HWIdentifier > & calibSlotLine(const HWIdentifier id) const
Gaudi::Property< bool > m_isSC
NTuple::Item< long > m_calibLine
NTuple::Item< long > m_layer
Gaudi::Property< bool > m_addCalib
SG::ReadCondHandleKey< LArCalibLineMapping > m_calibMapKey
const LArOnlineID_Base * m_onlineId
SG::ReadCondHandleKey< LArCalibLineMapping > m_calibMapSCKey
bool correctionsApplied() const
Have corrections been applied?
StatusCode applyCorrections()
apply correction set
StatusCode undoCorrections()
undo corrections that have been already applied
ConstCorrectionIt undoCorrBegin(unsigned int gain) const
get iterator over the Undo-Vector for a certain gain
ConstCorrectionIt undoCorrEnd(unsigned int gain) const
ConstReference get(const HWIdentifier id, unsigned int gain=0) const
get data with online identifier
bool isEmpty() const
is LArWave uninitialized?
Definition LArWave.h:183
LArWaveHelper m_waveHelper
StatusCode initialize()
LArWaves2Ntuple(const std::string &name, ISvcLocator *pSvcLocator)
bool fillWave(const HWIdentifier chid, const LArWaveCumul &wave)
@ LARNGAIN
Definition CaloGain.h:19
@ LARHIGHGAIN
Definition CaloGain.h:18