92 << writeHandle.
fullKey() <<
" is already valid.");
93 return StatusCode::SUCCESS;
102 larOnlineID = scidhelper;
106 larOnlineID = idhelper;
114 larOnOffIdMapping = *larOnOffIdMappingHdl;
115 if (larOnOffIdMapping ==
nullptr) {
116 ATH_MSG_ERROR(
"Failed to retrieve LArOnOffIdMapping object");
117 return StatusCode::FAILURE;
128 if (larShape ==
nullptr) {
130 return StatusCode::FAILURE;
136 larAutoCorrTotal= *AutoCorrTotalHdl;
137 if (larAutoCorrTotal ==
nullptr) {
139 return StatusCode::FAILURE;
149 larNoise = *NoiseHdl;
150 if (larNoise ==
nullptr) {
152 return StatusCode::FAILURE;
157 larPedestal = *PedestalHdl;
158 if (larPedestal ==
nullptr) {
160 return StatusCode::FAILURE;
165 ATH_MSG_INFO(
"IOV found from intersection for LArOFCCondObj object: "
171 std::unique_ptr<LArOFC> larOFC =
172 std::make_unique<LArOFC>(larOnlineID, larOnOffIdMapping,
m_nGains);
174 std::vector<float> OFCa_tmp, OFCb_tmp;
181 for (
size_t igain = 0; igain <
m_nGains; igain++) {
188 unsigned int nsamples_shape = Shape.size();
193 int igain_autocorr = 0;
198 const std::vector<double>
AutoCorr =
201 unsigned int nsamples_AC_OFC = (1+((int)(sqrt(1+8*
AutoCorr.size()))))/2;
203 const std::vector<double>& rmsSampl =
205 unsigned int nsamples2 = rmsSampl.size();
206 if (nsamples2 != nsamples_AC_OFC) {
218 unsigned int iBeginOfNSamples = firstSample;
219 if(nsamples_AC_OFC + iBeginOfNSamples > nsamples_shape)
227 float RMSpedestal = larPedestal->
pedestalRMS(chid,igain);
233 <<chid<<
" at gain "<<igain );
239 if(Shape.size()==0 || ShapeDer.size()==0 ||
AutoCorr.empty())
242 <<chid<<
" at gain "<<igain );
246 if (Shape.size()!=ShapeDer.size()) {
247 ATH_MSG_ERROR(
"Got invalid shape object: Size=" << Shape.size() <<
", DerSize=" << ShapeDer.size());
248 return StatusCode::SUCCESS;
258 Eigen::MatrixXf AC = Eigen::MatrixXf::Zero(nsamples_AC_OFC,nsamples_AC_OFC);
259 Eigen::MatrixXf ACinv = Eigen::MatrixXf::Zero(nsamples_AC_OFC,nsamples_AC_OFC);
260 for(l=0;l<nsamples_AC_OFC;++l) {
261 for(c=0;c<nsamples_AC_OFC;++c) {
266 int i1=std::min(l,c);
267 int i2=std::max(l,c);
268 int index = i1*nsamples_AC_OFC - i1*(i1+1)/2 -(i1+1) + i2;
271 AC(l,c) = AC(l,c)*rmsSampl[l]*rmsSampl[c];
285 for(l=0;l<nsamples_AC_OFC;++l)
287 ACinv_PS[l]=0.; ACinv_PSD[l]=0.;
288 for(c=0;c<nsamples_AC_OFC;++c){
289 ACinv_PS[l]+=ACinv(l,c)*Shape[c+iBeginOfNSamples];
290 ACinv_PSD[l]+=ACinv(l,c)*ShapeDer[c+iBeginOfNSamples];
292 Q1+=Shape[l+iBeginOfNSamples]*ACinv_PS[l];
293 Q2+=ShapeDer[l+iBeginOfNSamples]*ACinv_PSD[l];
294 Q3+=ShapeDer[l+iBeginOfNSamples]*ACinv_PS[l];
296 float DELTA=Q1*Q2-Q3*Q3;
299 OFCa_tmp.resize(nsamples_AC_OFC);
300 for(i=0;i<nsamples_AC_OFC;++i)
301 OFCa_tmp[i]=(ACinv_PS[i]*Q2-ACinv_PSD[i]*Q3)/
DELTA;
303 OFCb_tmp.resize(nsamples_AC_OFC);
304 for(i=0;i<nsamples_AC_OFC;++i)
305 OFCb_tmp[i]=(ACinv_PS[i]*Q3-ACinv_PSD[i]*Q1)/
DELTA;
310 std::cout<<larOnlineID
312 <<
" gain="<<igain<<
" Nminbias="<<
m_Nminbias<<std::endl;
313 std::cout<<
"Shape: ";
314 for(c=0;c<nsamples_shape;++c)
315 std::cout<<Shape[c]<<
" ";
316 std::cout<<std::endl;
317 std::cout<<
"ShapeDer: ";
318 for(c=0;c<nsamples_shape;++c)
319 std::cout<<ShapeDer[c]<<
" ";
320 std::cout<<std::endl;
321 for(c=0;c<nsamples_AC_OFC;++c)
322 std::cout<<Shape[c+iBeginOfNSamples]<<
" ";
323 std::cout<<
" <- "<<iBeginOfNSamples<<std::endl;
324 for(i=0;i<nsamples_AC_OFC;++i) std::cout<<ACinv_PS[i]<<
" ";
325 std::cout<<std::endl;
326 for(i=0;i<nsamples_AC_OFC;++i) std::cout<<ACinv_PSD[i]<<
" ";
327 std::cout<<std::endl;
328 std::cout<<
" Q1="<<Q1<<
" Q2="<<Q2<<
" Q3="<<Q3
329 <<
" DELTA="<<
DELTA<<std::endl;
330 std::cout <<
" OFCa: ";
331 for(i=0;i<nsamples_AC_OFC;++i)
332 std::cout<<(ACinv_PS[i]*Q2-ACinv_PSD[i]*Q3)/
DELTA<<
" ";
333 std::cout<<std::endl;
335 bool stat = larOFC->setOFC(hid, igain, std::make_pair(OFCa_tmp, OFCb_tmp));
337 msg(MSG::ERROR) <<
"LArOFC::setOFC fails for gain " << igain <<
", hash " << hid <<
endmsg;
341 for (
unsigned igain=0;igain<
m_nGains;++igain) {
342 std::vector<float>
empty;
343 bool stat = larOFC->setOFC(hid,igain, std::make_pair(
empty,
empty));
345 msg(MSG::ERROR) <<
"LArOFC::setOFC fails for gain " << igain <<
", hash " << hid <<
endmsg;
355 return StatusCode::SUCCESS;