16 output.resize(4, output[0]);
17 auto name = [&output](
const char * n)->TString{
18 return Form(n,output[0].GetName());
20 auto title = [&output](
const char * t)->TString{
21 return Form(t,output[0].GetTitle());
23 output[1].SetNameTitle(name(
"leffpixels_found_%s"), title(
"low efficiency pixels, found, %s"));
24 output[2].SetNameTitle(name(
"noisypixels_eff_%s"), title(
"noisy pixels, efficiency, %s"));
25 output[3].SetNameTitle(name(
"leffpixels_eff_%s"), title(
"low efficiency pixels, efficiency, %s"));
26 output[0].SetNameTitle(name(
"noisypixels_found_%s"), title(
"noisy pixels, found, %s"));
28 TH2F& noisypixels_found_output = output[0];
29 TH2F& leffpixels_found_output = output[1];
30 TH2F& noisypixels_eff_output = output[2];
31 TH2F& leffpixels_eff_output = output[3];
34 if(input->GetMaximum()<0.5)
return 0;
36 std::vector<TH2F> vec_found_leff{},vec_found_noisy{},vec_eff_leff{},vec_eff_noisy{};
40 TH2F tmp_eff_noisy, tmp_eff_leff;
41 TH2F tmp_found_leff, tmp_found_noisy;
49 std::tie(tmp_found_leff,tmp_found_noisy,tmp_eff_leff, tmp_eff_noisy) =
findLEffAndNoisyPixels(input, tmp_inact_pix_around, method);
58 tmp_eff_noisy=TH2F(*input);
59 tmp_eff_noisy.SetName(
"tmp_eff_noisy");
60 tmp_eff_noisy.Reset();
61 tmp_eff_leff=TH2F(*input);
62 tmp_eff_leff.SetName(
"tmp_eff_leff");
64 tmp_found_noisy=TH2F(*input);
65 tmp_found_noisy.SetName(
"tmp_found_noisy");
66 tmp_found_noisy.Reset();
67 tmp_found_leff=TH2F(*input);
68 tmp_found_leff.SetName(
"tmp_found_leff");
69 tmp_found_leff.Reset();
73 const double Threshold_LEFF=5.;
76 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
78 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
80 double ratio_leff=0, ratio_noisy=0;
81 double gauss_helper_12 = (col_ID-p[1][row_ID])/p[2][row_ID];
82 double gauss_helper_45 = (col_ID-p[4][row_ID])/p[5][row_ID];
83 double fit = p[0][row_ID]*exp(-0.5*gauss_helper_12*gauss_helper_12)
84 + p[3][row_ID]*exp(-0.5*gauss_helper_45*gauss_helper_45) + p[6][row_ID];
85 double sigma=std::sqrt(fit);
88 double bin_content=input->GetBinContent(row_ID,col_ID);
90 if(fit>=bin_content) ratio_leff = std::abs(fit-bin_content)/sigma;
91 else ratio_noisy = std::abs(fit-bin_content)/sigma;
95 if( ratio_leff > Threshold_LEFF) tmp_found_leff.SetBinContent(row_ID,col_ID,1);
96 if( ratio_noisy > Threshold_NOISY) tmp_found_noisy.SetBinContent(row_ID,col_ID,1);
98 tmp_eff_leff.SetBinContent(row_ID,col_ID,100.*ratio_leff);
99 tmp_eff_noisy.SetBinContent(row_ID,col_ID,100.*ratio_noisy);
105 vec_found_leff.push_back(tmp_found_leff);
106 vec_found_noisy.push_back(tmp_found_noisy);
107 vec_eff_leff.push_back(tmp_eff_leff);
108 vec_eff_noisy.push_back(tmp_eff_noisy);
112 for(
unsigned int m=0; m<
m_methods.size(); m++)
114 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
116 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
118 noisypixels_found_output.Fill(row_ID,col_ID, vec_found_noisy[m].GetBinContent(row_ID,col_ID));
119 leffpixels_found_output.Fill(row_ID,col_ID, vec_found_leff[m].GetBinContent(row_ID,col_ID));
123 noisypixels_eff_output.SetBinContent(row_ID,col_ID, vec_eff_noisy[m].GetBinContent(row_ID,col_ID));
124 leffpixels_eff_output.SetBinContent(row_ID,col_ID, vec_eff_leff[m].GetBinContent(row_ID,col_ID));
128 if(noisypixels_eff_output.GetBinContent(row_ID,col_ID)<vec_eff_noisy[m].GetBinContent(row_ID,col_ID))
130 noisypixels_eff_output.SetBinContent(row_ID,col_ID, vec_eff_noisy[m].GetBinContent(row_ID,col_ID));
132 if(leffpixels_eff_output.GetBinContent(row_ID,col_ID)>vec_eff_leff[m].GetBinContent(row_ID,col_ID))
134 leffpixels_eff_output.SetBinContent(row_ID,col_ID, vec_eff_leff[m].GetBinContent(row_ID,col_ID));
142 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
144 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
146 if(noisypixels_found_output.GetBinContent(row_ID,col_ID)==
m_methods.size()) noisypixels_found_output.SetBinContent(row_ID,col_ID,1);
147 else noisypixels_found_output.SetBinContent(row_ID,col_ID,0);
149 if(leffpixels_found_output.GetBinContent(row_ID,col_ID)==
m_methods.size()) leffpixels_found_output.SetBinContent(row_ID,col_ID,1);
150 else leffpixels_found_output.SetBinContent(row_ID,col_ID,0);
219 TH2F tmp_found_leff(*input);
220 tmp_found_leff.SetName(
"tmp_found_leff");
221 tmp_found_leff.Reset();
223 TH2F tmp_found_noisy(*input);
224 tmp_found_noisy.SetName(
"tmp_found_noisy");
225 tmp_found_noisy.Reset();
227 TH2F tmp_eff_leff(*input);
228 tmp_eff_leff.SetName(
"tmp_eff_leff");
229 tmp_eff_leff.Reset();
231 TH2F tmp_eff_noisy(*input);
232 tmp_eff_noisy.SetName(
"tmp_eff_noisy");
233 tmp_eff_noisy.Reset();
235 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
237 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
239 if(input->GetBinContent(row_ID, col_ID)!=0 && tmp_inact_pix_around.GetBinContent(row_ID, col_ID)<0.1)
245 for(
auto legpix : legit_pixels)
247 sum+=input->GetBinContent(legpix.first,legpix.second);
254 if(method==
"2_ROW" || method==
"2_COL")
256 av_noisy=sum/(std::abs(npixels-4)*0.5);
259 else if(method==
"4_PIX")
261 av_noisy=sum/(std::ceil(npixels*0.5));
264 else if(method==
"8_PIX")
266 av_noisy=sum/(npixels);
270 if ((av_leff == 0) or (av_noisy == 0))[[
unlikely]]{
271 std::cerr<<
"AFP_NoisyPixelTool::findLEffAndNoisyPixels: denominator is zero\n";
274 double ratio_leff = input->GetBinContent(row_ID,col_ID)/av_leff;
275 double ratio_noisy = input->GetBinContent(row_ID,col_ID)/av_noisy;
276 tmp_eff_leff.SetBinContent(row_ID,col_ID,100.*ratio_leff);
277 tmp_eff_noisy.SetBinContent(row_ID,col_ID,100.*ratio_noisy);
279 if(ratio_leff <
m_threshLEff) tmp_found_leff.SetBinContent(row_ID,col_ID,1.);
280 if(ratio_noisy >
m_threshNoisy) tmp_found_noisy.SetBinContent(row_ID,col_ID,1.);
285 return {tmp_found_leff,tmp_found_noisy,tmp_eff_leff,tmp_eff_noisy};
291 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
293 for(
int row_ID=1; row_ID<=input->GetNbinsX(); row_ID++)
295 if(input->GetBinContent(row_ID,col_ID)==0)
continue;
297 int inactive_pixels_around=tmp_inact_pix_around.GetBinContent(row_ID, col_ID);
298 int leff_pixels_around=0;
300 for(
auto legpix : legit_pixels)
302 if(tmp_found_leff.GetBinContent(legpix.first,legpix.second)>0) leff_pixels_around++;
305 if(leff_pixels_around!=0 && inactive_pixels_around==0)
312 for(
auto legpix : legit_pixels)
314 if(tmp_found_leff.GetBinContent(legpix.first,legpix.second)==0)
316 re_av+=input->GetBinContent(legpix.first,legpix.second);
324 for(
const auto & legpix : legit_pixels)
326 re_av+=input->GetBinContent(legpix.first,legpix.second);
329 if(re_av/input->GetBinContent(row_ID,col_ID)<1.5 && re_av/input->GetBinContent(row_ID,col_ID)>0.5) re_av=1;
336 std::cerr<<
"AFP_NoisyPixelTool::findLEffAndNoisyPixels: re_av denominator is zero\n";
339 double ratio_noisy =
m_sensitivity+input->GetBinContent(row_ID,col_ID)/re_av;
340 double ratio_leff = input->GetBinContent(row_ID,col_ID)/re_av;
343 tmp_eff_leff.SetBinContent(row_ID,col_ID,1);
344 tmp_eff_noisy.SetBinContent(row_ID,col_ID,1);
347 if(row_ID!=input->GetNbinsX() && row_ID!=1 && col_ID!=1 && col_ID!=input->GetNbinsY())
351 tmp_found_noisy.SetBinContent(row_ID,col_ID,1);
352 if(re_av!=1) tmp_eff_noisy.SetBinContent(row_ID,col_ID,100.*ratio_noisy);
354 if( ((ratio_leff<
m_threshLEff && re_av!=1) || re_av==1) )
356 tmp_found_leff.SetBinContent(row_ID,col_ID,1);
357 if(re_av!=1) tmp_eff_leff.SetBinContent(row_ID,col_ID,100.*ratio_leff);
371 std::vector<std::vector<double>> params(nParams, std::vector<double>(input->GetNbinsX()+1, 0.));
373 for(
int row_ID=0; row_ID<=input->GetNbinsX(); row_ID++)
375 std::string srow_ID = std::to_string(row_ID);
376 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));
378 for(
int col_ID=1; col_ID<=input->GetNbinsY(); col_ID++)
380 hist->Fill(col_ID, 1.0*input->GetBinContent(row_ID,col_ID));
384 std::shared_ptr<TF1> FIT_2(
new TF1(
"gaus",
"gaus(0)+gaus(3)+[6]",0,input->GetNbinsY(),nParams));
387 FIT_2->SetParameters(25000,hist->GetMean(),hist->GetStdDev()/std::sqrt(2),
388 5000,hist->GetMean(),hist->GetStdDev()/std::sqrt(2),
389 std::max(hist->GetBinContent(2),std::max(hist->GetBinContent(3),hist->GetBinContent(4))) );
393 for(
int par=0;par<nParams;++par)
395 FIT_2->SetParameter(par,params.at(par).at(row_ID-1));
400 hist->Fit(FIT_2.get(),
"Q");
402 for(
int par=0;par<nParams;++par)
404 params.at(par).at(row_ID-1)=FIT_2->GetParameter(par);