]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/vertexingHF/AliHFMassFitter.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliHFMassFitter.cxx
index f3580033831179ad40dc773e77ed4ac4c4568d9a..2ccbba57e652128753a0cb8cc6255cc35961e0d3 100644 (file)
@@ -61,17 +61,22 @@ AliHFMassFitter::AliHFMassFitter() :
   fNFinalPars(1),
   fFitPars(0),
   fWithBkg(0),
-  ftypeOfFit4Bkg(0),
-  ftypeOfFit4Sgn(0),
+  ftypeOfFit4Bkg(kExpo),
+  ftypeOfFit4Sgn(kGaus),
   ffactor(1),
   fntuParam(0),
   fMass(1.865),
+  fMassErr(0.01),
   fSigmaSgn(0.012),
+  fSigmaSgnErr(0.001),
+  fRawYield(0.),
+  fRawYieldErr(0.),
   fSideBands(0),
   fFixPar(0),
   fSideBandl(0),
   fSideBandr(0),
   fcounter(0),
+  fFitOption("L,"),
   fContourGraph(0)
 {
   // default constructor
@@ -83,7 +88,7 @@ AliHFMassFitter::AliHFMassFitter() :
 
 //___________________________________________________________________________
 
-AliHFMassFitter::AliHFMassFitter (const TH1F *histoToFit, Double_t minvalue, Double_t maxvalue, Int_t rebin,Int_t fittypeb,Int_t fittypes): 
+AliHFMassFitter::AliHFMassFitter (const TH1F *histoToFit, Double_t minvalue, Double_t maxvalue, Int_t rebin, Int_t fittypeb, Int_t fittypes):
  TNamed(),
  fhistoInvMass(0),
  fminMass(0),
@@ -95,17 +100,22 @@ AliHFMassFitter::AliHFMassFitter (const TH1F *histoToFit, Double_t minvalue, Dou
  fNFinalPars(1),
  fFitPars(0),
  fWithBkg(0),
- ftypeOfFit4Bkg(0),
- ftypeOfFit4Sgn(0),
+ ftypeOfFit4Bkg(kExpo),
+ ftypeOfFit4Sgn(kGaus),
  ffactor(1),
  fntuParam(0),
  fMass(1.865),
+ fMassErr(0.01),
  fSigmaSgn(0.012),
+ fSigmaSgnErr(0.001),
+ fRawYield(0.),
+ fRawYieldErr(0.),
  fSideBands(0),
  fFixPar(0),
  fSideBandl(0),
  fSideBandr(0),
  fcounter(0),
+ fFitOption("L,"),
  fContourGraph(0)
 {
   // standard constructor
@@ -152,12 +162,17 @@ AliHFMassFitter::AliHFMassFitter(const AliHFMassFitter &mfit):
   ffactor(mfit.ffactor),
   fntuParam(mfit.fntuParam),
   fMass(mfit.fMass),
+  fMassErr(mfit.fMassErr),
   fSigmaSgn(mfit.fSigmaSgn),
+  fSigmaSgnErr(mfit.fSigmaSgnErr),
+  fRawYield(mfit.fRawYield),
+  fRawYieldErr(mfit.fRawYieldErr),
   fSideBands(mfit.fSideBands),
   fFixPar(0),
   fSideBandl(mfit.fSideBandl),
   fSideBandr(mfit.fSideBandr),
   fcounter(mfit.fcounter),
+  fFitOption(mfit.fFitOption),
   fContourGraph(mfit.fContourGraph)
 {
   //copy constructor
@@ -208,10 +223,15 @@ AliHFMassFitter& AliHFMassFitter::operator=(const AliHFMassFitter &mfit){
   ffactor= mfit.ffactor;
   fntuParam= mfit.fntuParam;
   fMass= mfit.fMass;
+  fMassErr= mfit.fMassErr;
   fSigmaSgn= mfit.fSigmaSgn;
+  fSigmaSgnErr= mfit.fSigmaSgnErr;
+  fRawYield= mfit.fRawYield;
+  fRawYieldErr= mfit.fRawYieldErr;
   fSideBands= mfit.fSideBands;
   fSideBandl= mfit.fSideBandl;
   fSideBandr= mfit.fSideBandr;
+  fFitOption= mfit.fFitOption;
   fcounter= mfit.fcounter;
   fContourGraph= mfit.fContourGraph;
 
@@ -325,7 +345,7 @@ Bool_t AliHFMassFitter::SetFixThisParam(Int_t thispar,Bool_t fixpar){
   //return kFALSE if something wrong
 
   if(thispar>=fNFinalPars) {
-    cout<<"Error! Parameter out of bounds! Max is "<<fNFinalPars-1<<endl;
+    AliError(Form("Error! Parameter out of bounds! Max is %d\n",fNFinalPars-1));
     return kFALSE;
   }
   if(!fFixPar){
@@ -344,11 +364,11 @@ Bool_t AliHFMassFitter::SetFixThisParam(Int_t thispar,Bool_t fixpar){
 Bool_t AliHFMassFitter::GetFixThisParam(Int_t thispar)const{
   //return the value of fFixPar[thispar]
   if(thispar>=fNFinalPars) {
-    cout<<"Error! Parameter out of bounds! Max is "<<fNFinalPars-1<<endl;
+    AliError(Form("Error! Parameter out of bounds! Max is %d\n",fNFinalPars-1));
     return kFALSE;
   }
   if(!fFixPar) {
-    cout<<"Error! Parameters to be fixed still not set"<<endl;
+    AliError("Error! Parameters to be fixed still not set");
     return kFALSE;
 
   }
@@ -532,7 +552,7 @@ void AliHFMassFitter::RebinMass(Int_t bingroup){
   // Rebin invariant mass histogram
 
   if(!fhistoInvMass){
-    cout<<"Histogram not set"<<endl;
+    AliError("Histogram not set!!");
     return;
   }
   Int_t nbinshisto=fhistoInvMass->GetNbinsX();
@@ -686,6 +706,7 @@ Double_t AliHFMassFitter::FitFunction4Sgn (Double_t *x, Double_t *par){
   // * [2] = sigma
   //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
 
+  //  AliInfo("Signal function set to: Gaussian");
   return par[0]/TMath::Sqrt(2.*TMath::Pi())/par[2]*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/2./par[2]/par[2]);
 
 }
@@ -724,6 +745,7 @@ Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
     // * [1] = B;
     //exponential = [1]*[0]/(exp([1]*max)-exp([1]*min))*exp([1]*x)
     total = par[0+firstPar]*par[1+firstPar]/(TMath::Exp(par[1+firstPar]*fmaxMass)-TMath::Exp(par[1+firstPar]*fminMass))*TMath::Exp(par[1+firstPar]*x[0]);
+    //    AliInfo("Background function set to: exponential");
     break;
   case 1:
     //linear
@@ -731,6 +753,7 @@ Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
     // * [0] = integralBkg;
     // * [1] = b;
     total= par[0+firstPar]/(fmaxMass-fminMass)+par[1+firstPar]*(x[0]-0.5*(fmaxMass+fminMass));
+    //    AliInfo("Background function set to: linear");
     break;
   case 2:
     //polynomial
@@ -741,6 +764,7 @@ Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
     // * [1] = b;
     // * [2] = c;
     total = par[0+firstPar]/(fmaxMass-fminMass)+par[1]*(x[0]-0.5*(fmaxMass+fminMass))+par[2+firstPar]*(x[0]*x[0]-1/3.*(fmaxMass*fmaxMass*fmaxMass-fminMass*fminMass*fminMass)/(fmaxMass-fminMass));
+    //    AliInfo("Background function set to: polynomial");
     break;
   case 3:
     total=par[0+firstPar];
@@ -757,6 +781,7 @@ Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
     Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
 
     total = par[0+firstPar]*(par[1+firstPar]+1.)/(TMath::Power(fmaxMass-mpi,par[1+firstPar]+1.)-TMath::Power(fminMass-mpi,par[1+firstPar]+1.))*TMath::Power(x[0]-mpi,par[1+firstPar]);
+    //    AliInfo("Background function set to: powerlaw");
     }
     break;
   case 5:
@@ -766,6 +791,7 @@ Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
     Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
 
     total = par[1+firstPar]*TMath::Sqrt(x[0] - mpi)*TMath::Exp(-1.*par[2+firstPar]*(x[0]-mpi));
+    //    AliInfo("Background function set to: wit exponential");
     } 
     break;
 //   default:
@@ -790,16 +816,15 @@ Bool_t AliHFMassFitter::SideBandsBounds(){
   Double_t minHisto=fhistoInvMass->GetBinLowEdge(1);
   Double_t maxHisto=fhistoInvMass->GetBinLowEdge(fNbin+1);
 
-  Double_t sidebandldouble,sidebandrdouble;
-  Bool_t leftok=kFALSE, rightok=kFALSE;
+  Double_t sidebandldouble=0.,sidebandrdouble=0.;
 
   if(fMass-fminMass < 0 || fmaxMass-fMass <0) {
-    cout<<"Left limit of range > mean or right limit of range < mean: change left/right limit or initial mean value"<<endl;
+    AliError("Left limit of range > mean or right limit of range < mean: change left/right limit or initial mean value");
     return kFALSE;
   } 
   
   //histo limit = fit function limit
-  if((TMath::Abs(fminMass-minHisto) < 1e6 || TMath::Abs(fmaxMass - maxHisto) < 1e6) && (fMass-4.*fSigmaSgn-fminMass) < 1e6){
+  if((TMath::Abs(fminMass-minHisto) < 1e-6 || TMath::Abs(fmaxMass - maxHisto) < 1e-6) && (fMass-4.*fSigmaSgn-fminMass) < 1e-6){
     Double_t coeff = (fMass-fminMass)/fSigmaSgn;
     sidebandldouble=(fMass-0.5*coeff*fSigmaSgn);
     sidebandrdouble=(fMass+0.5*coeff*fSigmaSgn);
@@ -828,7 +853,6 @@ Bool_t AliHFMassFitter::SideBandsBounds(){
   
   if(TMath::Abs(tmp-sidebandldouble) > 1e-6){
     cout<<tmp<<" is not allowed, changing it to the nearest value allowed: ";
-    leftok=kTRUE;
   }
   cout<<sidebandldouble<<" (bin "<<fSideBandl<<")"<<endl;
 
@@ -840,12 +864,11 @@ Bool_t AliHFMassFitter::SideBandsBounds(){
   sidebandrdouble=fhistoInvMass->GetBinLowEdge(fSideBandr+1);
 
   if(TMath::Abs(tmp-sidebandrdouble) > 1e-6){
-    cout<<tmp<<" is not allowed, changing it to the nearest value allowed: ";
-    rightok=kTRUE;
+    AliWarning(Form("%f is not allowed, changing it to the nearest value allowed: \n",tmp));
   }
   cout<<sidebandrdouble<<" (bin "<<fSideBandr<<")"<<endl;
   if (fSideBandl==0 || fSideBandr==fNbin) {
-    cout<<"Error! Range too little"; 
+    AliError("Error! Range too little");
     return kFALSE;
   }
   return kTRUE;
@@ -939,7 +962,7 @@ Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
     Double_t diffUnderBands=(intUnderHisto-intUnderFunc);
     Double_t relDiff=diffUnderPick/diffUnderBands;
     cout<<"Relative difference = "<<relDiff<<endl;
-    if(TMath::Abs(relDiff) < 1) isBkgOnly=kTRUE;
+    if(TMath::Abs(relDiff) < 0.25) isBkgOnly=kTRUE;
     else{
       cout<<"Relative difference = "<<relDiff<<": I suppose there is some signal, continue with total fit!"<<endl;
     }
@@ -978,7 +1001,7 @@ Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
   Double_t totInt = fhistoInvMass->Integral(fminBinMass,fmaxBinMass, "width");
   //cout<<"Here tot integral is = "<<totInt<<"; integral in whole range is "<<fhistoInvMass->Integral("width")<<endl;
   fSideBands = kTRUE;
-  Double_t width=fhistoInvMass->GetBinWidth(8);
+  Double_t width=fhistoInvMass->GetBinWidth(1);
   //cout<<"fNbin = "<<fNbin<<endl;
   if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
 
@@ -1044,7 +1067,7 @@ Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
   //if only signal and reflection: skip
   if (!(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn==1)) {
     ftypeOfFit4Sgn=0;
-    fhistoInvMass->Fit(bkgname.Data(),"R,L,E,0");
+    fhistoInvMass->Fit(bkgname.Data(),Form("R,%sE,0",fFitOption.Data()));
    
     for(Int_t i=0;i<bkgPar;i++){
       fFitPars[i]=funcbkg->GetParameter(i);
@@ -1078,7 +1101,7 @@ Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
 
     funcbkg1->SetLineColor(2); //red
 
- switch (ftypeOfFit4Bkg) {
   switch (ftypeOfFit4Bkg) {
     case 0:
        {
         cout<<"*** Exponential Fit ***"<<endl;
@@ -1124,10 +1147,10 @@ Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
        }
         break;
     }
-      //cout<<"Parameters set to: "<<0.5*(totInt-intbkg1)<<"\t"<<fMass<<"\t"<<ffactor*fSigmaSgn<<"\t"<<intbkg1<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<endl;
-      //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<bkgPar<<"\tgsidebands = "<<fSideBands<<endl;
+    //cout<<"Parameters set to: "<<0.5*(totInt-intbkg1)<<"\t"<<fMass<<"\t"<<ffactor*fSigmaSgn<<"\t"<<intbkg1<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<endl;
+    //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<bkgPar<<"\tgsidebands = "<<fSideBands<<endl;
 
-    Int_t status=fhistoInvMass->Fit(bkg1name.Data(),"R,L,E,+,0");
+    Int_t status=fhistoInvMass->Fit(bkg1name.Data(),Form("R,%sE,+,0",fFitOption.Data()));
     if (status != 0){
       cout<<"Minuit returned "<<status<<endl;
       return kFALSE;
@@ -1242,7 +1265,7 @@ Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
 
   Int_t status;
 
-  status = fhistoInvMass->Fit(massname.Data(),"R,L,E,+,0");
+  status = fhistoInvMass->Fit(massname.Data(),Form("R,%sE,+,0",fFitOption.Data()));
   if (status != 0){
     cout<<"Minuit returned "<<status<<endl;
     return kFALSE;
@@ -1251,8 +1274,12 @@ Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
   cout<<"fit done"<<endl;
   //reset value of fMass and fSigmaSgn to those found from fit
   fMass=funcmass->GetParameter(fNFinalPars-2);
+  fMassErr=funcmass->GetParError(fNFinalPars-2);
   fSigmaSgn=funcmass->GetParameter(fNFinalPars-1);
-  
+  fSigmaSgnErr=funcmass->GetParError(fNFinalPars-1);
+  fRawYield=funcmass->GetParameter(fNFinalPars-3)/fhistoInvMass->GetBinWidth(1);
+  fRawYieldErr=funcmass->GetParError(fNFinalPars-3)/fhistoInvMass->GetBinWidth(1);
+
   for(Int_t i=0;i<fNFinalPars;i++){
     fFitPars[i+2*bkgPar-3]=funcmass->GetParameter(i);
     fFitPars[fNFinalPars+4*bkgPar-6+i]= funcmass->GetParError(i);
@@ -1391,7 +1418,7 @@ Bool_t AliHFMassFitter::RefitWithBkgOnly(Bool_t draw){
   }
 
 
-  Int_t status=fhistoInvMass->Fit(bkgname.Data(),"R,L,E,+,0");
+  Int_t status=fhistoInvMass->Fit(bkgname.Data(),Form("R,%sE,+,0",fFitOption.Data()));
   if (status != 0){
     cout<<"Minuit returned "<<status<<endl;
     return kFALSE;
@@ -1767,7 +1794,7 @@ void AliHFMassFitter::PlotFit(TVirtualPad* pd,Double_t nsigma,Int_t writeFitInfo
     pinfo2->AddText(str);
     str=Form("B (%.0f#sigma) %.0f #pm %.0f",nsigma,bkg,errbkg);
     pinfo2->AddText(str);
-    str=Form("S/B (%.0f#sigma) %.4f ",nsigma,signal/bkg);
+    if(bkg>0) str=Form("S/B (%.0f#sigma) %.4f ",nsigma,signal/bkg); 
     pinfo2->AddText(str);
 
     pd->cd();
@@ -2004,6 +2031,11 @@ void AliHFMassFitter::Significance(Double_t nOfSigma,Double_t &significance,Doub
 void AliHFMassFitter::Significance(Double_t min, Double_t max, Double_t &significance,Double_t &errsignificance) const {
   // Return significance integral in a range
 
+  if(fcounter==0){
+    AliError("Number of fits is zero, check whether you made the fit before computing the significance!\n");
+    return;
+  }
+
   Double_t signal,errsignal,background,errbackground;
   Signal(min, max,signal,errsignal);
   Background(min, max,background,errbackground);