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 ,fSigma2GausInit(0.012)
59 ,fMeanFixedFromMassFit(kFALSE)
60 ,fSigmaFixedFromMassFit(kFALSE)
61 ,fSigma2GausFixedFromMassFit(kFALSE)
62 ,fFrac2GausFixedFromMassFit(kFALSE)
79 ,fFixRflOverSig(kFALSE)
81 ,fHistoTemplRflInit(0x0)
90 ,fVnRflLimited(kFALSE)
94 ,fMassSecPeakFunc(0x0)
100 ,fDoSecondPeakVn(kFALSE)
183 fMassHisto = (TH1F*)hMass->Clone(
"fHistoInvMass");
219 Int_t NvnParsSgn = 1;
225 if(!massprefit) {AliError(
"Impossible to perform the mass prefit");
return kFALSE;}
228 std::vector<Double_t> initpars;
236 initpars.push_back(
fMassFuncFromPrefit->GetParameter(iSecPeakPar+fNParsMassBkg+fNParsMassSgn));
239 initpars.push_back(
fMassFuncFromPrefit->GetParameter(iReflPar+fNParsMassBkg+fNParsMassSgn+fNParsSec));
242 if(vnprefit) {initpars.push_back(
fVnBkgFuncSb->GetParameter(iVnBkgPar));}
243 else {initpars.push_back(0.05);}
245 initpars.push_back(0.10);
253 ROOT::Math::WrappedMultiTF1 wfTotVn(*
fVnTotFunc,1);
256 ROOT::Fit::DataOptions
opt;
257 ROOT::Fit::DataRange rangeMass;
260 ROOT::Fit::BinData dataMass(opt,rangeMass);
262 ROOT::Fit::BinData dataVn(opt,rangeMass);
266 ROOT::Fit::Chi2Function chi2Mass(dataMass, wfTotMass);
267 ROOT::Fit::Chi2Function chi2Vn(dataVn, wfTotVn);
275 fitter.Config().SetParamsSettings(nparsvn,initpars.data());
283 if(
fFixSecMass) {fitter.Config().ParSettings(fNParsMassBkg+fNParsMassSgn+1).Fix();}
284 if(
fFixSecWidth) {fitter.Config().ParSettings(fNParsMassBkg+fNParsMassSgn+2).Fix();}
287 if(
fFixRflOverSig) fitter.Config().ParSettings(fNParsMassBkg+fNParsMassSgn+fNParsSec).Fix();
291 fitter.Config().MinimizerOptions().SetPrintLevel(0);
292 fitter.Config().SetMinimizer(
"Minuit2",
"Migrad");
293 for(
Int_t iPar=0; iPar<nparsvn; iPar++) {fitter.Config().ParSettings(iPar).SetName(
fVnTotFunc->GetParName(iPar));}
296 fitter.FitFCN(nparsvn,globalChi2,0,dataMass.Size()+dataVn.Size(),kFALSE);
297 ROOT::Fit::FitResult result = fitter.Result();
298 result.Print(std::cout);
307 for(
Int_t iPar=0; iPar<nparsvn; iPar++) {
308 fVnTotFunc->SetParameter(iPar,result.Parameter(iPar));
309 fVnTotFunc->SetParError(iPar,result.ParError(iPar));
311 fMassTotFunc->SetParameter(iPar,result.Parameter(iPar));
314 if(iPar>=nparsmass && iPar<nparsvn-NvnParsSgn) {
315 fVnBkgFunc->SetParameter(iPar-nparsmass,result.Parameter(iPar));
316 fVnBkgFunc->SetParError(iPar-nparsmass,result.ParError(iPar));
318 if(iPar>=fNParsMassBkg && iPar<fNParsMassBkg+fNParsMassSgn) {
319 fMassSgnFunc->SetParameter(iPar-fNParsMassBkg,result.Parameter(iPar));
321 if(iPar<fNParsMassBkg) {
322 fMassBkgFunc->SetParameter(iPar,result.Parameter(iPar));
329 if(
fReflections && (iPar>=fNParsMassBkg+fNParsMassSgn+fNParsSec && iPar<fNParsMassBkg+fNParsMassSgn+fNParsSec+fNParsRfl)) {
330 fMassRflFunc->SetParameter(iPar-(fNParsMassBkg+fNParsMassSgn+fNParsSec),result.Parameter(iPar));
331 fMassRflFunc->SetParError(iPar-(fNParsMassBkg+fNParsMassSgn+fNParsSec),result.ParError(iPar));
332 fMassBkgRflFunc->SetParameter(iPar-(fNParsMassSgn+fNParsSec),result.Parameter(iPar));
333 fMassBkgRflFunc->SetParError(iPar-(fNParsMassSgn+fNParsSec),result.ParError(iPar));
335 if(
fSecondPeak && (iPar>=fNParsMassBkg+fNParsMassSgn && iPar<fNParsMassBkg+fNParsMassSgn+fNParsSec)) {
336 fMassSecPeakFunc->SetParameter(iPar-(fNParsMassBkg+fNParsMassSgn),result.Parameter(iPar));
337 fMassSecPeakFunc->SetParError(iPar-(fNParsMassBkg+fNParsMassSgn),result.ParError(iPar));
356 fProb = result.Prob();
365 gStyle->SetOptStat(0);
366 gStyle->SetCanvasColor(0);
367 gStyle->SetFrameFillColor(0);
412 TPaveText* massinfo =
new TPaveText(0.45,0.7,1.,0.87,
"NDC");
413 massinfo->SetTextFont(42);
414 massinfo->SetTextSize(0.05);
415 massinfo->SetBorderSize(0);
416 massinfo->SetFillStyle(0);
417 massinfo->SetTextColor(kBlue);
423 massinfo->Draw(
"same");
451 TPaveText* vninfo =
new TPaveText(-0.45,0.7,1.,0.87,
"NDC");
452 vninfo->SetTextFont(42);
453 vninfo->SetTextSize(0.05);
454 vninfo->SetBorderSize(0);
455 vninfo->SetFillStyle(0);
456 Int_t NvnParsSgn = 1;
461 vninfo->AddText(Form(
"#chi^{2}/#it{ndf} = %.2f/%d",
fChiSquare,
fNDF));
462 vninfo->Draw(
"same");
472 fMassMin=TMath::Max(fMassMin,tmpmin);
514 for(
Int_t iBin=0; iBin<nMassBins; iBin++) {
518 if(max<(mean-
fNSigmaForSB*sigma)) {SBbins[iBin]=1; nSBbins++;}
519 else {SBbins[iBin]=0;}
522 if(min>(mean+
fNSigmaForSB*sigma)) {SBbins[iBin]=1; nSBbins++;}
523 else {SBbins[iBin]=0;}
527 for(
Int_t iBin=0; iBin<nMassBins; iBin++) {
528 if(SBbins[iBin]==1) {
545 AliError(
"Error in setting signal par names: check fVnBkgFuncType");
567 AliError(
"Error in computing fMassSgnFuncType: check fMassSgnFuncType");
594 AliError(
"Error in computing fNParsMassBkg: check fMassBkgFuncType");
612 AliError(
"Error in computing fNParsVnBkg: check fVnBkgFuncType");
655 AliError(
"Error in setting signal par names: check fMassSgnFuncType");
689 AliError(
"Error in setting signal par names: check fMassBkgFuncType");
715 Signal(minMass,maxMass,signal,errsignal);
738 Background(minMass,maxMass,background,errbackground);
748 if(!
fMassBkgFunc) {background=-1; errbackground=0;
return;}
758 for(
Int_t iBin=1; iBin<=leftBand; iBin++){
765 intBerr=TMath::Sqrt(sum2);
768 errbackground=intBerr/intB*background;
781 Significance(minMass, maxMass, significance, errsignificance);
809 return TMath::Gaus(x,mean,sigma,kTRUE);
815 if(isnorm) {
return TMath::Exp(x/coeff)/(coeff*(TMath::Exp(
fMassMax/coeff)-TMath::Exp(
fMassMin/coeff)));}
816 else TMath::Exp(x/coeff);
825 else {
return pars[0];}
829 else {
return pars[0]+pars[1]*x;}
833 else {
return pars[0]+pars[1]*x+pars[2]*x*x;}
841 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
842 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]);
848 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
849 return pars[0]*TMath::Sqrt(x - mpi)*TMath::Exp(-1.*pars[1]*(x-mpi));
856 for(
Int_t iT=1; iT<=Ndeg; iT++){
857 if(isnorm) total+=pars[iT]*TMath::Power(x-
fMassParticle,iT)/TMath::Factorial(iT);
858 else total+=pars[iT]*TMath::Power(x,iT);
868 return pars[0]*
GetGausPDF(m[0],pars[1],pars[2]);
871 return pars[0]*(pars[3]*
GetGausPDF(m[0],pars[1],pars[2])+(1-pars[3])*
GetGausPDF(m[0],pars[1],pars[4]));
883 return pars[0]*
GetExpoPDF(m[0],pars[1],kTRUE);
947 return pars[0]*
GetGausPDF(m[0],pars[1],pars[2]);
955 return pars[0]*
GetExpoPDF(m[0],pars[1],kFALSE);
1013 for(
Int_t iPar=0; iPar<
fNParsVnBkg; iPar++) {vnbkgpars[iPar] = pars[iPar+fNParsMassSgn+fNParsMassBkg+fNParsSec+
fNParsRfl];}
1024 vnRefl = pars[fNParsMassSgn+fNParsMassBkg+fNParsSec+fNParsRfl+
fNParsVnBkg];
1027 vnRefl = -pars[fNParsMassSgn+fNParsMassBkg+fNParsSec+fNParsRfl+
fNParsVnBkg];
1036 AliError(
"Error in setting reflection vn option: check fVnRflOpt");
1052 else Refl +=
MassRfl(m,rflpars);
1055 return (vnSgn*Sgn+vnBkg*Bkg+vnSecPeak*SecPeak+vnRefl*Refl)/(Sgn+Bkg+SecPeak+Refl);
1062 TCanvas* c0=
new TCanvas(
"c0",
"",600,800);
Int_t fVnRflOpt
internal variable for fit with reflections
Int_t fFrac2GausFixed
flag to fix second peak width in case of k2Gaus
Int_t fPolDegreeVnBkg
degree of polynomial expansion for back fit (option 6 for back)
Double_t MassSecondPeak(Double_t *m, Double_t *par)
Double_t GetExpoPDF(Double_t x, Double_t slope, Bool_t isnorm=kTRUE)
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 fNParsVnSecPeak
number of parameters in vn sgn fit function (1)
Int_t fNParsRfl
flag use/not use reflections
Bool_t fReflections
degree of polynomial expansion for vn 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
initialization for fraction of second gaussian in case of k2Gaus
Double_t fMean
uncertainty on mass peak width from simultaneus fit
TH1F * fHistoTemplRfl
switch for fix refl/signal
Double_t fMassParticle
flag to fix fraction of second gaussian in case of k2Gaus
Bool_t fFixSecMass
width of the 2nd peak
Int_t fNParsSec
fit function for second peak
Bool_t fSecondPeak
maximum vn of reflections
Double_t fSigma2GausInit
initialization for peak position
Double_t GetHigherPolFuncPDF(Double_t x, Double_t *pars, Int_t Ndeg, Bool_t isnorm=kTRUE)
Bool_t fSigmaFixedFromMassFit
flag to fix peak position from mass prefit
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.
void SetFixSecondGaussianSigma(Double_t sigma)
Int_t fSigma2GausFixed
flag to fix peak position
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
void SetFixFrac2Gaus(Double_t frac)
Double_t GetSigma() const
void SetPolDegreeForBackgroundFit(Int_t deg)
Double_t fChiSquare
uncertainty raw yield from simultaneus fit
Bool_t fSigma2GausFixedFromMassFit
flag to fix peak width from mass prefit
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)
Bool_t fFrac2GausFixedFromMassFit
flag to fix second peak width from mass prefit in case of k2Gaus
TF1 * fMassSecPeakFunc
switch off/on second peak (for D+->KKpi in Ds)
TF1 * fVnBkgFunc
vn bkg fit function (1st step from SB prefit)
Int_t fPolDegreeBkg
flag to fix fraction of second gaussian in case of k2Gaus
Double_t fSecWidth
position of the 2nd peak
void SetInitialSecondGaussianSigma(Double_t sigma)
Bool_t fVnRflLimited
option for reflection vn type
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)
Int_t fNParsVnRfl
number of parameters in vn sec peak fit function (1 if included, 0 otherwise)
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)
Int_t fNParsVnSgn
number of parameters in vn bkg fit function
Double_t fSigmaUncertainty
mass peak width from simultaneus fit
Double_t fFrac2GausInit
initialization for second peak width in case of k2Gaus
Double_t fRawYield
uncertainty on mass peak position from simultaneus fit
Double_t fVnRflMax
minimum vn of reflections
Int_t fSigmaFixed
number of parameters in vn refl fit function (1 if included, 0 otherwise)
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
Double_t fVnRflMin
flag to limit or not the vn of reflections
TF1 * fMassSgnFunc
mass bkg fit function (final, after simultaneus fit)
void SetInitialFrac2Gaus(Double_t frac)
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 GetRawYield() const
Double_t fVnSecPeak
flag to fix the width of the 2nd peak