1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 /////////////////////////////////////////////////////////////
20 // AliHFMassFitter for the fit of invariant mass distribution
23 // Author: C.Bianchin, chiara.bianchin@pd.infn.it
24 /////////////////////////////////////////////////////////////
26 #include <Riostream.h>
34 #include <TVirtualPad.h>
36 #include <TVirtualFitter.h>
39 #include <TPaveText.h>
40 #include <TDatabasePDG.h>
42 #include "AliHFMassFitter.h"
43 #include "AliVertexingHFUtils.h"
49 ClassImp(AliHFMassFitter)
51 //************** constructors
52 AliHFMassFitter::AliHFMassFitter() :
64 ftypeOfFit4Bkg(kExpo),
65 ftypeOfFit4Sgn(kGaus),
82 // default constructor
84 cout<<"Default constructor:"<<endl;
85 cout<<"Remember to set the Histo, the Type, the FixPar"<<endl;
89 //___________________________________________________________________________
91 AliHFMassFitter::AliHFMassFitter (const TH1F *histoToFit, Double_t minvalue, Double_t maxvalue, Int_t rebin, Int_t fittypeb, Int_t fittypes):
103 ftypeOfFit4Bkg(kExpo),
104 ftypeOfFit4Sgn(kGaus),
121 // standard constructor
123 fhistoInvMass= (TH1F*)histoToFit->Clone("fhistoInvMass");
124 fhistoInvMass->SetDirectory(0);
127 if(rebin!=1) RebinMass(rebin);
128 else fNbin=(Int_t)fhistoInvMass->GetNbinsX();
130 ftypeOfFit4Bkg=fittypeb;
131 ftypeOfFit4Sgn=fittypes;
132 if(ftypeOfFit4Bkg!=0 && ftypeOfFit4Bkg!=1 && ftypeOfFit4Bkg!=2 && ftypeOfFit4Bkg!=4 && ftypeOfFit4Bkg!=5) fWithBkg=kFALSE;
134 if (!fWithBkg) cout<<"Fit Histogram of Signal only"<<endl;
135 else cout<<"Type of fit For Background = "<<ftypeOfFit4Bkg<<endl;
138 fFitPars=new Float_t[fParsSize];
140 SetDefaultFixParam();
142 fContourGraph=new TList();
143 fContourGraph->SetOwner();
148 AliHFMassFitter::AliHFMassFitter(const AliHFMassFitter &mfit):
150 fhistoInvMass(mfit.fhistoInvMass),
151 fminMass(mfit.fminMass),
152 fmaxMass(mfit.fmaxMass),
153 fminBinMass(mfit.fminBinMass),
154 fmaxBinMass(mfit.fmaxBinMass),
156 fParsSize(mfit.fParsSize),
157 fNFinalPars(mfit.fNFinalPars),
159 fWithBkg(mfit.fWithBkg),
160 ftypeOfFit4Bkg(mfit.ftypeOfFit4Bkg),
161 ftypeOfFit4Sgn(mfit.ftypeOfFit4Sgn),
162 ffactor(mfit.ffactor),
163 fntuParam(mfit.fntuParam),
165 fMassErr(mfit.fMassErr),
166 fSigmaSgn(mfit.fSigmaSgn),
167 fSigmaSgnErr(mfit.fSigmaSgnErr),
168 fRawYield(mfit.fRawYield),
169 fRawYieldErr(mfit.fRawYieldErr),
170 fSideBands(mfit.fSideBands),
172 fSideBandl(mfit.fSideBandl),
173 fSideBandr(mfit.fSideBandr),
174 fcounter(mfit.fcounter),
175 fFitOption(mfit.fFitOption),
176 fContourGraph(mfit.fContourGraph)
180 if(mfit.fParsSize > 0){
181 fFitPars=new Float_t[fParsSize];
182 fFixPar=new Bool_t[fNFinalPars];
183 memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
184 memcpy(fFixPar,mfit.fFixPar,mfit.fNFinalPars*sizeof(Bool_t));
189 //_________________________________________________________________________
191 AliHFMassFitter::~AliHFMassFitter() {
195 cout<<"AliHFMassFitter destructor called"<<endl;
197 delete fhistoInvMass;
208 //_________________________________________________________________________
210 AliHFMassFitter& AliHFMassFitter::operator=(const AliHFMassFitter &mfit){
212 //assignment operator
214 if(&mfit == this) return *this;
215 fhistoInvMass= mfit.fhistoInvMass;
216 fminMass= mfit.fminMass;
217 fmaxMass= mfit.fmaxMass;
219 fParsSize= mfit.fParsSize;
220 fWithBkg= mfit.fWithBkg;
221 ftypeOfFit4Bkg= mfit.ftypeOfFit4Bkg;
222 ftypeOfFit4Sgn= mfit.ftypeOfFit4Sgn;
223 ffactor= mfit.ffactor;
224 fntuParam= mfit.fntuParam;
226 fMassErr= mfit.fMassErr;
227 fSigmaSgn= mfit.fSigmaSgn;
228 fSigmaSgnErr= mfit.fSigmaSgnErr;
229 fRawYield= mfit.fRawYield;
230 fRawYieldErr= mfit.fRawYieldErr;
231 fSideBands= mfit.fSideBands;
232 fSideBandl= mfit.fSideBandl;
233 fSideBandr= mfit.fSideBandr;
234 fFitOption= mfit.fFitOption;
235 fcounter= mfit.fcounter;
236 fContourGraph= mfit.fContourGraph;
238 if(mfit.fParsSize > 0){
241 fFitPars=new Float_t[fParsSize];
242 memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
246 fFixPar=new Bool_t[fNFinalPars];
247 memcpy(fFixPar,mfit.fFixPar,mfit.fNFinalPars*sizeof(Float_t));
253 //************ tools & settings
255 //__________________________________________________________________________
257 void AliHFMassFitter::ComputeNFinalPars() {
259 //compute the number of parameters of the total (signal+bgk) function
260 cout<<"Info:ComputeNFinalPars... ";
261 switch (ftypeOfFit4Bkg) {//npar background func
281 cout<<"Error in computing fNFinalPars: check ftypeOfFit4Bkg"<<endl;
285 fNFinalPars+=3; //gaussian signal
286 cout<<": "<<fNFinalPars<<endl;
288 //__________________________________________________________________________
290 void AliHFMassFitter::ComputeParSize() {
292 //compute the size of the parameter array and set the data member
294 switch (ftypeOfFit4Bkg) {//npar background func
314 cout<<"Error in computing fParsSize: check ftypeOfFit4Bkg"<<endl;
318 fParsSize += 3; // npar refl
319 fParsSize += 3; // npar signal gaus
321 fParsSize*=2; // add errors
322 cout<<"Parameters array size "<<fParsSize<<endl;
325 //___________________________________________________________________________
326 void AliHFMassFitter::SetDefaultFixParam(){
328 //Set default values for fFixPar (only total integral fixed)
331 fFixPar=new Bool_t[fNFinalPars];
333 fFixPar[0]=kTRUE; //default: IntTot fixed
334 cout<<"Parameter 0 is fixed"<<endl;
335 for(Int_t i=1;i<fNFinalPars;i++){
341 //___________________________________________________________________________
342 Bool_t AliHFMassFitter::SetFixThisParam(Int_t thispar,Bool_t fixpar){
344 //set the value (kFALSE or kTRUE) of one element of fFixPar
345 //return kFALSE if something wrong
347 if(thispar>=fNFinalPars) {
348 AliError(Form("Error! Parameter out of bounds! Max is %d\n",fNFinalPars-1));
352 cout<<"Initializing fFixPar...";
353 SetDefaultFixParam();
354 cout<<" done."<<endl;
357 fFixPar[thispar]=fixpar;
358 if(fixpar)cout<<"Parameter "<<thispar<<" is now fixed"<<endl;
359 else cout<<"Parameter "<<thispar<<" is now free"<<endl;
363 //___________________________________________________________________________
364 Bool_t AliHFMassFitter::GetFixThisParam(Int_t thispar)const{
365 //return the value of fFixPar[thispar]
366 if(thispar>=fNFinalPars) {
367 AliError(Form("Error! Parameter out of bounds! Max is %d\n",fNFinalPars-1));
371 AliError("Error! Parameters to be fixed still not set");
375 return fFixPar[thispar];
379 //___________________________________________________________________________
380 void AliHFMassFitter::SetHisto(const TH1F *histoToFit){
382 fhistoInvMass = new TH1F(*histoToFit);
383 fhistoInvMass->SetDirectory(0);
384 //cout<<"SetHisto pointer "<<fhistoInvMass<<endl;
387 //___________________________________________________________________________
389 void AliHFMassFitter::SetType(Int_t fittypeb, Int_t fittypes) {
391 //set the type of fit to perform for signal and background
393 ftypeOfFit4Bkg = fittypeb;
394 ftypeOfFit4Sgn = fittypes;
397 fFitPars = new Float_t[fParsSize];
399 SetDefaultFixParam();
402 //___________________________________________________________________________
404 void AliHFMassFitter::Reset() {
406 //delete the histogram and reset the mean and sigma to default
408 cout<<"Reset called: delete histogram, set mean value to 1.85 and sigma to 0.012"<<endl;
411 cout<<"Reset "<<fhistoInvMass<<endl;
412 delete fhistoInvMass;
415 //_________________________________________________________________________
417 void AliHFMassFitter::InitNtuParam(TString ntuname) {
419 // Create ntuple to keep fit parameters
422 fntuParam=new TNtuple(ntuname.Data(),"Contains fit parameters","intbkg1:slope1:conc1:intGB:meanGB:sigmaGB:intbkg2:slope2:conc2:inttot:slope3:conc3:intsgn:meansgn:sigmasgn:intbkg1Err:slope1Err:conc1Err:intGBErr:meanGBErr:sigmaGBErr:intbkg2Err:slope2Err:conc2Err:inttotErr:slope3Err:conc3Err:intsgnErr:meansgnErr:sigmasgnErr");
426 //_________________________________________________________________________
428 void AliHFMassFitter::FillNtuParam() {
429 // Fill ntuple with fit parameters
433 if (ftypeOfFit4Bkg==2) {
434 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
435 fntuParam->SetBranchAddress("slope1",&fFitPars[1]);
436 fntuParam->SetBranchAddress("conc1",&fFitPars[2]);
437 fntuParam->SetBranchAddress("intGB",&fFitPars[3]);
438 fntuParam->SetBranchAddress("meanGB",&fFitPars[4]);
439 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[5]);
440 fntuParam->SetBranchAddress("intbkg2",&fFitPars[6]);
441 fntuParam->SetBranchAddress("slope2",&fFitPars[7]);
442 fntuParam->SetBranchAddress("conc2",&fFitPars[8]);
443 fntuParam->SetBranchAddress("inttot",&fFitPars[9]);
444 fntuParam->SetBranchAddress("slope3",&fFitPars[10]);
445 fntuParam->SetBranchAddress("conc3",&fFitPars[11]);
446 fntuParam->SetBranchAddress("intsgn",&fFitPars[12]);
447 fntuParam->SetBranchAddress("meansgn",&fFitPars[13]);
448 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[14]);
450 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[15]);
451 fntuParam->SetBranchAddress("slope1Err",&fFitPars[16]);
452 fntuParam->SetBranchAddress("conc1Err",&fFitPars[17]);
453 fntuParam->SetBranchAddress("intGBErr",&fFitPars[18]);
454 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[19]);
455 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[20]);
456 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[21]);
457 fntuParam->SetBranchAddress("slope2Err",&fFitPars[22]);
458 fntuParam->SetBranchAddress("conc2Err",&fFitPars[23]);
459 fntuParam->SetBranchAddress("inttotErr",&fFitPars[24]);
460 fntuParam->SetBranchAddress("slope3Err",&fFitPars[25]);
461 fntuParam->SetBranchAddress("conc3Err",&fFitPars[26]);
462 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[27]);
463 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[28]);
464 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[29]);
468 if(ftypeOfFit4Bkg==3){
469 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
470 fntuParam->SetBranchAddress("slope1",¬hing);
471 fntuParam->SetBranchAddress("conc1",¬hing);
472 fntuParam->SetBranchAddress("intGB",&fFitPars[1]);
473 fntuParam->SetBranchAddress("meanGB",&fFitPars[2]);
474 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[3]);
475 fntuParam->SetBranchAddress("intbkg2",&fFitPars[4]);
476 fntuParam->SetBranchAddress("slope2",¬hing);
477 fntuParam->SetBranchAddress("conc2",¬hing);
478 fntuParam->SetBranchAddress("inttot",&fFitPars[6]);
479 fntuParam->SetBranchAddress("slope3",¬hing);
480 fntuParam->SetBranchAddress("conc3",¬hing);
481 fntuParam->SetBranchAddress("intsgn",&fFitPars[6]);
482 fntuParam->SetBranchAddress("meansgn",&fFitPars[7]);
483 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[8]);
485 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[9]);
486 fntuParam->SetBranchAddress("slope1Err",¬hing);
487 fntuParam->SetBranchAddress("conc1Err",¬hing);
488 fntuParam->SetBranchAddress("intGBErr",&fFitPars[10]);
489 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[11]);
490 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[12]);
491 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[13]);
492 fntuParam->SetBranchAddress("slope2Err",¬hing);
493 fntuParam->SetBranchAddress("conc2Err",¬hing);
494 fntuParam->SetBranchAddress("inttotErr",&fFitPars[15]);
495 fntuParam->SetBranchAddress("slope3Err",¬hing);
496 fntuParam->SetBranchAddress("conc3Err",¬hing);
497 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[15]);
498 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[16]);
499 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[17]);
503 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
504 fntuParam->SetBranchAddress("slope1",&fFitPars[1]);
505 fntuParam->SetBranchAddress("conc1",¬hing);
506 fntuParam->SetBranchAddress("intGB",&fFitPars[2]);
507 fntuParam->SetBranchAddress("meanGB",&fFitPars[3]);
508 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[4]);
509 fntuParam->SetBranchAddress("intbkg2",&fFitPars[5]);
510 fntuParam->SetBranchAddress("slope2",&fFitPars[6]);
511 fntuParam->SetBranchAddress("conc2",¬hing);
512 fntuParam->SetBranchAddress("inttot",&fFitPars[7]);
513 fntuParam->SetBranchAddress("slope3",&fFitPars[8]);
514 fntuParam->SetBranchAddress("conc3",¬hing);
515 fntuParam->SetBranchAddress("intsgn",&fFitPars[9]);
516 fntuParam->SetBranchAddress("meansgn",&fFitPars[10]);
517 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[11]);
519 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[12]);
520 fntuParam->SetBranchAddress("slope1Err",&fFitPars[13]);
521 fntuParam->SetBranchAddress("conc1Err",¬hing);
522 fntuParam->SetBranchAddress("intGBErr",&fFitPars[14]);
523 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[15]);
524 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[16]);
525 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[17]);
526 fntuParam->SetBranchAddress("slope2Err",&fFitPars[18]);
527 fntuParam->SetBranchAddress("conc2Err",¬hing);
528 fntuParam->SetBranchAddress("inttotErr",&fFitPars[19]);
529 fntuParam->SetBranchAddress("slope3Err",&fFitPars[20]);
530 fntuParam->SetBranchAddress("conc3Err",¬hing);
531 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[21]);
532 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[22]);
533 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[23]);
537 fntuParam->TTree::Fill();
540 //_________________________________________________________________________
542 TNtuple* AliHFMassFitter::NtuParamOneShot(TString ntuname){
543 // Create, fill and return ntuple with fit parameters
545 InitNtuParam(ntuname.Data());
549 //_________________________________________________________________________
551 void AliHFMassFitter::RebinMass(Int_t bingroup){
552 // Rebin invariant mass histogram
555 AliError("Histogram not set!!");
558 Int_t nbinshisto=fhistoInvMass->GetNbinsX();
560 cout<<"Error! Cannot group "<<bingroup<<" bins\n";
562 cout<<"Kept original number of bins: "<<fNbin<<endl;
565 while(nbinshisto%bingroup != 0) {
568 cout<<"Group "<<bingroup<<" bins"<<endl;
569 fhistoInvMass->Rebin(bingroup);
570 fNbin = fhistoInvMass->GetNbinsX();
571 cout<<"New number of bins: "<<fNbin<<endl;
578 //___________________________________________________________________________
580 Double_t AliHFMassFitter::FitFunction4MassDistr (Double_t *x, Double_t *par){
581 // Fit function for signal+background
584 //exponential or linear fit
586 // par[0] = tot integral
588 // par[2] = gaussian integral
589 // par[3] = gaussian mean
590 // par[4] = gaussian sigma
592 Double_t total,bkg=0,sgn=0;
594 if (ftypeOfFit4Bkg==0 || ftypeOfFit4Bkg==1) {
595 if(ftypeOfFit4Sgn == 0) {
597 Double_t parbkg[2] = {par[0]-par[2], par[1]};
598 bkg = FitFunction4Bkg(x,parbkg);
600 if(ftypeOfFit4Sgn == 1) {
601 Double_t parbkg[5] = {par[2],par[3],ffactor*par[4],par[0]-2*par[2], par[1]};
602 bkg = FitFunction4Bkg(x,parbkg);
605 sgn = FitFunction4Sgn(x,&par[2]);
611 // par[0] = tot integral
614 // par[3] = gaussian integral
615 // par[4] = gaussian mean
616 // par[5] = gaussian sigma
618 if (ftypeOfFit4Bkg==2) {
620 if(ftypeOfFit4Sgn == 0) {
622 Double_t parbkg[3] = {par[0]-par[3], par[1], par[2]};
623 bkg = FitFunction4Bkg(x,parbkg);
625 if(ftypeOfFit4Sgn == 1) {
627 Double_t parbkg[6] = {par[3],par[4],ffactor*par[5],par[0]-2*par[3], par[1], par[2]};
628 bkg = FitFunction4Bkg(x,parbkg);
631 sgn = FitFunction4Sgn(x,&par[3]);
634 if (ftypeOfFit4Bkg==3) {
636 if(ftypeOfFit4Sgn == 0) {
637 bkg=FitFunction4Bkg(x,par);
638 sgn=FitFunction4Sgn(x,&par[1]);
640 if(ftypeOfFit4Sgn == 1) {
641 Double_t parbkg[4]={par[1],par[2],ffactor*par[3],par[0]};
642 bkg=FitFunction4Bkg(x,parbkg);
643 sgn=FitFunction4Sgn(x,&par[1]);
649 // par[0] = tot integral
651 // par[2] = gaussian integral
652 // par[3] = gaussian mean
653 // par[4] = gaussian sigma
655 if (ftypeOfFit4Bkg==4) {
657 if(ftypeOfFit4Sgn == 0) {
659 Double_t parbkg[2] = {par[0]-par[2], par[1]};
660 bkg = FitFunction4Bkg(x,parbkg);
662 if(ftypeOfFit4Sgn == 1) {
664 Double_t parbkg[5] = {par[2],par[3],ffactor*par[4],par[0]-par[2], par[1]};
665 bkg = FitFunction4Bkg(x,parbkg);
667 sgn = FitFunction4Sgn(x,&par[2]);
671 //Power and exponential fit
673 // par[0] = tot integral
676 // par[3] = gaussian integral
677 // par[4] = gaussian mean
678 // par[5] = gaussian sigma
680 if (ftypeOfFit4Bkg==5) {
682 if(ftypeOfFit4Sgn == 0) {
683 Double_t parbkg[3] = {par[0]-par[3],par[1],par[2]};
684 bkg = FitFunction4Bkg(x,parbkg);
686 if(ftypeOfFit4Sgn == 1) {
687 Double_t parbkg[6] = {par[3],par[4],ffactor*par[5],par[0]-par[3], par[1], par[2]};
688 bkg = FitFunction4Bkg(x,parbkg);
690 sgn = FitFunction4Sgn(x,&par[3]);
698 //_________________________________________________________________________
699 Double_t AliHFMassFitter::FitFunction4Sgn (Double_t *x, Double_t *par){
700 // Fit function for the signal
702 //gaussian = A/(sigma*sqrt(2*pi))*exp(-(x-mean)^2/2/sigma^2)
704 // * [0] = integralSgn
707 //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
709 // AliInfo("Signal function set to: Gaussian");
710 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]);
714 //__________________________________________________________________________
716 Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
717 // Fit function for the background
719 Double_t maxDeltaM = 4.*fSigmaSgn;
720 if(fSideBands && TMath::Abs(x[0]-fMass) < maxDeltaM) {
725 Double_t gaus2=0,total=-1;
726 if(ftypeOfFit4Sgn == 1){
728 //gaussian = A/(sigma*sqrt(2*pi))*exp(-(x-mean)^2/2/sigma^2)
730 // * [0] = integralSgn
733 //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
734 gaus2 = FitFunction4Sgn(x,par);
737 switch (ftypeOfFit4Bkg){
740 //exponential = A*exp(B*x) -> integral(exponential)=A/B*exp(B*x)](min,max)
741 //-> A = B*integral/(exp(B*max)-exp(B*min)) where integral can be written
742 //as integralTot- integralGaus (=par [2])
744 // * [0] = integralBkg;
746 //exponential = [1]*[0]/(exp([1]*max)-exp([1]*min))*exp([1]*x)
747 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]);
748 // AliInfo("Background function set to: exponential");
752 //y=a+b*x -> integral = a(max-min)+1/2*b*(max^2-min^2) -> a = (integral-1/2*b*(max^2-min^2))/(max-min)=integral/(max-min)-1/2*b*(max+min)
753 // * [0] = integralBkg;
755 total= par[0+firstPar]/(fmaxMass-fminMass)+par[1+firstPar]*(x[0]-0.5*(fmaxMass+fminMass));
756 // AliInfo("Background function set to: linear");
760 //y=a+b*x+c*x**2 -> integral = a(max-min) + 1/2*b*(max^2-min^2) +
761 //+ 1/3*c*(max^3-min^3) ->
762 //a = (integral-1/2*b*(max^2-min^2)-1/3*c*(max^3-min^3))/(max-min)
763 // * [0] = integralBkg;
766 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));
767 // AliInfo("Background function set to: polynomial");
770 total=par[0+firstPar];
774 //y=a(x-m_pi)^b -> integral = a/(b+1)*((max-m_pi)^(b+1)-(min-m_pi)^(b+1))
776 //a = integral*(b+1)/((max-m_pi)^(b+1)-(min-m_pi)^(b+1))
777 // * [0] = integralBkg;
779 // a(power function) = [0]*([1]+1)/((max-m_pi)^([1]+1)-(min-m_pi)^([1]+1))*(x-m_pi)^[1]
781 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
783 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]);
784 // AliInfo("Background function set to: powerlaw");
788 //power function wit exponential
789 //y=a*Sqrt(x-m_pi)*exp(-b*(x-m_pi))
791 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
793 total = par[1+firstPar]*TMath::Sqrt(x[0] - mpi)*TMath::Exp(-1.*par[2+firstPar]*(x[0]-mpi));
794 // AliInfo("Background function set to: wit exponential");
798 // Types of Fit Functions for Background:
799 // * 0 = exponential;
801 // * 2 = polynomial 2nd order
802 // * 3 = no background"<<endl;
803 // * 4 = Power function
804 // * 5 = Power function with exponential
810 //__________________________________________________________________________
811 Bool_t AliHFMassFitter::SideBandsBounds(){
813 //determines the ranges of the side bands
815 if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
816 Double_t minHisto=fhistoInvMass->GetBinLowEdge(1);
817 Double_t maxHisto=fhistoInvMass->GetBinLowEdge(fNbin+1);
819 Double_t sidebandldouble=0.,sidebandrdouble=0.;
821 if(fMass-fminMass < 0 || fmaxMass-fMass <0) {
822 AliError("Left limit of range > mean or right limit of range < mean: change left/right limit or initial mean value");
826 //histo limit = fit function limit
827 if((TMath::Abs(fminMass-minHisto) < 1e-6 || TMath::Abs(fmaxMass - maxHisto) < 1e-6) && (fMass-4.*fSigmaSgn-fminMass) < 1e-6){
828 Double_t coeff = (fMass-fminMass)/fSigmaSgn;
829 sidebandldouble=(fMass-0.5*coeff*fSigmaSgn);
830 sidebandrdouble=(fMass+0.5*coeff*fSigmaSgn);
831 cout<<"Changed number of sigma from 4 to "<<0.5*coeff<<" for the estimation of the side bands"<<endl;
832 if (coeff<3) cout<<"Side bands inside 3 sigma, may be better use ftypeOfFit4Bkg = 3 (only signal)"<<endl;
834 cout<<"Side bands inside 2 sigma. Change mode: ftypeOfFit4Bkg = 3"<<endl;
836 //set binleft and right without considering SetRangeFit- anyway no bkg!
837 sidebandldouble=(fMass-4.*fSigmaSgn);
838 sidebandrdouble=(fMass+4.*fSigmaSgn);
842 sidebandldouble=(fMass-4.*fSigmaSgn);
843 sidebandrdouble=(fMass+4.*fSigmaSgn);
846 cout<<"Left side band ";
849 //calculate bin corresponding to fSideBandl
850 fSideBandl=fhistoInvMass->FindBin(sidebandldouble);
851 if (sidebandldouble >= fhistoInvMass->GetBinCenter(fSideBandl)) fSideBandl++;
852 sidebandldouble=fhistoInvMass->GetBinLowEdge(fSideBandl);
854 if(TMath::Abs(tmp-sidebandldouble) > 1e-6){
855 cout<<tmp<<" is not allowed, changing it to the nearest value allowed: ";
857 cout<<sidebandldouble<<" (bin "<<fSideBandl<<")"<<endl;
859 cout<<"Right side band ";
861 //calculate bin corresponding to fSideBandr
862 fSideBandr=fhistoInvMass->FindBin(sidebandrdouble);
863 if (sidebandrdouble < fhistoInvMass->GetBinCenter(fSideBandr)) fSideBandr--;
864 sidebandrdouble=fhistoInvMass->GetBinLowEdge(fSideBandr+1);
866 if(TMath::Abs(tmp-sidebandrdouble) > 1e-6){
867 AliWarning(Form("%f is not allowed, changing it to the nearest value allowed: \n",tmp));
869 cout<<sidebandrdouble<<" (bin "<<fSideBandr<<")"<<endl;
870 if (fSideBandl==0 || fSideBandr==fNbin) {
871 AliError("Error! Range too little");
877 //__________________________________________________________________________
879 void AliHFMassFitter::GetSideBandsBounds(Int_t &left, Int_t &right) const{
881 // get the range of the side bands
883 if (fSideBandl==0 && fSideBandr==0){
884 cout<<"Use MassFitter method first"<<endl;
891 //__________________________________________________________________________
892 Bool_t AliHFMassFitter::CheckRangeFit(){
893 //check if the limit of the range correspond to the limit of bins. If not reset the limit to the nearer value which satisfy this condition
895 if (!fhistoInvMass) {
896 cout<<"No histogram to fit! SetHisto(TH1F* h) before! "<<endl;
899 Bool_t leftok=kFALSE, rightok=kFALSE;
900 Int_t nbins=fhistoInvMass->GetNbinsX();
901 Double_t minhisto=fhistoInvMass->GetBinLowEdge(1), maxhisto=fhistoInvMass->GetBinLowEdge(nbins+1);
903 //check if limits are inside histogram range
905 if( fminMass-minhisto < 0. ) {
906 cout<<"Out of histogram left bound! Setting to "<<minhisto<<endl;
909 if( fmaxMass-maxhisto > 0. ) {
910 cout<<"Out of histogram right bound! Setting to"<<maxhisto<<endl;
916 //calculate bin corresponding to fminMass
917 fminBinMass=fhistoInvMass->FindBin(fminMass);
918 if (fminMass >= fhistoInvMass->GetBinCenter(fminBinMass)) fminBinMass++;
919 fminMass=fhistoInvMass->GetBinLowEdge(fminBinMass);
920 if(TMath::Abs(tmp-fminMass) > 1e-6){
921 cout<<"Left bound "<<tmp<<" is not allowed, changing it to the nearest value allowed: "<<fminMass<<endl;
926 //calculate bin corresponding to fmaxMass
927 fmaxBinMass=fhistoInvMass->FindBin(fmaxMass);
928 if (fmaxMass < fhistoInvMass->GetBinCenter(fmaxBinMass)) fmaxBinMass--;
929 fmaxMass=fhistoInvMass->GetBinLowEdge(fmaxBinMass+1);
930 if(TMath::Abs(tmp-fmaxMass) > 1e-6){
931 cout<<"Right bound "<<tmp<<" is not allowed, changing it to the nearest value allowed: "<<fmaxMass<<endl;
935 return (leftok && rightok);
939 //__________________________________________________________________________
941 Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
942 // Main method of the class: performs the fit of the histogram
944 //Set default fitter Minuit in order to use gMinuit in the contour plots
945 TVirtualFitter::SetDefaultFitter("Minuit");
948 Bool_t isBkgOnly=kFALSE;
950 Int_t fit1status=RefitWithBkgOnly(kFALSE);
952 Int_t checkinnsigma=4;
953 Double_t range[2]={fMass-checkinnsigma*fSigmaSgn,fMass+checkinnsigma*fSigmaSgn};
954 TF1* func=GetHistoClone()->GetFunction("funcbkgonly");
955 Double_t intUnderFunc=func->Integral(range[0],range[1]);
956 Double_t intUnderHisto=fhistoInvMass->Integral(fhistoInvMass->FindBin(range[0]),fhistoInvMass->FindBin(range[1]),"width");
957 cout<<"Pick zone: IntFunc = "<<intUnderFunc<<"; IntHist = "<<intUnderHisto<<"\tDiff = "<<intUnderHisto-intUnderFunc<<"\tRelDiff = "<<(intUnderHisto-intUnderFunc)/intUnderFunc<<endl;
958 Double_t diffUnderPick=(intUnderHisto-intUnderFunc);
959 intUnderFunc=func->Integral(fminMass,fminMass+checkinnsigma*fSigmaSgn);
960 intUnderHisto=fhistoInvMass->Integral(fhistoInvMass->FindBin(fminMass),fhistoInvMass->FindBin(fminMass+checkinnsigma*fSigmaSgn),"width");
961 cout<<"Band (l) zone: IntFunc = "<<intUnderFunc<<"; IntHist = "<<intUnderHisto<<"\tDiff = "<<intUnderHisto-intUnderFunc<<"\tRelDiff = "<<(intUnderHisto-intUnderFunc)/intUnderFunc<<endl;
962 Double_t diffUnderBands=(intUnderHisto-intUnderFunc);
963 Double_t relDiff=diffUnderPick/diffUnderBands;
964 cout<<"Relative difference = "<<relDiff<<endl;
965 if(TMath::Abs(relDiff) < 0.25) isBkgOnly=kTRUE;
967 cout<<"Relative difference = "<<relDiff<<": I suppose there is some signal, continue with total fit!"<<endl;
971 cout<<"INFO!! The histogram contains only background"<<endl;
974 //increase counter of number of fits done
980 Int_t bkgPar = fNFinalPars-3; //background function's number of parameters
982 cout<<"fNFinalPars = "<<fNFinalPars<<"\tbkgPar = "<<bkgPar<<endl;
985 TString listname="contourplot";
988 fContourGraph=new TList();
989 fContourGraph->SetOwner();
992 fContourGraph->SetName(listname);
996 TString bkgname="funcbkg";
997 TString bkg1name="funcbkg1";
998 TString massname="funcmass";
1001 Double_t totInt = fhistoInvMass->Integral(fminBinMass,fmaxBinMass, "width");
1002 //cout<<"Here tot integral is = "<<totInt<<"; integral in whole range is "<<fhistoInvMass->Integral("width")<<endl;
1004 Double_t width=fhistoInvMass->GetBinWidth(1);
1005 //cout<<"fNbin = "<<fNbin<<endl;
1006 if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
1008 Bool_t ok=SideBandsBounds();
1009 if(!ok) return kFALSE;
1011 //sidebands integral - first approx (from histo)
1012 Double_t sideBandsInt=(Double_t)fhistoInvMass->Integral(1,fSideBandl,"width") + (Double_t)fhistoInvMass->Integral(fSideBandr,fNbin,"width");
1013 cout<<"------nbin = "<<fNbin<<"\twidth = "<<width<<"\tbinleft = "<<fSideBandl<<"\tbinright = "<<fSideBandr<<endl;
1014 cout<<"------sideBandsInt - first approx = "<<sideBandsInt<<endl;
1015 if (sideBandsInt<=0) {
1016 cout<<"! sideBandsInt <=0. There's a problem, cannot start the fit"<<endl;
1023 TF1 *funcbkg = new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,bkgPar,"AliHFMassFitter","FitFunction4Bkg");
1024 cout<<"Function name = "<<funcbkg->GetName()<<endl<<endl;
1026 funcbkg->SetLineColor(2); //red
1028 //first fit for bkg: approx bkgint
1030 switch (ftypeOfFit4Bkg) {
1032 funcbkg->SetParNames("BkgInt","Slope");
1033 funcbkg->SetParameters(sideBandsInt,-2.);
1036 funcbkg->SetParNames("BkgInt","Slope");
1037 funcbkg->SetParameters(sideBandsInt,-100.);
1040 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
1041 funcbkg->SetParameters(sideBandsInt,-10.,5);
1044 if(ftypeOfFit4Sgn==0){
1045 funcbkg->SetParNames("Const");
1046 funcbkg->SetParameter(0,0.);
1047 funcbkg->FixParameter(0,0.);
1051 funcbkg->SetParNames("BkgInt","Coef2");
1052 funcbkg->SetParameters(sideBandsInt,0.5);
1055 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
1056 funcbkg->SetParameters(sideBandsInt, -10., 5.);
1059 cout<<"Wrong choise of ftypeOfFit4Bkg ("<<ftypeOfFit4Bkg<<")"<<endl;
1063 cout<<"\nBACKGROUND FIT - only combinatorial"<<endl;
1064 Int_t ftypeOfFit4SgnBkp=ftypeOfFit4Sgn;
1066 Double_t intbkg1=0,slope1=0,conc1=0;
1067 //if only signal and reflection: skip
1068 if (!(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn==1)) {
1070 fhistoInvMass->Fit(bkgname.Data(),Form("R,%sE,0",fFitOption.Data()));
1072 for(Int_t i=0;i<bkgPar;i++){
1073 fFitPars[i]=funcbkg->GetParameter(i);
1074 //cout<<i<<"\t"<<funcbkg->GetParameter(i)<<"\t";
1075 fFitPars[fNFinalPars+2*bkgPar+3+i]= funcbkg->GetParError(i);
1076 //cout<<fNFinalPars+2*bkgPar+3+i<<"\t"<< funcbkg->GetParError(i)<<endl;
1078 fSideBands = kFALSE;
1079 //intbkg1 = funcbkg->GetParameter(0);
1081 intbkg1 = funcbkg->Integral(fminMass,fmaxMass);
1082 if(ftypeOfFit4Bkg!=3) slope1 = funcbkg->GetParameter(1);
1083 if(ftypeOfFit4Bkg==2) conc1 = funcbkg->GetParameter(2);
1084 if(ftypeOfFit4Bkg==5) conc1 = funcbkg->GetParameter(2);
1087 //cout<<"First fit: \nintbkg1 = "<<intbkg1<<"\t(Compare with par0 = "<<funcbkg->GetParameter(0)<<")\nslope1= "<<slope1<<"\nconc1 = "<<conc1<<endl;
1089 else cout<<"\t\t//"<<endl;
1091 ftypeOfFit4Sgn=ftypeOfFit4SgnBkp;
1093 if (ftypeOfFit4Sgn == 1) {
1094 cout<<"\nBACKGROUND FIT WITH REFLECTION"<<endl;
1097 //cout<<"fNFinalPars = "<<fNFinalPars<<"\tbkgPar = "<<bkgPar<<endl;
1099 funcbkg1 = new TF1(bkg1name.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,bkgPar,"AliHFMassFitter","FitFunction4Bkg");
1100 cout<<"Function name = "<<funcbkg1->GetName()<<endl;
1102 funcbkg1->SetLineColor(2); //red
1104 switch (ftypeOfFit4Bkg) {
1107 cout<<"*** Exponential Fit ***"<<endl;
1108 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Slope");
1109 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1);
1114 cout<<"*** Linear Fit ***"<<endl;
1115 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Slope");
1116 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1);
1121 cout<<"*** Polynomial Fit ***"<<endl;
1122 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Coef1","Coef2");
1123 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1,conc1);
1127 //no background: gaus sign+ gaus broadened
1129 cout<<"*** No background Fit ***"<<endl;
1130 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","Const");
1131 funcbkg1->SetParameters(0.5*totInt,fMass,ffactor*fSigmaSgn,0.);
1132 funcbkg1->FixParameter(3,0.);
1137 cout<<"*** Power function Fit ***"<<endl;
1138 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Coef2");
1139 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1);
1144 cout<<"*** Power function conv. with exponential Fit ***"<<endl;
1145 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Coef1","Coef2");
1146 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1,conc1);
1150 //cout<<"Parameters set to: "<<0.5*(totInt-intbkg1)<<"\t"<<fMass<<"\t"<<ffactor*fSigmaSgn<<"\t"<<intbkg1<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<endl;
1151 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<bkgPar<<"\tgsidebands = "<<fSideBands<<endl;
1153 Int_t status=fhistoInvMass->Fit(bkg1name.Data(),Form("R,%sE,+,0",fFitOption.Data()));
1155 cout<<"Minuit returned "<<status<<endl;
1159 for(Int_t i=0;i<bkgPar;i++){
1160 fFitPars[bkgPar-3+i]=funcbkg1->GetParameter(i);
1161 //cout<<bkgPar-3+i<<"\t"<<funcbkg1->GetParameter(i);
1162 fFitPars[fNFinalPars+3*bkgPar-6+i]= funcbkg1->GetParError(i);
1163 //cout<<"\t"<<fNFinalPars+3*bkgPar-6+i<<"\t"<<funcbkg1->GetParError(i)<<endl;
1166 intbkg1=funcbkg1->GetParameter(3);
1167 if(ftypeOfFit4Bkg!=3) slope1 = funcbkg1->GetParameter(4);
1168 if(ftypeOfFit4Bkg==2) conc1 = funcbkg1->GetParameter(5);
1169 if(ftypeOfFit4Bkg==5) conc1 = funcbkg1->GetParameter(5);
1175 for(Int_t i=0;i<3;i++){
1176 fFitPars[bkgPar-3+i]=0.;
1177 cout<<bkgPar-3+i<<"\t"<<0.<<"\t";
1178 fFitPars[fNFinalPars+3*bkgPar-6+i]= 0.;
1179 cout<<fNFinalPars+3*bkgPar-6+i<<"\t"<<0.<<endl;
1182 for(Int_t i=0;i<bkgPar-3;i++){
1183 fFitPars[bkgPar+i]=funcbkg->GetParameter(i);
1184 cout<<bkgPar+i<<"\t"<<funcbkg->GetParameter(i)<<"\t";
1185 fFitPars[fNFinalPars+3*bkgPar-3+i]= funcbkg->GetParError(i);
1186 cout<<fNFinalPars+3*bkgPar-3+i<<"\t"<< funcbkg->GetParError(i)<<endl;
1192 //sidebands integral - second approx (from fit)
1193 fSideBands = kFALSE;
1195 //cout<<"Compare intbkg1 = "<<intbkg1<<" and integral = ";
1196 if(ftypeOfFit4Sgn == 1) bkgInt=funcbkg1->Integral(fminMass,fmaxMass);
1197 else bkgInt=funcbkg->Integral(fminMass,fmaxMass);
1198 //cout<</*"------BkgInt(Fit) = "<<*/bkgInt<<endl;
1200 //Signal integral - first approx
1202 sgnInt = totInt-bkgInt;
1203 //cout<<"------TotInt = "<<totInt<<"\tsgnInt = "<<sgnInt<<endl;
1205 cout<<"Setting sgnInt = - sgnInt"<<endl;
1208 /*Fit All Mass distribution with exponential + gaussian (+gaussian braodened) */
1209 TF1 *funcmass = new TF1(massname.Data(),this,&AliHFMassFitter::FitFunction4MassDistr,fminMass,fmaxMass,fNFinalPars,"AliHFMassFitter","FitFunction4MassDistr");
1210 cout<<"Function name = "<<funcmass->GetName()<<endl<<endl;
1211 funcmass->SetLineColor(4); //blue
1214 cout<<"\nTOTAL FIT"<<endl;
1217 funcmass->SetParNames("TotInt","Slope","SgnInt","Mean","Sigma");
1218 funcmass->SetParameters(totInt,slope1,sgnInt,fMass,fSigmaSgn);
1220 //cout<<"Parameters set to: "<<totInt<<"\t"<<slope1<<"\t"<<sgnInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
1221 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<fNFinalPars<<"\tgsidebands = "<<fSideBands<<endl;
1223 funcmass->FixParameter(0,totInt);
1226 funcmass->FixParameter(1,slope1);
1229 funcmass->FixParameter(2,sgnInt);
1232 funcmass->FixParameter(3,fMass);
1235 funcmass->FixParameter(4,fSigmaSgn);
1238 if (fNFinalPars==6){
1239 funcmass->SetParNames("TotInt","Coef1","Coef2","SgnInt","Mean","Sigma");
1240 funcmass->SetParameters(totInt,slope1,conc1,sgnInt,fMass,fSigmaSgn);
1242 //cout<<"Parameters set to: "<<totInt<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<sgnInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
1243 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<fNFinalPars<<"\tgsidebands = "<<fSideBands<<endl;
1244 if(fFixPar[0])funcmass->FixParameter(0,totInt);
1245 if(fFixPar[1])funcmass->FixParameter(1,slope1);
1246 if(fFixPar[2])funcmass->FixParameter(2,conc1);
1247 if(fFixPar[3])funcmass->FixParameter(3,sgnInt);
1248 if(fFixPar[4])funcmass->FixParameter(4,fMass);
1249 if(fFixPar[5])funcmass->FixParameter(5,fSigmaSgn);
1251 //funcmass->FixParameter(2,sgnInt);
1254 funcmass->SetParNames("Const","SgnInt","Mean","Sigma");
1255 if(ftypeOfFit4Sgn == 1) funcmass->SetParameters(0.,0.5*totInt,fMass,fSigmaSgn);
1256 else funcmass->SetParameters(0.,totInt,fMass,fSigmaSgn);
1257 if(fFixPar[0]) funcmass->FixParameter(0,0.);
1258 if(fFixPar[1])funcmass->FixParameter(1,sgnInt);
1259 if(fFixPar[2])funcmass->FixParameter(2,fMass);
1260 if(fFixPar[3])funcmass->FixParameter(3,fSigmaSgn);
1261 //cout<<"Parameters set to: "<<0.5*totInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
1262 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<fNFinalPars<<"\tgsidebands = "<<fSideBands<<endl;
1268 status = fhistoInvMass->Fit(massname.Data(),Form("R,%sE,+,0",fFitOption.Data()));
1270 cout<<"Minuit returned "<<status<<endl;
1274 cout<<"fit done"<<endl;
1275 //reset value of fMass and fSigmaSgn to those found from fit
1276 fMass=funcmass->GetParameter(fNFinalPars-2);
1277 fMassErr=funcmass->GetParError(fNFinalPars-2);
1278 fSigmaSgn=funcmass->GetParameter(fNFinalPars-1);
1279 fSigmaSgnErr=funcmass->GetParError(fNFinalPars-1);
1280 fRawYield=funcmass->GetParameter(fNFinalPars-3)/fhistoInvMass->GetBinWidth(1);
1281 fRawYieldErr=funcmass->GetParError(fNFinalPars-3)/fhistoInvMass->GetBinWidth(1);
1283 for(Int_t i=0;i<fNFinalPars;i++){
1284 fFitPars[i+2*bkgPar-3]=funcmass->GetParameter(i);
1285 fFitPars[fNFinalPars+4*bkgPar-6+i]= funcmass->GetParError(i);
1286 //cout<<i+2*bkgPar-3<<"\t"<<funcmass->GetParameter(i)<<"\t\t"<<fNFinalPars+4*bkgPar-6+i<<"\t"<<funcmass->GetParError(i)<<endl;
1289 //check: cout parameters
1290 for(Int_t i=0;i<2*(fNFinalPars+2*bkgPar-3);i++){
1291 cout<<i<<"\t"<<fFitPars[i]<<endl;
1295 if(funcmass->GetParameter(fNFinalPars-1) <0 || funcmass->GetParameter(fNFinalPars-2) <0 || funcmass->GetParameter(fNFinalPars-3) <0 ) {
1296 cout<<"IntS or mean or sigma negative. You may tray to SetInitialGaussianSigma(..) and SetInitialGaussianMean(..)"<<endl;
1300 //increase counter of number of fits done
1306 for (Int_t kpar=1; kpar<fNFinalPars;kpar++){
1308 for(Int_t jpar=kpar+1;jpar<fNFinalPars;jpar++){
1309 cout<<"Par "<<kpar<<" and "<<jpar<<endl;
1311 // produce 2 contours per couple of parameters
1312 TGraph* cont[2] = {0x0, 0x0};
1313 const Double_t errDef[2] = {1., 4.};
1314 for (Int_t i=0; i<2; i++) {
1315 gMinuit->SetErrorDef(errDef[i]);
1316 cont[i] = (TGraph*)gMinuit->Contour(80,kpar,jpar);
1317 cout<<"Minuit Status = "<<gMinuit->GetStatus()<<endl;
1320 if(!cont[0] || !cont[1]){
1321 cout<<"Skipping par "<<kpar<<" vs par "<<jpar<<endl;
1325 // set graph titles and add them to the list
1326 TString title = "Contour plot";
1327 TString titleX = funcmass->GetParName(kpar);
1328 TString titleY = funcmass->GetParName(jpar);
1329 for (Int_t i=0; i<2; i++) {
1330 cont[i]->SetName( Form("cperr%d_%d%d", i, kpar, jpar) );
1331 cont[i]->SetTitle(title);
1332 cont[i]->GetXaxis()->SetTitle(titleX);
1333 cont[i]->GetYaxis()->SetTitle(titleY);
1334 cont[i]->GetYaxis()->SetLabelSize(0.033);
1335 cont[i]->GetYaxis()->SetTitleSize(0.033);
1336 cont[i]->GetYaxis()->SetTitleOffset(1.67);
1338 fContourGraph->Add(cont[i]);
1342 TString cvname = Form("c%d%d", kpar, jpar);
1343 TCanvas *c4=new TCanvas(cvname,cvname,600,600);
1345 cont[1]->SetFillColor(38);
1346 cont[1]->Draw("alf");
1347 cont[0]->SetFillColor(9);
1348 cont[0]->Draw("lf");
1356 if (ftypeOfFit4Sgn == 1) {
1362 AddFunctionsToHisto();
1363 if (draw) DrawFit();
1369 //______________________________________________________________________________
1371 Bool_t AliHFMassFitter::RefitWithBkgOnly(Bool_t draw){
1373 //perform a fit with background function only. Can be useful to try when fit fails to understand if it is because there's no signal
1374 //If you want to change the backgroud function or range use SetType or SetRangeFit before
1376 TString bkgname="funcbkgonly";
1377 fSideBands = kFALSE;
1379 TF1* funcbkg = new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,fNFinalPars-3,"AliHFMassFitter","FitFunction4Bkg");
1381 funcbkg->SetLineColor(kBlue+3); //dark blue
1383 Double_t integral=fhistoInvMass->Integral(fhistoInvMass->FindBin(fminMass),fhistoInvMass->FindBin(fmaxMass),"width");
1385 switch (ftypeOfFit4Bkg) {
1387 funcbkg->SetParNames("BkgInt","Slope");
1388 funcbkg->SetParameters(integral,-2.);
1391 funcbkg->SetParNames("BkgInt","Slope");
1392 funcbkg->SetParameters(integral,-100.);
1395 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
1396 funcbkg->SetParameters(integral,-10.,5);
1399 cout<<"Warning! This choice does not make a lot of sense..."<<endl;
1400 if(ftypeOfFit4Sgn==0){
1401 funcbkg->SetParNames("Const");
1402 funcbkg->SetParameter(0,0.);
1403 funcbkg->FixParameter(0,0.);
1407 funcbkg->SetParNames("BkgInt","Coef1");
1408 funcbkg->SetParameters(integral,0.5);
1411 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
1412 funcbkg->SetParameters(integral,-10.,5.);
1415 cout<<"Wrong choise of ftypeOfFit4Bkg ("<<ftypeOfFit4Bkg<<")"<<endl;
1421 Int_t status=fhistoInvMass->Fit(bkgname.Data(),Form("R,%sE,+,0",fFitOption.Data()));
1423 cout<<"Minuit returned "<<status<<endl;
1426 AddFunctionsToHisto();
1433 //_________________________________________________________________________
1434 Double_t AliHFMassFitter::GetChiSquare() const{
1436 TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass");
1438 cout<<"funcmass not found"<<endl;
1441 return funcmass->GetChisquare();
1444 //_________________________________________________________________________
1445 Double_t AliHFMassFitter::GetReducedChiSquare() const{
1446 //Get reduced Chi^2 method
1447 TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass");
1449 cout<<"funcmass not found"<<endl;
1452 return funcmass->GetChisquare()/funcmass->GetNDF();
1457 //_________________________________________________________________________
1458 void AliHFMassFitter::GetFitPars(Float_t *vector) const {
1459 // Return fit parameters
1461 for(Int_t i=0;i<fParsSize;i++){
1462 vector[i]=fFitPars[i];
1467 //_________________________________________________________________________
1468 void AliHFMassFitter::IntS(Float_t *valuewitherror) const {
1470 //gives the integral of signal obtained from fit parameters
1471 if(!valuewitherror) {
1472 printf("AliHFMassFitter::IntS: got a null pointer\n");
1476 Int_t index=fParsSize/2 - 3;
1477 valuewitherror[0]=fFitPars[index];
1478 index=fParsSize - 3;
1479 valuewitherror[1]=fFitPars[index];
1483 //_________________________________________________________________________
1484 void AliHFMassFitter::AddFunctionsToHisto(){
1486 //Add the background function in the complete range to the list of functions attached to the histogram
1488 //cout<<"AddFunctionsToHisto called"<<endl;
1489 TString bkgname = "funcbkg";
1491 Bool_t done1=kFALSE,done2=kFALSE;
1493 TString bkgnamesave=bkgname;
1494 TString testname=bkgname;
1495 testname += "FullRange";
1496 TF1 *testfunc=(TF1*)fhistoInvMass->FindObject(testname.Data());
1501 testname="funcbkgonly";
1502 testfunc=(TF1*)fhistoInvMass->FindObject(testname.Data());
1509 cout<<"AddFunctionsToHisto already used: exiting...."<<endl;
1513 TList *hlist=fhistoInvMass->GetListOfFunctions();
1517 TF1 *bonly=(TF1*)hlist->FindObject(testname.Data());
1519 cout<<testname.Data()<<" not found looking for complete fit"<<endl;
1521 bonly->SetLineColor(kBlue+3);
1522 hlist->Add((TF1*)bonly->Clone());
1529 TF1 *b=(TF1*)hlist->FindObject(bkgname.Data());
1531 cout<<bkgname<<" not found, cannot produce "<<bkgname<<"FullRange and "<<bkgname<<"Recalc"<<endl;
1535 bkgname += "FullRange";
1536 TF1 *bfullrange=new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,fNFinalPars-3,"AliHFMassFitter","FitFunction4Bkg");
1537 //cout<<bfullrange->GetName()<<endl;
1538 for(Int_t i=0;i<fNFinalPars-3;i++){
1539 bfullrange->SetParName(i,b->GetParName(i));
1540 bfullrange->SetParameter(i,b->GetParameter(i));
1541 bfullrange->SetParError(i,b->GetParError(i));
1543 bfullrange->SetLineStyle(4);
1544 bfullrange->SetLineColor(14);
1546 bkgnamesave += "Recalc";
1548 TF1 *blastpar=new TF1(bkgnamesave.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,fNFinalPars-3,"AliHFMassFitter","FitFunction4Bkg");
1550 TF1 *mass=fhistoInvMass->GetFunction("funcmass");
1553 cout<<"funcmass doesn't exist "<<endl;
1557 //intBkg=intTot-intS
1558 blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(fNFinalPars-3));
1559 blastpar->SetParError(0,mass->GetParError(fNFinalPars-3));
1560 if (fNFinalPars>=5) {
1561 blastpar->SetParameter(1,mass->GetParameter(1));
1562 blastpar->SetParError(1,mass->GetParError(1));
1564 if (fNFinalPars==6) {
1565 blastpar->SetParameter(2,mass->GetParameter(2));
1566 blastpar->SetParError(2,mass->GetParError(2));
1569 blastpar->SetLineStyle(1);
1570 blastpar->SetLineColor(2);
1572 hlist->Add((TF1*)bfullrange->Clone());
1573 hlist->Add((TF1*)blastpar->Clone());
1584 //_________________________________________________________________________
1586 TH1F* AliHFMassFitter::GetHistoClone() const{
1588 TH1F* hout=(TH1F*)fhistoInvMass->Clone(fhistoInvMass->GetName());
1591 //_________________________________________________________________________
1593 void AliHFMassFitter::WriteHisto(TString path) const {
1595 //Write the histogram in the default file HFMassFitterOutput.root
1597 if (fcounter == 0) {
1598 cout<<"Use MassFitter method before WriteHisto"<<endl;
1601 TH1F* hget=(TH1F*)fhistoInvMass->Clone();
1603 path += "HFMassFitterOutput.root";
1606 if (fcounter == 1) output = new TFile(path.Data(),"recreate");
1607 else output = new TFile(path.Data(),"update");
1610 fContourGraph->Write();
1615 cout<<fcounter<<" "<<hget->GetName()<<" written in "<<path<<endl;
1621 //_________________________________________________________________________
1623 void AliHFMassFitter::WriteNtuple(TString path) const{
1624 //TNtuple* nget=(TNtuple*)fntuParam->Clone();
1625 path += "HFMassFitterOutput.root";
1626 TFile *output = new TFile(path.Data(),"update");
1631 //cout<<nget->GetName()<<" written in "<<path<<endl;
1632 cout<<fntuParam->GetName()<<" written in "<<path<<endl;
1643 //_________________________________________________________________________
1644 void AliHFMassFitter::WriteCanvas(TString userIDstring,TString path,Double_t nsigma,Int_t writeFitInfo,Bool_t draw) const{
1646 //write the canvas in a root file
1648 gStyle->SetOptStat(0);
1649 gStyle->SetCanvasColor(0);
1650 gStyle->SetFrameFillColor(0);
1654 switch (ftypeOfFit4Bkg){
1671 type="PowExp"; //3+3
1675 TString filename=Form("%sMassFit.root",type.Data());
1676 filename.Prepend(userIDstring);
1677 path.Append(filename);
1679 TFile* outputcv=new TFile(path.Data(),"update");
1681 TCanvas* c=(TCanvas*)GetPad(nsigma,writeFitInfo);
1682 c->SetName(Form("%s%s%s",c->GetName(),userIDstring.Data(),type.Data()));
1683 if(draw)c->DrawClone();
1689 //_________________________________________________________________________
1691 TVirtualPad* AliHFMassFitter::GetPad(Double_t nsigma,Int_t writeFitInfo)const{
1692 //return a TVirtualPad with the fitted histograms and info
1694 TString cvtitle="fit of ";
1695 cvtitle+=fhistoInvMass->GetName();
1699 TCanvas *c=new TCanvas(cvname,cvtitle);
1700 PlotFit(c->cd(),nsigma,writeFitInfo);
1703 //_________________________________________________________________________
1705 void AliHFMassFitter::PlotFit(TVirtualPad* pd,Double_t nsigma,Int_t writeFitInfo)const{
1706 //plot histogram, fit functions and write parameters according to verbosity level (0,1,>1)
1707 gStyle->SetOptStat(0);
1708 gStyle->SetCanvasColor(0);
1709 gStyle->SetFrameFillColor(0);
1711 cout<<"nsigma = "<<nsigma<<endl;
1712 cout<<"Verbosity = "<<writeFitInfo<<endl;
1714 TH1F* hdraw=GetHistoClone();
1716 if(!hdraw->GetFunction("funcmass") && !hdraw->GetFunction("funcbkgFullRange") && !hdraw->GetFunction("funcbkgRecalc")&& !hdraw->GetFunction("funcbkgonly")){
1717 cout<<"Probably fit failed and you didn't try to refit with background only, there's no function to be drawn"<<endl;
1721 if(hdraw->GetFunction("funcbkgonly")){ //Warning! if this function is present, no chance to draw the other!
1722 cout<<"Drawing background fit only"<<endl;
1723 hdraw->SetMinimum(0);
1724 hdraw->GetXaxis()->SetRangeUser(fminMass,fmaxMass);
1726 hdraw->SetMarkerStyle(20);
1727 hdraw->DrawClone("PE");
1728 hdraw->GetFunction("funcbkgonly")->DrawClone("sames");
1730 if(writeFitInfo > 0){
1731 TPaveText *pinfo=new TPaveText(0.6,0.86,1.,1.,"NDC");
1732 pinfo->SetBorderSize(0);
1733 pinfo->SetFillStyle(0);
1734 TF1* f=hdraw->GetFunction("funcbkgonly");
1735 for (Int_t i=0;i<fNFinalPars-3;i++){
1736 pinfo->SetTextColor(kBlue+3);
1737 TString str=Form("%s = %.3f #pm %.3f",f->GetParName(i),f->GetParameter(i),f->GetParError(i));
1738 pinfo->AddText(str);
1741 pinfo->AddText(Form("Reduced #chi^{2} = %.3f",f->GetChisquare()/f->GetNDF()));
1751 hdraw->SetMinimum(0);
1752 hdraw->GetXaxis()->SetRangeUser(fminMass,fmaxMass);
1754 hdraw->SetMarkerStyle(20);
1755 hdraw->DrawClone("PE");
1756 // if(hdraw->GetFunction("funcbkgFullRange")) hdraw->GetFunction("funcbkgFullRange")->DrawClone("same");
1757 // if(hdraw->GetFunction("funcbkgRecalc")) hdraw->GetFunction("funcbkgRecalc")->DrawClone("same");
1758 if(hdraw->GetFunction("funcmass")) hdraw->GetFunction("funcmass")->DrawClone("same");
1760 if(writeFitInfo > 0){
1761 TPaveText *pinfob=new TPaveText(0.6,0.86,1.,1.,"NDC");
1762 TPaveText *pinfom=new TPaveText(0.6,0.7,1.,.87,"NDC");
1763 pinfob->SetBorderSize(0);
1764 pinfob->SetFillStyle(0);
1765 pinfom->SetBorderSize(0);
1766 pinfom->SetFillStyle(0);
1767 TF1* ff=fhistoInvMass->GetFunction("funcmass");
1769 for (Int_t i=fNFinalPars-3;i<fNFinalPars;i++){
1770 pinfom->SetTextColor(kBlue);
1771 TString str=Form("%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1772 if(!(writeFitInfo==1 && i==fNFinalPars-3)) pinfom->AddText(str);
1775 pinfom->DrawClone();
1777 TPaveText *pinfo2=new TPaveText(0.1,0.1,0.6,0.4,"NDC");
1778 pinfo2->SetBorderSize(0);
1779 pinfo2->SetFillStyle(0);
1781 Double_t signif, signal, bkg, errsignif, errsignal, errbkg;
1783 Significance(nsigma,signif,errsignif);
1784 Signal(nsigma,signal,errsignal);
1785 Background(nsigma,bkg, errbkg);
1787 Significance(1.828,1.892,signif,errsignif);
1788 Signal(1.828,1.892,signal,errsignal);
1789 Background(1.828,1.892,bkg, errbkg);
1791 TString str=Form("Significance (%.0f#sigma) %.1f #pm %.1f ",nsigma,signif,errsignif);
1792 pinfo2->AddText(str);
1793 str=Form("S (%.0f#sigma) %.0f #pm %.0f ",nsigma,signal,errsignal);
1794 pinfo2->AddText(str);
1795 str=Form("B (%.0f#sigma) %.0f #pm %.0f",nsigma,bkg,errbkg);
1796 pinfo2->AddText(str);
1797 if(bkg>0) str=Form("S/B (%.0f#sigma) %.4f ",nsigma,signal/bkg);
1798 pinfo2->AddText(str);
1803 if(writeFitInfo > 1){
1804 for (Int_t i=0;i<fNFinalPars-3;i++){
1805 pinfob->SetTextColor(kRed);
1806 str=Form("%s = %f #pm %f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1807 pinfob->AddText(str);
1810 pinfob->DrawClone();
1818 //_________________________________________________________________________
1820 void AliHFMassFitter::DrawHere(TVirtualPad* pd,Double_t nsigma,Int_t writeFitInfo) const {
1821 //draws histogram together with fit functions with default nice colors in user canvas
1822 PlotFit(pd,nsigma,writeFitInfo);
1827 //_________________________________________________________________________
1828 void AliHFMassFitter::DrawFit(Double_t nsigma) const{
1830 //draws histogram together with fit functions with default nice colors
1831 gStyle->SetOptStat(0);
1832 gStyle->SetCanvasColor(0);
1833 gStyle->SetFrameFillColor(0);
1836 TCanvas* c=(TCanvas*)GetPad(nsigma,1);
1842 //_________________________________________________________________________
1844 void AliHFMassFitter::PrintParTitles() const{
1846 //prints to screen the parameters names
1848 TF1 *f=fhistoInvMass->GetFunction("funcmass");
1850 cout<<"Fit function not found"<<endl;
1854 cout<<"Parameter Titles \n";
1855 for(Int_t i=0;i<fNFinalPars;i++){
1856 cout<<"Par "<<i<<": "<<f->GetParName(i)<<endl;
1862 //************ significance
1864 //_________________________________________________________________________
1866 void AliHFMassFitter::Signal(Double_t nOfSigma,Double_t &signal,Double_t &errsignal) const {
1867 // Return signal integral in mean+- n sigma
1870 cout<<"Use MassFitter method before Signal"<<endl;
1874 Double_t min=fMass-nOfSigma*fSigmaSgn;
1875 Double_t max=fMass+nOfSigma*fSigmaSgn;
1877 Signal(min,max,signal,errsignal);
1884 //_________________________________________________________________________
1886 void AliHFMassFitter::Signal(Double_t min, Double_t max, Double_t &signal,Double_t &errsignal) const {
1888 // Return signal integral in a range
1891 cout<<"Use MassFitter method before Signal"<<endl;
1896 TString bkgname="funcbkgRecalc";
1897 TString bkg1name="funcbkg1Recalc";
1898 TString massname="funcmass";
1902 TF1 *funcmass=fhistoInvMass->GetFunction(massname.Data());
1904 cout<<"AliHFMassFitter::Signal() ERROR -> Mass distr function not found!"<<endl;
1908 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1909 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1912 cout<<"AliHFMassFitter::Signal() ERROR -> Bkg function not found!"<<endl;
1916 Int_t np=fNFinalPars-3;
1918 Double_t intS,intSerr;
1920 //relative error evaluation
1921 intS=funcmass->GetParameter(np);
1922 intSerr=funcmass->GetParError(np);
1924 cout<<"Sgn relative error evaluation from fit: "<<intSerr/intS<<endl;
1925 Double_t background,errbackground;
1926 Background(min,max,background,errbackground);
1928 //signal +/- error in the range
1930 Double_t mass=funcmass->Integral(min, max)/fhistoInvMass->GetBinWidth(4);
1931 signal=mass - background;
1932 errsignal=(intSerr/intS)*signal;/*assume relative error is the same as for total integral*/
1936 //_________________________________________________________________________
1938 void AliHFMassFitter::Background(Double_t nOfSigma,Double_t &background,Double_t &errbackground) const {
1939 // Return background integral in mean+- n sigma
1942 cout<<"Use MassFitter method before Background"<<endl;
1945 Double_t min=fMass-nOfSigma*fSigmaSgn;
1946 Double_t max=fMass+nOfSigma*fSigmaSgn;
1948 Background(min,max,background,errbackground);
1953 //___________________________________________________________________________
1955 void AliHFMassFitter::Background(Double_t min, Double_t max, Double_t &background,Double_t &errbackground) const {
1956 // Return background integral in a range
1959 cout<<"Use MassFitter method before Background"<<endl;
1964 TString bkgname="funcbkgRecalc";
1965 TString bkg1name="funcbkg1Recalc";
1968 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1969 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1971 cout<<"AliHFMassFitter::Background() ERROR -> Bkg function not found!"<<endl;
1976 Double_t intB,intBerr;
1978 //relative error evaluation: from final parameters of the fit
1979 if(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn == 0) cout<<"No background fit: Bkg relative error evaluation put to zero"<<endl;
1981 intB=funcbkg->GetParameter(0);
1982 intBerr=funcbkg->GetParError(0);
1983 cout<<"Bkg relative error evaluation: from final parameters of the fit: "<<intBerr/intB<<endl;
1986 //relative error evaluation: from histo
1988 intB=fhistoInvMass->Integral(1,fSideBandl)+fhistoInvMass->Integral(fSideBandr,fNbin);
1990 for(Int_t i=1;i<=fSideBandl;i++){
1991 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1993 for(Int_t i=fSideBandr;i<=fNbin;i++){
1994 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1997 intBerr=TMath::Sqrt(sum2);
1998 cout<<"Bkg relative error evaluation: from histo: "<<intBerr/intB<<endl;
2000 cout<<"Last estimation of bkg error is used"<<endl;
2002 //backround +/- error in the range
2003 if (ftypeOfFit4Bkg == 3 && ftypeOfFit4Sgn == 0) {
2008 background=funcbkg->Integral(min,max)/(Double_t)fhistoInvMass->GetBinWidth(2);
2009 errbackground=intBerr/intB*background; // assume relative error is the same as for total integral
2010 //cout<<"integral = "<<funcbkg->Integral(min, max)<<"\tbinW = "<<fhistoInvMass->GetBinWidth(2)<<endl;
2017 //__________________________________________________________________________
2019 void AliHFMassFitter::Significance(Double_t nOfSigma,Double_t &significance,Double_t &errsignificance) const {
2020 // Return significance in mean+- n sigma
2022 Double_t min=fMass-nOfSigma*fSigmaSgn;
2023 Double_t max=fMass+nOfSigma*fSigmaSgn;
2024 Significance(min, max, significance, errsignificance);
2029 //__________________________________________________________________________
2031 void AliHFMassFitter::Significance(Double_t min, Double_t max, Double_t &significance,Double_t &errsignificance) const {
2032 // Return significance integral in a range
2035 AliError("Number of fits is zero, check whether you made the fit before computing the significance!\n");
2039 Double_t signal,errsignal,background,errbackground;
2040 Signal(min, max,signal,errsignal);
2041 Background(min, max,background,errbackground);
2043 if (signal+background <= 0.){
2044 cout<<"Cannot calculate significance because of div by 0!"<<endl;
2050 AliVertexingHFUtils::ComputeSignificance(signal,errsignal,background,errbackground,significance,errsignificance);