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() :
81 // default constructor
83 cout<<"Default constructor:"<<endl;
84 cout<<"Remember to set the Histo, the Type, the FixPar"<<endl;
88 //___________________________________________________________________________
90 AliHFMassFitter::AliHFMassFitter (const TH1F *histoToFit, Double_t minvalue, Double_t maxvalue, Int_t rebin,Int_t fittypeb,Int_t fittypes):
119 // standard constructor
121 fhistoInvMass= (TH1F*)histoToFit->Clone("fhistoInvMass");
122 fhistoInvMass->SetDirectory(0);
125 if(rebin!=1) RebinMass(rebin);
126 else fNbin=(Int_t)fhistoInvMass->GetNbinsX();
128 ftypeOfFit4Bkg=fittypeb;
129 ftypeOfFit4Sgn=fittypes;
130 if(ftypeOfFit4Bkg!=0 && ftypeOfFit4Bkg!=1 && ftypeOfFit4Bkg!=2 && ftypeOfFit4Bkg!=4 && ftypeOfFit4Bkg!=5) fWithBkg=kFALSE;
132 if (!fWithBkg) cout<<"Fit Histogram of Signal only"<<endl;
133 else cout<<"Type of fit For Background = "<<ftypeOfFit4Bkg<<endl;
136 fFitPars=new Float_t[fParsSize];
138 SetDefaultFixParam();
140 fContourGraph=new TList();
141 fContourGraph->SetOwner();
146 AliHFMassFitter::AliHFMassFitter(const AliHFMassFitter &mfit):
148 fhistoInvMass(mfit.fhistoInvMass),
149 fminMass(mfit.fminMass),
150 fmaxMass(mfit.fmaxMass),
151 fminBinMass(mfit.fminBinMass),
152 fmaxBinMass(mfit.fmaxBinMass),
154 fParsSize(mfit.fParsSize),
155 fNFinalPars(mfit.fNFinalPars),
157 fWithBkg(mfit.fWithBkg),
158 ftypeOfFit4Bkg(mfit.ftypeOfFit4Bkg),
159 ftypeOfFit4Sgn(mfit.ftypeOfFit4Sgn),
160 ffactor(mfit.ffactor),
161 fntuParam(mfit.fntuParam),
163 fMassErr(mfit.fMassErr),
164 fSigmaSgn(mfit.fSigmaSgn),
165 fSigmaSgnErr(mfit.fSigmaSgnErr),
166 fRawYield(mfit.fRawYield),
167 fRawYieldErr(mfit.fRawYieldErr),
168 fSideBands(mfit.fSideBands),
170 fSideBandl(mfit.fSideBandl),
171 fSideBandr(mfit.fSideBandr),
172 fcounter(mfit.fcounter),
173 fContourGraph(mfit.fContourGraph)
177 if(mfit.fParsSize > 0){
178 fFitPars=new Float_t[fParsSize];
179 fFixPar=new Bool_t[fNFinalPars];
180 memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
181 memcpy(fFixPar,mfit.fFixPar,mfit.fNFinalPars*sizeof(Bool_t));
186 //_________________________________________________________________________
188 AliHFMassFitter::~AliHFMassFitter() {
192 cout<<"AliHFMassFitter destructor called"<<endl;
194 delete fhistoInvMass;
205 //_________________________________________________________________________
207 AliHFMassFitter& AliHFMassFitter::operator=(const AliHFMassFitter &mfit){
209 //assignment operator
211 if(&mfit == this) return *this;
212 fhistoInvMass= mfit.fhistoInvMass;
213 fminMass= mfit.fminMass;
214 fmaxMass= mfit.fmaxMass;
216 fParsSize= mfit.fParsSize;
217 fWithBkg= mfit.fWithBkg;
218 ftypeOfFit4Bkg= mfit.ftypeOfFit4Bkg;
219 ftypeOfFit4Sgn= mfit.ftypeOfFit4Sgn;
220 ffactor= mfit.ffactor;
221 fntuParam= mfit.fntuParam;
223 fMassErr= mfit.fMassErr;
224 fSigmaSgn= mfit.fSigmaSgn;
225 fSigmaSgnErr= mfit.fSigmaSgnErr;
226 fRawYield= mfit.fRawYield;
227 fRawYieldErr= mfit.fRawYieldErr;
228 fSideBands= mfit.fSideBands;
229 fSideBandl= mfit.fSideBandl;
230 fSideBandr= mfit.fSideBandr;
231 fcounter= mfit.fcounter;
232 fContourGraph= mfit.fContourGraph;
234 if(mfit.fParsSize > 0){
237 fFitPars=new Float_t[fParsSize];
238 memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
242 fFixPar=new Bool_t[fNFinalPars];
243 memcpy(fFixPar,mfit.fFixPar,mfit.fNFinalPars*sizeof(Float_t));
249 //************ tools & settings
251 //__________________________________________________________________________
253 void AliHFMassFitter::ComputeNFinalPars() {
255 //compute the number of parameters of the total (signal+bgk) function
256 cout<<"Info:ComputeNFinalPars... ";
257 switch (ftypeOfFit4Bkg) {//npar background func
277 cout<<"Error in computing fNFinalPars: check ftypeOfFit4Bkg"<<endl;
281 fNFinalPars+=3; //gaussian signal
282 cout<<": "<<fNFinalPars<<endl;
284 //__________________________________________________________________________
286 void AliHFMassFitter::ComputeParSize() {
288 //compute the size of the parameter array and set the data member
290 switch (ftypeOfFit4Bkg) {//npar background func
310 cout<<"Error in computing fParsSize: check ftypeOfFit4Bkg"<<endl;
314 fParsSize += 3; // npar refl
315 fParsSize += 3; // npar signal gaus
317 fParsSize*=2; // add errors
318 cout<<"Parameters array size "<<fParsSize<<endl;
321 //___________________________________________________________________________
322 void AliHFMassFitter::SetDefaultFixParam(){
324 //Set default values for fFixPar (only total integral fixed)
327 fFixPar=new Bool_t[fNFinalPars];
329 fFixPar[0]=kTRUE; //default: IntTot fixed
330 cout<<"Parameter 0 is fixed"<<endl;
331 for(Int_t i=1;i<fNFinalPars;i++){
337 //___________________________________________________________________________
338 Bool_t AliHFMassFitter::SetFixThisParam(Int_t thispar,Bool_t fixpar){
340 //set the value (kFALSE or kTRUE) of one element of fFixPar
341 //return kFALSE if something wrong
343 if(thispar>=fNFinalPars) {
344 cout<<"Error! Parameter out of bounds! Max is "<<fNFinalPars-1<<endl;
348 cout<<"Initializing fFixPar...";
349 SetDefaultFixParam();
350 cout<<" done."<<endl;
353 fFixPar[thispar]=fixpar;
354 if(fixpar)cout<<"Parameter "<<thispar<<" is now fixed"<<endl;
355 else cout<<"Parameter "<<thispar<<" is now free"<<endl;
359 //___________________________________________________________________________
360 Bool_t AliHFMassFitter::GetFixThisParam(Int_t thispar)const{
361 //return the value of fFixPar[thispar]
362 if(thispar>=fNFinalPars) {
363 cout<<"Error! Parameter out of bounds! Max is "<<fNFinalPars-1<<endl;
367 cout<<"Error! Parameters to be fixed still not set"<<endl;
371 return fFixPar[thispar];
375 //___________________________________________________________________________
376 void AliHFMassFitter::SetHisto(const TH1F *histoToFit){
378 fhistoInvMass = new TH1F(*histoToFit);
379 fhistoInvMass->SetDirectory(0);
380 //cout<<"SetHisto pointer "<<fhistoInvMass<<endl;
383 //___________________________________________________________________________
385 void AliHFMassFitter::SetType(Int_t fittypeb, Int_t fittypes) {
387 //set the type of fit to perform for signal and background
389 ftypeOfFit4Bkg = fittypeb;
390 ftypeOfFit4Sgn = fittypes;
393 fFitPars = new Float_t[fParsSize];
395 SetDefaultFixParam();
398 //___________________________________________________________________________
400 void AliHFMassFitter::Reset() {
402 //delete the histogram and reset the mean and sigma to default
404 cout<<"Reset called: delete histogram, set mean value to 1.85 and sigma to 0.012"<<endl;
407 cout<<"Reset "<<fhistoInvMass<<endl;
408 delete fhistoInvMass;
411 //_________________________________________________________________________
413 void AliHFMassFitter::InitNtuParam(TString ntuname) {
415 // Create ntuple to keep fit parameters
418 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");
422 //_________________________________________________________________________
424 void AliHFMassFitter::FillNtuParam() {
425 // Fill ntuple with fit parameters
429 if (ftypeOfFit4Bkg==2) {
430 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
431 fntuParam->SetBranchAddress("slope1",&fFitPars[1]);
432 fntuParam->SetBranchAddress("conc1",&fFitPars[2]);
433 fntuParam->SetBranchAddress("intGB",&fFitPars[3]);
434 fntuParam->SetBranchAddress("meanGB",&fFitPars[4]);
435 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[5]);
436 fntuParam->SetBranchAddress("intbkg2",&fFitPars[6]);
437 fntuParam->SetBranchAddress("slope2",&fFitPars[7]);
438 fntuParam->SetBranchAddress("conc2",&fFitPars[8]);
439 fntuParam->SetBranchAddress("inttot",&fFitPars[9]);
440 fntuParam->SetBranchAddress("slope3",&fFitPars[10]);
441 fntuParam->SetBranchAddress("conc3",&fFitPars[11]);
442 fntuParam->SetBranchAddress("intsgn",&fFitPars[12]);
443 fntuParam->SetBranchAddress("meansgn",&fFitPars[13]);
444 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[14]);
446 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[15]);
447 fntuParam->SetBranchAddress("slope1Err",&fFitPars[16]);
448 fntuParam->SetBranchAddress("conc1Err",&fFitPars[17]);
449 fntuParam->SetBranchAddress("intGBErr",&fFitPars[18]);
450 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[19]);
451 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[20]);
452 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[21]);
453 fntuParam->SetBranchAddress("slope2Err",&fFitPars[22]);
454 fntuParam->SetBranchAddress("conc2Err",&fFitPars[23]);
455 fntuParam->SetBranchAddress("inttotErr",&fFitPars[24]);
456 fntuParam->SetBranchAddress("slope3Err",&fFitPars[25]);
457 fntuParam->SetBranchAddress("conc3Err",&fFitPars[26]);
458 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[27]);
459 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[28]);
460 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[29]);
464 if(ftypeOfFit4Bkg==3){
465 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
466 fntuParam->SetBranchAddress("slope1",¬hing);
467 fntuParam->SetBranchAddress("conc1",¬hing);
468 fntuParam->SetBranchAddress("intGB",&fFitPars[1]);
469 fntuParam->SetBranchAddress("meanGB",&fFitPars[2]);
470 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[3]);
471 fntuParam->SetBranchAddress("intbkg2",&fFitPars[4]);
472 fntuParam->SetBranchAddress("slope2",¬hing);
473 fntuParam->SetBranchAddress("conc2",¬hing);
474 fntuParam->SetBranchAddress("inttot",&fFitPars[6]);
475 fntuParam->SetBranchAddress("slope3",¬hing);
476 fntuParam->SetBranchAddress("conc3",¬hing);
477 fntuParam->SetBranchAddress("intsgn",&fFitPars[6]);
478 fntuParam->SetBranchAddress("meansgn",&fFitPars[7]);
479 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[8]);
481 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[9]);
482 fntuParam->SetBranchAddress("slope1Err",¬hing);
483 fntuParam->SetBranchAddress("conc1Err",¬hing);
484 fntuParam->SetBranchAddress("intGBErr",&fFitPars[10]);
485 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[11]);
486 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[12]);
487 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[13]);
488 fntuParam->SetBranchAddress("slope2Err",¬hing);
489 fntuParam->SetBranchAddress("conc2Err",¬hing);
490 fntuParam->SetBranchAddress("inttotErr",&fFitPars[15]);
491 fntuParam->SetBranchAddress("slope3Err",¬hing);
492 fntuParam->SetBranchAddress("conc3Err",¬hing);
493 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[15]);
494 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[16]);
495 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[17]);
499 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
500 fntuParam->SetBranchAddress("slope1",&fFitPars[1]);
501 fntuParam->SetBranchAddress("conc1",¬hing);
502 fntuParam->SetBranchAddress("intGB",&fFitPars[2]);
503 fntuParam->SetBranchAddress("meanGB",&fFitPars[3]);
504 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[4]);
505 fntuParam->SetBranchAddress("intbkg2",&fFitPars[5]);
506 fntuParam->SetBranchAddress("slope2",&fFitPars[6]);
507 fntuParam->SetBranchAddress("conc2",¬hing);
508 fntuParam->SetBranchAddress("inttot",&fFitPars[7]);
509 fntuParam->SetBranchAddress("slope3",&fFitPars[8]);
510 fntuParam->SetBranchAddress("conc3",¬hing);
511 fntuParam->SetBranchAddress("intsgn",&fFitPars[9]);
512 fntuParam->SetBranchAddress("meansgn",&fFitPars[10]);
513 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[11]);
515 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[12]);
516 fntuParam->SetBranchAddress("slope1Err",&fFitPars[13]);
517 fntuParam->SetBranchAddress("conc1Err",¬hing);
518 fntuParam->SetBranchAddress("intGBErr",&fFitPars[14]);
519 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[15]);
520 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[16]);
521 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[17]);
522 fntuParam->SetBranchAddress("slope2Err",&fFitPars[18]);
523 fntuParam->SetBranchAddress("conc2Err",¬hing);
524 fntuParam->SetBranchAddress("inttotErr",&fFitPars[19]);
525 fntuParam->SetBranchAddress("slope3Err",&fFitPars[20]);
526 fntuParam->SetBranchAddress("conc3Err",¬hing);
527 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[21]);
528 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[22]);
529 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[23]);
533 fntuParam->TTree::Fill();
536 //_________________________________________________________________________
538 TNtuple* AliHFMassFitter::NtuParamOneShot(TString ntuname){
539 // Create, fill and return ntuple with fit parameters
541 InitNtuParam(ntuname.Data());
545 //_________________________________________________________________________
547 void AliHFMassFitter::RebinMass(Int_t bingroup){
548 // Rebin invariant mass histogram
551 cout<<"Histogram not set"<<endl;
554 Int_t nbinshisto=fhistoInvMass->GetNbinsX();
556 cout<<"Error! Cannot group "<<bingroup<<" bins\n";
558 cout<<"Kept original number of bins: "<<fNbin<<endl;
561 while(nbinshisto%bingroup != 0) {
564 cout<<"Group "<<bingroup<<" bins"<<endl;
565 fhistoInvMass->Rebin(bingroup);
566 fNbin = fhistoInvMass->GetNbinsX();
567 cout<<"New number of bins: "<<fNbin<<endl;
574 //___________________________________________________________________________
576 Double_t AliHFMassFitter::FitFunction4MassDistr (Double_t *x, Double_t *par){
577 // Fit function for signal+background
580 //exponential or linear fit
582 // par[0] = tot integral
584 // par[2] = gaussian integral
585 // par[3] = gaussian mean
586 // par[4] = gaussian sigma
588 Double_t total,bkg=0,sgn=0;
590 if (ftypeOfFit4Bkg==0 || ftypeOfFit4Bkg==1) {
591 if(ftypeOfFit4Sgn == 0) {
593 Double_t parbkg[2] = {par[0]-par[2], par[1]};
594 bkg = FitFunction4Bkg(x,parbkg);
596 if(ftypeOfFit4Sgn == 1) {
597 Double_t parbkg[5] = {par[2],par[3],ffactor*par[4],par[0]-2*par[2], par[1]};
598 bkg = FitFunction4Bkg(x,parbkg);
601 sgn = FitFunction4Sgn(x,&par[2]);
607 // par[0] = tot integral
610 // par[3] = gaussian integral
611 // par[4] = gaussian mean
612 // par[5] = gaussian sigma
614 if (ftypeOfFit4Bkg==2) {
616 if(ftypeOfFit4Sgn == 0) {
618 Double_t parbkg[3] = {par[0]-par[3], par[1], par[2]};
619 bkg = FitFunction4Bkg(x,parbkg);
621 if(ftypeOfFit4Sgn == 1) {
623 Double_t parbkg[6] = {par[3],par[4],ffactor*par[5],par[0]-2*par[3], par[1], par[2]};
624 bkg = FitFunction4Bkg(x,parbkg);
627 sgn = FitFunction4Sgn(x,&par[3]);
630 if (ftypeOfFit4Bkg==3) {
632 if(ftypeOfFit4Sgn == 0) {
633 bkg=FitFunction4Bkg(x,par);
634 sgn=FitFunction4Sgn(x,&par[1]);
636 if(ftypeOfFit4Sgn == 1) {
637 Double_t parbkg[4]={par[1],par[2],ffactor*par[3],par[0]};
638 bkg=FitFunction4Bkg(x,parbkg);
639 sgn=FitFunction4Sgn(x,&par[1]);
645 // par[0] = tot integral
647 // par[2] = gaussian integral
648 // par[3] = gaussian mean
649 // par[4] = gaussian sigma
651 if (ftypeOfFit4Bkg==4) {
653 if(ftypeOfFit4Sgn == 0) {
655 Double_t parbkg[2] = {par[0]-par[2], par[1]};
656 bkg = FitFunction4Bkg(x,parbkg);
658 if(ftypeOfFit4Sgn == 1) {
660 Double_t parbkg[5] = {par[2],par[3],ffactor*par[4],par[0]-par[2], par[1]};
661 bkg = FitFunction4Bkg(x,parbkg);
663 sgn = FitFunction4Sgn(x,&par[2]);
667 //Power and exponential fit
669 // par[0] = tot integral
672 // par[3] = gaussian integral
673 // par[4] = gaussian mean
674 // par[5] = gaussian sigma
676 if (ftypeOfFit4Bkg==5) {
678 if(ftypeOfFit4Sgn == 0) {
679 Double_t parbkg[3] = {par[0]-par[3],par[1],par[2]};
680 bkg = FitFunction4Bkg(x,parbkg);
682 if(ftypeOfFit4Sgn == 1) {
683 Double_t parbkg[6] = {par[3],par[4],ffactor*par[5],par[0]-par[3], par[1], par[2]};
684 bkg = FitFunction4Bkg(x,parbkg);
686 sgn = FitFunction4Sgn(x,&par[3]);
694 //_________________________________________________________________________
695 Double_t AliHFMassFitter::FitFunction4Sgn (Double_t *x, Double_t *par){
696 // Fit function for the signal
698 //gaussian = A/(sigma*sqrt(2*pi))*exp(-(x-mean)^2/2/sigma^2)
700 // * [0] = integralSgn
703 //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
705 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]);
709 //__________________________________________________________________________
711 Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
712 // Fit function for the background
714 Double_t maxDeltaM = 4.*fSigmaSgn;
715 if(fSideBands && TMath::Abs(x[0]-fMass) < maxDeltaM) {
720 Double_t gaus2=0,total=-1;
721 if(ftypeOfFit4Sgn == 1){
723 //gaussian = A/(sigma*sqrt(2*pi))*exp(-(x-mean)^2/2/sigma^2)
725 // * [0] = integralSgn
728 //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
729 gaus2 = FitFunction4Sgn(x,par);
732 switch (ftypeOfFit4Bkg){
735 //exponential = A*exp(B*x) -> integral(exponential)=A/B*exp(B*x)](min,max)
736 //-> A = B*integral/(exp(B*max)-exp(B*min)) where integral can be written
737 //as integralTot- integralGaus (=par [2])
739 // * [0] = integralBkg;
741 //exponential = [1]*[0]/(exp([1]*max)-exp([1]*min))*exp([1]*x)
742 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]);
746 //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)
747 // * [0] = integralBkg;
749 total= par[0+firstPar]/(fmaxMass-fminMass)+par[1+firstPar]*(x[0]-0.5*(fmaxMass+fminMass));
753 //y=a+b*x+c*x**2 -> integral = a(max-min) + 1/2*b*(max^2-min^2) +
754 //+ 1/3*c*(max^3-min^3) ->
755 //a = (integral-1/2*b*(max^2-min^2)-1/3*c*(max^3-min^3))/(max-min)
756 // * [0] = integralBkg;
759 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));
762 total=par[0+firstPar];
766 //y=a(x-m_pi)^b -> integral = a/(b+1)*((max-m_pi)^(b+1)-(min-m_pi)^(b+1))
768 //a = integral*(b+1)/((max-m_pi)^(b+1)-(min-m_pi)^(b+1))
769 // * [0] = integralBkg;
771 // a(power function) = [0]*([1]+1)/((max-m_pi)^([1]+1)-(min-m_pi)^([1]+1))*(x-m_pi)^[1]
773 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
775 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]);
779 //power function wit exponential
780 //y=a*Sqrt(x-m_pi)*exp(-b*(x-m_pi))
782 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
784 total = par[1+firstPar]*TMath::Sqrt(x[0] - mpi)*TMath::Exp(-1.*par[2+firstPar]*(x[0]-mpi));
788 // Types of Fit Functions for Background:
789 // * 0 = exponential;
791 // * 2 = polynomial 2nd order
792 // * 3 = no background"<<endl;
793 // * 4 = Power function
794 // * 5 = Power function with exponential
800 //__________________________________________________________________________
801 Bool_t AliHFMassFitter::SideBandsBounds(){
803 //determines the ranges of the side bands
805 if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
806 Double_t minHisto=fhistoInvMass->GetBinLowEdge(1);
807 Double_t maxHisto=fhistoInvMass->GetBinLowEdge(fNbin+1);
809 Double_t sidebandldouble,sidebandrdouble;
810 Bool_t leftok=kFALSE, rightok=kFALSE;
812 if(fMass-fminMass < 0 || fmaxMass-fMass <0) {
813 cout<<"Left limit of range > mean or right limit of range < mean: change left/right limit or initial mean value"<<endl;
817 //histo limit = fit function limit
818 if((TMath::Abs(fminMass-minHisto) < 1e6 || TMath::Abs(fmaxMass - maxHisto) < 1e6) && (fMass-4.*fSigmaSgn-fminMass) < 1e6){
819 Double_t coeff = (fMass-fminMass)/fSigmaSgn;
820 sidebandldouble=(fMass-0.5*coeff*fSigmaSgn);
821 sidebandrdouble=(fMass+0.5*coeff*fSigmaSgn);
822 cout<<"Changed number of sigma from 4 to "<<0.5*coeff<<" for the estimation of the side bands"<<endl;
823 if (coeff<3) cout<<"Side bands inside 3 sigma, may be better use ftypeOfFit4Bkg = 3 (only signal)"<<endl;
825 cout<<"Side bands inside 2 sigma. Change mode: ftypeOfFit4Bkg = 3"<<endl;
827 //set binleft and right without considering SetRangeFit- anyway no bkg!
828 sidebandldouble=(fMass-4.*fSigmaSgn);
829 sidebandrdouble=(fMass+4.*fSigmaSgn);
833 sidebandldouble=(fMass-4.*fSigmaSgn);
834 sidebandrdouble=(fMass+4.*fSigmaSgn);
837 cout<<"Left side band ";
840 //calculate bin corresponding to fSideBandl
841 fSideBandl=fhistoInvMass->FindBin(sidebandldouble);
842 if (sidebandldouble >= fhistoInvMass->GetBinCenter(fSideBandl)) fSideBandl++;
843 sidebandldouble=fhistoInvMass->GetBinLowEdge(fSideBandl);
845 if(TMath::Abs(tmp-sidebandldouble) > 1e-6){
846 cout<<tmp<<" is not allowed, changing it to the nearest value allowed: ";
849 cout<<sidebandldouble<<" (bin "<<fSideBandl<<")"<<endl;
851 cout<<"Right side band ";
853 //calculate bin corresponding to fSideBandr
854 fSideBandr=fhistoInvMass->FindBin(sidebandrdouble);
855 if (sidebandrdouble < fhistoInvMass->GetBinCenter(fSideBandr)) fSideBandr--;
856 sidebandrdouble=fhistoInvMass->GetBinLowEdge(fSideBandr+1);
858 if(TMath::Abs(tmp-sidebandrdouble) > 1e-6){
859 cout<<tmp<<" is not allowed, changing it to the nearest value allowed: ";
862 cout<<sidebandrdouble<<" (bin "<<fSideBandr<<")"<<endl;
863 if (fSideBandl==0 || fSideBandr==fNbin) {
864 cout<<"Error! Range too little";
870 //__________________________________________________________________________
872 void AliHFMassFitter::GetSideBandsBounds(Int_t &left, Int_t &right) const{
874 // get the range of the side bands
876 if (fSideBandl==0 && fSideBandr==0){
877 cout<<"Use MassFitter method first"<<endl;
884 //__________________________________________________________________________
885 Bool_t AliHFMassFitter::CheckRangeFit(){
886 //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
888 if (!fhistoInvMass) {
889 cout<<"No histogram to fit! SetHisto(TH1F* h) before! "<<endl;
892 Bool_t leftok=kFALSE, rightok=kFALSE;
893 Int_t nbins=fhistoInvMass->GetNbinsX();
894 Double_t minhisto=fhistoInvMass->GetBinLowEdge(1), maxhisto=fhistoInvMass->GetBinLowEdge(nbins+1);
896 //check if limits are inside histogram range
898 if( fminMass-minhisto < 0. ) {
899 cout<<"Out of histogram left bound! Setting to "<<minhisto<<endl;
902 if( fmaxMass-maxhisto > 0. ) {
903 cout<<"Out of histogram right bound! Setting to"<<maxhisto<<endl;
909 //calculate bin corresponding to fminMass
910 fminBinMass=fhistoInvMass->FindBin(fminMass);
911 if (fminMass >= fhistoInvMass->GetBinCenter(fminBinMass)) fminBinMass++;
912 fminMass=fhistoInvMass->GetBinLowEdge(fminBinMass);
913 if(TMath::Abs(tmp-fminMass) > 1e-6){
914 cout<<"Left bound "<<tmp<<" is not allowed, changing it to the nearest value allowed: "<<fminMass<<endl;
919 //calculate bin corresponding to fmaxMass
920 fmaxBinMass=fhistoInvMass->FindBin(fmaxMass);
921 if (fmaxMass < fhistoInvMass->GetBinCenter(fmaxBinMass)) fmaxBinMass--;
922 fmaxMass=fhistoInvMass->GetBinLowEdge(fmaxBinMass+1);
923 if(TMath::Abs(tmp-fmaxMass) > 1e-6){
924 cout<<"Right bound "<<tmp<<" is not allowed, changing it to the nearest value allowed: "<<fmaxMass<<endl;
928 return (leftok && rightok);
932 //__________________________________________________________________________
934 Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
935 // Main method of the class: performs the fit of the histogram
937 //Set default fitter Minuit in order to use gMinuit in the contour plots
938 TVirtualFitter::SetDefaultFitter("Minuit");
941 Bool_t isBkgOnly=kFALSE;
943 Int_t fit1status=RefitWithBkgOnly(kFALSE);
945 Int_t checkinnsigma=4;
946 Double_t range[2]={fMass-checkinnsigma*fSigmaSgn,fMass+checkinnsigma*fSigmaSgn};
947 TF1* func=GetHistoClone()->GetFunction("funcbkgonly");
948 Double_t intUnderFunc=func->Integral(range[0],range[1]);
949 Double_t intUnderHisto=fhistoInvMass->Integral(fhistoInvMass->FindBin(range[0]),fhistoInvMass->FindBin(range[1]),"width");
950 cout<<"Pick zone: IntFunc = "<<intUnderFunc<<"; IntHist = "<<intUnderHisto<<"\tDiff = "<<intUnderHisto-intUnderFunc<<"\tRelDiff = "<<(intUnderHisto-intUnderFunc)/intUnderFunc<<endl;
951 Double_t diffUnderPick=(intUnderHisto-intUnderFunc);
952 intUnderFunc=func->Integral(fminMass,fminMass+checkinnsigma*fSigmaSgn);
953 intUnderHisto=fhistoInvMass->Integral(fhistoInvMass->FindBin(fminMass),fhistoInvMass->FindBin(fminMass+checkinnsigma*fSigmaSgn),"width");
954 cout<<"Band (l) zone: IntFunc = "<<intUnderFunc<<"; IntHist = "<<intUnderHisto<<"\tDiff = "<<intUnderHisto-intUnderFunc<<"\tRelDiff = "<<(intUnderHisto-intUnderFunc)/intUnderFunc<<endl;
955 Double_t diffUnderBands=(intUnderHisto-intUnderFunc);
956 Double_t relDiff=diffUnderPick/diffUnderBands;
957 cout<<"Relative difference = "<<relDiff<<endl;
958 if(TMath::Abs(relDiff) < 0.25) isBkgOnly=kTRUE;
960 cout<<"Relative difference = "<<relDiff<<": I suppose there is some signal, continue with total fit!"<<endl;
964 cout<<"INFO!! The histogram contains only background"<<endl;
967 //increase counter of number of fits done
973 Int_t bkgPar = fNFinalPars-3; //background function's number of parameters
975 cout<<"fNFinalPars = "<<fNFinalPars<<"\tbkgPar = "<<bkgPar<<endl;
978 TString listname="contourplot";
981 fContourGraph=new TList();
982 fContourGraph->SetOwner();
985 fContourGraph->SetName(listname);
989 TString bkgname="funcbkg";
990 TString bkg1name="funcbkg1";
991 TString massname="funcmass";
994 Double_t totInt = fhistoInvMass->Integral(fminBinMass,fmaxBinMass, "width");
995 //cout<<"Here tot integral is = "<<totInt<<"; integral in whole range is "<<fhistoInvMass->Integral("width")<<endl;
997 Double_t width=fhistoInvMass->GetBinWidth(8);
998 //cout<<"fNbin = "<<fNbin<<endl;
999 if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
1001 Bool_t ok=SideBandsBounds();
1002 if(!ok) return kFALSE;
1004 //sidebands integral - first approx (from histo)
1005 Double_t sideBandsInt=(Double_t)fhistoInvMass->Integral(1,fSideBandl,"width") + (Double_t)fhistoInvMass->Integral(fSideBandr,fNbin,"width");
1006 cout<<"------nbin = "<<fNbin<<"\twidth = "<<width<<"\tbinleft = "<<fSideBandl<<"\tbinright = "<<fSideBandr<<endl;
1007 cout<<"------sideBandsInt - first approx = "<<sideBandsInt<<endl;
1008 if (sideBandsInt<=0) {
1009 cout<<"! sideBandsInt <=0. There's a problem, cannot start the fit"<<endl;
1016 TF1 *funcbkg = new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,bkgPar,"AliHFMassFitter","FitFunction4Bkg");
1017 cout<<"Function name = "<<funcbkg->GetName()<<endl<<endl;
1019 funcbkg->SetLineColor(2); //red
1021 //first fit for bkg: approx bkgint
1023 switch (ftypeOfFit4Bkg) {
1025 funcbkg->SetParNames("BkgInt","Slope");
1026 funcbkg->SetParameters(sideBandsInt,-2.);
1029 funcbkg->SetParNames("BkgInt","Slope");
1030 funcbkg->SetParameters(sideBandsInt,-100.);
1033 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
1034 funcbkg->SetParameters(sideBandsInt,-10.,5);
1037 if(ftypeOfFit4Sgn==0){
1038 funcbkg->SetParNames("Const");
1039 funcbkg->SetParameter(0,0.);
1040 funcbkg->FixParameter(0,0.);
1044 funcbkg->SetParNames("BkgInt","Coef2");
1045 funcbkg->SetParameters(sideBandsInt,0.5);
1048 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
1049 funcbkg->SetParameters(sideBandsInt, -10., 5.);
1052 cout<<"Wrong choise of ftypeOfFit4Bkg ("<<ftypeOfFit4Bkg<<")"<<endl;
1056 cout<<"\nBACKGROUND FIT - only combinatorial"<<endl;
1057 Int_t ftypeOfFit4SgnBkp=ftypeOfFit4Sgn;
1059 Double_t intbkg1=0,slope1=0,conc1=0;
1060 //if only signal and reflection: skip
1061 if (!(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn==1)) {
1063 fhistoInvMass->Fit(bkgname.Data(),"R,L,E,0");
1065 for(Int_t i=0;i<bkgPar;i++){
1066 fFitPars[i]=funcbkg->GetParameter(i);
1067 //cout<<i<<"\t"<<funcbkg->GetParameter(i)<<"\t";
1068 fFitPars[fNFinalPars+2*bkgPar+3+i]= funcbkg->GetParError(i);
1069 //cout<<fNFinalPars+2*bkgPar+3+i<<"\t"<< funcbkg->GetParError(i)<<endl;
1071 fSideBands = kFALSE;
1072 //intbkg1 = funcbkg->GetParameter(0);
1074 intbkg1 = funcbkg->Integral(fminMass,fmaxMass);
1075 if(ftypeOfFit4Bkg!=3) slope1 = funcbkg->GetParameter(1);
1076 if(ftypeOfFit4Bkg==2) conc1 = funcbkg->GetParameter(2);
1077 if(ftypeOfFit4Bkg==5) conc1 = funcbkg->GetParameter(2);
1080 //cout<<"First fit: \nintbkg1 = "<<intbkg1<<"\t(Compare with par0 = "<<funcbkg->GetParameter(0)<<")\nslope1= "<<slope1<<"\nconc1 = "<<conc1<<endl;
1082 else cout<<"\t\t//"<<endl;
1084 ftypeOfFit4Sgn=ftypeOfFit4SgnBkp;
1086 if (ftypeOfFit4Sgn == 1) {
1087 cout<<"\nBACKGROUND FIT WITH REFLECTION"<<endl;
1090 //cout<<"fNFinalPars = "<<fNFinalPars<<"\tbkgPar = "<<bkgPar<<endl;
1092 funcbkg1 = new TF1(bkg1name.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,bkgPar,"AliHFMassFitter","FitFunction4Bkg");
1093 cout<<"Function name = "<<funcbkg1->GetName()<<endl;
1095 funcbkg1->SetLineColor(2); //red
1097 switch (ftypeOfFit4Bkg) {
1100 cout<<"*** Exponential Fit ***"<<endl;
1101 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Slope");
1102 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1);
1107 cout<<"*** Linear Fit ***"<<endl;
1108 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Slope");
1109 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1);
1114 cout<<"*** Polynomial Fit ***"<<endl;
1115 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Coef1","Coef2");
1116 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1,conc1);
1120 //no background: gaus sign+ gaus broadened
1122 cout<<"*** No background Fit ***"<<endl;
1123 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","Const");
1124 funcbkg1->SetParameters(0.5*totInt,fMass,ffactor*fSigmaSgn,0.);
1125 funcbkg1->FixParameter(3,0.);
1130 cout<<"*** Power function Fit ***"<<endl;
1131 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Coef2");
1132 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1);
1137 cout<<"*** Power function conv. with exponential Fit ***"<<endl;
1138 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Coef1","Coef2");
1139 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1,conc1);
1143 //cout<<"Parameters set to: "<<0.5*(totInt-intbkg1)<<"\t"<<fMass<<"\t"<<ffactor*fSigmaSgn<<"\t"<<intbkg1<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<endl;
1144 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<bkgPar<<"\tgsidebands = "<<fSideBands<<endl;
1146 Int_t status=fhistoInvMass->Fit(bkg1name.Data(),"R,L,E,+,0");
1148 cout<<"Minuit returned "<<status<<endl;
1152 for(Int_t i=0;i<bkgPar;i++){
1153 fFitPars[bkgPar-3+i]=funcbkg1->GetParameter(i);
1154 //cout<<bkgPar-3+i<<"\t"<<funcbkg1->GetParameter(i);
1155 fFitPars[fNFinalPars+3*bkgPar-6+i]= funcbkg1->GetParError(i);
1156 //cout<<"\t"<<fNFinalPars+3*bkgPar-6+i<<"\t"<<funcbkg1->GetParError(i)<<endl;
1159 intbkg1=funcbkg1->GetParameter(3);
1160 if(ftypeOfFit4Bkg!=3) slope1 = funcbkg1->GetParameter(4);
1161 if(ftypeOfFit4Bkg==2) conc1 = funcbkg1->GetParameter(5);
1162 if(ftypeOfFit4Bkg==5) conc1 = funcbkg1->GetParameter(5);
1168 for(Int_t i=0;i<3;i++){
1169 fFitPars[bkgPar-3+i]=0.;
1170 cout<<bkgPar-3+i<<"\t"<<0.<<"\t";
1171 fFitPars[fNFinalPars+3*bkgPar-6+i]= 0.;
1172 cout<<fNFinalPars+3*bkgPar-6+i<<"\t"<<0.<<endl;
1175 for(Int_t i=0;i<bkgPar-3;i++){
1176 fFitPars[bkgPar+i]=funcbkg->GetParameter(i);
1177 cout<<bkgPar+i<<"\t"<<funcbkg->GetParameter(i)<<"\t";
1178 fFitPars[fNFinalPars+3*bkgPar-3+i]= funcbkg->GetParError(i);
1179 cout<<fNFinalPars+3*bkgPar-3+i<<"\t"<< funcbkg->GetParError(i)<<endl;
1185 //sidebands integral - second approx (from fit)
1186 fSideBands = kFALSE;
1188 //cout<<"Compare intbkg1 = "<<intbkg1<<" and integral = ";
1189 if(ftypeOfFit4Sgn == 1) bkgInt=funcbkg1->Integral(fminMass,fmaxMass);
1190 else bkgInt=funcbkg->Integral(fminMass,fmaxMass);
1191 //cout<</*"------BkgInt(Fit) = "<<*/bkgInt<<endl;
1193 //Signal integral - first approx
1195 sgnInt = totInt-bkgInt;
1196 //cout<<"------TotInt = "<<totInt<<"\tsgnInt = "<<sgnInt<<endl;
1198 cout<<"Setting sgnInt = - sgnInt"<<endl;
1201 /*Fit All Mass distribution with exponential + gaussian (+gaussian braodened) */
1202 TF1 *funcmass = new TF1(massname.Data(),this,&AliHFMassFitter::FitFunction4MassDistr,fminMass,fmaxMass,fNFinalPars,"AliHFMassFitter","FitFunction4MassDistr");
1203 cout<<"Function name = "<<funcmass->GetName()<<endl<<endl;
1204 funcmass->SetLineColor(4); //blue
1207 cout<<"\nTOTAL FIT"<<endl;
1210 funcmass->SetParNames("TotInt","Slope","SgnInt","Mean","Sigma");
1211 funcmass->SetParameters(totInt,slope1,sgnInt,fMass,fSigmaSgn);
1213 //cout<<"Parameters set to: "<<totInt<<"\t"<<slope1<<"\t"<<sgnInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
1214 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<fNFinalPars<<"\tgsidebands = "<<fSideBands<<endl;
1216 funcmass->FixParameter(0,totInt);
1219 funcmass->FixParameter(1,slope1);
1222 funcmass->FixParameter(2,sgnInt);
1225 funcmass->FixParameter(3,fMass);
1228 funcmass->FixParameter(4,fSigmaSgn);
1231 if (fNFinalPars==6){
1232 funcmass->SetParNames("TotInt","Coef1","Coef2","SgnInt","Mean","Sigma");
1233 funcmass->SetParameters(totInt,slope1,conc1,sgnInt,fMass,fSigmaSgn);
1235 //cout<<"Parameters set to: "<<totInt<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<sgnInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
1236 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<fNFinalPars<<"\tgsidebands = "<<fSideBands<<endl;
1237 if(fFixPar[0])funcmass->FixParameter(0,totInt);
1238 if(fFixPar[1])funcmass->FixParameter(1,slope1);
1239 if(fFixPar[2])funcmass->FixParameter(2,conc1);
1240 if(fFixPar[3])funcmass->FixParameter(3,sgnInt);
1241 if(fFixPar[4])funcmass->FixParameter(4,fMass);
1242 if(fFixPar[5])funcmass->FixParameter(5,fSigmaSgn);
1244 //funcmass->FixParameter(2,sgnInt);
1247 funcmass->SetParNames("Const","SgnInt","Mean","Sigma");
1248 if(ftypeOfFit4Sgn == 1) funcmass->SetParameters(0.,0.5*totInt,fMass,fSigmaSgn);
1249 else funcmass->SetParameters(0.,totInt,fMass,fSigmaSgn);
1250 if(fFixPar[0]) funcmass->FixParameter(0,0.);
1251 if(fFixPar[1])funcmass->FixParameter(1,sgnInt);
1252 if(fFixPar[2])funcmass->FixParameter(2,fMass);
1253 if(fFixPar[3])funcmass->FixParameter(3,fSigmaSgn);
1254 //cout<<"Parameters set to: "<<0.5*totInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
1255 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<fNFinalPars<<"\tgsidebands = "<<fSideBands<<endl;
1261 status = fhistoInvMass->Fit(massname.Data(),"R,L,E,+,0");
1263 cout<<"Minuit returned "<<status<<endl;
1267 cout<<"fit done"<<endl;
1268 //reset value of fMass and fSigmaSgn to those found from fit
1269 fMass=funcmass->GetParameter(fNFinalPars-2);
1270 fMassErr=funcmass->GetParError(fNFinalPars-2);
1271 fSigmaSgn=funcmass->GetParameter(fNFinalPars-1);
1272 fSigmaSgnErr=funcmass->GetParError(fNFinalPars-1);
1273 fRawYield=funcmass->GetParameter(fNFinalPars-3)/fhistoInvMass->GetBinWidth(1);
1274 fRawYieldErr=funcmass->GetParError(fNFinalPars-3)/fhistoInvMass->GetBinWidth(1);
1276 for(Int_t i=0;i<fNFinalPars;i++){
1277 fFitPars[i+2*bkgPar-3]=funcmass->GetParameter(i);
1278 fFitPars[fNFinalPars+4*bkgPar-6+i]= funcmass->GetParError(i);
1279 //cout<<i+2*bkgPar-3<<"\t"<<funcmass->GetParameter(i)<<"\t\t"<<fNFinalPars+4*bkgPar-6+i<<"\t"<<funcmass->GetParError(i)<<endl;
1282 //check: cout parameters
1283 for(Int_t i=0;i<2*(fNFinalPars+2*bkgPar-3);i++){
1284 cout<<i<<"\t"<<fFitPars[i]<<endl;
1288 if(funcmass->GetParameter(fNFinalPars-1) <0 || funcmass->GetParameter(fNFinalPars-2) <0 || funcmass->GetParameter(fNFinalPars-3) <0 ) {
1289 cout<<"IntS or mean or sigma negative. You may tray to SetInitialGaussianSigma(..) and SetInitialGaussianMean(..)"<<endl;
1293 //increase counter of number of fits done
1299 for (Int_t kpar=1; kpar<fNFinalPars;kpar++){
1301 for(Int_t jpar=kpar+1;jpar<fNFinalPars;jpar++){
1302 cout<<"Par "<<kpar<<" and "<<jpar<<endl;
1304 // produce 2 contours per couple of parameters
1305 TGraph* cont[2] = {0x0, 0x0};
1306 const Double_t errDef[2] = {1., 4.};
1307 for (Int_t i=0; i<2; i++) {
1308 gMinuit->SetErrorDef(errDef[i]);
1309 cont[i] = (TGraph*)gMinuit->Contour(80,kpar,jpar);
1310 cout<<"Minuit Status = "<<gMinuit->GetStatus()<<endl;
1313 if(!cont[0] || !cont[1]){
1314 cout<<"Skipping par "<<kpar<<" vs par "<<jpar<<endl;
1318 // set graph titles and add them to the list
1319 TString title = "Contour plot";
1320 TString titleX = funcmass->GetParName(kpar);
1321 TString titleY = funcmass->GetParName(jpar);
1322 for (Int_t i=0; i<2; i++) {
1323 cont[i]->SetName( Form("cperr%d_%d%d", i, kpar, jpar) );
1324 cont[i]->SetTitle(title);
1325 cont[i]->GetXaxis()->SetTitle(titleX);
1326 cont[i]->GetYaxis()->SetTitle(titleY);
1327 cont[i]->GetYaxis()->SetLabelSize(0.033);
1328 cont[i]->GetYaxis()->SetTitleSize(0.033);
1329 cont[i]->GetYaxis()->SetTitleOffset(1.67);
1331 fContourGraph->Add(cont[i]);
1335 TString cvname = Form("c%d%d", kpar, jpar);
1336 TCanvas *c4=new TCanvas(cvname,cvname,600,600);
1338 cont[1]->SetFillColor(38);
1339 cont[1]->Draw("alf");
1340 cont[0]->SetFillColor(9);
1341 cont[0]->Draw("lf");
1349 if (ftypeOfFit4Sgn == 1) {
1355 AddFunctionsToHisto();
1356 if (draw) DrawFit();
1362 //______________________________________________________________________________
1364 Bool_t AliHFMassFitter::RefitWithBkgOnly(Bool_t draw){
1366 //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
1367 //If you want to change the backgroud function or range use SetType or SetRangeFit before
1369 TString bkgname="funcbkgonly";
1370 fSideBands = kFALSE;
1372 TF1* funcbkg = new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,fNFinalPars-3,"AliHFMassFitter","FitFunction4Bkg");
1374 funcbkg->SetLineColor(kBlue+3); //dark blue
1376 Double_t integral=fhistoInvMass->Integral(fhistoInvMass->FindBin(fminMass),fhistoInvMass->FindBin(fmaxMass),"width");
1378 switch (ftypeOfFit4Bkg) {
1380 funcbkg->SetParNames("BkgInt","Slope");
1381 funcbkg->SetParameters(integral,-2.);
1384 funcbkg->SetParNames("BkgInt","Slope");
1385 funcbkg->SetParameters(integral,-100.);
1388 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
1389 funcbkg->SetParameters(integral,-10.,5);
1392 cout<<"Warning! This choice does not make a lot of sense..."<<endl;
1393 if(ftypeOfFit4Sgn==0){
1394 funcbkg->SetParNames("Const");
1395 funcbkg->SetParameter(0,0.);
1396 funcbkg->FixParameter(0,0.);
1400 funcbkg->SetParNames("BkgInt","Coef1");
1401 funcbkg->SetParameters(integral,0.5);
1404 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
1405 funcbkg->SetParameters(integral,-10.,5.);
1408 cout<<"Wrong choise of ftypeOfFit4Bkg ("<<ftypeOfFit4Bkg<<")"<<endl;
1414 Int_t status=fhistoInvMass->Fit(bkgname.Data(),"R,L,E,+,0");
1416 cout<<"Minuit returned "<<status<<endl;
1419 AddFunctionsToHisto();
1426 //_________________________________________________________________________
1427 Double_t AliHFMassFitter::GetChiSquare() const{
1429 TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass");
1431 cout<<"funcmass not found"<<endl;
1434 return funcmass->GetChisquare();
1437 //_________________________________________________________________________
1438 Double_t AliHFMassFitter::GetReducedChiSquare() const{
1439 //Get reduced Chi^2 method
1440 TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass");
1442 cout<<"funcmass not found"<<endl;
1445 return funcmass->GetChisquare()/funcmass->GetNDF();
1450 //_________________________________________________________________________
1451 void AliHFMassFitter::GetFitPars(Float_t *vector) const {
1452 // Return fit parameters
1454 for(Int_t i=0;i<fParsSize;i++){
1455 vector[i]=fFitPars[i];
1460 //_________________________________________________________________________
1461 void AliHFMassFitter::IntS(Float_t *valuewitherror) const {
1463 //gives the integral of signal obtained from fit parameters
1464 if(!valuewitherror) {
1465 printf("AliHFMassFitter::IntS: got a null pointer\n");
1469 Int_t index=fParsSize/2 - 3;
1470 valuewitherror[0]=fFitPars[index];
1471 index=fParsSize - 3;
1472 valuewitherror[1]=fFitPars[index];
1476 //_________________________________________________________________________
1477 void AliHFMassFitter::AddFunctionsToHisto(){
1479 //Add the background function in the complete range to the list of functions attached to the histogram
1481 //cout<<"AddFunctionsToHisto called"<<endl;
1482 TString bkgname = "funcbkg";
1484 Bool_t done1=kFALSE,done2=kFALSE;
1486 TString bkgnamesave=bkgname;
1487 TString testname=bkgname;
1488 testname += "FullRange";
1489 TF1 *testfunc=(TF1*)fhistoInvMass->FindObject(testname.Data());
1494 testname="funcbkgonly";
1495 testfunc=(TF1*)fhistoInvMass->FindObject(testname.Data());
1502 cout<<"AddFunctionsToHisto already used: exiting...."<<endl;
1506 TList *hlist=fhistoInvMass->GetListOfFunctions();
1510 TF1 *bonly=(TF1*)hlist->FindObject(testname.Data());
1512 cout<<testname.Data()<<" not found looking for complete fit"<<endl;
1514 bonly->SetLineColor(kBlue+3);
1515 hlist->Add((TF1*)bonly->Clone());
1522 TF1 *b=(TF1*)hlist->FindObject(bkgname.Data());
1524 cout<<bkgname<<" not found, cannot produce "<<bkgname<<"FullRange and "<<bkgname<<"Recalc"<<endl;
1528 bkgname += "FullRange";
1529 TF1 *bfullrange=new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,fNFinalPars-3,"AliHFMassFitter","FitFunction4Bkg");
1530 //cout<<bfullrange->GetName()<<endl;
1531 for(Int_t i=0;i<fNFinalPars-3;i++){
1532 bfullrange->SetParName(i,b->GetParName(i));
1533 bfullrange->SetParameter(i,b->GetParameter(i));
1534 bfullrange->SetParError(i,b->GetParError(i));
1536 bfullrange->SetLineStyle(4);
1537 bfullrange->SetLineColor(14);
1539 bkgnamesave += "Recalc";
1541 TF1 *blastpar=new TF1(bkgnamesave.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,fNFinalPars-3,"AliHFMassFitter","FitFunction4Bkg");
1543 TF1 *mass=fhistoInvMass->GetFunction("funcmass");
1546 cout<<"funcmass doesn't exist "<<endl;
1550 //intBkg=intTot-intS
1551 blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(fNFinalPars-3));
1552 blastpar->SetParError(0,mass->GetParError(fNFinalPars-3));
1553 if (fNFinalPars>=5) {
1554 blastpar->SetParameter(1,mass->GetParameter(1));
1555 blastpar->SetParError(1,mass->GetParError(1));
1557 if (fNFinalPars==6) {
1558 blastpar->SetParameter(2,mass->GetParameter(2));
1559 blastpar->SetParError(2,mass->GetParError(2));
1562 blastpar->SetLineStyle(1);
1563 blastpar->SetLineColor(2);
1565 hlist->Add((TF1*)bfullrange->Clone());
1566 hlist->Add((TF1*)blastpar->Clone());
1577 //_________________________________________________________________________
1579 TH1F* AliHFMassFitter::GetHistoClone() const{
1581 TH1F* hout=(TH1F*)fhistoInvMass->Clone(fhistoInvMass->GetName());
1584 //_________________________________________________________________________
1586 void AliHFMassFitter::WriteHisto(TString path) const {
1588 //Write the histogram in the default file HFMassFitterOutput.root
1590 if (fcounter == 0) {
1591 cout<<"Use MassFitter method before WriteHisto"<<endl;
1594 TH1F* hget=(TH1F*)fhistoInvMass->Clone();
1596 path += "HFMassFitterOutput.root";
1599 if (fcounter == 1) output = new TFile(path.Data(),"recreate");
1600 else output = new TFile(path.Data(),"update");
1603 fContourGraph->Write();
1608 cout<<fcounter<<" "<<hget->GetName()<<" written in "<<path<<endl;
1614 //_________________________________________________________________________
1616 void AliHFMassFitter::WriteNtuple(TString path) const{
1617 //TNtuple* nget=(TNtuple*)fntuParam->Clone();
1618 path += "HFMassFitterOutput.root";
1619 TFile *output = new TFile(path.Data(),"update");
1624 //cout<<nget->GetName()<<" written in "<<path<<endl;
1625 cout<<fntuParam->GetName()<<" written in "<<path<<endl;
1636 //_________________________________________________________________________
1637 void AliHFMassFitter::WriteCanvas(TString userIDstring,TString path,Double_t nsigma,Int_t writeFitInfo,Bool_t draw) const{
1639 //write the canvas in a root file
1641 gStyle->SetOptStat(0);
1642 gStyle->SetCanvasColor(0);
1643 gStyle->SetFrameFillColor(0);
1647 switch (ftypeOfFit4Bkg){
1664 type="PowExp"; //3+3
1668 TString filename=Form("%sMassFit.root",type.Data());
1669 filename.Prepend(userIDstring);
1670 path.Append(filename);
1672 TFile* outputcv=new TFile(path.Data(),"update");
1674 TCanvas* c=(TCanvas*)GetPad(nsigma,writeFitInfo);
1675 c->SetName(Form("%s%s%s",c->GetName(),userIDstring.Data(),type.Data()));
1676 if(draw)c->DrawClone();
1682 //_________________________________________________________________________
1684 TVirtualPad* AliHFMassFitter::GetPad(Double_t nsigma,Int_t writeFitInfo)const{
1685 //return a TVirtualPad with the fitted histograms and info
1687 TString cvtitle="fit of ";
1688 cvtitle+=fhistoInvMass->GetName();
1692 TCanvas *c=new TCanvas(cvname,cvtitle);
1693 PlotFit(c->cd(),nsigma,writeFitInfo);
1696 //_________________________________________________________________________
1698 void AliHFMassFitter::PlotFit(TVirtualPad* pd,Double_t nsigma,Int_t writeFitInfo)const{
1699 //plot histogram, fit functions and write parameters according to verbosity level (0,1,>1)
1700 gStyle->SetOptStat(0);
1701 gStyle->SetCanvasColor(0);
1702 gStyle->SetFrameFillColor(0);
1704 cout<<"nsigma = "<<nsigma<<endl;
1705 cout<<"Verbosity = "<<writeFitInfo<<endl;
1707 TH1F* hdraw=GetHistoClone();
1709 if(!hdraw->GetFunction("funcmass") && !hdraw->GetFunction("funcbkgFullRange") && !hdraw->GetFunction("funcbkgRecalc")&& !hdraw->GetFunction("funcbkgonly")){
1710 cout<<"Probably fit failed and you didn't try to refit with background only, there's no function to be drawn"<<endl;
1714 if(hdraw->GetFunction("funcbkgonly")){ //Warning! if this function is present, no chance to draw the other!
1715 cout<<"Drawing background fit only"<<endl;
1716 hdraw->SetMinimum(0);
1717 hdraw->GetXaxis()->SetRangeUser(fminMass,fmaxMass);
1719 hdraw->SetMarkerStyle(20);
1720 hdraw->DrawClone("PE");
1721 hdraw->GetFunction("funcbkgonly")->DrawClone("sames");
1723 if(writeFitInfo > 0){
1724 TPaveText *pinfo=new TPaveText(0.6,0.86,1.,1.,"NDC");
1725 pinfo->SetBorderSize(0);
1726 pinfo->SetFillStyle(0);
1727 TF1* f=hdraw->GetFunction("funcbkgonly");
1728 for (Int_t i=0;i<fNFinalPars-3;i++){
1729 pinfo->SetTextColor(kBlue+3);
1730 TString str=Form("%s = %.3f #pm %.3f",f->GetParName(i),f->GetParameter(i),f->GetParError(i));
1731 pinfo->AddText(str);
1734 pinfo->AddText(Form("Reduced #chi^{2} = %.3f",f->GetChisquare()/f->GetNDF()));
1744 hdraw->SetMinimum(0);
1745 hdraw->GetXaxis()->SetRangeUser(fminMass,fmaxMass);
1747 hdraw->SetMarkerStyle(20);
1748 hdraw->DrawClone("PE");
1749 // if(hdraw->GetFunction("funcbkgFullRange")) hdraw->GetFunction("funcbkgFullRange")->DrawClone("same");
1750 // if(hdraw->GetFunction("funcbkgRecalc")) hdraw->GetFunction("funcbkgRecalc")->DrawClone("same");
1751 if(hdraw->GetFunction("funcmass")) hdraw->GetFunction("funcmass")->DrawClone("same");
1753 if(writeFitInfo > 0){
1754 TPaveText *pinfob=new TPaveText(0.6,0.86,1.,1.,"NDC");
1755 TPaveText *pinfom=new TPaveText(0.6,0.7,1.,.87,"NDC");
1756 pinfob->SetBorderSize(0);
1757 pinfob->SetFillStyle(0);
1758 pinfom->SetBorderSize(0);
1759 pinfom->SetFillStyle(0);
1760 TF1* ff=fhistoInvMass->GetFunction("funcmass");
1762 for (Int_t i=fNFinalPars-3;i<fNFinalPars;i++){
1763 pinfom->SetTextColor(kBlue);
1764 TString str=Form("%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1765 if(!(writeFitInfo==1 && i==fNFinalPars-3)) pinfom->AddText(str);
1768 pinfom->DrawClone();
1770 TPaveText *pinfo2=new TPaveText(0.1,0.1,0.6,0.4,"NDC");
1771 pinfo2->SetBorderSize(0);
1772 pinfo2->SetFillStyle(0);
1774 Double_t signif, signal, bkg, errsignif, errsignal, errbkg;
1776 Significance(nsigma,signif,errsignif);
1777 Signal(nsigma,signal,errsignal);
1778 Background(nsigma,bkg, errbkg);
1780 Significance(1.828,1.892,signif,errsignif);
1781 Signal(1.828,1.892,signal,errsignal);
1782 Background(1.828,1.892,bkg, errbkg);
1784 TString str=Form("Significance (%.0f#sigma) %.1f #pm %.1f ",nsigma,signif,errsignif);
1785 pinfo2->AddText(str);
1786 str=Form("S (%.0f#sigma) %.0f #pm %.0f ",nsigma,signal,errsignal);
1787 pinfo2->AddText(str);
1788 str=Form("B (%.0f#sigma) %.0f #pm %.0f",nsigma,bkg,errbkg);
1789 pinfo2->AddText(str);
1790 if(bkg>0) str=Form("S/B (%.0f#sigma) %.4f ",nsigma,signal/bkg);
1791 pinfo2->AddText(str);
1796 if(writeFitInfo > 1){
1797 for (Int_t i=0;i<fNFinalPars-3;i++){
1798 pinfob->SetTextColor(kRed);
1799 str=Form("%s = %f #pm %f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1800 pinfob->AddText(str);
1803 pinfob->DrawClone();
1811 //_________________________________________________________________________
1813 void AliHFMassFitter::DrawHere(TVirtualPad* pd,Double_t nsigma,Int_t writeFitInfo) const {
1814 //draws histogram together with fit functions with default nice colors in user canvas
1815 PlotFit(pd,nsigma,writeFitInfo);
1820 //_________________________________________________________________________
1821 void AliHFMassFitter::DrawFit(Double_t nsigma) const{
1823 //draws histogram together with fit functions with default nice colors
1824 gStyle->SetOptStat(0);
1825 gStyle->SetCanvasColor(0);
1826 gStyle->SetFrameFillColor(0);
1829 TCanvas* c=(TCanvas*)GetPad(nsigma,1);
1835 //_________________________________________________________________________
1837 void AliHFMassFitter::PrintParTitles() const{
1839 //prints to screen the parameters names
1841 TF1 *f=fhistoInvMass->GetFunction("funcmass");
1843 cout<<"Fit function not found"<<endl;
1847 cout<<"Parameter Titles \n";
1848 for(Int_t i=0;i<fNFinalPars;i++){
1849 cout<<"Par "<<i<<": "<<f->GetParName(i)<<endl;
1855 //************ significance
1857 //_________________________________________________________________________
1859 void AliHFMassFitter::Signal(Double_t nOfSigma,Double_t &signal,Double_t &errsignal) const {
1860 // Return signal integral in mean+- n sigma
1863 cout<<"Use MassFitter method before Signal"<<endl;
1867 Double_t min=fMass-nOfSigma*fSigmaSgn;
1868 Double_t max=fMass+nOfSigma*fSigmaSgn;
1870 Signal(min,max,signal,errsignal);
1877 //_________________________________________________________________________
1879 void AliHFMassFitter::Signal(Double_t min, Double_t max, Double_t &signal,Double_t &errsignal) const {
1881 // Return signal integral in a range
1884 cout<<"Use MassFitter method before Signal"<<endl;
1889 TString bkgname="funcbkgRecalc";
1890 TString bkg1name="funcbkg1Recalc";
1891 TString massname="funcmass";
1895 TF1 *funcmass=fhistoInvMass->GetFunction(massname.Data());
1897 cout<<"AliHFMassFitter::Signal() ERROR -> Mass distr function not found!"<<endl;
1901 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1902 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1905 cout<<"AliHFMassFitter::Signal() ERROR -> Bkg function not found!"<<endl;
1909 Int_t np=fNFinalPars-3;
1911 Double_t intS,intSerr;
1913 //relative error evaluation
1914 intS=funcmass->GetParameter(np);
1915 intSerr=funcmass->GetParError(np);
1917 cout<<"Sgn relative error evaluation from fit: "<<intSerr/intS<<endl;
1918 Double_t background,errbackground;
1919 Background(min,max,background,errbackground);
1921 //signal +/- error in the range
1923 Double_t mass=funcmass->Integral(min, max)/fhistoInvMass->GetBinWidth(4);
1924 signal=mass - background;
1925 errsignal=(intSerr/intS)*signal;/*assume relative error is the same as for total integral*/
1929 //_________________________________________________________________________
1931 void AliHFMassFitter::Background(Double_t nOfSigma,Double_t &background,Double_t &errbackground) const {
1932 // Return background integral in mean+- n sigma
1935 cout<<"Use MassFitter method before Background"<<endl;
1938 Double_t min=fMass-nOfSigma*fSigmaSgn;
1939 Double_t max=fMass+nOfSigma*fSigmaSgn;
1941 Background(min,max,background,errbackground);
1946 //___________________________________________________________________________
1948 void AliHFMassFitter::Background(Double_t min, Double_t max, Double_t &background,Double_t &errbackground) const {
1949 // Return background integral in a range
1952 cout<<"Use MassFitter method before Background"<<endl;
1957 TString bkgname="funcbkgRecalc";
1958 TString bkg1name="funcbkg1Recalc";
1961 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1962 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1964 cout<<"AliHFMassFitter::Background() ERROR -> Bkg function not found!"<<endl;
1969 Double_t intB,intBerr;
1971 //relative error evaluation: from final parameters of the fit
1972 if(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn == 0) cout<<"No background fit: Bkg relative error evaluation put to zero"<<endl;
1974 intB=funcbkg->GetParameter(0);
1975 intBerr=funcbkg->GetParError(0);
1976 cout<<"Bkg relative error evaluation: from final parameters of the fit: "<<intBerr/intB<<endl;
1979 //relative error evaluation: from histo
1981 intB=fhistoInvMass->Integral(1,fSideBandl)+fhistoInvMass->Integral(fSideBandr,fNbin);
1983 for(Int_t i=1;i<=fSideBandl;i++){
1984 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1986 for(Int_t i=fSideBandr;i<=fNbin;i++){
1987 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1990 intBerr=TMath::Sqrt(sum2);
1991 cout<<"Bkg relative error evaluation: from histo: "<<intBerr/intB<<endl;
1993 cout<<"Last estimation of bkg error is used"<<endl;
1995 //backround +/- error in the range
1996 if (ftypeOfFit4Bkg == 3 && ftypeOfFit4Sgn == 0) {
2001 background=funcbkg->Integral(min,max)/(Double_t)fhistoInvMass->GetBinWidth(2);
2002 errbackground=intBerr/intB*background; // assume relative error is the same as for total integral
2003 //cout<<"integral = "<<funcbkg->Integral(min, max)<<"\tbinW = "<<fhistoInvMass->GetBinWidth(2)<<endl;
2010 //__________________________________________________________________________
2012 void AliHFMassFitter::Significance(Double_t nOfSigma,Double_t &significance,Double_t &errsignificance) const {
2013 // Return significance in mean+- n sigma
2015 Double_t min=fMass-nOfSigma*fSigmaSgn;
2016 Double_t max=fMass+nOfSigma*fSigmaSgn;
2017 Significance(min, max, significance, errsignificance);
2022 //__________________________________________________________________________
2024 void AliHFMassFitter::Significance(Double_t min, Double_t max, Double_t &significance,Double_t &errsignificance) const {
2025 // Return significance integral in a range
2027 Double_t signal,errsignal,background,errbackground;
2028 Signal(min, max,signal,errsignal);
2029 Background(min, max,background,errbackground);
2031 if (signal+background <= 0.){
2032 cout<<"Cannot calculate significance because of div by 0!"<<endl;
2038 AliVertexingHFUtils::ComputeSignificance(signal,errsignal,background,errbackground,significance,errsignificance);