81 cout<<
"ProfileZwithIterativeGaussFit(): No histogram supplied!"<<endl;
86 int num_bins_x = hist->GetXaxis()->GetNbins();
87 int num_bins_y = hist->GetYaxis()->GetNbins();
94 double num_not_converged = 0;
104 if (fDebug ||
false) std::cout <<
" ** profileZwithIterativeGaussFit ** target: " << mu_graph->GetName() <<
" ** " << std::endl;
106 for (
int i = 1; i < num_bins_x+(num_bins==1); i+=num_bins) {
108 for (
int j = 1; j < num_bins_y+(num_bins==1); j+=num_bins) {
110 int index = i/num_bins;
111 int index_y = j/num_bins;
113 current_proj = hist->ProjectionZ(Form(
"%s_GaussProjection_%i_%i",hist->GetName(),index, index_y),i,i+num_bins-1,j,j+num_bins-1);
114 current_proj->SetTitle(Form(
"%s - Bin %i x %i",hist->GetName(), index,index_y));
116 double current_mu,current_err_mu, current_sigma, current_err_sigma;
118 if(current_proj->GetEntries() < minEntries) {
125 current_err_sigma = 1;
127 if (fDebug) std::cout<<
"WARNING: Only "<<current_proj->GetEntries()<<
" entries in bin "<<index<<
","<<index_y<<
" in histogram " <<hist->GetName()<< std::endl;
137 IterativeGaussFit(current_proj, current_mu, current_err_mu, current_sigma, current_err_sigma);
139 if (current_sigma > max_sigma || max_sigma == 0) max_sigma = current_sigma;
140 if (current_sigma < min_sigma || min_sigma == 0) min_sigma = current_sigma;
141 if (current_mu > max_mu || max_mu == 0) max_mu = current_mu;
142 if (current_mu < min_mu || min_mu == 0) min_mu = current_mu;
146 float x_coord = (hist->GetXaxis()->GetBinLowEdge(i) + hist->GetXaxis()->GetBinUpEdge(i+num_bins-1))/2;
147 float y_coord = (hist->GetYaxis()->GetBinLowEdge(j) + hist->GetYaxis()->GetBinUpEdge(j+num_bins-1))/2;
149 int binx = mu_graph->GetXaxis()->FindBin(x_coord);
150 int biny = mu_graph->GetYaxis()->FindBin(y_coord);
152 mu_graph->Fill(x_coord,y_coord,current_mu);
153 mu_graph->SetBinError(binx,biny, current_err_mu);
154 if (fDebug ||
false) std::cout <<
" ** profileZwithIterativeGaussFit ** target: " << mu_graph->GetName()
155 <<
" bin(" << binx <<
", " << biny <<
") = " << current_mu
156 <<
" +- " << current_err_mu << std::endl;
159 if (sigma_graph) sigma_graph->SetBinContent(binx, biny, current_sigma);
160 if (sigma_err_graph) sigma_err_graph->SetBinContent(binx, biny, current_err_sigma);
161 if (mu_err_graph) mu_err_graph->SetBinContent(binx, biny,current_err_mu);
169 mu_graph->GetXaxis()->SetTitle(hist->GetXaxis()->GetTitle());
170 mu_graph->GetYaxis()->SetTitle(hist->GetYaxis()->GetTitle());
171 mu_graph->GetYaxis()->SetTitleOffset(1);
172 mu_graph->GetZaxis()->SetTitle(hist->GetZaxis()->GetTitle());
173 mu_graph->GetZaxis()->SetTitleOffset(1.2);
174 mu_graph->SetTitle(hist->GetTitle() );
180 sigma_graph->GetXaxis()->SetTitle(hist->GetXaxis()->GetTitle());
181 sigma_graph->GetYaxis()->SetTitle(hist->GetYaxis()->GetTitle());
182 sigma_graph->GetYaxis()->SetTitleOffset(1);
183 sigma_graph->GetZaxis()->SetTitle(hist->GetZaxis()->GetTitle());
184 sigma_graph->GetZaxis()->SetTitleOffset(1.2);
185 sigma_graph->SetTitle( hist->GetTitle() );
191 mu_err_graph->GetXaxis()->SetTitle(hist->GetXaxis()->GetTitle());
192 mu_err_graph->GetYaxis()->SetTitle(hist->GetYaxis()->GetTitle());
193 mu_err_graph->GetYaxis()->SetTitleOffset(1);
194 mu_err_graph->GetZaxis()->SetTitle(Form(
"Error of fit #mu: %s",hist->GetZaxis()->GetTitle()));
195 mu_err_graph->GetZaxis()->SetTitleOffset(1.2);
196 mu_err_graph->SetTitle(hist->GetTitle());
201 if (sigma_err_graph) {
202 sigma_err_graph->GetXaxis()->SetTitle(hist->GetXaxis()->GetTitle());
203 sigma_err_graph->GetYaxis()->SetTitle(hist->GetYaxis()->GetTitle());
204 sigma_err_graph->GetYaxis()->SetTitleOffset(1);
205 sigma_err_graph->GetZaxis()->SetTitle(Form(
"Error of fit #sigma: %s",hist->GetZaxis()->GetTitle()));
206 sigma_err_graph->GetZaxis()->SetTitleOffset(1.2);
207 sigma_err_graph->SetTitle(hist->GetTitle());
213 if (num_not_converged || num_skipped) std::cout<<
"Fit Results for histogram: "<< hist->GetName()<<std::endl;
214 if (num_not_converged) std::cout<<
"Non Convergent Bin Fraction: "<<num_not_converged<<
" / " <<num_bins_x*num_bins_y - num_skipped<<std::endl;
215 if (num_skipped) std::cout<<
"Number skipped bins: "<<num_skipped<<
" / " <<num_bins_x*num_bins_y<<std::endl;
229 std::cout <<
"Error in ProfileYwithIterativeGaussFit(): Histogram not found" <<std::endl;
234 std::cout <<
"Error in ProfileYwithIterativeGaussFit(): Invalid number of bins to integrate over." <<std::endl;
238 const int minEntries = 50;
239 const int fDebug = 0;
241 int num_bins_x = hist->GetXaxis()->GetNbins();
243 if (mu_graph) mu_graph->Rebin(num_bins);
244 if (sigma_graph) sigma_graph->Rebin(num_bins);
246 double* errs_mu =
new double[num_bins_x/num_bins + 2];
247 double* errs_sigma =
new double[num_bins_x/num_bins + 2];
250 errs_mu[num_bins_x/num_bins + 1] = 0;
253 errs_sigma[num_bins_x/num_bins + 1] = 0;
255 double min_sigma = 0;
256 double max_sigma = 0;
264 for (
int i = 1; i < (num_bins_x + (num_bins == 1)); i+=num_bins) {
266 int index = i/num_bins;
267 if (num_bins == 1) index--;
269 current_proj = hist->ProjectionY(Form(
"%s_projection_%i",hist->GetName(),index),i,i+num_bins-1);
271 double mu, mu_err, sigma, sigma_err;
273 if(current_proj->GetEntries() < minEntries) {
279 if ( fDebug ) std::cout<<
"WARNING: Not enough entries in bin "<<index<<std::endl;
284 if (sigma > max_sigma || max_sigma == 0) max_sigma = sigma;
285 if (sigma < min_sigma || min_sigma == 0) min_sigma = sigma;
286 if (mu > max_mu || max_mu == 0) max_mu = mu;
287 if (mu < min_mu || min_mu == 0) min_mu = mu;
291 double value_x = (hist->GetXaxis()->GetBinLowEdge(i) + hist->GetXaxis()->GetBinUpEdge(i+num_bins-1))/2;
295 if (sigma_graph) sigma_graph->Fill(value_x, sigma);
296 if (mu_graph) mu_graph->Fill(value_x, mu);
298 errs_mu[index + 1] = mu_err;
299 errs_sigma[index + 1] = sigma_err;
310 sigma_graph->SetError(errs_sigma);
313 sigma_graph->GetYaxis()->SetTitleOffset(1.5);
316 sigma_graph->GetYaxis()->SetTitle(sigma_graph->GetYaxis()->GetTitle());
317 sigma_graph->GetXaxis()->SetTitle(sigma_graph->GetXaxis()->GetTitle());
318 sigma_graph->SetTitle(
"");
322 mu_graph->SetError(errs_mu);
325 mu_graph->GetYaxis()->SetTitleOffset(1.5);
328 mu_graph->GetYaxis()->SetTitle(mu_graph->GetYaxis()->GetTitle());
329 mu_graph->GetXaxis()->SetTitle(mu_graph->GetXaxis()->GetTitle());
330 mu_graph->SetTitle(
"");
333 if (fDebug && num_skipped) std::cout<<
" Number of skipped bins: "<<num_skipped<<std::endl;
390 const int iteration_limit = 20;
391 const float percent_limit = 0.01;
392 const float fit_range_multiplier = 1.5;
393 const int fDebug = 0;
397 double current_mu = 0;
398 double current_sigma = 0;
399 double mu_percent_diff;
400 double sigma_percent_diff;
405 if (fDebug) std::cout<<
"Error in Anp::IterativeGaussFit(): Histogram to be fit is missing" <<std::endl;
408 if (hist->GetEntries() < minEntries) {
409 if (fDebug) std::cout<<
"Error in Anp::IterativeGaussFit(): Histogram has too few entries " << hist->GetEntries() << std::endl;
415 TF1* fit_func =
new TF1(
"fit_func",
"gaus");
417 int bad_fit = hist->Fit(fit_func,
"QN");
419 if (fDebug && bad_fit) std::cout <<
"BAD INITIAL FIT: "<< hist->GetTitle() << std::endl;
421 last_mu = fit_func->GetParameter(1);
422 last_sigma = fit_func->GetParameter(2);
424 if (bad_fit) last_mu = hist->GetMean();
427 if (fabs(last_mu - hist->GetMean()) > 3*hist->GetBinWidth(1)) {
428 last_mu = hist->GetMean();
429 last_sigma = hist->GetRMS();
437 while ( iteration < iteration_limit ) {
441 double FitRangeLower = last_mu-fit_range_multiplier*last_sigma;
442 double FitRangeUpper = last_mu+fit_range_multiplier*last_sigma;
445 if ((FitRangeUpper-FitRangeLower)/hist->GetBinWidth(1) < 5) {
446 FitRangeLower -= hist->GetBinWidth(1);
447 FitRangeUpper += hist->GetBinWidth(1);
450 fit_func->SetRange(FitRangeLower, FitRangeUpper);
451 if (m_PrintLevel >= 3) cout <<
" ** IterativeGaussFit ** fit iter # " << iteration
452 <<
" new fit range: " << FitRangeLower <<
" --> " << FitRangeUpper << endl;
454 bad_fit = hist->Fit(fit_func,
"RQN");
457 if (fit_func->GetParameter(1) < hist->GetXaxis()->GetXmin() || fit_func->GetParameter(1) > hist->GetXaxis()->GetXmax()) bad_fit = 1;
459 if (fit_func->GetParameter(2) > hist->GetXaxis()->GetXmax()-hist->GetXaxis()->GetXmin()) bad_fit = 1;
461 if (fDebug && bad_fit) std::cout<<
" ** BAD FIT ** : bin "<< hist->GetTitle() <<
" iteration "<<iteration<<std::endl;
465 for (
int i_div = 2; i_div < (hist->GetXaxis()->GetNbins()/2)+1; ++i_div)
466 if ((hist->GetXaxis()->GetNbins() % i_div) == 0) {
471 hist->Rebin(rebinFactor);
472 hist->Fit(fit_func,
"RQN");
476 current_mu = fit_func->GetParameter(1);
477 current_sigma = fit_func->GetParameter(2);
479 float average_mu = (last_mu+current_mu)/2;
480 float average_sigma = (last_sigma+current_sigma)/2;
482 if (average_mu == 0) {
483 if ( fDebug ) std::cout<<
" Average mu = 0 in bin "<< hist->GetTitle() <<std::endl;
484 average_mu = current_mu;
487 if (average_sigma == 0) {
488 if ( fDebug ) std::cout<<
"Average sigma = 0; Fit Problem in "<< hist->GetTitle() <<
". "<<last_sigma<<
" "<<current_sigma<<std::endl;
489 average_sigma = current_sigma;
492 mu_percent_diff = fabs((last_mu-current_mu)/average_mu);
493 sigma_percent_diff = fabs((last_sigma-current_sigma)/average_sigma);
495 if ( mu_percent_diff < percent_limit && sigma_percent_diff < percent_limit )
break;
497 if (iteration != iteration_limit) {
498 last_mu = current_mu;
499 last_sigma = current_sigma;
502 if (fabs(last_mu - hist->GetMean()) > 5*hist->GetBinWidth(1)) {
503 if (m_PrintLevel >= 3) cout <<
" ** IterativeGaussFit ** fit iter # " << iteration
504 <<
" ** WARNING ** last_mu looks bad: " << last_mu
505 <<
" this iter mu: " << fit_func->GetParameter(1)
506 <<
" proposed mu: " << hist->GetMean()
508 last_mu = hist->GetMean();
512 if (iteration == iteration_limit) {
513 if (fDebug ) std::cout<<
"WARNING: Fit did not converge to < "<<percent_limit*100<<
"% in "<< hist->GetTitle() <<
" in "<<iteration_limit<<
" iterations. Percent Diffs: "<<mu_percent_diff*100<<
"% (Mu),"<<
" "<<sigma_percent_diff*100<<
"% (Sigma)"<<std::endl;
518 mu_err = fit_func->GetParError(1);
519 sigma = current_sigma;
520 sigma_err = fit_func->GetParError(2);
522 hist->GetListOfFunctions()->Add(fit_func);
524 if (m_PrintLevel >= 1 ) {
525 cout <<
" ** IterativeGaussFit ** fit result: histo name " << hist->GetName() <<
" title: " << hist->GetTitle() << endl
526 <<
" mu = " << mu <<
" +- " << mu_err << endl
527 <<
" sigma = " << sigma <<
" +- " << sigma_err
536 cout <<
" ** IterativeGaussFit ** Please type RETURN to continue:\n>";
545 fit_func->Draw(
"same");
546 std::string str =
"";
549 q.Write((str+
"_"+hist->GetName()).c_str());