//Renata Kopecna #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace fcnc; multifit::multifit(options* o): opts(o) { output = new TFile(("result" + opts->name + ".root").c_str(), "RECREATE"); }; multifit::~multifit(){ output->Write(); output->Close(); delete output; }; void multifit::fit_gaussian(vector& values, double& gauss_mean, double& sigma_gauss_mean, double& gauss_width, double& sigma_gauss_width, double& chi_squared) const { double max = *max_element(std::begin(values), std::end(values)); double min = *min_element(std::begin(values), std::end(values)); double mean=0.0; double rms=0.0; TTree* t = new TTree("tree", "pull values"); double value; TBranch *branch = t->Branch("value",&value,"value/D"); for (unsigned int i = 0; i < values.size(); i++) { value = values.at(i); branch->Fill(); t->Fill(); mean += value/values.size(); } for (unsigned int i = 0; i < values.size(); i++){ value = values.at(i); rms += (value - mean)*(value - mean)/values.size(); } rms = sqrt(rms); TF1* f1 = new TF1("f1", "gaus(0)/sqrt(2.0*3.1415926536)/abs([2])", min-5.0, max+5.0); f1->SetParameters(1.0,mean,rms); //f1->SetParLimits(0, 1.0, 1.0); f1->FixParameter(0, 1.0); t->UnbinnedFit("f1", "value"); gauss_mean = f1->GetParameter(1); sigma_gauss_mean = f1->GetParError(1); gauss_width = f1->GetParameter(2); sigma_gauss_width = f1->GetParError(2); delete f1; delete t; }; void multifit::update_pull(parameter* p, vector& values, vector& errors, double& gauss_mean, double& sigma_gauss_mean, double& gauss_width, double& sigma_gauss_width, double& chi_squared, string appendix) const { unsigned int runs=values.size(); string parname(p->get_name()); string descr(p->get_description()); gStyle->SetOptStat(0); gStyle->SetOptFit(0); //finally the pull histo TH1D* pull_histo = new TH1D((parname + "_pull_").c_str(), (descr + " pull distribution;" + "(" + descr + "^{fitted}-" + descr + "^{generated})/#sigma").c_str(), 50, -5.0, 5.0);//sensible for pulls //fill histos //this is done every time because the time is negligible double start_value = p->get_start_value(); vector pull_values; for (unsigned int k=0; kFill(pull); pull_values.push_back(pull); } } fit_gaussian(pull_values, gauss_mean, sigma_gauss_mean, gauss_width, sigma_gauss_width, chi_squared); TCanvas *pull_canvas = new TCanvas((parname + "_pull_" + appendix).c_str(), "Bs Likelihood Analysis: Pull distribution",1600,1200); pull_canvas->cd(); pull_histo->Draw(); TF1 *g = new TF1("g","[0]*exp(-(x-[1])*(x-[1])/2.0/[2]/[2])",-5.0,5.0); //for normalization: multiply with dx*histint = width/Nbins*histint g->SetParameters(1.0/sqrt(2.0*TMath::Pi())/gauss_width*10.0/50.0*pull_histo->Integral(), gauss_mean, gauss_width); g->Draw("same"); TPaveText* text = new TPaveText(0.6,0.7,0.88,0.88,"NDC"); text->SetFillColor(0); std::ostringstream stream_mean; stream_mean << "Mean: " << fixed << setprecision(3) << gauss_mean << "#pm" << sigma_gauss_mean; std::ostringstream stream_width; stream_width << "Width: " << fixed << setprecision(3) << gauss_width << "#pm" << sigma_gauss_width; text->AddText(stream_mean.str().c_str()); text->AddText(stream_width.str().c_str()); text->Draw("same"); string afilename; //TODO: move to paths if (appendix != "") afilename = "plots/pull_" + parname + "_" + appendix + ".eps"; else afilename = "plots/pull_" + parname + ".eps"; if (opts->write_eps)pull_canvas->Print(afilename.c_str(), "eps"); output->cd(); pull_canvas->Write(); delete text; delete g; delete pull_histo; delete pull_canvas; } void multifit::update_value(parameter * p, vector& values, vector& errors, double& gauss_mean, double& sigma_gauss_mean, double& gauss_width, double& sigma_gauss_width, double& chi_squared, string appendix) const { unsigned int runs=values.size(); string parname(p->get_name()); string descr(p->get_description()); //first find min and max values double max = *max_element(std::begin(values), std::end(values)); double min = *min_element(std::begin(values), std::end(values)); double width = max-min; double hist_min = min - 0.5*width; double hist_max = max + 0.5*width; gStyle->SetOptStat(0); gStyle->SetOptFit(0); TH1D* value_histo = new TH1D((parname+"_values").c_str(), (descr + ";" + descr).c_str(), 50, hist_min, hist_max); for (unsigned int k=0; kFill(values.at(k)); } fit_gaussian(values, gauss_mean, sigma_gauss_mean, gauss_width, sigma_gauss_width, chi_squared); TCanvas *value_canvas = new TCanvas((parname + "_value_" + appendix).c_str(), "Bs Likelihood Analysis: Value distribution",1600,1200); value_canvas->cd(); value_histo->Draw(); TF1 *g = new TF1("g","[0]*exp(-(x-[1])*(x-[1])/2.0/[2]/[2])",-5.0,5.0); g->SetParameters(1.0/sqrt(2.0*TMath::Pi())/gauss_width*(hist_max-hist_min)/50.0*value_histo->Integral(), gauss_mean, gauss_width); g->Draw("same"); TPaveText* text = new TPaveText(0.6,0.7,0.88,0.88,"NDC"); text->SetFillColor(0); std::ostringstream stream_mean; stream_mean << "Mean: " << fixed << setprecision(3) << gauss_mean << "#pm" << sigma_gauss_mean; std::ostringstream stream_width; stream_width << "Width: " << fixed << setprecision(3) << gauss_width << "#pm" << sigma_gauss_width; text->AddText(stream_mean.str().c_str()); text->AddText(stream_width.str().c_str()); text->Draw("same"); //TODO: move string afilename; if (appendix != "") afilename = "plots/value_" + parname + "_" + appendix + ".eps"; else afilename = "plots/value_" + parname + ".eps"; if (opts->write_eps) value_canvas->Print(afilename.c_str(), "eps"); output->cd(); value_canvas->Write(); delete text; delete value_histo; delete value_canvas; delete g; } void multifit::update_error(parameter* p, vector& values, vector& errors, double& gauss_mean, double& sigma_gauss_mean, double& gauss_width, double& sigma_gauss_width, double& chi_squared, string appendix) const { unsigned int runs=values.size(); string parname(p->get_name()); string descr(p->get_description()); //then find min and max errors double max = *max_element(std::begin(errors), std::end(errors)); double min = *min_element(std::begin(errors), std::end(errors)); double width = max - min; double hist_min = min - 0.5*width; double hist_max = max + 0.5*width; gStyle->SetOptStat(0); gStyle->SetOptFit(0); TH1D* error_histo = new TH1D((parname+"_errors").c_str(), ("#sigma(" + descr + ");#sigma(" + descr + ")").c_str(), 100, hist_min, hist_max); for (unsigned int k=0; kFill(errors.at(k)); } fit_gaussian(errors, gauss_mean, sigma_gauss_mean, gauss_width, sigma_gauss_width, chi_squared); TCanvas *error_canvas = new TCanvas((parname + "_error_" + appendix).c_str(), "Bs Likelihood Analysis: Error distribution",1600,1200); error_canvas->cd(); error_histo->Draw(); TF1 *g = new TF1("g","[0]*exp(-(x-[1])*(x-[1])/2.0/[2]/[2])",-5.0,5.0); g->SetParameters(1.0/sqrt(2.0*TMath::Pi())/gauss_width*(hist_max-hist_min)/100.0*error_histo->Integral(), gauss_mean, gauss_width); g->Draw("same"); TPaveText* text = new TPaveText(0.6,0.7,0.88,0.88,"NDC"); text->SetFillColor(0); std::ostringstream stream_mean; stream_mean << "Mean: " << fixed << setprecision(3) << gauss_mean << "#pm" << sigma_gauss_mean; std::ostringstream stream_width; stream_width << "Width: " << fixed << setprecision(3) << gauss_width << "#pm" << sigma_gauss_width; text->AddText(stream_mean.str().c_str()); text->AddText(stream_width.str().c_str()); text->Draw("same"); //TODO: move string afilename; if (appendix != "") afilename = "plots/error_" + parname + "_" + appendix + ".eps"; else afilename = "plots/error_" + parname + ".eps"; if (opts->write_eps) error_canvas->Print(afilename.c_str(), "eps"); output->cd(); error_canvas->Write(); delete text; delete error_histo; delete error_canvas; delete g; }