90 << writeHandle.
fullKey() <<
" is already valid.");
91 return StatusCode::SUCCESS;
100 larOnlineID = scidhelper;
104 larOnlineID = idhelper;
112 larOnOffIdMapping = *larOnOffIdMappingHdl;
113 if (larOnOffIdMapping ==
nullptr) {
114 ATH_MSG_ERROR(
"Failed to retrieve LArOnOffIdMapping object");
115 return StatusCode::FAILURE;
126 if (larShape ==
nullptr) {
128 return StatusCode::FAILURE;
134 larAutoCorrTotal= *AutoCorrTotalHdl;
135 if (larAutoCorrTotal ==
nullptr) {
137 return StatusCode::FAILURE;
147 larNoise = *NoiseHdl;
148 if (larNoise ==
nullptr) {
150 return StatusCode::FAILURE;
155 larPedestal = *PedestalHdl;
156 if (larPedestal ==
nullptr) {
158 return StatusCode::FAILURE;
163 ATH_MSG_INFO(
"IOV found from intersection for LArOFCCondObj object: "
169 std::unique_ptr<LArOFC> larOFC =
170 std::make_unique<LArOFC>(larOnlineID, larOnOffIdMapping,
m_nGains);
172 std::vector<float> OFCa_tmp, OFCb_tmp;
179 for (
size_t igain = 0; igain <
m_nGains; igain++) {
186 unsigned int nsamples_shape = Shape.size();
191 int igain_autocorr = 0;
196 const std::vector<double>
AutoCorr =
199 unsigned int nsamples_AC_OFC = (1+((int)(sqrt(1+8*
AutoCorr.size()))))/2;
201 const std::vector<double>& rmsSampl =
203 unsigned int nsamples2 = rmsSampl.size();
204 if (nsamples2 != nsamples_AC_OFC) {
216 unsigned int iBeginOfNSamples = firstSample;
217 if(nsamples_AC_OFC + iBeginOfNSamples > nsamples_shape)
225 float RMSpedestal = larPedestal->
pedestalRMS(chid,igain);
231 <<chid<<
" at gain "<<igain );
237 if(Shape.size()==0 || ShapeDer.size()==0 ||
AutoCorr.empty())
240 <<chid<<
" at gain "<<igain );
244 if (Shape.size()!=ShapeDer.size()) {
245 ATH_MSG_ERROR(
"Got invalid shape object: Size=" << Shape.size() <<
", DerSize=" << ShapeDer.size());
246 return StatusCode::SUCCESS;
256 Eigen::MatrixXf AC = Eigen::MatrixXf::Zero(nsamples_AC_OFC,nsamples_AC_OFC);
257 Eigen::MatrixXf ACinv = Eigen::MatrixXf::Zero(nsamples_AC_OFC,nsamples_AC_OFC);
258 for(l=0;l<nsamples_AC_OFC;++l) {
259 for(c=0;c<nsamples_AC_OFC;++c) {
264 int i1=std::min(l,c);
265 int i2=std::max(l,c);
266 int index = i1*nsamples_AC_OFC - i1*(i1+1)/2 -(i1+1) + i2;
269 AC(l,c) = AC(l,c)*rmsSampl[l]*rmsSampl[c];
283 for(l=0;l<nsamples_AC_OFC;++l)
285 ACinv_PS[l]=0.; ACinv_PSD[l]=0.;
286 for(c=0;c<nsamples_AC_OFC;++c){
287 ACinv_PS[l]+=ACinv(l,c)*Shape[c+iBeginOfNSamples];
288 ACinv_PSD[l]+=ACinv(l,c)*ShapeDer[c+iBeginOfNSamples];
290 Q1+=Shape[l+iBeginOfNSamples]*ACinv_PS[l];
291 Q2+=ShapeDer[l+iBeginOfNSamples]*ACinv_PSD[l];
292 Q3+=ShapeDer[l+iBeginOfNSamples]*ACinv_PS[l];
294 float DELTA=Q1*Q2-Q3*Q3;
297 OFCa_tmp.resize(nsamples_AC_OFC);
298 for(i=0;i<nsamples_AC_OFC;++i)
299 OFCa_tmp[i]=(ACinv_PS[i]*Q2-ACinv_PSD[i]*Q3)/
DELTA;
301 OFCb_tmp.resize(nsamples_AC_OFC);
302 for(i=0;i<nsamples_AC_OFC;++i)
303 OFCb_tmp[i]=(ACinv_PS[i]*Q3-ACinv_PSD[i]*Q1)/
DELTA;
308 std::cout<<larOnlineID
310 <<
" gain="<<igain<<
" Nminbias="<<
m_Nminbias<<std::endl;
311 std::cout<<
"Shape: ";
312 for(c=0;c<nsamples_shape;++c)
313 std::cout<<Shape[c]<<
" ";
314 std::cout<<std::endl;
315 std::cout<<
"ShapeDer: ";
316 for(c=0;c<nsamples_shape;++c)
317 std::cout<<ShapeDer[c]<<
" ";
318 std::cout<<std::endl;
319 for(c=0;c<nsamples_AC_OFC;++c)
320 std::cout<<Shape[c+iBeginOfNSamples]<<
" ";
321 std::cout<<
" <- "<<iBeginOfNSamples<<std::endl;
322 for(i=0;i<nsamples_AC_OFC;++i) std::cout<<ACinv_PS[i]<<
" ";
323 std::cout<<std::endl;
324 for(i=0;i<nsamples_AC_OFC;++i) std::cout<<ACinv_PSD[i]<<
" ";
325 std::cout<<std::endl;
326 std::cout<<
" Q1="<<Q1<<
" Q2="<<Q2<<
" Q3="<<Q3
327 <<
" DELTA="<<
DELTA<<std::endl;
328 std::cout <<
" OFCa: ";
329 for(i=0;i<nsamples_AC_OFC;++i)
330 std::cout<<(ACinv_PS[i]*Q2-ACinv_PSD[i]*Q3)/
DELTA<<
" ";
331 std::cout<<std::endl;
333 bool stat = larOFC->setOFC(hid, igain, std::make_pair(OFCa_tmp, OFCb_tmp));
335 msg(MSG::ERROR) <<
"LArOFC::setOFC fails for gain " << igain <<
", hash " << hid <<
endmsg;
339 for (
unsigned igain=0;igain<
m_nGains;++igain) {
340 std::vector<float>
empty;
341 bool stat = larOFC->setOFC(hid,igain, std::make_pair(
empty,
empty));
343 msg(MSG::ERROR) <<
"LArOFC::setOFC fails for gain " << igain <<
", hash " << hid <<
endmsg;
353 return StatusCode::SUCCESS;