Example #1
0
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;
}
Example #3
0
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;
}
Example #4
0
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
Example #5
0
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;
}