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 /////////////////////////////////////////////////////////////
26 #include "AliHFMassFitter.h"
29 ClassImp(AliHFMassFitter)
31 //************** constructors
32 AliHFMassFitter::AliHFMassFitter() :
52 // default constructor
54 cout<<"Default constructor"<<endl;
57 //___________________________________________________________________________
59 AliHFMassFitter::AliHFMassFitter (TH1F *histoToFit, Double_t minvalue, Double_t maxvalue, Int_t rebin,Int_t fittypeb,Int_t fittypes):
79 // standard constructor
81 fhistoInvMass= (TH1F*)histoToFit->Clone("fhistoInvMass");
84 if(rebin!=1) RebinMass(rebin);
85 else fNbin=(Int_t)fhistoInvMass->GetNbinsX();
86 ftypeOfFit4Bkg=fittypeb;
87 ftypeOfFit4Sgn=fittypes;
88 if(ftypeOfFit4Bkg!=0 && ftypeOfFit4Bkg!=1 && ftypeOfFit4Bkg!=2) fWithBkg=kFALSE;
90 if (!fWithBkg) cout<<"Fit Histogram of Signal only"<<endl;
91 else cout<<"Type of fit For Background = "<<ftypeOfFit4Bkg<<endl;
94 fFitPars=new Float_t[fParsSize];
98 AliHFMassFitter::AliHFMassFitter(const AliHFMassFitter &mfit):
100 fhistoInvMass(mfit.fhistoInvMass),
101 fminMass(mfit.fminMass),
102 fmaxMass(mfit.fmaxMass),
104 fParsSize(mfit.fParsSize),
106 fWithBkg(mfit.fWithBkg),
107 ftypeOfFit4Bkg(mfit.ftypeOfFit4Bkg),
108 ftypeOfFit4Sgn(mfit.ftypeOfFit4Sgn),
109 ffactor(mfit.ffactor),
110 fntuParam(mfit.fntuParam),
112 fSigmaSgn(mfit.fSigmaSgn),
113 fSideBands(mfit.fSideBands),
114 fSideBandl(mfit.fSideBandl),
115 fSideBandr(mfit.fSideBandr),
116 fcounter(mfit.fcounter)
121 if(mfit.fParsSize > 0){
122 fFitPars=new Float_t[fParsSize];
123 memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
125 //for(Int_t i=0;i<fParsSize;i++) fFitPars[i]=mfit.fFitPars[i];
128 //_________________________________________________________________________
130 AliHFMassFitter::~AliHFMassFitter() {
131 cout<<"AliHFMassFitter destructor called"<<endl;
133 cout<<"deleting histogram..."<<endl;
134 delete fhistoInvMass;
138 cout<<"deleting ntuple..."<<endl;
146 cout<<"deleting parameter array..."<<endl;
153 //_________________________________________________________________________
155 AliHFMassFitter& AliHFMassFitter::operator=(const AliHFMassFitter &mfit){
157 //assignment operator
159 if(&mfit == this) return *this;
160 fhistoInvMass= mfit.fhistoInvMass;
161 fminMass= mfit.fminMass;
162 fmaxMass= mfit.fmaxMass;
164 fParsSize= mfit.fParsSize;
165 fWithBkg= mfit.fWithBkg;
166 ftypeOfFit4Bkg= mfit.ftypeOfFit4Bkg;
167 ftypeOfFit4Sgn= mfit.ftypeOfFit4Sgn;
168 ffactor= mfit.ffactor;
169 fntuParam= mfit.fntuParam;
171 fSigmaSgn= mfit.fSigmaSgn;
172 fSideBands= mfit.fSideBands;
173 fSideBandl= mfit.fSideBandl;
174 fSideBandr= mfit.fSideBandr;
175 fcounter= mfit.fcounter;
176 if(mfit.fParsSize > 0){
181 fFitPars=new Float_t[fParsSize];
182 memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
184 // fFitPars=new Float_t[fParsSize];
185 // for(Int_t i=0;i<fParsSize;i++) fFitPars[i]=mfit.fFitPars[i];
190 //************ tools & settings
192 //__________________________________________________________________________
194 void AliHFMassFitter::ComputeParSize() {
195 switch (ftypeOfFit4Bkg) {//npar backround func
209 cout<<"Error in computing fParsSize: check ftypeOfFit4Bkg"<<endl;
213 fParsSize += 3; // npar refl
214 fParsSize += 3; // npar signal gaus
216 fParsSize*=2; // add errors
217 cout<<"Parameters array size "<<fParsSize<<endl;
220 //___________________________________________________________________________
221 void AliHFMassFitter::SetHisto(TH1F *histoToFit){
222 //fhistoInvMass = (TH1F*)histoToFit->Clone();
223 fhistoInvMass = new TH1F(*histoToFit);
224 cout<<"SetHisto pointer "<<fhistoInvMass<<endl;
227 //___________________________________________________________________________
229 void AliHFMassFitter::SetType(Int_t fittypeb, Int_t fittypes) {
230 ftypeOfFit4Bkg = fittypeb;
231 ftypeOfFit4Sgn = fittypes;
233 fFitPars = new Float_t[fParsSize];
237 //___________________________________________________________________________
239 void AliHFMassFitter::Reset() {
240 cout<<"Reset called: delete histogram, set mean value to 1.85 and sigma to 0.012"<<endl;
243 cout<<"Reset "<<fhistoInvMass<<endl;
245 cout<<"esiste"<<endl;
246 //delete fhistoInvMass;
248 cout<<fhistoInvMass<<endl;
250 else cout<<"histogram doesn't exist, do not delete"<<endl;
254 //_________________________________________________________________________
256 void AliHFMassFitter::InitNtuParam(char *ntuname) {
257 // Create ntuple to keep fit parameters
259 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");
263 //_________________________________________________________________________
265 void AliHFMassFitter::FillNtuParam() {
266 // Fill ntuple with fit parameters
270 if (ftypeOfFit4Bkg==2) {
271 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
272 fntuParam->SetBranchAddress("slope1",&fFitPars[1]);
273 fntuParam->SetBranchAddress("conc1",&fFitPars[2]);
274 fntuParam->SetBranchAddress("intGB",&fFitPars[3]);
275 fntuParam->SetBranchAddress("meanGB",&fFitPars[4]);
276 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[5]);
277 fntuParam->SetBranchAddress("intbkg2",&fFitPars[6]);
278 fntuParam->SetBranchAddress("slope2",&fFitPars[7]);
279 fntuParam->SetBranchAddress("conc2",&fFitPars[8]);
280 fntuParam->SetBranchAddress("inttot",&fFitPars[9]);
281 fntuParam->SetBranchAddress("slope3",&fFitPars[10]);
282 fntuParam->SetBranchAddress("conc3",&fFitPars[11]);
283 fntuParam->SetBranchAddress("intsgn",&fFitPars[12]);
284 fntuParam->SetBranchAddress("meansgn",&fFitPars[13]);
285 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[14]);
287 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[15]);
288 fntuParam->SetBranchAddress("slope1Err",&fFitPars[16]);
289 fntuParam->SetBranchAddress("conc1Err",&fFitPars[17]);
290 fntuParam->SetBranchAddress("intGBErr",&fFitPars[18]);
291 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[19]);
292 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[20]);
293 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[21]);
294 fntuParam->SetBranchAddress("slope2Err",&fFitPars[22]);
295 fntuParam->SetBranchAddress("conc2Err",&fFitPars[23]);
296 fntuParam->SetBranchAddress("inttotErr",&fFitPars[24]);
297 fntuParam->SetBranchAddress("slope3Err",&fFitPars[25]);
298 fntuParam->SetBranchAddress("conc3Err",&fFitPars[26]);
299 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[27]);
300 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[28]);
301 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[29]);
305 if(ftypeOfFit4Bkg==3){
306 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
307 fntuParam->SetBranchAddress("slope1",¬hing);
308 fntuParam->SetBranchAddress("conc1",¬hing);
309 fntuParam->SetBranchAddress("intGB",&fFitPars[1]);
310 fntuParam->SetBranchAddress("meanGB",&fFitPars[2]);
311 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[3]);
312 fntuParam->SetBranchAddress("intbkg2",&fFitPars[4]);
313 fntuParam->SetBranchAddress("slope2",¬hing);
314 fntuParam->SetBranchAddress("conc2",¬hing);
315 fntuParam->SetBranchAddress("inttot",&fFitPars[6]);
316 fntuParam->SetBranchAddress("slope3",¬hing);
317 fntuParam->SetBranchAddress("conc3",¬hing);
318 fntuParam->SetBranchAddress("intsgn",&fFitPars[6]);
319 fntuParam->SetBranchAddress("meansgn",&fFitPars[7]);
320 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[8]);
322 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[9]);
323 fntuParam->SetBranchAddress("slope1Err",¬hing);
324 fntuParam->SetBranchAddress("conc1Err",¬hing);
325 fntuParam->SetBranchAddress("intGBErr",&fFitPars[10]);
326 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[11]);
327 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[12]);
328 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[13]);
329 fntuParam->SetBranchAddress("slope2Err",¬hing);
330 fntuParam->SetBranchAddress("conc2Err",¬hing);
331 fntuParam->SetBranchAddress("inttotErr",&fFitPars[15]);
332 fntuParam->SetBranchAddress("slope3Err",¬hing);
333 fntuParam->SetBranchAddress("conc3Err",¬hing);
334 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[15]);
335 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[16]);
336 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[17]);
340 fntuParam->SetBranchAddress("intbkg1",&fFitPars[0]);
341 fntuParam->SetBranchAddress("slope1",&fFitPars[1]);
342 fntuParam->SetBranchAddress("conc1",¬hing);
343 fntuParam->SetBranchAddress("intGB",&fFitPars[2]);
344 fntuParam->SetBranchAddress("meanGB",&fFitPars[3]);
345 fntuParam->SetBranchAddress("sigmaGB",&fFitPars[4]);
346 fntuParam->SetBranchAddress("intbkg2",&fFitPars[5]);
347 fntuParam->SetBranchAddress("slope2",&fFitPars[6]);
348 fntuParam->SetBranchAddress("conc2",¬hing);
349 fntuParam->SetBranchAddress("inttot",&fFitPars[7]);
350 fntuParam->SetBranchAddress("slope3",&fFitPars[8]);
351 fntuParam->SetBranchAddress("conc3",¬hing);
352 fntuParam->SetBranchAddress("intsgn",&fFitPars[9]);
353 fntuParam->SetBranchAddress("meansgn",&fFitPars[10]);
354 fntuParam->SetBranchAddress("sigmasgn",&fFitPars[11]);
356 fntuParam->SetBranchAddress("intbkg1Err",&fFitPars[12]);
357 fntuParam->SetBranchAddress("slope1Err",&fFitPars[13]);
358 fntuParam->SetBranchAddress("conc1Err",¬hing);
359 fntuParam->SetBranchAddress("intGBErr",&fFitPars[14]);
360 fntuParam->SetBranchAddress("meanGBErr",&fFitPars[15]);
361 fntuParam->SetBranchAddress("sigmaGBErr",&fFitPars[16]);
362 fntuParam->SetBranchAddress("intbkg2Err",&fFitPars[17]);
363 fntuParam->SetBranchAddress("slope2Err",&fFitPars[18]);
364 fntuParam->SetBranchAddress("conc2Err",¬hing);
365 fntuParam->SetBranchAddress("inttotErr",&fFitPars[19]);
366 fntuParam->SetBranchAddress("slope3Err",&fFitPars[20]);
367 fntuParam->SetBranchAddress("conc3Err",¬hing);
368 fntuParam->SetBranchAddress("intsgnErr",&fFitPars[21]);
369 fntuParam->SetBranchAddress("meansgnErr",&fFitPars[22]);
370 fntuParam->SetBranchAddress("sigmasgnErr",&fFitPars[23]);
374 fntuParam->TTree::Fill();
377 //_________________________________________________________________________
379 TNtuple* AliHFMassFitter::NtuParamOneShot(char *ntuname){
380 // Create, fill and return ntuple with fit parameters
382 InitNtuParam(ntuname);
386 //_________________________________________________________________________
388 void AliHFMassFitter::RebinMass(Int_t bingroup){
389 // Rebin invariant mass histogram
392 cout<<"Error! Cannot group "<<bingroup<<" bins\n";
393 fNbin=fhistoInvMass->GetNbinsX();
394 cout<<"Kept original number of bins: "<<fNbin<<endl;
396 fhistoInvMass->Rebin(bingroup);
397 fNbin = fhistoInvMass->GetNbinsX();
398 cout<<"New number of bins: "<<fNbin<<endl;
406 //___________________________________________________________________________
408 Double_t AliHFMassFitter::FitFunction4MassDistr (Double_t *x, Double_t *par){
409 // Fit function for signal+background
412 //exponential or linear fit
414 // par[0] = tot integral
416 // par[2] = gaussian integral
417 // par[3] = gaussian mean
418 // par[4] = gaussian sigma
420 Double_t total,bkg=0,sgn=0;
422 if (ftypeOfFit4Bkg==0 || ftypeOfFit4Bkg==1) {
423 if(ftypeOfFit4Sgn == 0) {
425 Double_t parbkg[2] = {par[0]-par[2], par[1]};
426 bkg = FitFunction4Bkg(x,parbkg);
428 if(ftypeOfFit4Sgn == 1) {
429 Double_t parbkg[5] = {par[2],par[3],ffactor*par[4],par[0]-2*par[2], par[1]};
430 bkg = FitFunction4Bkg(x,parbkg);
433 sgn = FitFunction4Sgn(x,&par[2]);
439 // par[0] = tot integral
442 // par[3] = gaussian integral
443 // par[4] = gaussian mean
444 // par[5] = gaussian sigma
446 if (ftypeOfFit4Bkg==2) {
448 if(ftypeOfFit4Sgn == 0) {
450 Double_t parbkg[3] = {par[0]-par[3], par[1], par[2]};
451 bkg = FitFunction4Bkg(x,parbkg);
453 if(ftypeOfFit4Sgn == 1) {
455 Double_t parbkg[6] = {par[3],par[4],ffactor*par[5],par[0]-2*par[3], par[1], par[2]};
456 bkg = FitFunction4Bkg(x,parbkg);
459 sgn = FitFunction4Sgn(x,&par[3]);
462 if (ftypeOfFit4Bkg==3) {
464 if(ftypeOfFit4Sgn == 0) {
465 bkg=FitFunction4Bkg(x,par);
466 sgn=FitFunction4Sgn(x,&par[1]);
468 if(ftypeOfFit4Sgn == 1) {
469 Double_t parbkg[4]={par[1],par[2],ffactor*par[3],par[0]};
470 bkg=FitFunction4Bkg(x,parbkg);
471 sgn=FitFunction4Sgn(x,&par[1]);
480 //_________________________________________________________________________
481 Double_t AliHFMassFitter::FitFunction4Sgn (Double_t *x, Double_t *par){
482 // Fit function for the signal
484 //gaussian = A/(sigma*sqrt(2*pi))*exp(-(x-mean)^2/2/sigma^2)
486 // * [0] = integralSgn
489 //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
491 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]);
495 //__________________________________________________________________________
497 Double_t AliHFMassFitter::FitFunction4Bkg (Double_t *x, Double_t *par){
498 // Fit function for the background
500 Double_t maxDeltaM = 4.*fSigmaSgn;
501 if(fSideBands && TMath::Abs(x[0]-fMass) < maxDeltaM) {
506 Double_t gaus2=0,total=-1;
507 if(ftypeOfFit4Sgn == 1){
509 //gaussian = A/(sigma*sqrt(2*pi))*exp(-(x-mean)^2/2/sigma^2)
511 // * [0] = integralSgn
514 //gaussian = [0]/TMath::Sqrt(2.*TMath::Pi())/[2]*exp[-(x-[1])*(x-[1])/(2*[2]*[2])]
515 gaus2 = FitFunction4Sgn(x,par);
518 switch (ftypeOfFit4Bkg){
521 //exponential = A*exp(B*x) -> integral(exponential)=A/B*exp(B*x)](min,max)
522 //-> A = B*integral/(exp(B*max)-exp(B*min)) where integral can be written
523 //as integralTot- integralGaus (=par [2])
525 // * [0] = integralBkg;
527 //exponential = [1]*[0]/(exp([1]*max)-exp([1]*min))*exp([1]*x)
528 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]);
532 //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)
533 // * [0] = integralBkg;
535 total= par[0+firstPar]/(fmaxMass-fminMass)+par[1+firstPar]*(x[0]-0.5*(fmaxMass+fminMass));
539 //y=a+b*x+c*x**2 -> integral = a(max-min) + 1/2*b*(max^2-min^2) +
540 //+ 1/3*c*(max^3-min^3) ->
541 //a = (integral-1/2*b*(max^2-min^2)-1/3*c*(max^3-min^3))/(max-min)
542 // * [0] = integralBkg;
545 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));
548 total=par[0+firstPar];
551 // Types of Fit Functions for Background:
552 // * 0 = exponential;
554 // * 2 = polynomial 2nd order
555 // * 3 = no background"<<endl;
561 //__________________________________________________________________________
562 Bool_t AliHFMassFitter::SideBandsBounds(){
564 Double_t width=fhistoInvMass->GetBinWidth(8);
565 if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
566 Double_t minHisto=fhistoInvMass->GetBinLowEdge(1);
567 Double_t maxHisto=fhistoInvMass->GetBinLowEdge(fNbin)+width;
569 if(fMass-fminMass < 0 || fmaxMass-fMass <0) {
570 cout<<"Left limit of range > mean or right limit of range < mean: change left/right limit or initial mean value"<<endl;
574 if((fminMass!=minHisto || fmaxMass!= maxHisto) && (fMass-4.*fSigmaSgn-fminMass) <= 0){
575 Double_t coeff = (fMass-fminMass)/fSigmaSgn;
577 fSideBandl=(Int_t)((fMass-0.5*coeff*fSigmaSgn-fminMass)/width);
578 fSideBandr=(Int_t)((fMass+0.5*coeff*fSigmaSgn-fminMass)/width);
579 cout<<"Changed number of sigma from 4 to "<<0.5*coeff<<" for the estimation of the side bands"<<endl;
580 if (coeff<3) cout<<"Side bands inside 3 sigma, may be better use ftypeOfFit4Bkg = 3 (only signal)"<<endl;
583 cout<<"Side bands inside 2 sigma. Change mode: ftypeOfFit4Bkg = 3"<<endl;
585 //set binleft and right without considering SetRangeFit- anyway no bkg!
586 fSideBandl=(Int_t)((fMass-4.*fSigmaSgn-minHisto)/width);
587 fSideBandr=(Int_t)((fMass+4.*fSigmaSgn-minHisto)/width);
591 fSideBandl=(Int_t)((fMass-4.*fSigmaSgn-minHisto)/width);
592 fSideBandr=(Int_t)((fMass+4.*fSigmaSgn-minHisto)/width);
593 // cout<<"\tfMass = "<<fMass<<"\tfSigmaSgn = "<<fSigmaSgn<<"\tminHisto = "<<minHisto<<endl;
594 // cout<<"\tbinleft = "<<fSideBandl<<"\tbinright = "<<fSideBandr<<endl;
598 cout<<"Error! Range too little";
604 //__________________________________________________________________________
606 void AliHFMassFitter::GetSideBandsBounds(Int_t &left, Int_t &right) const{
607 if (fSideBandl==0 && fSideBandr==0){
608 cout<<"Use MassFitter method first"<<endl;
615 //__________________________________________________________________________
617 Bool_t AliHFMassFitter::MassFitter(Bool_t draw){
618 // Main method of the class: performs the fit of the histogram
620 Int_t nFitPars=0; //total function's number of parameters
621 switch (ftypeOfFit4Bkg){
636 Int_t bkgPar = nFitPars-3; //background function's number of parameters
638 cout<<"nFitPars = "<<nFitPars<<"\tbkgPar = "<<bkgPar<<endl;
641 TString bkgname="funcbkg";
642 TString bkg1name="funcbkg1";
643 TString massname="funcmass";
646 Double_t totInt = fhistoInvMass->Integral("width");
649 Double_t width=fhistoInvMass->GetBinWidth(8);
651 if (fNbin==0) fNbin=fhistoInvMass->GetNbinsX();
652 Double_t minHisto=fhistoInvMass->GetBinLowEdge(1);
653 Double_t maxHisto=fhistoInvMass->GetBinLowEdge(fNbin)+width;
654 Bool_t ok=SideBandsBounds();
655 if(!ok) return kFALSE;
657 //sidebands integral - first approx (from histo)
658 Double_t sideBandsInt=(Double_t)fhistoInvMass->Integral(1,fSideBandl,"width") + (Double_t)fhistoInvMass->Integral(fSideBandr,fNbin,"width");
659 cout<<"------nbin = "<<fNbin<<"\twidth = "<<width<<"\tbinleft = "<<fSideBandl<<"\tbinright = "<<fSideBandr<<endl;
660 cout<<"------sideBandsInt - first approx = "<<sideBandsInt<<endl;
661 if (sideBandsInt<=0) {
662 cout<<"! sideBandsInt <=0. There's a problem, cannot start the fit"<<endl;
669 TF1 *funcbkg = new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,minHisto,maxHisto,bkgPar,"AliHFMassFitter","FitFunction4Bkg");
670 cout<<"Function name = "<<funcbkg->GetName()<<endl<<endl;
672 funcbkg->SetLineColor(2); //red
674 //first fit for bkg: approx bkgint
676 switch (ftypeOfFit4Bkg) {
678 funcbkg->SetParNames("BkgInt","Slope");
679 funcbkg->SetParameters(sideBandsInt,-2.);
682 funcbkg->SetParNames("BkgInt","Slope");
683 funcbkg->SetParameters(sideBandsInt,-100.);
686 funcbkg->SetParNames("BkgInt","Coef1","Coef2");
687 funcbkg->SetParameters(sideBandsInt,-10.,5);
690 if(ftypeOfFit4Sgn==0){
691 funcbkg->SetParNames("Const");
692 funcbkg->SetParameter(0,0.);
693 funcbkg->FixParameter(0,0.);
697 cout<<"Wrong choise of ftypeOfFit4Bkg ("<<ftypeOfFit4Bkg<<")"<<endl;
701 cout<<"\nBACKGROUND FIT - only combinatorial"<<endl;
702 Int_t ftypeOfFit4SgnBkp=ftypeOfFit4Sgn;
704 Double_t intbkg1=0,slope1=0,conc1=0;
705 //if only signal and reflection: skip
706 if (!(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn==1)) {
708 fhistoInvMass->Fit(bkgname.Data(),"R,L,E,0");
710 for(Int_t i=0;i<bkgPar;i++){
711 fFitPars[i]=funcbkg->GetParameter(i);
712 //cout<<i<<"\t"<<funcbkg->GetParameter(i)<<"\t";
713 fFitPars[nFitPars+2*bkgPar+3+i]= funcbkg->GetParError(i);
714 //cout<<nFitPars+2*bkgPar+3+i<<"\t"<< funcbkg->GetParError(i)<<endl;
717 //intbkg1 = funcbkg->GetParameter(0);
718 funcbkg->SetRange(fminMass,fmaxMass);
719 intbkg1 = funcbkg->Integral(fminMass,fmaxMass);
720 if(ftypeOfFit4Bkg!=3) slope1 = funcbkg->GetParameter(1);
721 if(ftypeOfFit4Bkg==2) conc1 = funcbkg->GetParameter(2);
722 cout<<"Primo fit: \nintbkg1 = "<<intbkg1<<"\t(Compare with par0 = "<<funcbkg->GetParameter(0)<<")\nslope1= "<<slope1<<"\nconc1 = "<<conc1<<endl;
724 else cout<<"\t\t//"<<endl;
726 ftypeOfFit4Sgn=ftypeOfFit4SgnBkp;
728 if (ftypeOfFit4Sgn == 1) {
729 cout<<"\nBACKGROUND FIT WITH REFLECTION"<<endl;
732 cout<<"nFitPars = "<<nFitPars<<"\tbkgPar = "<<bkgPar<<endl;
734 funcbkg1 = new TF1(bkg1name.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,bkgPar,"AliHFMassFitter","FitFunction4Bkg");
735 cout<<"Function name = "<<funcbkg1->GetName()<<endl;
737 funcbkg1->SetLineColor(2); //red
739 if(ftypeOfFit4Bkg==2){
740 cout<<"*** Polynomial Fit ***"<<endl;
741 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Coef1","Coef2");
742 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1,conc1);
743 // cout<<"Parameters set to: "<<0.5*(totInt-intbkg1)<<"\t"<<fMass<<"\t"<<ffactor*fSigmaSgn<<"\t"<<intbkg1<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<endl;
744 // cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<bkgPar<<"\tgsidebands = "<<fSideBands<<endl;
746 if(ftypeOfFit4Bkg==3) //no background: gaus sign+ gaus broadened
748 cout<<"*** No background Fit ***"<<endl;
749 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","Const");
750 funcbkg1->SetParameters(0.5*totInt,fMass,ffactor*fSigmaSgn,0.);
751 funcbkg1->FixParameter(3,0.);
752 } else{ //expo or linear
753 if(ftypeOfFit4Bkg==0) cout<<"*** Exponential Fit ***"<<endl;
754 if(ftypeOfFit4Bkg==1) cout<<"*** Linear Fit ***"<<endl;
755 funcbkg1->SetParNames("IntGB","MeanGB","SigmaGB","BkgInt","Slope");
756 funcbkg1->SetParameters(0.5*(totInt-intbkg1),fMass,ffactor*fSigmaSgn,intbkg1,slope1);
759 fhistoInvMass->Fit(bkg1name.Data(),"R,L,E,+,0");
761 for(Int_t i=0;i<bkgPar;i++){
762 fFitPars[bkgPar-3+i]=funcbkg1->GetParameter(i);
763 //cout<<bkgPar-3+i<<"\t"<<funcbkg1->GetParameter(i);
764 fFitPars[nFitPars+3*bkgPar-6+i]= funcbkg1->GetParError(i);
765 //cout<<"\t"<<nFitPars+3*bkgPar-6+i<<"\t"<<funcbkg1->GetParError(i)<<endl;
768 intbkg1=funcbkg1->GetParameter(3);
769 if(ftypeOfFit4Bkg!=3) slope1 = funcbkg1->GetParameter(4);
770 if(ftypeOfFit4Bkg==2) conc1 = funcbkg1->GetParameter(5);
775 for(Int_t i=0;i<3;i++){
776 fFitPars[bkgPar-3+i]=0.;
777 cout<<bkgPar-3+i<<"\t"<<0.<<"\t";
778 fFitPars[nFitPars+3*bkgPar-6+i]= 0.;
779 cout<<nFitPars+3*bkgPar-6+i<<"\t"<<0.<<endl;
782 for(Int_t i=0;i<bkgPar-3;i++){
783 fFitPars[bkgPar+i]=funcbkg->GetParameter(i);
784 cout<<bkgPar+i<<"\t"<<funcbkg->GetParameter(i)<<"\t";
785 fFitPars[nFitPars+3*bkgPar-3+i]= funcbkg->GetParError(i);
786 cout<<nFitPars+3*bkgPar-3+i<<"\t"<< funcbkg->GetParError(i)<<endl;
792 //sidebands integral - second approx (from fit)
795 cout<<"Compare intbkg1 = "<<intbkg1<<" and integral = ";
796 if(ftypeOfFit4Sgn == 1) bkgInt=funcbkg1->Integral(fminMass,fmaxMass);
797 else bkgInt=funcbkg->Integral(fminMass,fmaxMass);
798 cout<</*"------BkgInt(Fit) = "<<*/bkgInt<<endl;
800 //Signal integral - first approx
802 sgnInt = totInt-bkgInt;
803 cout<<"------TotInt = "<<totInt<<"\tsgnInt = "<<sgnInt<<endl;
805 /*Fit All Mass distribution with exponential + gaussian (+gaussiam braodened) */
806 TF1 *funcmass = new TF1(massname.Data(),this,&AliHFMassFitter::FitFunction4MassDistr,fminMass,fmaxMass,nFitPars,"AliHFMassFitter","FitFunction4MassDistr");
807 cout<<"Function name = "<<funcmass->GetName()<<endl<<endl;
808 funcmass->SetLineColor(4); //blue
811 cout<<"\nTOTAL FIT"<<endl;
814 funcmass->SetParNames("TotInt","Slope","SgnInt","Mean","Sigma");
815 funcmass->SetParameters(totInt,slope1,sgnInt,fMass,fSigmaSgn);
816 //cout<<"Parameters set to: "<<totInt<<"\t"<<slope1<<"\t"<<sgnInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
817 // cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<nFitPars<<"\tgsidebands = "<<fSideBands<<endl;
818 funcmass->FixParameter(0,totInt);
821 funcmass->SetParNames("TotInt","Coef1","Coef2","SgnInt","Mean","Sigma");
822 funcmass->SetParameters(totInt,slope1,conc1,sgnInt,fMass,fSigmaSgn);
823 // cout<<"Parameters set to: "<<totInt<<"\t"<<slope1<<"\t"<<conc1<<"\t"<<sgnInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
824 // cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<nFitPars<<"\tgsidebands = "<<fSideBands<<endl;
825 funcmass->FixParameter(0,totInt);
828 funcmass->SetParNames("Const","SgnInt","Mean","Sigma");
829 if(ftypeOfFit4Sgn == 1) funcmass->SetParameters(0.,0.5*totInt,fMass,fSigmaSgn);
830 else funcmass->SetParameters(0.,totInt,fMass,fSigmaSgn);
831 funcmass->FixParameter(0,0.);
832 //cout<<"Parameters set to: "<<0.5*totInt<<"\t"<<fMass<<"\t"<<fSigmaSgn<<"\t"<<endl;
833 //cout<<"Limits: ("<<fminMass<<","<<fmaxMass<<")\tnPar = "<<nFitPars<<"\tgsidebands = "<<fSideBands<<endl;
837 fhistoInvMass->Fit(massname.Data(),"R,L,E,+,0");
838 cout<<"fit done"<<endl;
839 //reset value of fMass and fSigmaSgn to those found from fit
840 fMass=funcmass->GetParameter(nFitPars-2);
841 fSigmaSgn=funcmass->GetParameter(nFitPars-1);
843 for(Int_t i=0;i<nFitPars;i++){
844 fFitPars[i+2*bkgPar-3]=funcmass->GetParameter(i);
845 fFitPars[nFitPars+4*bkgPar-6+i]= funcmass->GetParError(i);
846 //cout<<i+2*bkgPar-3<<"\t"<<funcmass->GetParameter(i)<<"\t\t"<<nFitPars+4*bkgPar-6+i<<"\t"<<funcmass->GetParError(i)<<endl;
849 //check: cout parameters
850 for(Int_t i=0;i<2*(nFitPars+2*bkgPar-3);i++){
851 cout<<i<<"\t"<<fFitPars[i]<<endl;
856 // TCanvas *canvas=new TCanvas(fhistoInvMass->GetName(),fhistoInvMass->GetName());
857 // TH1F *fhistocopy=new TH1F(*fhistoInvMass);
859 // fhistocopy->DrawClone();
860 // if(ftypeOfFit4Sgn == 1) funcbkg1->DrawClone("sames");
861 // else funcbkg->DrawClone("sames");
862 // funcmass->DrawClone("sames");
863 // cout<<"Drawn"<<endl;
866 if(funcmass->GetParameter(nFitPars-1) <0 || funcmass->GetParameter(nFitPars-2) <0 || funcmass->GetParameter(nFitPars-3) <0 ) {
867 cout<<"IntS or mean or sigma negative. You may tray to SetInitialGaussianSigma(..) and SetInitialGaussianMean(..)"<<endl;
871 //increase counter of number of fits done
874 if (ftypeOfFit4Sgn == 1 && funcbkg1) {
887 AddFunctionsToHisto();
893 //_________________________________________________________________________
894 Double_t AliHFMassFitter::GetChiSquare() const{
895 TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass");
896 return funcmass->GetChisquare();
899 //_________________________________________________________________________
900 Double_t AliHFMassFitter::GetReducedChiSquare() const{
901 TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass");
902 return funcmass->GetChisquare()/funcmass->GetNDF();
907 //_________________________________________________________________________
908 void AliHFMassFitter::GetFitPars(Float_t *vector) const {
909 // Return fit parameters
911 for(Int_t i=0;i<fParsSize;i++){
912 vector[i]=fFitPars[i];
917 //_________________________________________________________________________
918 void AliHFMassFitter::AddFunctionsToHisto(){
920 cout<<"AddFunctionsToHisto called"<<endl;
921 TString bkgname = "funcbkg";
923 switch (ftypeOfFit4Bkg){
937 if (ftypeOfFit4Sgn == 1) {
942 TString bkgnamesave=bkgname;
943 TString testname=bkgname;
944 testname += "FullRange";
945 TF1 *testfunc=(TF1*)fhistoInvMass->FindObject(testname.Data());
947 cout<<"AddFunctionsToHisto already used: exiting...."<<endl;
951 TList *hlist=fhistoInvMass->GetListOfFunctions();
954 TF1 *b=(TF1*)hlist->FindObject(bkgname.Data());
956 cout<<bkgname<<" not found, cannot produce "<<bkgname<<"FullRange and "<<bkgname<<"Recalc"<<endl;
960 bkgname += "FullRange";
961 TF1 *bfullrange=new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,np,"AliHFMassFitter","FitFunction4Bkg");
962 //cout<<bfullrange->GetName()<<endl;
963 for(Int_t i=0;i<np;i++){
964 //cout<<i<<" di "<<np<<endl;
965 bfullrange->SetParName(i,b->GetParName(i));
966 bfullrange->SetParameter(i,b->GetParameter(i));
967 bfullrange->SetParError(i,b->GetParError(i));
969 bfullrange->SetLineStyle(4);
970 bfullrange->SetLineColor(14);
972 bkgnamesave += "Recalc";
974 TF1 *blastpar=new TF1(bkgnamesave.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,np,"AliHFMassFitter","FitFunction4Bkg");
976 TF1 *mass=fhistoInvMass->GetFunction("funcmass");
979 cout<<"funcmass doesn't exist "<<endl;
983 blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(np));
984 blastpar->SetParError(0,mass->GetParError(np));
986 blastpar->SetParameter(1,mass->GetParameter(1));
987 blastpar->SetParError(1,mass->GetParError(1));
990 blastpar->SetParameter(2,mass->GetParameter(2));
991 blastpar->SetParError(2,mass->GetParError(2));
994 blastpar->SetLineStyle(1);
995 blastpar->SetLineColor(2);
997 hlist->Add(bfullrange->Clone());
998 hlist->Add(blastpar->Clone());
1011 //_________________________________________________________________________
1013 TH1F* AliHFMassFitter::GetHistoClone() const{
1015 TH1F* hout=(TH1F*)fhistoInvMass->Clone(fhistoInvMass->GetName());
1018 //_________________________________________________________________________
1020 void AliHFMassFitter::WriteHisto(TString path) {
1021 if (fcounter == 0) {
1022 cout<<"Use MassFitter method before WriteHisto"<<endl;
1025 TH1F* hget=(TH1F*)fhistoInvMass->Clone();
1027 path += "HFMassFitterOutput.root";
1030 if (fcounter == 1) output = new TFile(path.Data(),"recreate");
1031 else output = new TFile(path.Data(),"update");
1036 cout<<fcounter<<" "<<hget->GetName()<<" written in "<<path<<endl;
1045 //_________________________________________________________________________
1047 void AliHFMassFitter::WriteNtuple(TString path) const{
1048 //TNtuple* nget=(TNtuple*)fntuParam->Clone();
1049 path += "HFMassFitterOutput.root";
1050 TFile *output = new TFile(path.Data(),"update");
1055 //cout<<nget->GetName()<<" written in "<<path<<endl;
1056 cout<<fntuParam->GetName()<<" written in "<<path<<endl;
1069 //_________________________________________________________________________
1071 void AliHFMassFitter::DrawFit() const{
1073 TString cvtitle="fit of ";
1074 cvtitle+=fhistoInvMass->GetName();
1078 TCanvas *c=new TCanvas(cvname,cvtitle);
1080 GetHistoClone()->Draw("hist");
1081 GetHistoClone()->GetFunction("funcbkgFullRange")->Draw("same");
1082 GetHistoClone()->GetFunction("funcbkgRecalc")->Draw("same");
1083 GetHistoClone()->GetFunction("funcmass")->Draw("same");
1089 //************ significance
1091 //_________________________________________________________________________
1093 void AliHFMassFitter::Signal(Double_t nOfSigma,Double_t &signal,Double_t &errsignal) const {
1094 // Return signal integral in mean+- n sigma
1097 cout<<"Use MassFitter method before Signal"<<endl;
1102 TString bkgname= "funcbkgRecalc";
1103 TString bkg1name="funcbkg1Recalc";
1104 TString massname="funcmass";
1108 TF1 *funcmass=fhistoInvMass->GetFunction(massname.Data());
1110 cout<<"AliHFMassFitter::Signal() ERROR -> Mass distr function not found!"<<endl;
1114 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1115 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1118 cout<<"AliHFMassFitter::Signal() ERROR -> Bkg function not found!"<<endl;
1123 switch (ftypeOfFit4Bkg){
1138 Double_t intS,intSerr;
1140 //relative error evaluation
1141 intS=funcmass->GetParameter(np);
1142 intSerr=funcmass->GetParError(np);
1143 cout<<"Sgn relative error evaluation from fit: "<<intSerr/intS<<endl;
1144 Double_t background,errbackground;
1145 Background(nOfSigma,background,errbackground);
1147 //signal +/- error in nsigma
1148 Double_t min=fMass-nOfSigma*fSigmaSgn;
1149 Double_t max=fMass+nOfSigma*fSigmaSgn;
1151 Double_t mass=funcmass->Integral(min, max)/fhistoInvMass->GetBinWidth(4);
1152 signal=mass - background;
1153 errsignal=TMath::Sqrt((intSerr/intS*mass)*(intSerr/intS*mass)/*assume relative error is the same as for total integral*/ + errbackground*errbackground);
1157 //_________________________________________________________________________
1159 void AliHFMassFitter::Signal(Double_t min, Double_t max, Double_t &signal,Double_t &errsignal) const {
1161 // Return signal integral in a range
1164 cout<<"Use MassFitter method before Signal"<<endl;
1169 TString bkgname="funcbkgRecalc";
1170 TString bkg1name="funcbkg1Recalc";
1171 TString massname="funcmass";
1175 TF1 *funcmass=fhistoInvMass->GetFunction(massname.Data());
1177 cout<<"AliHFMassFitter::Signal() ERROR -> Mass distr function not found!"<<endl;
1181 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1182 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1185 cout<<"AliHFMassFitter::Signal() ERROR -> Bkg function not found!"<<endl;
1190 switch (ftypeOfFit4Bkg){
1205 Double_t intS,intSerr;
1207 //relative error evaluation
1208 intS=funcmass->GetParameter(np);
1209 intSerr=funcmass->GetParError(np);
1211 cout<<"Sgn relative error evaluation from fit: "<<intSerr/intS<<endl;
1212 Double_t background,errbackground;
1213 Background(min,max,background,errbackground);
1215 //signal +/- error in the range
1217 Double_t mass=funcmass->Integral(min, max)/fhistoInvMass->GetBinWidth(4);
1218 signal=mass - background;
1219 errsignal=(intSerr/intS)*signal;/*assume relative error is the same as for total integral*/
1223 //_________________________________________________________________________
1225 void AliHFMassFitter::Background(Double_t nOfSigma,Double_t &background,Double_t &errbackground) const {
1226 // Return background integral in mean+- n sigma
1229 cout<<"Use MassFitter method before Background"<<endl;
1234 TString bkgname="funcbkgRecalc";
1235 TString bkg1name="funcbkg1Recalc";
1238 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1239 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1241 cout<<"AliHFMassFitter::Background() ERROR -> Bkg function not found!"<<endl;
1245 Double_t intB,intBerr;
1247 //relative error evaluation: from final parameters of the fit
1248 if(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn == 0) cout<<"No background fit: Bkg relative error evaluation put to zero"<<endl;
1250 intB=funcbkg->GetParameter(0);
1251 intBerr=funcbkg->GetParError(0);
1252 cout<<"Bkg relative error evaluation: from final parameters of the fit: "<<intBerr/intB<<endl;
1255 Double_t min=fMass-nOfSigma*fSigmaSgn;
1256 Double_t max=fMass+nOfSigma*fSigmaSgn;
1258 //relative error evaluation: from histo
1260 intB=fhistoInvMass->Integral(1,fSideBandl)+fhistoInvMass->Integral(fSideBandr,fNbin);
1262 for(Int_t i=1;i<=fSideBandl;i++){
1263 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1265 for(Int_t i=fSideBandr;i<=fNbin;i++){
1266 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1269 intBerr=TMath::Sqrt(sum2);
1270 cout<<"Bkg relative error evaluation: from histo: "<<intBerr/intB<<endl;
1272 cout<<"Last estimation of bkg error is used"<<endl;
1274 //backround +/- error in nsigma
1275 if (ftypeOfFit4Bkg == 3 && ftypeOfFit4Sgn == 0) {
1280 background=funcbkg->Integral(min,max)/(Double_t)fhistoInvMass->GetBinWidth(2);
1281 errbackground=intBerr/intB*background; // assume relative error is the same as for total integral
1282 //cout<<"integral = "<<funcbkg->Integral(min, max)<<"\tbinW = "<<fhistoInvMass->GetBinWidth(2)<<endl;
1287 //___________________________________________________________________________
1289 void AliHFMassFitter::Background(Double_t min, Double_t max, Double_t &background,Double_t &errbackground) const {
1290 // Return background integral in a range
1293 cout<<"Use MassFitter method before Background"<<endl;
1298 TString bkgname="funcbkgRecalc";
1299 TString bkg1name="funcbkg1Recalc";
1302 if(ftypeOfFit4Sgn == 0) funcbkg=fhistoInvMass->GetFunction(bkgname.Data());
1303 else funcbkg=fhistoInvMass->GetFunction(bkg1name.Data());
1305 cout<<"AliHFMassFitter::Background() ERROR -> Bkg function not found!"<<endl;
1310 Double_t intB,intBerr;
1312 //relative error evaluation: from final parameters of the fit
1313 if(ftypeOfFit4Bkg==3 && ftypeOfFit4Sgn == 0) cout<<"No background fit: Bkg relative error evaluation put to zero"<<endl;
1315 intB=funcbkg->GetParameter(0);
1316 intBerr=funcbkg->GetParError(0);
1317 cout<<"Bkg relative error evaluation: from final parameters of the fit: "<<intBerr/intB<<endl;
1320 //relative error evaluation: from histo
1322 intB=fhistoInvMass->Integral(1,fSideBandl)+fhistoInvMass->Integral(fSideBandr,fNbin);
1324 for(Int_t i=1;i<=fSideBandl;i++){
1325 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1327 for(Int_t i=fSideBandr;i<=fNbin;i++){
1328 sum2+=fhistoInvMass->GetBinError(i)*fhistoInvMass->GetBinError(i);
1331 intBerr=TMath::Sqrt(sum2);
1332 cout<<"Bkg relative error evaluation: from histo: "<<intBerr/intB<<endl;
1334 cout<<"Last estimation of bkg error is used"<<endl;
1336 //backround +/- error in the range
1337 if (ftypeOfFit4Bkg == 3 && ftypeOfFit4Sgn == 0) {
1342 background=funcbkg->Integral(min,max)/(Double_t)fhistoInvMass->GetBinWidth(2);
1343 errbackground=intBerr/intB*background; // assume relative error is the same as for total integral
1344 //cout<<"integral = "<<funcbkg->Integral(min, max)<<"\tbinW = "<<fhistoInvMass->GetBinWidth(2)<<endl;
1351 //__________________________________________________________________________
1353 void AliHFMassFitter::Significance(Double_t nOfSigma,Double_t &significance,Double_t &errsignificance) const {
1354 // Return significance in mean+- n sigma
1356 Double_t signal,errsignal,background,errbackground;
1357 Signal(nOfSigma,signal,errsignal);
1358 Background(nOfSigma,background,errbackground);
1360 significance = signal/TMath::Sqrt(signal+background);
1362 errsignificance = TMath::Sqrt(significance*significance/(signal+background)/(signal+background)*(1/4.*errsignal*errsignal+errbackground*errbackground)+significance*significance/signal/signal*errsignal*errsignal);
1367 //__________________________________________________________________________
1369 void AliHFMassFitter::Significance(Double_t min, Double_t max, Double_t &significance,Double_t &errsignificance) const {
1370 // Return significance integral in a range
1372 Double_t signal,errsignal,background,errbackground;
1373 Signal(min, max,signal,errsignal);
1374 Background(min, max,background,errbackground);
1376 significance = signal/TMath::Sqrt(signal+background);
1378 errsignificance = TMath::Sqrt(significance*significance/(signal+background)/(signal+background)*(1/4.*errsignal*errsignal+errbackground*errbackground)+significance*significance/signal/signal*errsignal*errsignal);