void fitTools::fillPositionResolution(TH1F* h1_sigmaEta, TH1F* h1_sigmaPhi, TH2D* h2_deltaEta, TH2D* h2_deltaPhi) { for(int iBin=1; iBin<(h2_deltaEta->GetNbinsX()+1); ++iBin) { TH1D* h1_projection = h2_deltaEta->ProjectionY("projectiony", iBin, iBin); TF1* gaussian= new TF1("gaussian", "gaus"); fitProjection(h1_projection, gaussian, 2., "RQLL"); h1_sigmaEta->SetBinContent(iBin, gaussian->GetParameter(2)); h1_sigmaEta->SetBinError(iBin, gaussian->GetParError(2)); delete gaussian; gaussian = 0; h1_projection = 0; } //for bins eta for(int iBin=1; iBin<(h2_deltaPhi->GetNbinsX()+1); ++iBin) { TH1D* h1_projection = h2_deltaPhi->ProjectionY("projectiony", iBin, iBin); TF1* gaussian= new TF1("gaussian", "gaus"); fitProjection(h1_projection, gaussian, 2., "RQLL"); h1_sigmaPhi->SetBinContent(iBin, gaussian->GetParameter(2)); h1_sigmaPhi->SetBinError(iBin, gaussian->GetParError(2)); delete gaussian; gaussian = 0; h1_projection = 0; } //for bins } //fill position resolution
void GaussianProfile::getTruncatedMeanRMS(TH1* hist, float& mean, float& mean_error, float& rms, float& rms_error) { int nBins = hist->GetNbinsX(); double xMin = hist->GetXaxis()->GetXmin(); double xMax = hist->GetXaxis()->GetXmax(); //double binWidth = (xMax - xMin) / (double) nBins; //WARNING: this works only if bins are of the same size double integral = hist->Integral(); int maxBin = 0; TF1* gaussian = new TF1("gaussian", "gaus"); fitProjection(hist, gaussian, 1.5, "RQN"); //maxBin = (int) ceil((gaussian->GetParameter(1) - xMin) / binWidth); maxBin = hist->FindBin(gaussian->GetParameter(1)); delete gaussian; TH1D* newHisto = new TH1D("newHisto", "", nBins, xMin, xMax); newHisto->SetBinContent(maxBin, hist->GetBinContent(maxBin)); newHisto->SetBinError(maxBin, hist->GetBinError(maxBin)); int iBin = maxBin; int delta_iBin = 1; int sign = 1; while (newHisto->Integral() < 0.99 * integral) { iBin += sign * delta_iBin; newHisto->SetBinContent(iBin, hist->GetBinContent(iBin)); newHisto->SetBinError(iBin, hist->GetBinError(iBin)); delta_iBin += 1; sign *= -1; } rms = newHisto->GetRMS(); rms_error = newHisto->GetRMSError(); while (newHisto->Integral() < 0.99 * integral) { iBin += sign * delta_iBin; newHisto->SetBinContent(iBin, hist->GetBinContent(iBin)); newHisto->SetBinError(iBin, hist->GetBinError(iBin)); delta_iBin += 1; sign *= -1; } mean = newHisto->GetMean(); mean_error = newHisto->GetMeanError(); delete newHisto; }
void fitTools::getTruncatedMeanAndRMS(TH1D* h1_projection, Float_t& mean, Float_t& mean_err, Float_t& rms, Float_t& rms_err, Double_t percentIntegral_MEAN, Double_t percentIntegral_RMS) { //TCanvas* getTruncatedMeanAndRMS(TH1D* h1_projection, Float_t& mean, Float_t& mean_err, Float_t& rms, Float_t& rms_err, Double_t percentIntegral_MEAN=0.9, Double_t percentIntegral_RMS=0.68) { bool useMode = false; if( percentIntegral_MEAN<0. || percentIntegral_MEAN>1. ) { std::cout << "WARNING! percentIntegral_MEAN is " << percentIntegral_MEAN << "!! Setting it to 90%." << std::endl; percentIntegral_MEAN = 0.9; } if( percentIntegral_RMS<0. || percentIntegral_RMS>1. ) { std::cout << "WARNING! percentIntegral_RMS is " << percentIntegral_RMS << "!! Setting it to 68%." << std::endl; percentIntegral_RMS = 0.68; } Int_t nBins = h1_projection->GetNbinsX(); Double_t xMin = h1_projection->GetXaxis()->GetXmin(); Double_t xMax = h1_projection->GetXaxis()->GetXmax(); Double_t binWidth = (xMax-xMin)/(Double_t)nBins; //WARNING: this works only if bins are of the same size Double_t integral = h1_projection->Integral(); // std::cout << "xmax: " << xMax << "\txMin: " << xMin << std::endl; //first: find maximum // std::cout << "N: " << gaussian->GetParameter(0) << "\tmu: " << gaussian->GetParameter(1) << "\tsigma: " << gaussian->GetParameter(2) << std::endl; Int_t maxBin; if( useMode ) { maxBin = h1_projection->GetMaximumBin(); } else { TF1* gaussian = new TF1("gaussian", "gaus"); gaussian->SetLineColor(kGreen); fitProjection(h1_projection, gaussian, 1.5, "RQN"); maxBin = (Int_t)ceil((gaussian->GetParameter(1)-xMin)/binWidth); delete gaussian; } // std::cout << "maxBin: " << maxBin << "\tbin center: " << h1_projection->GetXaxis()->GetBinCenter(maxBin) << "\t gauss mu: " << gaussian->GetParameter(1) << std::endl; TH1D* newHisto = new TH1D("newHisto", "", nBins, xMin, xMax); newHisto->SetBinContent( maxBin, h1_projection->GetBinContent(maxBin) ); newHisto->SetBinError( maxBin, h1_projection->GetBinError(maxBin) ); Int_t iBin = maxBin; Int_t delta_iBin = 1; Int_t sign = 1; // std::cout << "iBin: " << iBin << "\tint: " << newHisto->Integral()/integral << std::endl; while( newHisto->Integral() < percentIntegral_RMS*integral ) { iBin += sign*delta_iBin; // std::cout << "iBin: " << iBin << "\tint: " << newHisto->Integral()/integral << std::endl; newHisto->SetBinContent( iBin, h1_projection->GetBinContent(iBin) ); newHisto->SetBinError( iBin, h1_projection->GetBinError(iBin) ); delta_iBin += 1; sign *= -1; } // std::cout << "done with rms." << std::endl; // TCanvas* c1 = new TCanvas("c1", "c1", 800, 600); // c1->cd(); // h1_projection->Draw(); // newHisto->SetFillColor(kRed); // newHisto->DrawClone("HISTO same"); rms = newHisto->GetRMS(); rms_err = newHisto->GetRMSError(); //std::cout << "rms: " << rms << std::endl; while( newHisto->Integral() < percentIntegral_MEAN*integral ) { // std::cout << "iBin: " << iBin << "\tint: " << newHisto->Integral()/integral << std::endl; iBin += sign*delta_iBin; newHisto->SetBinContent( iBin, h1_projection->GetBinContent(iBin) ); newHisto->SetBinError( iBin, h1_projection->GetBinError(iBin) ); delta_iBin += 1; sign *= -1; } // newHisto->SetFillStyle(3004); // newHisto->SetFillColor(kBlue); // newHisto->DrawClone("HISTO same"); mean = newHisto->GetMean(); mean_err = newHisto->GetMeanError(); delete newHisto; // return c1; }
void fitTools::fillProfile(TH1F* h1_response_FIT, TH1F* h1_resolution_FIT, TH1F* h1_response_MEAN, TH1F* h1_resolution_RMS, TH2D* h2, std::string name) { std::string fileName = "Projections/"+name+".root"; TFile* projectionFile; if( name!= "" ) { projectionFile = TFile::Open(fileName.c_str(), "RECREATE"); projectionFile->cd(); } for(int iBin=1; iBin<(h2->GetNbinsX()+1); ++iBin) { char histName[50]; sprintf(histName, "projection_%d",iBin); TH1D* h1_projection = h2->ProjectionY(histName, iBin, iBin); TF1* gaussian_LL = new TF1("gaussian_LL", "gaus"); fitProjection(h1_projection, gaussian_LL, 2., "RQLL"); TF1* gaussian_chi = new TF1("gaussian_chi", "gaus"); fitProjection(h1_projection, gaussian_chi, 2., "RQO+"); if( name!="" ) { h1_projection->Write(); } Float_t mu = gaussian_LL->GetParameter(1); Float_t mu_err = gaussian_chi->GetParError(1); h1_response_FIT->SetBinContent(iBin, mu); h1_response_FIT->SetBinError(iBin, mu_err); Float_t sigma = gaussian_LL->GetParameter(2); Float_t resolution = (mu!=0.) ? sigma/mu : -1.; h1_resolution_FIT->SetBinContent(iBin, resolution); Float_t sigma_err = gaussian_chi->GetParError(2); Float_t res_err = (mu!=0.) ? sqrt( sigma_err*sigma_err/(mu*mu) + mu_err*mu_err*sigma*sigma/(mu*mu*mu*mu) ) : 0.; h1_resolution_FIT->SetBinError(iBin, res_err); Float_t n = h1_projection->GetEntries(); Float_t mean = h1_projection->GetMean(); Float_t mean_err = (n!=0) ? h1_projection->GetRMS()/sqrt(n) : 0.; h1_response_MEAN->SetBinContent(iBin, mean); h1_response_MEAN->SetBinError(iBin, mean_err); Float_t rms = h1_projection->GetRMS(); Float_t rms_err = (n!=0) ? h1_projection->GetRMS()/sqrt(n) : 0.; resolution = (mean!=0.) ? rms/mean : -1.; res_err = (mean!=0.) ? sqrt( rms_err*rms_err/(mean*mean) + mean_err*mean_err*rms*rms/(mean*mean*mean*mean) ) : 0.; if( resolution != 0. ) { h1_resolution_RMS->SetBinContent(iBin, resolution); h1_resolution_RMS->SetBinError(iBin, res_err); } h1_projection = 0; } //for bins if(name!="") { projectionFile->Write(); projectionFile->Close(); delete projectionFile; } projectionFile = 0; } //fill profile
void fitTools::fitProjection_sameArea(TH1D* h1_projection, TF1* gaussian, TH1D* newhisto, Float_t percIntegral, const std::string& option, bool useMode) { if( percIntegral<0. || percIntegral>1. ) { std::cout << "WARNING! percIntegral is " << percIntegral << "!! Setting it to 90%." << std::endl; percIntegral = 0.9; } Int_t nBins = h1_projection->GetNbinsX(); Double_t xMin = h1_projection->GetXaxis()->GetXmin(); Double_t xMax = h1_projection->GetXaxis()->GetXmax(); Double_t binWidth = (xMax-xMin)/(Double_t)nBins; //WARNING: this works only if bins are of the same size Double_t integral = h1_projection->Integral(); //first: find maximum Int_t maxBin; if( useMode ) { maxBin = h1_projection->GetMaximumBin(); } else { TF1* tmp_gaussian = new TF1("tmp_gaussian", "gaus"); fitProjection(h1_projection, tmp_gaussian, 2.5, "RQN"); maxBin = (Int_t)ceil((tmp_gaussian->GetParameter(1)-xMin)/binWidth); delete tmp_gaussian; } // std::cout << "maxBin: " << maxBin << "\tbin center: " << h1_projection->GetXaxis()->GetBinCenter(maxBin) << "\t gauss mu: " << gaussian->GetParameter(1) << std::endl; TH1D* newHisto_tmp = new TH1D("newHisto_tmp", "", nBins, xMin, xMax); newHisto_tmp->SetBinContent( maxBin, h1_projection->GetBinContent(maxBin) ); newHisto_tmp->SetBinError( maxBin, h1_projection->GetBinError(maxBin) ); Int_t iBin = maxBin; Int_t delta_iBin = 1; Int_t sign = 1; Float_t xMin_fit = newHisto_tmp->GetXaxis()->GetBinLowEdge(maxBin); Float_t xMax_fit = newHisto_tmp->GetXaxis()->GetBinUpEdge(maxBin); //add bins till percent area is reached: while( newHisto_tmp->Integral() < percIntegral*integral ) { iBin += sign*delta_iBin; newHisto_tmp->SetBinContent( iBin, h1_projection->GetBinContent(iBin) ); newHisto_tmp->SetBinError( iBin, h1_projection->GetBinError(iBin) ); if( newHisto_tmp->GetXaxis()->GetBinLowEdge(iBin) < xMin_fit ) xMin_fit = newHisto_tmp->GetXaxis()->GetBinLowEdge(iBin); if( newHisto_tmp->GetXaxis()->GetBinUpEdge(iBin) > xMax_fit ) xMax_fit = newHisto_tmp->GetXaxis()->GetBinLowEdge(iBin); delta_iBin += 1; sign *= -1; //makes it jump from left to right about max } // std::cout << "done with rms." << std::endl; // TCanvas* c1 = new TCanvas("c1", "c1", 800, 600); // c1->cd(); // h1_projection->Draw(); // newHisto->SetFillColor(kRed); // newHisto->DrawClone("HISTO same"); //initialize parameters to likely values: gaussian->SetParameter( 0, newHisto_tmp->Integral() ); gaussian->SetParameter( 1, newHisto_tmp->GetMean() ); gaussian->SetParameter( 2, newHisto_tmp->GetRMS() ); gaussian->SetRange(xMin_fit, xMax_fit); newHisto_tmp->Fit(gaussian, option.c_str()); *newhisto = *newHisto_tmp; delete newHisto_tmp; newHisto_tmp=0; // return c1; }