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)
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