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 **************************************************************************/
16 /////////////////////////////////////////////////////////////
18 // AliHFMassFitter for the fit of invariant mass distribution
21 // Author: C.Bianchin, chiara.bianchin@pd.infn.it
22 /////////////////////////////////////////////////////////////
27 #include <TVirtualFitter.h>
28 #include <TClonesArray.h>
30 #include "AliHFMassFitter.h"
33 ClassImp(AliHFMassFitter)
35 //************** constructors
36 AliHFMassFitter::AliHFMassFitter() :
57 // default constructor
59 cout<<"Default constructor"<<endl;
63 //___________________________________________________________________________
65 AliHFMassFitter::AliHFMassFitter (TH1F *histoToFit, Double_t minvalue, Double_t maxvalue, Int_t rebin,Int_t fittypeb,Int_t fittypes):
86 // standard constructor
88 fhistoInvMass= (TH1F*)histoToFit->Clone("fhistoInvMass");
91 if(rebin!=1) RebinMass(rebin);
92 else fNbin=(Int_t)fhistoInvMass->GetNbinsX();
93 ftypeOfFit4Bkg=fittypeb;
94 ftypeOfFit4Sgn=fittypes;
95 if(ftypeOfFit4Bkg!=0 && ftypeOfFit4Bkg!=1 && ftypeOfFit4Bkg!=2) fWithBkg=kFALSE;
97 if (!fWithBkg) cout<<"Fit Histogram of Signal only"<<endl;
98 else cout<<"Type of fit For Background = "<<ftypeOfFit4Bkg<<endl;
101 fFitPars=new Float_t[fParsSize];
103 fContourGraph=new TList();
104 fContourGraph->SetOwner();
109 AliHFMassFitter::AliHFMassFitter(const AliHFMassFitter &mfit):
111 fhistoInvMass(mfit.fhistoInvMass),
112 fminMass(mfit.fminMass),
113 fmaxMass(mfit.fmaxMass),
115 fParsSize(mfit.fParsSize),
117 fWithBkg(mfit.fWithBkg),
118 ftypeOfFit4Bkg(mfit.ftypeOfFit4Bkg),
119 ftypeOfFit4Sgn(mfit.ftypeOfFit4Sgn),
120 ffactor(mfit.ffactor),
121 fntuParam(mfit.fntuParam),
123 fSigmaSgn(mfit.fSigmaSgn),
124 fSideBands(mfit.fSideBands),
125 fSideBandl(mfit.fSideBandl),
126 fSideBandr(mfit.fSideBandr),
127 fcounter(mfit.fcounter),
128 fContourGraph(mfit.fContourGraph)
132 if(mfit.fParsSize > 0){
133 fFitPars=new Float_t[fParsSize];
134 memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
136 //for(Int_t i=0;i<fParsSize;i++) fFitPars[i]=mfit.fFitPars[i];
139 //_________________________________________________________________________
141 AliHFMassFitter::~AliHFMassFitter() {
142 cout<<"AliHFMassFitter destructor called"<<endl;
144 cout<<"deleting histogram..."<<endl;
145 delete fhistoInvMass;
149 cout<<"deleting ntuple..."<<endl;
157 cout<<"deleting parameter array..."<<endl;
164 //_________________________________________________________________________
166 AliHFMassFitter& AliHFMassFitter::operator=(const AliHFMassFitter &mfit){
168 //assignment operator
170 if(&mfit == this) return *this;
171 fhistoInvMass= mfit.fhistoInvMass;
172 fminMass= mfit.fminMass;
173 fmaxMass= mfit.fmaxMass;
175 fParsSize= mfit.fParsSize;
176 fWithBkg= mfit.fWithBkg;
177 ftypeOfFit4Bkg= mfit.ftypeOfFit4Bkg;
178 ftypeOfFit4Sgn= mfit.ftypeOfFit4Sgn;
179 ffactor= mfit.ffactor;
180 fntuParam= mfit.fntuParam;
182 fSigmaSgn= mfit.fSigmaSgn;
183 fSideBands= mfit.fSideBands;
184 fSideBandl= mfit.fSideBandl;
185 fSideBandr= mfit.fSideBandr;
186 fcounter= mfit.fcounter;
187 fContourGraph= mfit.fContourGraph;
189 if(mfit.fParsSize > 0){
194 fFitPars=new Float_t[fParsSize];
195 memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
197 // fFitPars=new Float_t[fParsSize];
198 // for(Int_t i=0;i<fParsSize;i++) fFitPars[i]=mfit.fFitPars[i];
203 //************ tools & settings
205 //__________________________________________________________________________
207 void AliHFMassFitter::ComputeParSize() {
208 switch (ftypeOfFit4Bkg) {//npar backround func
222 cout<<"Error in computing fParsSize: check ftypeOfFit4Bkg"<<endl;
226 fParsSize += 3; // npar refl
227 fParsSize += 3; // npar signal gaus
229 fParsSize*=2; // add errors
230 cout<<"Parameters array size "<<fParsSize<<endl;
233 //___________________________________________________________________________
234 void AliHFMassFitter::SetHisto(TH1F *histoToFit){
235 //fhistoInvMass = (TH1F*)histoToFit->Clone();
236 fhistoInvMass = new TH1F(*histoToFit);
237 cout<<"SetHisto pointer "<<fhistoInvMass<<endl;
240 //___________________________________________________________________________
242 void AliHFMassFitter::SetType(Int_t fittypeb, Int_t fittypes) {
243 ftypeOfFit4Bkg = fittypeb;
244 ftypeOfFit4Sgn = fittypes;
246 fFitPars = new Float_t[fParsSize];
250 //___________________________________________________________________________
252 void AliHFMassFitter::Reset() {
253 cout<<"Reset called: delete histogram, set mean value to 1.85 and sigma to 0.012"<<endl;
256 cout<<"Reset "<<fhistoInvMass<<endl;
258 //cout<<"esiste"<<endl;
259 //delete fhistoInvMass;
261 cout<<fhistoInvMass<<endl;
263 else cout<<"histogram doesn't exist, do not delete"<<endl;
267 //_________________________________________________________________________
269 void AliHFMassFitter::InitNtuParam(char *ntuname) {
270 // Create ntuple to keep fit parameters
272 fntuParam=new TNtuple(ntuname,"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");
276 //_________________________________________________________________________
278 void AliHFMassFitter::FillNtuParam() {
279 // Fill ntuple with fit parameters
283 if (ftypeOfFit4Bkg==2) {
284 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
285 fntuParam->SetBranchAddress("slope1",&fFitPars[1]);
286 fntuParam->SetBranchAddress("conc1",&fFitPars[2]);
287 fntuParam->SetBranchAddress("intGB",&fFitPars[3]);
288 fntuParam->SetBranchAddress("meanGB",&fFitPars[4]);
289 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[5]);
290 fntuParam->SetBranchAddress("intbkg2",&fFitPars[6]);
291 fntuParam->SetBranchAddress("slope2",&fFitPars[7]);
292 fntuParam->SetBranchAddress("conc2",&fFitPars[8]);
293 fntuParam->SetBranchAddress("inttot",&fFitPars[9]);
294 fntuParam->SetBranchAddress("slope3",&fFitPars[10]);
295 fntuParam->SetBranchAddress("conc3",&fFitPars[11]);
296 fntuParam->SetBranchAddress("intsgn",&fFitPars[12]);
297 fntuParam->SetBranchAddress("meansgn",&fFitPars[13]);
298 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[14]);
300 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[15]);
301 fntuParam->SetBranchAddress("slope1Err",&fFitPars[16]);
302 fntuParam->SetBranchAddress("conc1Err",&fFitPars[17]);
303 fntuParam->SetBranchAddress("intGBErr",&fFitPars[18]);
304 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[19]);
305 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[20]);
306 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[21]);
307 fntuParam->SetBranchAddress("slope2Err",&fFitPars[22]);
308 fntuParam->SetBranchAddress("conc2Err",&fFitPars[23]);
309 fntuParam->SetBranchAddress("inttotErr",&fFitPars[24]);
310 fntuParam->SetBranchAddress("slope3Err",&fFitPars[25]);
311 fntuParam->SetBranchAddress("conc3Err",&fFitPars[26]);
312 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[27]);
313 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[28]);
314 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[29]);
318 if(ftypeOfFit4Bkg==3){
319 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
320 fntuParam->SetBranchAddress("slope1",¬hing);
321 fntuParam->SetBranchAddress("conc1",¬hing);
322 fntuParam->SetBranchAddress("intGB",&fFitPars[1]);
323 fntuParam->SetBranchAddress("meanGB",&fFitPars[2]);
324 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[3]);
325 fntuParam->SetBranchAddress("intbkg2",&fFitPars[4]);
326 fntuParam->SetBranchAddress("slope2",¬hing);
327 fntuParam->SetBranchAddress("conc2",¬hing);
328 fntuParam->SetBranchAddress("inttot",&fFitPars[6]);
329 fntuParam->SetBranchAddress("slope3",¬hing);
330 fntuParam->SetBranchAddress("conc3",¬hing);
331 fntuParam->SetBranchAddress("intsgn",&fFitPars[6]);
332 fntuParam->SetBranchAddress("meansgn",&fFitPars[7]);
333 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[8]);
335 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[9]);
336 fntuParam->SetBranchAddress("slope1Err",¬hing);
337 fntuParam->SetBranchAddress("conc1Err",¬hing);
338 fntuParam->SetBranchAddress("intGBErr",&fFitPars[10]);
339 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[11]);
340 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[12]);
341 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[13]);
342 fntuParam->SetBranchAddress("slope2Err",¬hing);
343 fntuParam->SetBranchAddress("conc2Err",¬hing);
344 fntuParam->SetBranchAddress("inttotErr",&fFitPars[15]);
345 fntuParam->SetBranchAddress("slope3Err",¬hing);
346 fntuParam->SetBranchAddress("conc3Err",¬hing);
347 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[15]);
348 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[16]);
349 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[17]);
353 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
354 fntuParam->SetBranchAddress("slope1",&fFitPars[1]);
355 fntuParam->SetBranchAddress("conc1",¬hing);
356 fntuParam->SetBranchAddress("intGB",&fFitPars[2]);
357 fntuParam->SetBranchAddress("meanGB",&fFitPars[3]);
358 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[4]);
359 fntuParam->SetBranchAddress("intbkg2",&fFitPars[5]);
360 fntuParam->SetBranchAddress("slope2",&fFitPars[6]);
361 fntuParam->SetBranchAddress("conc2",¬hing);
362 fntuParam->SetBranchAddress("inttot",&fFitPars[7]);
363 fntuParam->SetBranchAddress("slope3",&fFitPars[8]);
364 fntuParam->SetBranchAddress("conc3",¬hing);
365 fntuParam->SetBranchAddress("intsgn",&fFitPars[9]);
366 fntuParam->SetBranchAddress("meansgn",&fFitPars[10]);
367 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[11]);
369 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[12]);
370 fntuParam->SetBranchAddress("slope1Err",&fFitPars[13]);
371 fntuParam->SetBranchAddress("conc1Err",¬hing);
372 fntuParam->SetBranchAddress("intGBErr",&fFitPars[14]);
373 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[15]);
374 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[16]);
375 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[17]);
376 fntuParam->SetBranchAddress("slope2Err",&fFitPars[18]);
377 fntuParam->SetBranchAddress("conc2Err",¬hing);
378 fntuParam->SetBranchAddress("inttotErr",&fFitPars[19]);
379 fntuParam->SetBranchAddress("slope3Err",&fFitPars[20]);
380 fntuParam->SetBranchAddress("conc3Err",¬hing);
381 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[21]);
382 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[22]);
383 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[23]);
387 fntuParam->TTree::Fill();
390 //_________________________________________________________________________
392 TNtuple* AliHFMassFitter::NtuParamOneShot(char *ntuname){
393 // Create, fill and return ntuple with fit parameters
395 InitNtuParam(ntuname);
399 //_________________________________________________________________________
401 void AliHFMassFitter::RebinMass(Int_t bingroup){
402 // Rebin invariant mass histogram
405 cout<<"Error! Cannot group "<<bingroup<<" bins\n";
406 fNbin=fhistoInvMass->GetNbinsX();
407 cout<<"Kept original number of bins: "<<fNbin<<endl;
409 fhistoInvMass->Rebin(bingroup);
410 fNbin = fhistoInvMass->GetNbinsX();
411 cout<<"New number of bins: "<<fNbin<<endl;
419 //___________________________________________________________________________
421 Double_t AliHFMassFitter::FitFunction4MassDistr (Double_t *x, Double_t *par){
422 // Fit function for signal+background
425 //exponential or linear fit
427 // par[0] = tot integral
429 // par[2] = gaussian integral
430 // par[3] = gaussian mean
431 // par[4] = gaussian sigma
433 Double_t total,bkg=0,sgn=0;
435 if (ftypeOfFit4Bkg==0 || ftypeOfFit4Bkg==1) {
436 if(ftypeOfFit4Sgn == 0) {
438 Double_t parbkg[2] = {par[0]-par[2], par[1]};
439 bkg = FitFunction4Bkg(x,parbkg);
441 if(ftypeOfFit4Sgn == 1) {
442 Double_t parbkg[5] = {par[2],par[3],ffactor*par[4],par[0]-2*par[2], par[1]};
443 bkg = FitFunction4Bkg(x,parbkg);
446 sgn = FitFunction4Sgn(x,&par[2]);
452 // par[0] = tot integral
455 // par[3] = gaussian integral
456 // par[4] = gaussian mean
457 // par[5] = gaussian sigma
459 if (ftypeOfFit4Bkg==2) {
461 if(ftypeOfFit4Sgn == 0) {
463 Double_t parbkg[3] = {par[0]-par[3], par[1], par[2]};
464 bkg = FitFunction4Bkg(x,parbkg);
466 if(ftypeOfFit4Sgn == 1) {
468 Double_t parbkg[6] = {par[3],par[4],ffactor*par[5],par[0]-2*par[3], par[1], par[2]};
469 bkg = FitFunction4Bkg(x,parbkg);
472 sgn = FitFunction4Sgn(x,&par[3]);
475 if (ftypeOfFit4Bkg==3) {
477 if(ftypeOfFit4Sgn == 0) {
478 bkg=FitFunction4Bkg(x,par);
479 sgn=FitFunction4Sgn(x,&par[1]);
481 if(ftypeOfFit4Sgn == 1) {
482 Double_t parbkg[4]={par[1],par[2],ffactor*par[3],par[0]};
483 bkg=FitFunction4Bkg(x,parbkg);
484 sgn=FitFunction4Sgn(x,&par[1]);
493 //_________________________________________________________________________
494 Double_t AliHFMassFitter::FitFunction4Sgn (Double_t *x, Double_t *par){
495 // Fit function for the signal
497 //gaussian = A/(sigma*sqrt(2*pi))*exp(-(x-mean)^2/2/sigma^2)
499 // * [0] = integralSgn
502 //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
504 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]);
508 //__________________________________________________________________________
510 Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
511 // Fit function for the background
513 Double_t maxDeltaM = 4.*fSigmaSgn;
514 if(fSideBands && TMath::Abs(x[0]-fMass) < maxDeltaM) {
519 Double_t gaus2=0,total=-1;
520 if(ftypeOfFit4Sgn == 1){
522 //gaussian = A/(sigma*sqrt(2*pi))*exp(-(x-mean)^2/2/sigma^2)
524 // * [0] = integralSgn
527 //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
528 gaus2 = FitFunction4Sgn(x,par);
531 switch (ftypeOfFit4Bkg){
534 //exponential = A*exp(B*x) -> integral(exponential)=A/B*exp(B*x)](min,max)
535 //-> A = B*integral/(exp(B*max)-exp(B*min)) where integral can be written
536 //as integralTot- integralGaus (=par [2])
538 // * [0] = integralBkg;
540 //exponential = [1]*[0]/(exp([1]*max)-exp([1]*min))*exp([1]*x)
541 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]);
545 //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)
546 // * [0] = integralBkg;
548 total= par[0+firstPar]/(fmaxMass-fminMass)+par[1+firstPar]*(x[0]-0.5*(fmaxMass+fminMass));
552 //y=a+b*x+c*x**2 -> integral = a(max-min) + 1/2*b*(max^2-min^2) +
553 //+ 1/3*c*(max^3-min^3) ->
554 //a = (integral-1/2*b*(max^2-min^2)-1/3*c*(max^3-min^3))/(max-min)
555 // * [0] = integralBkg;
558 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));
561 total=par[0+firstPar];
564 // Types of Fit Functions for Background:
565 // * 0 = exponential;
567 // * 2 = polynomial 2nd order
568 // * 3 = no background"<<endl;
574 //__________________________________________________________________________
575 Bool_t AliHFMassFitter::SideBandsBounds(){
577 Double_t width=fhistoInvMass->GetBinWidth(8);
578 if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
579 Double_t minHisto=fhistoInvMass->GetBinLowEdge(1);
580 Double_t maxHisto=fhistoInvMass->GetBinLowEdge(fNbin)+width;
582 if(fMass-fminMass < 0 || fmaxMass-fMass <0) {
583 cout<<"Left limit of range > mean or right limit of range < mean: change left/right limit or initial mean value"<<endl;
587 if((fminMass!=minHisto || fmaxMass!= maxHisto) && (fMass-4.*fSigmaSgn-fminMass) <= 0){
588 Double_t coeff = (fMass-fminMass)/fSigmaSgn;
590 fSideBandl=(Int_t)((fMass-0.5*coeff*fSigmaSgn-fminMass)/width);
591 fSideBandr=(Int_t)((fMass+0.5*coeff*fSigmaSgn-fminMass)/width);
592 cout<<"Changed number of sigma from 4 to "<<0.5*coeff<<" for the estimation of the side bands"<<endl;
593 if (coeff<3) cout<<"Side bands inside 3 sigma, may be better use ftypeOfFit4Bkg = 3 (only signal)"<<endl;
596 cout<<"Side bands inside 2 sigma. Change mode: ftypeOfFit4Bkg = 3"<<endl;
598 //set binleft and right without considering SetRangeFit- anyway no bkg!
599 fSideBandl=(Int_t)((fMass-4.*fSigmaSgn-minHisto)/width);
600 fSideBandr=(Int_t)((fMass+4.*fSigmaSgn-minHisto)/width);
604 fSideBandl=(Int_t)((fMass-4.*fSigmaSgn-minHisto)/width);
605 fSideBandr=(Int_t)((fMass+4.*fSigmaSgn-minHisto)/width);
606 // cout<<"\tfMass = "<<fMass<<"\tfSigmaSgn = "<<fSigmaSgn<<"\tminHisto = "<<minHisto<<endl;
607 // cout<<"\tbinleft = "<<fSideBandl<<"\tbinright = "<<fSideBandr<<endl;
611 cout<<"Error! Range too little";
617 //__________________________________________________________________________
619 void AliHFMassFitter::GetSideBandsBounds(Int_t &left, Int_t &right) const{
620 if (fSideBandl==0 && fSideBandr==0){
621 cout<<"Use MassFitter method first"<<endl;
628 //__________________________________________________________________________
630 Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
631 // Main method of the class: performs the fit of the histogram
633 //Set default fitter Minuit in order to use gMinuit in the contour plots
634 TVirtualFitter::SetDefaultFitter("Minuit");
636 Int_t nFitPars=0; //total function's number of parameters
637 switch (ftypeOfFit4Bkg){
652 Int_t bkgPar = nFitPars-3; //background function's number of parameters
654 cout<<"nFitPars = "<<nFitPars<<"\tbkgPar = "<<bkgPar<<endl;
657 TString listname="contourplot";
660 fContourGraph=new TList();
661 fContourGraph->SetOwner();
664 fContourGraph->SetName(listname);
668 TString bkgname="funcbkg";
669 TString bkg1name="funcbkg1";
670 TString massname="funcmass";
673 Double_t totInt = fhistoInvMass->Integral("width");
674 cout<<"Integral"<<endl;
677 Double_t width=fhistoInvMass->GetBinWidth(8);
678 cout<<"fNbin"<<fNbin<<endl;
679 if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
680 Double_t minHisto=fhistoInvMass->GetBinLowEdge(1);
681 Double_t maxHisto=fhistoInvMass->GetBinLowEdge(fNbin)+width;
682 Bool_t ok=SideBandsBounds();
683 if(!ok) return kFALSE;
685 //sidebands integral - first approx (from histo)
686 Double_t sideBandsInt=(Double_t)fhistoInvMass->Integral(1,fSideBandl,"width") + (Double_t)fhistoInvMass->Integral(fSideBandr,fNbin,"width");
687 cout<<"------nbin = "<<fNbin<<"\twidth = "<<width<<"\tbinleft = "<<fSideBandl<<"\tbinright = "<<fSideBandr<<endl;
688 cout<<"------sideBandsInt - first approx = "<<sideBandsInt<<endl;
689 if (sideBandsInt<=0) {
690 cout<<"! sideBandsInt <=0. There's a problem, cannot start the fit"<<endl;
697 TF1 *funcbkg = new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,minHisto,maxHisto,bkgPar,"AliHFMassFitter","FitFunction4Bkg");
698 cout<<"Function name = "<<funcbkg->GetName()<<endl<<endl;
700 funcbkg->SetLineColor(2); //red
702 //first fit for bkg: approx bkgint
704 switch (ftypeOfFit4Bkg) {
706 funcbkg->SetParNames("BkgInt","Slope");
707 funcbkg->SetParameters(sideBandsInt,-2.);
710 funcbkg->SetParNames("BkgInt","Slope");
711 funcbkg->SetParameters(sideBandsInt,-100.);
714 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
715 funcbkg->SetParameters(sideBandsInt,-10.,5);
718 if(ftypeOfFit4Sgn==0){
719 funcbkg->SetParNames("Const");
720 funcbkg->SetParameter(0,0.);
721 funcbkg->FixParameter(0,0.);
725 cout<<"Wrong choise of ftypeOfFit4Bkg ("<<ftypeOfFit4Bkg<<")"<<endl;
729 cout<<"\nBACKGROUND FIT - only combinatorial"<<endl;
730 Int_t ftypeOfFit4SgnBkp=ftypeOfFit4Sgn;
732 Double_t intbkg1=0,slope1=0,conc1=0;
733 //if only signal and reflection: skip
734 if (!(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn==1)) {
736 fhistoInvMass->Fit(bkgname.Data(),"R,L,E,0");
738 for(Int_t i=0;i<bkgPar;i++){
739 fFitPars[i]=funcbkg->GetParameter(i);
740 //cout<<i<<"\t"<<funcbkg->GetParameter(i)<<"\t";
741 fFitPars[nFitPars+2*bkgPar+3+i]= funcbkg->GetParError(i);
742 //cout<<nFitPars+2*bkgPar+3+i<<"\t"<< funcbkg->GetParError(i)<<endl;
745 //intbkg1 = funcbkg->GetParameter(0);
746 funcbkg->SetRange(fminMass,fmaxMass);
747 intbkg1 = funcbkg->Integral(fminMass,fmaxMass);
748 if(ftypeOfFit4Bkg!=3) slope1 = funcbkg->GetParameter(1);
749 if(ftypeOfFit4Bkg==2) conc1 = funcbkg->GetParameter(2);
750 cout<<"Primo fit: \nintbkg1 = "<<intbkg1<<"\t(Compare with par0 = "<<funcbkg->GetParameter(0)<<")\nslope1= "<<slope1<<"\nconc1 = "<<conc1<<endl;
752 else cout<<"\t\t//"<<endl;
754 ftypeOfFit4Sgn=ftypeOfFit4SgnBkp;
756 if (ftypeOfFit4Sgn == 1) {
757 cout<<"\nBACKGROUND FIT WITH REFLECTION"<<endl;
760 cout<<"nFitPars = "<<nFitPars<<"\tbkgPar = "<<bkgPar<<endl;
762 funcbkg1 = new TF1(bkg1name.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,bkgPar,"AliHFMassFitter","FitFunction4Bkg");
763 cout<<"Function name = "<<funcbkg1->GetName()<<endl;
765 funcbkg1->SetLineColor(2); //red
767 if(ftypeOfFit4Bkg==2){
768 cout<<"*** Polynomial Fit ***"<<endl;
769 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Coef1","Coef2");
770 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1,conc1);
771 // cout<<"Parameters set to: "<<0.5*(totInt-intbkg1)<<"\t"<<fMass<<"\t"<<ffactor*fSigmaSgn<<"\t"<<intbkg1<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<endl;
772 // cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<bkgPar<<"\tgsidebands = "<<fSideBands<<endl;
774 if(ftypeOfFit4Bkg==3) //no background: gaus sign+ gaus broadened
776 cout<<"*** No background Fit ***"<<endl;
777 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","Const");
778 funcbkg1->SetParameters(0.5*totInt,fMass,ffactor*fSigmaSgn,0.);
779 funcbkg1->FixParameter(3,0.);
780 } else{ //expo or linear
781 if(ftypeOfFit4Bkg==0) cout<<"*** Exponential Fit ***"<<endl;
782 if(ftypeOfFit4Bkg==1) cout<<"*** Linear Fit ***"<<endl;
783 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Slope");
784 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1);
787 fhistoInvMass->Fit(bkg1name.Data(),"R,L,E,+,0");
789 for(Int_t i=0;i<bkgPar;i++){
790 fFitPars[bkgPar-3+i]=funcbkg1->GetParameter(i);
791 //cout<<bkgPar-3+i<<"\t"<<funcbkg1->GetParameter(i);
792 fFitPars[nFitPars+3*bkgPar-6+i]= funcbkg1->GetParError(i);
793 //cout<<"\t"<<nFitPars+3*bkgPar-6+i<<"\t"<<funcbkg1->GetParError(i)<<endl;
796 intbkg1=funcbkg1->GetParameter(3);
797 if(ftypeOfFit4Bkg!=3) slope1 = funcbkg1->GetParameter(4);
798 if(ftypeOfFit4Bkg==2) conc1 = funcbkg1->GetParameter(5);
803 for(Int_t i=0;i<3;i++){
804 fFitPars[bkgPar-3+i]=0.;
805 cout<<bkgPar-3+i<<"\t"<<0.<<"\t";
806 fFitPars[nFitPars+3*bkgPar-6+i]= 0.;
807 cout<<nFitPars+3*bkgPar-6+i<<"\t"<<0.<<endl;
810 for(Int_t i=0;i<bkgPar-3;i++){
811 fFitPars[bkgPar+i]=funcbkg->GetParameter(i);
812 cout<<bkgPar+i<<"\t"<<funcbkg->GetParameter(i)<<"\t";
813 fFitPars[nFitPars+3*bkgPar-3+i]= funcbkg->GetParError(i);
814 cout<<nFitPars+3*bkgPar-3+i<<"\t"<< funcbkg->GetParError(i)<<endl;
820 //sidebands integral - second approx (from fit)
823 cout<<"Compare intbkg1 = "<<intbkg1<<" and integral = ";
824 if(ftypeOfFit4Sgn == 1) bkgInt=funcbkg1->Integral(fminMass,fmaxMass);
825 else bkgInt=funcbkg->Integral(fminMass,fmaxMass);
826 cout<</*"------BkgInt(Fit) = "<<*/bkgInt<<endl;
828 //Signal integral - first approx
830 sgnInt = totInt-bkgInt;
831 cout<<"------TotInt = "<<totInt<<"\tsgnInt = "<<sgnInt<<endl;
833 /*Fit All Mass distribution with exponential + gaussian (+gaussiam braodened) */
834 TF1 *funcmass = new TF1(massname.Data(),this,&AliHFMassFitter::FitFunction4MassDistr,fminMass,fmaxMass,nFitPars,"AliHFMassFitter","FitFunction4MassDistr");
835 cout<<"Function name = "<<funcmass->GetName()<<endl<<endl;
836 funcmass->SetLineColor(4); //blue
839 cout<<"\nTOTAL FIT"<<endl;
842 funcmass->SetParNames("TotInt","Slope","SgnInt","Mean","Sigma");
843 funcmass->SetParameters(totInt,slope1,sgnInt,fMass,fSigmaSgn);
844 //cout<<"Parameters set to: "<<totInt<<"\t"<<slope1<<"\t"<<sgnInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
845 // cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<nFitPars<<"\tgsidebands = "<<fSideBands<<endl;
846 funcmass->FixParameter(0,totInt);
849 funcmass->SetParNames("TotInt","Coef1","Coef2","SgnInt","Mean","Sigma");
850 funcmass->SetParameters(totInt,slope1,conc1,sgnInt,fMass,fSigmaSgn);
851 // cout<<"Parameters set to: "<<totInt<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<sgnInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
852 // cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<nFitPars<<"\tgsidebands = "<<fSideBands<<endl;
853 funcmass->FixParameter(0,totInt);
856 funcmass->SetParNames("Const","SgnInt","Mean","Sigma");
857 if(ftypeOfFit4Sgn == 1) funcmass->SetParameters(0.,0.5*totInt,fMass,fSigmaSgn);
858 else funcmass->SetParameters(0.,totInt,fMass,fSigmaSgn);
859 funcmass->FixParameter(0,0.);
860 //cout<<"Parameters set to: "<<0.5*totInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
861 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<nFitPars<<"\tgsidebands = "<<fSideBands<<endl;
865 fhistoInvMass->Fit(massname.Data(),"R,L,E,+,0");
866 cout<<"fit done"<<endl;
867 //reset value of fMass and fSigmaSgn to those found from fit
868 fMass=funcmass->GetParameter(nFitPars-2);
869 fSigmaSgn=funcmass->GetParameter(nFitPars-1);
871 for(Int_t i=0;i<nFitPars;i++){
872 fFitPars[i+2*bkgPar-3]=funcmass->GetParameter(i);
873 fFitPars[nFitPars+4*bkgPar-6+i]= funcmass->GetParError(i);
874 //cout<<i+2*bkgPar-3<<"\t"<<funcmass->GetParameter(i)<<"\t\t"<<nFitPars+4*bkgPar-6+i<<"\t"<<funcmass->GetParError(i)<<endl;
877 //check: cout parameters
878 for(Int_t i=0;i<2*(nFitPars+2*bkgPar-3);i++){
879 cout<<i<<"\t"<<fFitPars[i]<<endl;
884 // TCanvas *canvas=new TCanvas(fhistoInvMass->GetName(),fhistoInvMass->GetName());
885 // TH1F *fhistocopy=new TH1F(*fhistoInvMass);
887 // fhistocopy->DrawClone();
888 // if(ftypeOfFit4Sgn == 1) funcbkg1->DrawClone("sames");
889 // else funcbkg->DrawClone("sames");
890 // funcmass->DrawClone("sames");
891 // cout<<"Drawn"<<endl;
894 if(funcmass->GetParameter(nFitPars-1) <0 || funcmass->GetParameter(nFitPars-2) <0 || funcmass->GetParameter(nFitPars-3) <0 ) {
895 cout<<"IntS or mean or sigma negative. You may tray to SetInitialGaussianSigma(..) and SetInitialGaussianMean(..)"<<endl;
899 //increase counter of number of fits done
905 for (Int_t kpar=1; kpar<nFitPars;kpar++){
907 for(Int_t jpar=kpar+1;jpar<nFitPars;jpar++){
908 cout<<"Par "<<kpar<<" and "<<jpar<<endl;
910 // produce 2 contours per couple of parameters
911 TGraph* cont[2] = {0x0, 0x0};
912 const Double_t errDef[2] = {1., 4.};
913 for (Int_t i=0; i<2; i++) {
914 gMinuit->SetErrorDef(errDef[i]);
915 cont[i] = (TGraph*)gMinuit->Contour(80,kpar,jpar);
918 if(!cont[0] || !cont[1]){
919 cout<<"Skipping par "<<kpar<<" vs par "<<jpar<<endl;
923 // set graph titles and add them to the list
924 TString title = "Contour plot";
925 TString titleX = funcmass->GetParName(kpar);
926 TString titleY = funcmass->GetParName(jpar);
927 for (Int_t i=0; i<2; i++) {
928 cont[i]->SetName( Form("cperr%d_%d%d", i, kpar, jpar) );
929 cont[i]->SetTitle(title);
930 cont[i]->GetXaxis()->SetTitle(titleX);
931 cont[i]->GetYaxis()->SetTitle(titleY);
932 cont[i]->GetYaxis()->SetLabelSize(0.033);
933 cont[i]->GetYaxis()->SetTitleSize(0.033);
934 cont[i]->GetYaxis()->SetTitleOffset(1.67);
936 fContourGraph->Add(cont[i]);
940 TString cvname = Form("c%d%d", kpar, jpar);
941 TCanvas *c4=new TCanvas(cvname,cvname,600,600);
943 cont[1]->SetFillColor(38);
944 cont[1]->Draw("alf");
945 cont[0]->SetFillColor(9);
954 if (ftypeOfFit4Sgn == 1 && funcbkg1) {
967 AddFunctionsToHisto();
973 //_________________________________________________________________________
974 Double_t AliHFMassFitter::GetChiSquare() const{
975 TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass");
976 return funcmass->GetChisquare();
979 //_________________________________________________________________________
980 Double_t AliHFMassFitter::GetReducedChiSquare() const{
981 TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass");
982 return funcmass->GetChisquare()/funcmass->GetNDF();
987 //_________________________________________________________________________
988 void AliHFMassFitter::GetFitPars(Float_t *vector) const {
989 // Return fit parameters
991 for(Int_t i=0;i<fParsSize;i++){
992 vector[i]=fFitPars[i];
997 //_________________________________________________________________________
998 void AliHFMassFitter::AddFunctionsToHisto(){
1000 cout<<"AddFunctionsToHisto called"<<endl;
1001 TString bkgname = "funcbkg";
1003 switch (ftypeOfFit4Bkg){
1017 if (ftypeOfFit4Sgn == 1) {
1022 TString bkgnamesave=bkgname;
1023 TString testname=bkgname;
1024 testname += "FullRange";
1025 TF1 *testfunc=(TF1*)fhistoInvMass->FindObject(testname.Data());
1027 cout<<"AddFunctionsToHisto already used: exiting...."<<endl;
1031 TList *hlist=fhistoInvMass->GetListOfFunctions();
1034 TF1 *b=(TF1*)hlist->FindObject(bkgname.Data());
1036 cout<<bkgname<<" not found, cannot produce "<<bkgname<<"FullRange and "<<bkgname<<"Recalc"<<endl;
1040 bkgname += "FullRange";
1041 TF1 *bfullrange=new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,np,"AliHFMassFitter","FitFunction4Bkg");
1042 //cout<<bfullrange->GetName()<<endl;
1043 for(Int_t i=0;i<np;i++){
1044 //cout<<i<<" di "<<np<<endl;
1045 bfullrange->SetParName(i,b->GetParName(i));
1046 bfullrange->SetParameter(i,b->GetParameter(i));
1047 bfullrange->SetParError(i,b->GetParError(i));
1049 bfullrange->SetLineStyle(4);
1050 bfullrange->SetLineColor(14);
1052 bkgnamesave += "Recalc";
1054 TF1 *blastpar=new TF1(bkgnamesave.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,np,"AliHFMassFitter","FitFunction4Bkg");
1056 TF1 *mass=fhistoInvMass->GetFunction("funcmass");
1059 cout<<"funcmass doesn't exist "<<endl;
1063 blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(np));
1064 blastpar->SetParError(0,mass->GetParError(np));
1066 blastpar->SetParameter(1,mass->GetParameter(1));
1067 blastpar->SetParError(1,mass->GetParError(1));
1070 blastpar->SetParameter(2,mass->GetParameter(2));
1071 blastpar->SetParError(2,mass->GetParError(2));
1074 blastpar->SetLineStyle(1);
1075 blastpar->SetLineColor(2);
1077 hlist->Add(bfullrange->Clone());
1078 hlist->Add(blastpar->Clone());
1091 //_________________________________________________________________________
1093 TH1F* AliHFMassFitter::GetHistoClone() const{
1095 TH1F* hout=(TH1F*)fhistoInvMass->Clone(fhistoInvMass->GetName());
1098 //_________________________________________________________________________
1100 void AliHFMassFitter::WriteHisto(TString path) {
1101 if (fcounter == 0) {
1102 cout<<"Use MassFitter method before WriteHisto"<<endl;
1105 TH1F* hget=(TH1F*)fhistoInvMass->Clone();
1107 path += "HFMassFitterOutput.root";
1110 if (fcounter == 1) output = new TFile(path.Data(),"recreate");
1111 else output = new TFile(path.Data(),"update");
1114 fContourGraph->Write();
1117 cout<<fcounter<<" "<<hget->GetName()<<" written in "<<path<<endl;
1126 //_________________________________________________________________________
1128 void AliHFMassFitter::WriteNtuple(TString path) const{
1129 //TNtuple* nget=(TNtuple*)fntuParam->Clone();
1130 path += "HFMassFitterOutput.root";
1131 TFile *output = new TFile(path.Data(),"update");
1136 //cout<<nget->GetName()<<" written in "<<path<<endl;
1137 cout<<fntuParam->GetName()<<" written in "<<path<<endl;
1150 //_________________________________________________________________________
1152 void AliHFMassFitter::DrawFit() const{
1154 TString cvtitle="fit of ";
1155 cvtitle+=fhistoInvMass->GetName();
1159 TCanvas *c=new TCanvas(cvname,cvtitle);
1161 GetHistoClone()->Draw("hist");
1162 GetHistoClone()->GetFunction("funcbkgFullRange")->Draw("same");
1163 GetHistoClone()->GetFunction("funcbkgRecalc")->Draw("same");
1164 GetHistoClone()->GetFunction("funcmass")->Draw("same");
1170 //_________________________________________________________________________
1172 void AliHFMassFitter::PrintParTitles() const{
1173 TF1 *f=fhistoInvMass->GetFunction("funcmass");
1175 cout<<"Fit function not found"<<endl;
1180 switch (ftypeOfFit4Bkg){
1195 np+=3; //3 parameter for signal
1196 if (ftypeOfFit4Sgn == 1) np+=3;
1198 cout<<"Parameter Titles \n";
1199 for(Int_t i=0;i<np;i++){
1200 cout<<"Par "<<i<<": "<<f->GetParName(i)<<endl;
1206 //************ significance
1208 //_________________________________________________________________________
1210 void AliHFMassFitter::Signal(Double_t nOfSigma,Double_t &signal,Double_t &errsignal) const {
1211 // Return signal integral in mean+- n sigma
1214 cout<<"Use MassFitter method before Signal"<<endl;
1219 TString bkgname= "funcbkgRecalc";
1220 TString bkg1name="funcbkg1Recalc";
1221 TString massname="funcmass";
1225 TF1 *funcmass=fhistoInvMass->GetFunction(massname.Data());
1227 cout<<"AliHFMassFitter::Signal() ERROR -> Mass distr function not found!"<<endl;
1231 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1232 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1235 cout<<"AliHFMassFitter::Signal() ERROR -> Bkg function not found!"<<endl;
1240 switch (ftypeOfFit4Bkg){
1255 Double_t intS,intSerr;
1257 //relative error evaluation
1258 intS=funcmass->GetParameter(np);
1259 intSerr=funcmass->GetParError(np);
1260 cout<<"Sgn relative error evaluation from fit: "<<intSerr/intS<<endl;
1261 Double_t background,errbackground;
1262 Background(nOfSigma,background,errbackground);
1264 //signal +/- error in nsigma
1265 Double_t min=fMass-nOfSigma*fSigmaSgn;
1266 Double_t max=fMass+nOfSigma*fSigmaSgn;
1268 Double_t mass=funcmass->Integral(min, max)/fhistoInvMass->GetBinWidth(4);
1269 signal=mass - background;
1270 errsignal=TMath::Sqrt((intSerr/intS*mass)*(intSerr/intS*mass)/*assume relative error is the same as for total integral*/ + errbackground*errbackground);
1274 //_________________________________________________________________________
1276 void AliHFMassFitter::Signal(Double_t min, Double_t max, Double_t &signal,Double_t &errsignal) const {
1278 // Return signal integral in a range
1281 cout<<"Use MassFitter method before Signal"<<endl;
1286 TString bkgname="funcbkgRecalc";
1287 TString bkg1name="funcbkg1Recalc";
1288 TString massname="funcmass";
1292 TF1 *funcmass=fhistoInvMass->GetFunction(massname.Data());
1294 cout<<"AliHFMassFitter::Signal() ERROR -> Mass distr function not found!"<<endl;
1298 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1299 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1302 cout<<"AliHFMassFitter::Signal() ERROR -> Bkg function not found!"<<endl;
1307 switch (ftypeOfFit4Bkg){
1322 Double_t intS,intSerr;
1324 //relative error evaluation
1325 intS=funcmass->GetParameter(np);
1326 intSerr=funcmass->GetParError(np);
1328 cout<<"Sgn relative error evaluation from fit: "<<intSerr/intS<<endl;
1329 Double_t background,errbackground;
1330 Background(min,max,background,errbackground);
1332 //signal +/- error in the range
1334 Double_t mass=funcmass->Integral(min, max)/fhistoInvMass->GetBinWidth(4);
1335 signal=mass - background;
1336 errsignal=(intSerr/intS)*signal;/*assume relative error is the same as for total integral*/
1340 //_________________________________________________________________________
1342 void AliHFMassFitter::Background(Double_t nOfSigma,Double_t &background,Double_t &errbackground) const {
1343 // Return background integral in mean+- n sigma
1346 cout<<"Use MassFitter method before Background"<<endl;
1351 TString bkgname="funcbkgRecalc";
1352 TString bkg1name="funcbkg1Recalc";
1355 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1356 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1358 cout<<"AliHFMassFitter::Background() ERROR -> Bkg function not found!"<<endl;
1362 Double_t intB,intBerr;
1364 //relative error evaluation: from final parameters of the fit
1365 if(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn == 0) cout<<"No background fit: Bkg relative error evaluation put to zero"<<endl;
1367 intB=funcbkg->GetParameter(0);
1368 intBerr=funcbkg->GetParError(0);
1369 cout<<"Bkg relative error evaluation: from final parameters of the fit: "<<intBerr/intB<<endl;
1372 Double_t min=fMass-nOfSigma*fSigmaSgn;
1373 Double_t max=fMass+nOfSigma*fSigmaSgn;
1375 //relative error evaluation: from histo
1377 intB=fhistoInvMass->Integral(1,fSideBandl)+fhistoInvMass->Integral(fSideBandr,fNbin);
1379 for(Int_t i=1;i<=fSideBandl;i++){
1380 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1382 for(Int_t i=fSideBandr;i<=fNbin;i++){
1383 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1386 intBerr=TMath::Sqrt(sum2);
1387 cout<<"Bkg relative error evaluation: from histo: "<<intBerr/intB<<endl;
1389 cout<<"Last estimation of bkg error is used"<<endl;
1391 //backround +/- error in nsigma
1392 if (ftypeOfFit4Bkg == 3 && ftypeOfFit4Sgn == 0) {
1397 background=funcbkg->Integral(min,max)/(Double_t)fhistoInvMass->GetBinWidth(2);
1398 errbackground=intBerr/intB*background; // assume relative error is the same as for total integral
1399 //cout<<"integral = "<<funcbkg->Integral(min, max)<<"\tbinW = "<<fhistoInvMass->GetBinWidth(2)<<endl;
1404 //___________________________________________________________________________
1406 void AliHFMassFitter::Background(Double_t min, Double_t max, Double_t &background,Double_t &errbackground) const {
1407 // Return background integral in a range
1410 cout<<"Use MassFitter method before Background"<<endl;
1415 TString bkgname="funcbkgRecalc";
1416 TString bkg1name="funcbkg1Recalc";
1419 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1420 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1422 cout<<"AliHFMassFitter::Background() ERROR -> Bkg function not found!"<<endl;
1427 Double_t intB,intBerr;
1429 //relative error evaluation: from final parameters of the fit
1430 if(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn == 0) cout<<"No background fit: Bkg relative error evaluation put to zero"<<endl;
1432 intB=funcbkg->GetParameter(0);
1433 intBerr=funcbkg->GetParError(0);
1434 cout<<"Bkg relative error evaluation: from final parameters of the fit: "<<intBerr/intB<<endl;
1437 //relative error evaluation: from histo
1439 intB=fhistoInvMass->Integral(1,fSideBandl)+fhistoInvMass->Integral(fSideBandr,fNbin);
1441 for(Int_t i=1;i<=fSideBandl;i++){
1442 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1444 for(Int_t i=fSideBandr;i<=fNbin;i++){
1445 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1448 intBerr=TMath::Sqrt(sum2);
1449 cout<<"Bkg relative error evaluation: from histo: "<<intBerr/intB<<endl;
1451 cout<<"Last estimation of bkg error is used"<<endl;
1453 //backround +/- error in the range
1454 if (ftypeOfFit4Bkg == 3 && ftypeOfFit4Sgn == 0) {
1459 background=funcbkg->Integral(min,max)/(Double_t)fhistoInvMass->GetBinWidth(2);
1460 errbackground=intBerr/intB*background; // assume relative error is the same as for total integral
1461 //cout<<"integral = "<<funcbkg->Integral(min, max)<<"\tbinW = "<<fhistoInvMass->GetBinWidth(2)<<endl;
1468 //__________________________________________________________________________
1470 void AliHFMassFitter::Significance(Double_t nOfSigma,Double_t &significance,Double_t &errsignificance) const {
1471 // Return significance in mean+- n sigma
1473 Double_t signal,errsignal,background,errbackground;
1474 Signal(nOfSigma,signal,errsignal);
1475 Background(nOfSigma,background,errbackground);
1477 significance = signal/TMath::Sqrt(signal+background);
1479 errsignificance = TMath::Sqrt(significance*significance/(signal+background)/(signal+background)*(1/4.*errsignal*errsignal+errbackground*errbackground)+significance*significance/signal/signal*errsignal*errsignal);
1484 //__________________________________________________________________________
1486 void AliHFMassFitter::Significance(Double_t min, Double_t max, Double_t &significance,Double_t &errsignificance) const {
1487 // Return significance integral in a range
1489 Double_t signal,errsignal,background,errbackground;
1490 Signal(min, max,signal,errsignal);
1491 Background(min, max,background,errbackground);
1493 significance = signal/TMath::Sqrt(signal+background);
1495 errsignificance = TMath::Sqrt(significance*significance/(signal+background)/(signal+background)*(1/4.*errsignal*errsignal+errbackground*errbackground)+significance*significance/signal/signal*errsignal*errsignal);