6 #include <TGraphErrors.h>
12 #include <TVirtualPad.h>
13 #include <TDatabasePDG.h>
14 #include <TPaveText.h>
15 #include "Fit/BinData.h"
16 #include "HFitInterface.h"
30 ,fMassSgnFuncType(
kGaus)
31 ,fMassBkgFuncType(
kExpo)
33 ,fMassFuncFromPrefit(0x0)
46 ,fSigmaUncertainty(0.)
50 ,fRawYieldUncertainty(0.)
57 ,fMeanFixedFromMassFit(kFALSE)
58 ,fSigmaFixedFromMassFit(kFALSE)
69 ,fFixRflOverSig(kFALSE)
71 ,fHistoTemplRflInit(0x0)
80 ,fMassSecPeakFunc(0x0)
86 ,fDoSecondPeakVn(kFALSE)
95 ,fMassSgnFuncType(funcMassSgn)
96 ,fMassBkgFuncType(funcMassBkg)
97 ,fVnBkgFuncType(funcvnBkg)
98 ,fMassFuncFromPrefit(0x0)
111 ,fSigmaUncertainty(0.)
113 ,fMeanUncertainty(0.)
115 ,fRawYieldUncertainty(0.)
122 ,fMeanFixedFromMassFit(kFALSE)
123 ,fSigmaFixedFromMassFit(kFALSE)
124 ,fMassParticle(1.870)
131 ,fReflections(kFALSE)
134 ,fFixRflOverSig(kFALSE)
136 ,fHistoTemplRflInit(0x0)
138 ,fMassBkgRflFunc(0x0)
145 ,fMassSecPeakFunc(0x0)
150 ,fFixSecWidth(kFALSE)
151 ,fDoSecondPeakVn(kFALSE)
155 fMassHisto = (TH1F*)hMass->Clone(
"fHistoInvMass");
191 Int_t NvnParsSgn = 1;
196 if(!massprefit) {AliError(
"Impossible to perform the mass prefit");
return kFALSE;}
199 std::vector<Double_t> initpars;
207 initpars.push_back(
fMassFuncFromPrefit->GetParameter(iSecPeakPar+fNParsMassBkg+fNParsMassSgn));
210 initpars.push_back(
fMassFuncFromPrefit->GetParameter(iReflPar+fNParsMassBkg+fNParsMassSgn+fNParsSec));
213 if(vnprefit) {initpars.push_back(
fVnBkgFuncSb->GetParameter(iVnBkgPar));}
214 else {initpars.push_back(0.05);}
216 initpars.push_back(0.10);
224 ROOT::Math::WrappedMultiTF1 wfTotVn(*
fVnTotFunc,1);
227 ROOT::Fit::DataOptions opt;
228 ROOT::Fit::DataRange rangeMass;
231 ROOT::Fit::BinData dataMass(opt,rangeMass);
233 ROOT::Fit::BinData dataVn(opt,rangeMass);
237 ROOT::Fit::Chi2Function chi2Mass(dataMass, wfTotMass);
238 ROOT::Fit::Chi2Function chi2Vn(dataVn, wfTotVn);
246 fitter.Config().SetParamsSettings(nparsvn,initpars.data());
253 fitter.Config().MinimizerOptions().SetPrintLevel(0);
254 fitter.Config().SetMinimizer(
"Minuit2",
"Migrad");
255 for(
Int_t iPar=0; iPar<nparsvn; iPar++) {fitter.Config().ParSettings(iPar).SetName(
fVnTotFunc->GetParName(iPar));}
258 fitter.FitFCN(nparsvn,globalChi2,0,dataMass.Size()+dataVn.Size(),kFALSE);
259 ROOT::Fit::FitResult result = fitter.Result();
260 result.Print(std::cout);
269 for(
Int_t iPar=0; iPar<nparsvn; iPar++) {
270 fVnTotFunc->SetParameter(iPar,result.Parameter(iPar));
271 fVnTotFunc->SetParError(iPar,result.ParError(iPar));
273 fMassTotFunc->SetParameter(iPar,result.Parameter(iPar));
276 if(iPar>=nparsmass && iPar<nparsvn-NvnParsSgn) {
277 fVnBkgFunc->SetParameter(iPar-nparsmass,result.Parameter(iPar));
278 fVnBkgFunc->SetParError(iPar-nparsmass,result.ParError(iPar));
280 if(iPar>=fNParsMassBkg && iPar<fNParsMassBkg+fNParsMassSgn) {
281 fMassSgnFunc->SetParameter(iPar-fNParsMassBkg,result.Parameter(iPar));
283 if(iPar<fNParsMassBkg) {
284 fMassBkgFunc->SetParameter(iPar,result.Parameter(iPar));
287 fMassRflFunc->SetParameter(iPar,result.Parameter(iPar));
291 if(
fReflections && (iPar>=fNParsMassBkg+fNParsMassSgn+fNParsSec && iPar<fNParsMassBkg+fNParsMassSgn+fNParsSec+fNParsRfl)) {
292 fMassRflFunc->SetParameter(iPar-(fNParsMassBkg+fNParsMassSgn+fNParsSec),result.Parameter(iPar));
293 fMassRflFunc->SetParError(iPar-(fNParsMassBkg+fNParsMassSgn+fNParsSec),result.ParError(iPar));
295 if(
fSecondPeak && (iPar>=fNParsMassBkg+fNParsMassSgn && iPar<fNParsMassBkg+fNParsMassSgn+fNParsSec)) {
296 fMassSecPeakFunc->SetParameter(iPar-(fNParsMassBkg+fNParsMassSgn),result.Parameter(iPar));
297 fMassSecPeakFunc->SetParError(iPar-(fNParsMassBkg+fNParsMassSgn),result.ParError(iPar));
316 fProb = result.Prob();
325 gStyle->SetOptStat(0);
326 gStyle->SetCanvasColor(0);
327 gStyle->SetFrameFillColor(0);
372 TPaveText* massinfo =
new TPaveText(0.45,0.7,1.,0.87,
"NDC");
373 massinfo->SetTextFont(42);
374 massinfo->SetTextSize(0.05);
375 massinfo->SetBorderSize(0);
376 massinfo->SetFillStyle(0);
377 massinfo->SetTextColor(kBlue);
383 massinfo->Draw(
"same");
411 TPaveText* vninfo =
new TPaveText(-0.45,0.7,1.,0.87,
"NDC");
412 vninfo->SetTextFont(42);
413 vninfo->SetTextSize(0.05);
414 vninfo->SetBorderSize(0);
415 vninfo->SetFillStyle(0);
416 Int_t NvnParsSgn = 1;
420 vninfo->AddText(Form(
"#chi^{2}/#it{ndf} = %.2f/%d",
fChiSquare,
fNDF));
421 vninfo->Draw(
"same");
431 fMassMin=TMath::Max(fMassMin,tmpmin);
466 for(
Int_t iBin=0; iBin<nMassBins; iBin++) {
470 if(max<(mean-
fNSigmaForSB*sigma)) {SBbins[iBin]=1; nSBbins++;}
471 else {SBbins[iBin]=0;}
474 if(min>(mean+
fNSigmaForSB*sigma)) {SBbins[iBin]=1; nSBbins++;}
475 else {SBbins[iBin]=0;}
479 for(
Int_t iBin=0; iBin<nMassBins; iBin++) {
480 if(SBbins[iBin]==1) {
497 AliError(
"Error in setting signal par names: check fVnBkgFuncType");
519 AliError(
"Error in computing fMassSgnFuncType: check fMassSgnFuncType");
546 AliError(
"Error in computing fNParsMassBkg: check fMassBkgFuncType");
558 AliError(
"Error in computing fNParsVnBkg: check fVnBkgFuncType");
586 AliError(
"Error in setting signal par names: check fMassSgnFuncType");
620 AliError(
"Error in setting signal par names: check fMassBkgFuncType");
644 Signal(minMass,maxMass,signal,errsignal);
667 Background(minMass,maxMass,background,errbackground);
677 if(!
fMassBkgFunc) {background=-1; errbackground=0;
return;}
687 for(
Int_t iBin=1; iBin<=leftBand; iBin++){
694 intBerr=TMath::Sqrt(sum2);
697 errbackground=intBerr/intB*background;
710 Significance(minMass, maxMass, significance, errsignificance);
738 return TMath::Gaus(x,mean,sigma,kTRUE);
744 return TMath::Exp(x/coeff)/(coeff*(TMath::Exp(
fMassMax/coeff)-TMath::Exp(
fMassMin/coeff)));
753 else {
return pars[0];}
757 else {
return pars[0]+pars[1]*x;}
761 else {
return pars[0]+pars[1]*x+pars[2]*x*x;}
769 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
770 return pars[0]*(pars[1]+1.)/(TMath::Power(
fMassMax-mpi,pars[1]+1.)-TMath::Power(
fMassMin-mpi,pars[1]+1.))*TMath::Power(x-mpi,pars[1]);
776 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
777 return pars[0]*TMath::Sqrt(x - mpi)*TMath::Exp(-1.*pars[1]*(x-mpi));
785 total+=pars[iT]*TMath::Power(x-
fMassParticle,iT)/TMath::Factorial(iT);
795 return pars[0]*
GetGausPDF(m[0],pars[1],pars[2]);
798 return pars[0]*(pars[3]*
GetGausPDF(m[0],pars[1],pars[2])+(1-pars[3])*
GetGausPDF(m[0],pars[1],pars[4]));
874 return pars[0]*
GetGausPDF(m[0],pars[1],pars[2]);
933 for(
Int_t iPar=0; iPar<
fNParsVnBkg; iPar++) {vnbkgpars[iPar] = pars[iPar+fNParsMassSgn+fNParsMassBkg+fNParsSec+
fNParsRfl];}
949 else {
return (vnSgn*Sgn+vnBkg*(Bkg+SecPeak))/(Sgn+Bkg+SecPeak);}
956 TCanvas* c0=
new TCanvas(
"c0",
"",600,800);
Double_t MassSecondPeak(Double_t *m, Double_t *par)
Int_t fNParsVnBkg
number of parameters in mass bkg fit function
Bool_t fFixSecWidth
flag to fix the position of the 2nd peak
void SetFixReflOverS(Double_t rovers)
Int_t fNParsRfl
flag use/not use reflections
Bool_t fReflections
degree of polynomial expansion for back fit (option 6 for back)
void IncludeSecondGausPeak(Double_t mass, Bool_t fixm, Double_t width, Bool_t fixw)
Double_t MassRfl(Double_t *m, Double_t *par)
Bool_t SimultaneusFit(Bool_t drawFit=kTRUE)
Double_t GetPowerFuncPDF(Double_t x, Double_t *pars)
Bool_t fMeanFixedFromMassFit
flag to fix peak width from mass prefit
Double_t fMean
uncertainty on mass peak width from simultaneus fit
TH1F * fHistoTemplRfl
switch for fix refl/signal
Double_t fMassParticle
flag to fix peak position from mass prefit
Bool_t fFixSecMass
width of the 2nd peak
Int_t fNParsSec
fit function for second peak
Bool_t fSecondPeak
internal variable for fit with reflections
Bool_t fSigmaFixedFromMassFit
initialization for peak position
Double_t GetHigherPolFuncPDF(Double_t x, Double_t *pars)
void Signal(Double_t nOfSigma, Double_t &signal, Double_t &errsignal) const
Int_t MassFitter(Bool_t draw=kTRUE)
Double_t fSecMass
number of parameters in second peak fit function
TF1 * fMassTotFunc
mass signal fit function (final, after simultaneus fit)
Double_t vnBkgFunc(Double_t *m, Double_t *pars)
void SetUseLikelihoodFit()
Double_t fRflOverSig
fit parameters in reflection fit function
Double_t fMassMax
upper mass limit
AliHFInvMassFitter class for the fit of invariant mass distribution of charm hadrons.
Int_t fMeanFixed
flag to fix peak width
Double_t fVn
lower mass limit
Int_t fMassSgnFuncType
vn vs. mass histogram to fit
void DefineNumberOfParameters()
private methods
Double_t GetSigma() const
void SetPolDegreeForBackgroundFit(Int_t deg)
Double_t fChiSquare
uncertainty raw yield from simultaneus fit
void SetFixGaussianSigma(Double_t sigma)
Double_t fRawYieldUncertainty
raw yield from simultaneus fit
Double_t GetPowerExpoPDF(Double_t x, Double_t *pars)
Int_t fNSigmaForSB
simultaneus fit probability
TF1 * fMassBkgFunc
mass fit function (1st step, from prefit)
Double_t fMaxRefl
minimum for refelction histo
Double_t vnFunc(Double_t *m, Double_t *pars)
Double_t fVnUncertainty
vn of the signal from fit
Double_t fProb
simultaneus fit number of degree of freedom
Double_t MassSignal(Double_t *m, Double_t *pars)
void SetFixGaussianMean(Double_t mean)
TF1 * fMassSecPeakFunc
switch off/on second peak (for D+->KKpi in Ds)
TF1 * fVnBkgFunc
vn bkg fit function (1st step from SB prefit)
Double_t GetExpoPDF(Double_t x, Double_t slope)
Int_t fPolDegreeBkg
flag to fix peak position
Double_t fSecWidth
position of the 2nd peak
TF1 * fVnTotFunc
vn bkg fit function (final, after simultaneus fit)
Int_t fHarmonic
vn uncertainty of second peak from fit
Double_t fSigmaInit
number of sigma for sidebands region (vn bkg prefit)
Int_t fNParsMassBkg
number of parameters in mass signal fit function
Double_t MassBkgRfl(Double_t *m, Double_t *par)
Double_t fMeanUncertainty
mass peak position from simultaneus fit
Double_t GetPolPDF(Double_t x, Double_t *pars, Int_t order, Bool_t isnorm=kTRUE)
TH1F * SetTemplateReflections(const TH1 *h, TString opt, Double_t minRange, Double_t maxRange)
Double_t fSigma
uncertainty on vn of the signal from simultaneus fit
TF1 * fVnBkgFuncSb
mass fit function (final, after simultaneus fit)
Double_t fMeanInit
initialization for peak width
TH1F * fMassHisto
data members
void DrawHere(TVirtualPad *c)
TH1F * fHistoTemplRflInit
histogram with reflection template
Double_t GetGausPDF(Double_t x, Double_t mean, Double_t sigma)
fit functions
Int_t fNDF
simultaneus fit chi square
static void ComputeSignificance(Double_t signal, Double_t errsignal, Double_t background, Double_t errbackground, Double_t &significance, Double_t &errsignificance)
Significance calculator.
Bool_t fDoSecondPeakVn
vn of second peak from fit
TF1 * fMassRflFunc
initial histogram with reflection template
Double_t MassFunc(Double_t *m, Double_t *pars)
void Background(Double_t nOfSigma, Double_t &background, Double_t &errbackground) const
AliHFInvMassFitter * fMassFitter
vn fit function (final, after simultaneus fit)
TF1 * fMassBkgRflFunc
fit function for reflections
void SetInitialReflOverS(Double_t rovers)
TF1 * fMassFuncFromPrefit
type of vn bkg fit function
TH1F * fVnVsMassHisto
mass histogram to fit
Int_t fNParsMassSgn
mass of selected particle
void SetInitialGaussianSigma(Double_t sigma)
void SetInitialGaussianMean(Double_t mean)
Double_t fSigmaUncertainty
mass peak width from simultaneus fit
Double_t fRawYield
uncertainty on mass peak position from simultaneus fit
Int_t fSigmaFixed
number of parameters in vn bkg fit function
Double_t fMinRefl
refelction option
Int_t fVnBkgFuncType
type of mass bkg fit function
void Significance(Double_t nOfSigma, Double_t &significance, Double_t &errsignificance) const
Int_t fMassBkgFuncType
type of mass signal fit function
TF1 * fMassSgnFunc
mass bkg fit function (final, after simultaneus fit)
Double_t fRawYieldHelp
switch for smoothing of reflection template
Bool_t fFixRflOverSig
reflection/signal
TString fRflOpt
mass bkg fit function plus reflections (final, after simultaneus fit)
Double_t fMassMin
mass fitter for mass prefit
Double_t MassBkg(Double_t *m, Double_t *pars)
Double_t fVnSecPeakUncertainty
flag to introduce second peak vn in the vn vs. mass fit
Bool_t fSmoothRfl
maximum for refelction histo
Double_t fVnSecPeak
flag to fix the width of the 2nd peak