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 **************************************************************************/
15 #include "AliDielectronBtoJPSItoEleCDFfitFCNfitter.h"
24 AliDielectronBtoJPSItoEleCDFfitFCNfitter::AliDielectronBtoJPSItoEleCDFfitFCNfitter():
34 fFCN = new AliDielectronBtoJPSItoEleCDFfitFCN();
35 fFCN->SetCrystalBallFunction(kTRUE);
36 for(Int_t i=0; i<kInvMassTotal; i++) fParameterInvMassToFix[i]=kFALSE;
37 for(Int_t i=0; i<kPseudo; i++) fParameterXToFix[i]=kFALSE;
38 for(Int_t i=0; i<kPseudoBkg; i++) fParameterXbkgToFix[i]=kFALSE;
40 //__________________________________________________________________________________________
41 AliDielectronBtoJPSItoEleCDFfitFCNfitter::~AliDielectronBtoJPSItoEleCDFfitFCNfitter()
46 if(fInvMass) delete fInvMass;
51 //__________________________________________________________________________________________
52 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::SetInvMassSignalParameters(const Double_t massPar[5])
55 // Setter of the inv mass signal distribution parameters
57 fFCN->SetCrystalBallMmean(massPar[0]); //9
58 fFCN->SetCrystalBallNexp(massPar[1]); //10
59 fFCN->SetCrystalBallSigma(massPar[2]); //11
60 fFCN->SetCrystalBallAlpha(massPar[3]); //12
61 fFCN->SetCrystalBallNorm(massPar[4]); //13
62 //for(Int_t i=0; i<kInvMassSignal; i++) printf(" par%i %f \n",i,massPar[i]);
64 //__________________________________________________________________________________________
65 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::SetInvMassParameters(const Double_t massPar[9])
68 // Setter of the inv mass total distribution parameters
70 Double_t massParSig[5];
71 Double_t massParBkg[4];
73 for(Int_t iPar=0; iPar<9; iPar++){
74 if(iPar<5) massParSig[iPar]=massPar[iPar];
75 else massParBkg[iPar-5]=massPar[iPar];
77 SetInvMassSignalParameters(massParSig);
78 SetInvMassBkgParameters(massParBkg);
80 //__________________________________________________________________________________________
81 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::SetInvMassBkgParameters(const Double_t massPar[4])
84 // Setter of the Inv Mass background distribution parameters
86 fFCN->SetBkgInvMassNorm(massPar[0]);//14
87 fFCN->SetBkgInvMassMean(massPar[1]);//15
88 fFCN->SetBkgInvMassSlope(massPar[2]);//16
89 fFCN->SetBkgInvMassConst(massPar[3]);//17
91 //__________________________________________________________________________________________
92 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::GetInvMassParameters(TArrayD &massPar)
95 // Getter of the inv mass total distribution parameters
98 massPar.Set(kInvMassTotal);
99 massPar.AddAt(fFCN->GetCrystalBallMmean(),0); //9
100 massPar.AddAt(fFCN->GetCrystalBallNexp(),1); //10
101 massPar.AddAt(fFCN->GetCrystalBallSigma(),2); //11
102 massPar.AddAt(fFCN->GetCrystalBallAlpha(),3); //12
103 massPar.AddAt(fFCN->GetCrystalBallNorm(),4); //13
104 massPar.AddAt(fFCN->GetBkgInvMassNorm(),5);//14
105 massPar.AddAt(fFCN->GetBkgInvMassMean(),6);//15
106 massPar.AddAt(fFCN->GetBkgInvMassSlope(),7); //16
107 massPar.AddAt(fFCN->GetBkgInvMassConst(),8); //17
109 //__________________________________________________________________________________________
110 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::GetInvMassSignalParameters(TArrayD &massPar)
113 // Getter of the Inv Mass signal distribution parameters
116 massPar.Set(kInvMassSignal);
117 massPar.AddAt(fFCN->GetCrystalBallMmean(),0); //9
118 massPar.AddAt(fFCN->GetCrystalBallNexp(),1); //10
119 massPar.AddAt(fFCN->GetCrystalBallSigma(),2); //11
120 massPar.AddAt(fFCN->GetCrystalBallAlpha(),3); //12
121 massPar.AddAt(fFCN->GetCrystalBallNorm(),4); //13
124 //__________________________________________________________________________________________
125 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::GetInvMassBkgParameters(TArrayD &massPar)
128 // Getter of the Inv Mass background distribution parameters
131 massPar.Set(kInvMassBkg);
132 massPar.AddAt(fFCN->GetBkgInvMassNorm(),0); //14
133 massPar.AddAt(fFCN->GetBkgInvMassMean(),1); //15
134 massPar.AddAt(fFCN->GetCrystalBallSigma(),2); //11
135 massPar.AddAt(fFCN->GetCrystalBallAlpha(),3); //12
138 //__________________________________________________________________________________________
139 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::SetPseudoProperBkgParameters(Double_t xBkgPar[7])
142 // Setter of the psudoproper background distribution parameters
144 fFCN->SetResWeight(xBkgPar[0]);//0
145 fFCN->SetFPlus(xBkgPar[1]);//1
146 fFCN->SetFMinus(xBkgPar[2]);//2
147 fFCN->SetFSym(xBkgPar[3]);//3
148 fFCN->SetLamPlus(xBkgPar[4]); //4
149 fFCN->SetLamMinus(xBkgPar[5]); // 5
150 fFCN->SetLamSym(xBkgPar[6]); // 6
153 //__________________________________________________________________________________________
154 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::GetPseudoProperBkgParameters(TArrayD &xBkgPar)
157 // Getter of the psudoproper background distribution parameters
160 xBkgPar.Set(kPseudoBkg);
161 xBkgPar.AddAt(fFCN->GetResWeight(),0);
162 xBkgPar.AddAt(fFCN->GetFPlus(),1);
163 xBkgPar.AddAt(fFCN->GetFMinus(),2);
164 xBkgPar.AddAt(fFCN->GetFSym(),3);
165 xBkgPar.AddAt(fFCN->GetLamPlus(),4);
166 xBkgPar.AddAt(fFCN->GetLamMinus(),5);
167 xBkgPar.AddAt(fFCN->GetLamSym(),6);
169 //__________________________________________________________________________________________
170 TH1F* AliDielectronBtoJPSItoEleCDFfitFCNfitter::FitInvMassSignal(Double_t norm,Double_t mMin, Double_t mMax)
173 // Fit on the invariant mass signal distribution ( Crystal ball params )
176 printf("no histogram...exiting\n");
181 GetInvMassSignalParameters(pars);
183 TF1 * invMass = new TF1("invMassSignal",this,&AliDielectronBtoJPSItoEleCDFfitFCNfitter::CDFInvMassSignal,mMin,mMax,kInvMassSignal+1);
184 for(Int_t i=0; i<kInvMassSignal ; i++) {
185 if(fParameterInvMassToFix[i]) invMass->FixParameter(i,pars.At(i));
186 else invMass->SetParameter(i,pars.At(i));
188 invMass->SetParameter(kInvMassSignal,norm);
189 fInvMass->Fit("invMassSignal",Form("R%s",fFitOpt.Data()),"",mMin,mMax);
192 //__________________________________________________________________________________________
193 TH1F * AliDielectronBtoJPSItoEleCDFfitFCNfitter::FitInvMass(Double_t norm[2],Double_t mMin, Double_t mMax)
196 // Fit on the invariant mass total distribution
199 printf("no histogram...exiting\n");
204 GetInvMassParameters(pars);
206 TF1 * invMassTot = new TF1("invMassTot",this,&AliDielectronBtoJPSItoEleCDFfitFCNfitter::CDFInvMassTotal,mMin,mMax,11);
208 for(Int_t i=0; i<kInvMassTotal ; i++) {
209 if(fParameterInvMassToFix[i]) invMassTot->FixParameter(i,pars.At(i));
210 else invMassTot->SetParameter(i,pars.At(i));
213 if(!fParameterInvMassToFix[5]) invMassTot->SetParLimits(5,0,999999999);
216 invMassTot->SetParameter(9,norm[0]);
217 invMassTot->SetParLimits(9,0,999999999);
218 invMassTot->SetParameter(10,norm[1]);
219 invMassTot->SetParLimits(10,0,999999999);
221 fInvMass->Fit("invMassTot",Form("R%s",fFitOpt.Data()),"",mMin,mMax);
223 //printf("Inv Mass Params : ");
224 //for(Int_t i=0; i< 11; i++) printf("p%i %f ",i,invMassTot->GetParameter(i));
229 //__________________________________________________________________________________________
230 void AliDielectronBtoJPSItoEleCDFfitFCNfitter::GetPseudoProperParameters(TArrayD &xPar, Int_t type)
233 // Getter of the psudoproper background distribution parameters per dielectron type (FF, FS, SS)
237 xPar.AddAt(fFCN->GetNormGaus1ResFunc(type),0);
238 xPar.AddAt(fFCN->GetNormGaus2ResFunc(type),3);
239 xPar.AddAt(fFCN->GetResMean1(type),1);
240 xPar.AddAt(fFCN->GetResSigma1(type),2);
241 xPar.AddAt(fFCN->GetResMean2(type),4);
242 xPar.AddAt(fFCN->GetResSigma2(type),5);
243 xPar.AddAt(fFCN->GetResAlfa(type),6);
244 xPar.AddAt(fFCN->GetResLambda(type),7);
245 xPar.AddAt(fFCN->GetResNormExp(type),8);
247 //__________________________________________________________________________________________
248 TH1F * AliDielectronBtoJPSItoEleCDFfitFCNfitter::FitResolutionFunction(Double_t xMin, Double_t xMax, Int_t type, Double_t norm)
251 // Fit on the resolution function distribution per dielectron type
254 printf("no Pseudoproper decayhistogram...exiting\n");
259 GetPseudoProperParameters(pars,type);
261 TF1 * xPrompt = new TF1("xPrompt",this,&AliDielectronBtoJPSItoEleCDFfitFCNfitter::CDFResolutionFunction,xMin,xMax,11);
262 for(Int_t i=0; i<kPseudo ; i++) {
263 if(fParameterXToFix[i]) xPrompt->FixParameter(i,pars.At(i));
264 else xPrompt->SetParameter(i,pars.At(i));
265 printf("%f ",pars.At(i));
268 if(!fParameterXToFix[3]) xPrompt->SetParLimits(3,0,999999999);
269 xPrompt->FixParameter(9,type);
270 xPrompt->SetParameter(10,norm);
271 fX->Fit("xPrompt",Form("R%s",fFitOpt.Data()),"",xMin,xMax);
273 // printf("Res Func type %i : ",type);
274 // for(Int_t i=0; i< 11; i++) printf("p%i %6.3f ",i,xPrompt->GetParameter(i));
279 //__________________________________________________________________________________________
280 TH2F * AliDielectronBtoJPSItoEleCDFfitFCNfitter::FitBkgPsudoProper(Double_t xMin, Double_t xMax, Double_t norm)
283 // Fit on the resolution function distribution of the background ( in 2 D, whose one D is the dielectron
288 printf("no BKG Pseudoproper decay 2D histogram ...exiting\n");
293 GetPseudoProperBkgParameters(bkgParam);
295 TF2 *psProperBkgnd = new TF2("bkgPseudoProper",this,
296 &AliDielectronBtoJPSItoEleCDFfitFCNfitter::PsProperBackFitFunc,xMin,xMax,-0.5,2.5,8,"AliDielectronBtoJPSItoEleCDFfitFCNfitter","PsProperBackFitFunc");
298 for(Int_t i=0; i< kPseudoBkg ; i++) {
299 if(fParameterXbkgToFix[i]) psProperBkgnd->FixParameter(i,bkgParam.At(i));
300 else psProperBkgnd->SetParameter(i,bkgParam.At(i));
302 psProperBkgnd->SetParameter(kPseudoBkg,norm);
304 fX2D->Fit("bkgPseudoProper",Form("R%s",fFitOpt.Data()),"LEGO2",xMin,xMax);
309 //__________________________________________________________________________________________
310 Double_t AliDielectronBtoJPSItoEleCDFfitFCNfitter::CDFInvMassSignal(const Double_t *x,const Double_t *par)
315 SetInvMassSignalParameters(par);
316 return par[5]*fFCN->EvaluateCDFInvMassSigDistr(x[0]);
318 //__________________________________________________________________________________________
319 Double_t AliDielectronBtoJPSItoEleCDFfitFCNfitter::CDFInvMassBkg(const Double_t *x,const Double_t *par)
324 SetInvMassBkgParameters(par);
325 return fFCN->EvaluateCDFInvMassBkgDistr(x[0]);
327 //__________________________________________________________________________________________
328 Double_t AliDielectronBtoJPSItoEleCDFfitFCNfitter::CDFInvMassTotal(const Double_t *x,const Double_t *par)
331 // function (it doesn't use the function integral->pay attention to it)
333 SetInvMassParameters(par);
334 //return ((EvaluateCDFInvMassSigDistr(x[0])))*par[9] + (EvaluateCDFInvMassBkgDistr(x[0]))*par[10];
335 return (((fFCN->EvaluateCDFInvMassSigDistr(x[0])))*par[9] + (1-par[9])*(fFCN->EvaluateCDFInvMassBkgDistr(x[0])))*par[10];
337 //__________________________________________________________________________________________
338 Double_t AliDielectronBtoJPSItoEleCDFfitFCNfitter::CDFResolutionFunction(const Double_t *x,const Double_t *par)
343 // Double_t resParam[kPseudo];
344 // for(Int_t i=0; i<kPseudo; i++) {
345 // resParam[i] = par[i];
347 fFCN->SetResolutionConstants(par,(Int_t)par[9]);
348 return par[10]*fFCN->ResolutionFunc(x[0],-1.,(Int_t)(par[9]));
350 //__________________________________________________________________________________________
351 Double_t AliDielectronBtoJPSItoEleCDFfitFCNfitter::PsProperBackFitFunc(const Double_t* x, const Double_t* par)
356 Int_t type = TMath::Nint(x[1]);
358 for(Int_t i=0; i<7; i++) params[i]=par[i];
359 SetPseudoProperBkgParameters(params);
360 return fFCN->EvaluateCDFDecayTimeBkgDistr(x[0],type)*par[7]*fFCN->GetResWeight(type);