17 output.resize(4, output[0]);
18 auto name = [&output](
const char * n)->TString{
19 return Form(n,output[0].GetName());
21 auto title = [&output](
const char * t)->TString{
22 return Form(t,output[0].GetTitle());
24 output[1].SetNameTitle(name(
"leffpixels_found_%s"), title(
"low efficiency pixels, found, %s"));
25 output[2].SetNameTitle(name(
"noisypixels_eff_%s"), title(
"noisy pixels, efficiency, %s"));
26 output[3].SetNameTitle(name(
"leffpixels_eff_%s"), title(
"low efficiency pixels, efficiency, %s"));
27 output[0].SetNameTitle(name(
"noisypixels_found_%s"), title(
"noisy pixels, found, %s"));
29 TH2F& noisypixels_found_output = output[0];
30 TH2F& leffpixels_found_output = output[1];
31 TH2F& noisypixels_eff_output = output[2];
32 TH2F& leffpixels_eff_output = output[3];
35 if(input->GetMaximum()<0.5)
return 0;
37 std::vector<TH2F> vec_found_leff{},vec_found_noisy{},vec_eff_leff{},vec_eff_noisy{};
41 TH2F tmp_eff_noisy, tmp_eff_leff;
42 TH2F tmp_found_leff, tmp_found_noisy;
50 std::tie(tmp_found_leff,tmp_found_noisy,tmp_eff_leff, tmp_eff_noisy) =
findLEffAndNoisyPixels(input, tmp_inact_pix_around, method);
59 tmp_eff_noisy=TH2F(*input);
60 tmp_eff_noisy.SetName(
"tmp_eff_noisy");
61 tmp_eff_noisy.Reset();
62 tmp_eff_leff=TH2F(*input);
63 tmp_eff_leff.SetName(
"tmp_eff_leff");
65 tmp_found_noisy=TH2F(*input);
66 tmp_found_noisy.SetName(
"tmp_found_noisy");
67 tmp_found_noisy.Reset();
68 tmp_found_leff=TH2F(*input);
69 tmp_found_leff.SetName(
"tmp_found_leff");
70 tmp_found_leff.Reset();
74 const double Threshold_LEFF=5.;
77 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
79 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
81 double ratio_leff=0, ratio_noisy=0;
82 double gauss_helper_12 = (col_ID-p[1][row_ID])/p[2][row_ID];
83 double gauss_helper_45 = (col_ID-p[4][row_ID])/p[5][row_ID];
84 double fit = p[0][row_ID]*exp(-0.5*gauss_helper_12*gauss_helper_12)
85 + p[3][row_ID]*exp(-0.5*gauss_helper_45*gauss_helper_45) + p[6][row_ID];
86 double sigma=std::sqrt(fit);
89 double bin_content=input->GetBinContent(row_ID,col_ID);
91 if(fit>=bin_content) ratio_leff = std::abs(fit-bin_content)/sigma;
92 else ratio_noisy = std::abs(fit-bin_content)/sigma;
96 if( ratio_leff > Threshold_LEFF) tmp_found_leff.SetBinContent(row_ID,col_ID,1);
97 if( ratio_noisy > Threshold_NOISY) tmp_found_noisy.SetBinContent(row_ID,col_ID,1);
99 tmp_eff_leff.SetBinContent(row_ID,col_ID,100.*ratio_leff);
100 tmp_eff_noisy.SetBinContent(row_ID,col_ID,100.*ratio_noisy);
106 vec_found_leff.push_back(tmp_found_leff);
107 vec_found_noisy.push_back(tmp_found_noisy);
108 vec_eff_leff.push_back(tmp_eff_leff);
109 vec_eff_noisy.push_back(tmp_eff_noisy);
113 for(
unsigned int m=0; m<
m_methods.size(); m++)
115 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
117 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
119 noisypixels_found_output.Fill(row_ID,col_ID, vec_found_noisy[m].GetBinContent(row_ID,col_ID));
120 leffpixels_found_output.Fill(row_ID,col_ID, vec_found_leff[m].GetBinContent(row_ID,col_ID));
124 noisypixels_eff_output.SetBinContent(row_ID,col_ID, vec_eff_noisy[m].GetBinContent(row_ID,col_ID));
125 leffpixels_eff_output.SetBinContent(row_ID,col_ID, vec_eff_leff[m].GetBinContent(row_ID,col_ID));
129 if(noisypixels_eff_output.GetBinContent(row_ID,col_ID)<vec_eff_noisy[m].GetBinContent(row_ID,col_ID))
131 noisypixels_eff_output.SetBinContent(row_ID,col_ID, vec_eff_noisy[m].GetBinContent(row_ID,col_ID));
133 if(leffpixels_eff_output.GetBinContent(row_ID,col_ID)>vec_eff_leff[m].GetBinContent(row_ID,col_ID))
135 leffpixels_eff_output.SetBinContent(row_ID,col_ID, vec_eff_leff[m].GetBinContent(row_ID,col_ID));
143 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
145 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
147 if(noisypixels_found_output.GetBinContent(row_ID,col_ID)==
m_methods.size()) noisypixels_found_output.SetBinContent(row_ID,col_ID,1);
148 else noisypixels_found_output.SetBinContent(row_ID,col_ID,0);
150 if(leffpixels_found_output.GetBinContent(row_ID,col_ID)==
m_methods.size()) leffpixels_found_output.SetBinContent(row_ID,col_ID,1);
151 else leffpixels_found_output.SetBinContent(row_ID,col_ID,0);
221 TH2F tmp_found_leff(*input);
222 tmp_found_leff.SetName(
"tmp_found_leff");
223 tmp_found_leff.Reset();
225 TH2F tmp_found_noisy(*input);
226 tmp_found_noisy.SetName(
"tmp_found_noisy");
227 tmp_found_noisy.Reset();
229 TH2F tmp_eff_leff(*input);
230 tmp_eff_leff.SetName(
"tmp_eff_leff");
231 tmp_eff_leff.Reset();
233 TH2F tmp_eff_noisy(*input);
234 tmp_eff_noisy.SetName(
"tmp_eff_noisy");
235 tmp_eff_noisy.Reset();
237 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
239 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
241 if(input->GetBinContent(row_ID, col_ID)!=0 && tmp_inact_pix_around.GetBinContent(row_ID, col_ID)<0.1)
247 for(
auto legpix : legit_pixels)
249 sum+=input->GetBinContent(legpix.first,legpix.second);
256 if(method==
"2_ROW" || method==
"2_COL")
258 av_noisy=sum/(std::abs(npixels-4)*0.5);
261 else if(method==
"4_PIX")
263 av_noisy=sum/(std::ceil(npixels*0.5));
266 else if(method==
"8_PIX")
268 av_noisy=sum/(npixels);
272 if ((av_leff == 0) or (av_noisy == 0))[[
unlikely]]{
273 std::cerr<<
"AFP_NoisyPixelTool::findLEffAndNoisyPixels: denominator is zero\n";
276 double ratio_leff = input->GetBinContent(row_ID,col_ID)/av_leff;
277 double ratio_noisy = input->GetBinContent(row_ID,col_ID)/av_noisy;
278 tmp_eff_leff.SetBinContent(row_ID,col_ID,100.*ratio_leff);
279 tmp_eff_noisy.SetBinContent(row_ID,col_ID,100.*ratio_noisy);
281 if(ratio_leff <
m_threshLEff) tmp_found_leff.SetBinContent(row_ID,col_ID,1.);
282 if(ratio_noisy >
m_threshNoisy) tmp_found_noisy.SetBinContent(row_ID,col_ID,1.);
287 return {tmp_found_leff,tmp_found_noisy,tmp_eff_leff,tmp_eff_noisy};
293 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
295 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
297 if(input->GetBinContent(row_ID,col_ID)==0)
continue;
299 int inactive_pixels_around=tmp_inact_pix_around.GetBinContent(row_ID, col_ID);
300 int leff_pixels_around=0;
302 for(
auto legpix : legit_pixels)
304 if(tmp_found_leff.GetBinContent(legpix.first,legpix.second)>0) leff_pixels_around++;
307 if(leff_pixels_around!=0 && inactive_pixels_around==0)
314 for(
auto legpix : legit_pixels)
316 if(tmp_found_leff.GetBinContent(legpix.first,legpix.second)==0)
318 re_av+=input->GetBinContent(legpix.first,legpix.second);
326 for(
const auto & legpix : legit_pixels)
328 re_av+=input->GetBinContent(legpix.first,legpix.second);
331 if(re_av/input->GetBinContent(row_ID,col_ID)<1.5 && re_av/input->GetBinContent(row_ID,col_ID)>0.5) re_av=1;
338 std::cerr<<
"AFP_NoisyPixelTool::findLEffAndNoisyPixels: re_av denominator is zero\n";
341 double ratio_noisy =
m_sensitivity+input->GetBinContent(row_ID,col_ID)/re_av;
342 double ratio_leff = input->GetBinContent(row_ID,col_ID)/re_av;
345 tmp_eff_leff.SetBinContent(row_ID,col_ID,1);
346 tmp_eff_noisy.SetBinContent(row_ID,col_ID,1);
349 if(row_ID!=input->GetNbinsX() && row_ID!=1 && col_ID!=1 && col_ID!=input->GetNbinsY())
353 tmp_found_noisy.SetBinContent(row_ID,col_ID,1);
354 if(re_av!=1) tmp_eff_noisy.SetBinContent(row_ID,col_ID,100.*ratio_noisy);
356 if( ((ratio_leff<
m_threshLEff && re_av!=1) || re_av==1) )
358 tmp_found_leff.SetBinContent(row_ID,col_ID,1);
359 if(re_av!=1) tmp_eff_leff.SetBinContent(row_ID,col_ID,100.*ratio_leff);
373 std::vector<std::vector<double>> params(nParams, std::vector<double>(input->GetNbinsX()+1, 0.));
375 for(
int row_ID=0; row_ID<=input->GetNbinsX(); row_ID++)
377 std::string srow_ID = std::to_string(row_ID);
378 std::unique_ptr<TH1F> hist(
new TH1F((
"ROW"+srow_ID).c_str(), (
"ROW"+srow_ID).c_str(), input->GetNbinsY(), 0.5, input->GetNbinsX()+0.5));
380 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
382 hist->Fill(col_ID, 1.0*input->GetBinContent(row_ID,col_ID));
386 std::shared_ptr<TF1> FIT_2(
new TF1(
"gaus",
"gaus(0)+gaus(3)+[6]",0,input->GetNbinsY(),nParams));
389 FIT_2->SetParameters(25000,hist->GetMean(),hist->GetStdDev()/std::sqrt(2),
390 5000,hist->GetMean(),hist->GetStdDev()/std::sqrt(2),
391 std::max(hist->GetBinContent(2),std::max(hist->GetBinContent(3),hist->GetBinContent(4))) );
395 for(
int par=0;par<nParams;++par)
397 FIT_2->SetParameter(par,params.at(par).at(row_ID-1));
402 hist->Fit(FIT_2.get(),
"Q");
404 for(
int par=0;par<nParams;++par)
406 params.at(par).at(row_ID-1)=FIT_2->GetParameter(par);