]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/FLOW/blastwave/AliBlastwaveFit2D.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGCF / FLOW / blastwave / AliBlastwaveFit2D.cxx
CommitLineData
3416bb60 1#include<stdio.h>
2
3#include"AliBlastwaveFit2D.h"
4
5#include"TMath.h"
6#include"TH1.h"
7#include"TGraphErrors.h"
8
9ClassImp(AliBlastwaveFit2D);
10
11
12TF2 *AliBlastwaveFit2D::fgFuncIntYield = NULL;
13TF2 *AliBlastwaveFit2D::fgFuncIntV2 = NULL;
b4912369 14const char *AliBlastwaveFit2D::fgParName[7] = {"T_{FO}","s_{2}","mean #rho_{0}","#rho_{2}","#gamma","mass","norm"};
15Float_t AliBlastwaveFit2D::fgStartValues[5] = {0.1,0.057,1.2,0.025,1.1};
16const Float_t AliBlastwaveFit2D::fgStepValues[5] = {0.001,0.001,0.001,0.001,0.001};
17const Float_t AliBlastwaveFit2D::fgMinValues[5] = {0.0001,-0.45,0.01,-0.45,0.1};
18const Float_t AliBlastwaveFit2D::fgMaxValues[5] = {1.0,0.45,10.0,0.45,5};
3416bb60 19
20AliBlastwaveFit2D::AliBlastwaveFit2D(const char *name,Double_t mass) :
21 AliBlastwaveFit(name,mass)
22{
23 if(!fgFuncIntYield){
24 fgFuncIntYield = new TF2("fFuncInt2Yield",AliBlastwaveFit2D::FunctionIntYield,0,2*TMath::Pi(),0,1,7);
25 fgFuncIntYield->SetNpx(100);
26 fgFuncIntYield->SetNpy(100);
27 }
28 if(!fgFuncIntV2){
29 fgFuncIntV2 = new TF2("fFuncInt2V2",AliBlastwaveFit2D::FunctionIntV2,0,2*TMath::Pi(),0,1,7);
30 fgFuncIntV2->SetNpx(100);
31 fgFuncIntV2->SetNpy(100);
32 }
33
34 Initialize();
35}
36//------------------------------------------------------------------------------
37AliBlastwaveFit2D::AliBlastwaveFit2D() :
38 AliBlastwaveFit()
39{
40 if(!fgFuncIntYield){
41 fgFuncIntYield = new TF2("fFuncInt2Yield",AliBlastwaveFit2D::FunctionIntYield,0,2*TMath::Pi(),0,1,7);
42 fgFuncIntYield->SetNpx(100);
43 fgFuncIntYield->SetNpy(100);
44 }
45 if(!fgFuncIntV2){
46 fgFuncIntV2 = new TF2("fFuncInt2V2",AliBlastwaveFit2D::FunctionIntV2,0,2*TMath::Pi(),0,1,7);
47 fgFuncIntV2->SetNpx(100);
48 fgFuncIntV2->SetNpy(100);
49 }
50 Initialize();
51}
52//------------------------------------------------------------------------------
53AliBlastwaveFit2D::~AliBlastwaveFit2D(){
54}
55//------------------------------------------------------------------------------
56Double_t AliBlastwaveFit2D::FunctionIntYield(Double_t x[],Double_t par[]){
57 // x[0] = phi
58 // x[1] = r/R
59 // par[0] = pt
60 // par[1] = T
61 // par[2] = s2
62 // par[3] = rh0_0
63 // par[4] = rho_a
64 // par[5] = R_power
65 // par[6] = mass
66
67 Double_t mt = TMath::Sqrt(par[0]*par[0]+par[6]*par[6]);
68 Double_t rho = (par[3]+par[4]*TMath::Cos(2*x[0]))*TMath::Power(x[1],par[5]);
69 Double_t alfat = (par[0]/par[1])*TMath::SinH(rho);
70 Double_t betat = (mt/par[1])*TMath::CosH(rho);
71 Double_t results;
72 if(betat < 200) results = TMath::BesselI(0,alfat)*TMath::BesselK(1,betat)*(1+2*par[2]*TMath::Cos(2*x[0])) *x[1];
73 else results = 0.5*TMath::Exp(alfat-betat)/sqrt(alfat*betat)*(1+2*par[2]*TMath::Cos(2*x[0])) *x[1];
74
75 return results*par[0]*mt;
76}
77//------------------------------------------------------------------------------
78Double_t AliBlastwaveFit2D::FunctionIntV2(Double_t x[],Double_t par[]){
79 // x[0] = phi
80 // x[1] = r/R
81 // par[0] = pt
82 // par[1] = T_fo
83 // par[2] = s2
84 // par[3] = rh0_0
85 // par[4] = rho_a
86 // par[5] = R_power
87 // par[6] = mass
88
89 Double_t mt = TMath::Sqrt(par[0]*par[0]+par[6]*par[6]);
90 Double_t rho = (par[3]+par[4]*TMath::Cos(2*x[0]))*TMath::Power(x[1],par[5]);
91 Double_t alfat = (par[0]/par[1])*TMath::SinH(rho);
92 Double_t betat = (mt/par[1])*TMath::CosH(rho);
93 Double_t results;
94 if(betat < 200) results = TMath::Cos(2*x[0])*TMath::BesselI(2,alfat)*TMath::BesselK(1,betat)*(1+2*par[2]*TMath::Cos(2*x[0])) *x[1];
95 else results = TMath::Cos(2*x[0])*0.5*TMath::Exp(alfat-betat)/sqrt(alfat*betat)*(1+2*par[2]*TMath::Cos(2*x[0])) *x[1];
96
97 return results*par[0]*mt;
98}
99//------------------------------------------------------------------------------
100Int_t AliBlastwaveFit2D::SetParameter(Int_t ipar,Double_t val){
101 Bool_t status = kTRUE;
102
103 if(ipar < 0 || ipar > 4) return status;
104
105 if(fFunctionYield){
106 fFunctionYield->SetParameter(ipar,val);
107 status = kFALSE;
108 }
109 if(fFunctionV2){
110 fFunctionV2->SetParameter(ipar,val);
111 status = kFALSE;
112 }
113 return status;
114}
115//------------------------------------------------------------------------------
116Int_t AliBlastwaveFit2D::SetNormalization(){
117 Bool_t status = kTRUE;
118
119 TH1 *h = (TH1 *) GetSpectrumObjCopy();
120 if(fFunctionYield && h){
121 fFunctionYield->SetParameter(6,1.0);
122 Double_t intH=0;
123 Double_t intF=0;
124 for (Int_t ibin = 1; ibin <= h->GetNbinsX(); ibin++) {
125 Double_t pt = h->GetBinCenter(ibin);
126 if(pt < GetMaxPt() && pt > GetMinPt() && TMath::Abs(h->GetBinContent(ibin)) > h->GetBinError(ibin)+0.0001){
127 Double_t width = h->GetBinWidth(ibin);
128 intH += h->GetBinContent(ibin)*width;
129 intF += EvalYield(pt)*width;
130// for(Double_t x = -width*0.45;x < width*0.5;x+=width*0.1)
131// intF += EvalYield(pt+x)*width*0.1;
132 }
133 }
134
135 Double_t norm = 1;
136 if(intF > 0) norm = intH/intF;
137 fFunctionYield->SetParameter(6,norm);
138 status = kFALSE;
139 }
140 return status;
141}
142//------------------------------------------------------------------------------
143void AliBlastwaveFit2D::SetMass(Double_t mass) {
144 fMass=mass;
145 if(fFunctionV2) fFunctionV2->SetParameter(5,fMass);
146 if(fFunctionYield) fFunctionYield->SetParameter(5,fMass);
147}
148//------------------------------------------------------------------------------
149void AliBlastwaveFit2D::Initialize(){
150 char nameFuncYield[100];
151 char nameFuncV2[100];
152 snprintf(nameFuncYield,100,"%sFuncYield",GetName());
153 snprintf(nameFuncV2,100,"%sFuncV2",GetName());
154
155 if(fFunctionV2) delete fFunctionV2;
156 if(fFunctionYield) delete fFunctionYield;
157 fFunctionV2 = new TF1(nameFuncV2,V2,0,6,6);
158 fFunctionV2->SetParameter(5,fMass);
159 fFunctionYield = new TF1(nameFuncYield,Pt,0,6,7);
160 fFunctionYield->SetParameter(5,fMass);
161 fFunctionV2->SetNpx(200);
162 fFunctionYield->SetNpx(200);
163
164 for(Int_t i =0;i < 6;i++) fFunctionV2->SetParName(i,fgParName[i]);
165 for(Int_t i =0;i < 7;i++) fFunctionYield->SetParName(i,fgParName[i]);
166}
167//------------------------------------------------------------------------------
168Double_t AliBlastwaveFit2D::V2(Double_t x[],Double_t par[]){
169 // par[0] = T_fo
170 // par[1] = s2
171 // par[2] = rh0_mean
172 // par[3] = rho_v2
173 // par[4] = R_power
174 // par[5] = mass
175 Double_t maxRho = par[2]*0.5*(par[4]+2)/(1+2*par[1]*par[3]);
176
177 fgFuncIntYield->SetParameter(0,x[0]);
178 fgFuncIntYield->SetParameter(1,par[0]);
179 fgFuncIntYield->SetParameter(2,par[1]);
180 fgFuncIntYield->SetParameter(3,maxRho);
181 fgFuncIntYield->SetParameter(4,par[3]*maxRho*2);
182 fgFuncIntYield->SetParameter(5,par[4]);
183 fgFuncIntYield->SetParameter(6,par[5]);
184
185 fgFuncIntV2->SetParameter(0,x[0]);
186 fgFuncIntV2->SetParameter(1,par[0]);
187 fgFuncIntV2->SetParameter(2,par[1]);
188 fgFuncIntV2->SetParameter(3,maxRho);
189 fgFuncIntV2->SetParameter(4,par[3]*maxRho*2);
190 fgFuncIntV2->SetParameter(5,par[4]);
191 fgFuncIntV2->SetParameter(6,par[5]);
192
193 Double_t res = fgFuncIntV2->Integral(0.,2*TMath::Pi(),0.,1.);
194 Double_t den = fgFuncIntYield->Integral(0.,2*TMath::Pi(),0.,1.);
195
196 if(den == 0) return 0.0;
197
198 return res/den;
199}
200//------------------------------------------------------------------------------
201Double_t AliBlastwaveFit2D::Pt(Double_t x[],Double_t par[]){
202 // par[0] = T_fo
203 // par[1] = s2
204 // par[2] = rh0_mean
205 // par[3] = rho_v2
206 // par[4] = R_power
207 // par[5] = mass
208
209 Double_t maxRho = par[2]*0.5*(par[4]+2)/(1+2*par[1]*par[3]);
210
211 fgFuncIntYield->SetParameter(0,x[0]);
212 fgFuncIntYield->SetParameter(1,par[0]);
213 fgFuncIntYield->SetParameter(2,par[1]);
214 fgFuncIntYield->SetParameter(3,maxRho);
215 fgFuncIntYield->SetParameter(4,par[3]*maxRho*2);
216 fgFuncIntYield->SetParameter(5,par[4]);
217 fgFuncIntYield->SetParameter(6,par[5]);
218
219 fgFuncIntV2->SetParameter(0,x[0]);
220 fgFuncIntV2->SetParameter(1,par[0]);
221 fgFuncIntV2->SetParameter(2,par[1]);
222 fgFuncIntV2->SetParameter(3,maxRho);
223 fgFuncIntV2->SetParameter(4,par[3]*maxRho*2);
224 fgFuncIntV2->SetParameter(5,par[4]);
225 fgFuncIntV2->SetParameter(6,par[5]);
226
227 Double_t res = par[6]*1E+5*fgFuncIntYield->Integral(0.,2*TMath::Pi(),0.,1.);
228
229 return res;
230}
231//------------------------------------------------------------------------------
e931d3ab 232Float_t AliBlastwaveFit2D::GetMeanBeta(){
3416bb60 233
234 TF2 fbeta("fbeta","TMath::TanH(([0]+[1]*TMath::Cos(2*x))*TMath::Power(y,[2]))*y*(1+2*[3]*cos(2*x))",0,2*TMath::Pi(),0,1);
235 fbeta.SetNpx(1000);
236 fbeta.SetNpy(1000);
237
238 fbeta.SetParameter(0,fgFuncIntYield->GetParameter(3));
239 fbeta.SetParameter(1,fgFuncIntYield->GetParameter(4));
240 fbeta.SetParameter(2,fgFuncIntYield->GetParameter(5));
241 fbeta.SetParameter(3,fgFuncIntYield->GetParameter(2));
242
243 return fbeta.Integral(0.,2*TMath::Pi(),0.,1.)/TMath::Pi();
244}
245//------------------------------------------------------------------------------
e931d3ab 246Float_t AliBlastwaveFit2D::GetMeanBeta(Double_t par[]){
3416bb60 247 // par[0] = T_fo
248 // par[1] = s2
249 // par[2] = rh0_mean
250 // par[3] = rho_v2
251 // par[4] = R_power
252 // par[5] = mass
253
254 Double_t maxRho = par[2]*0.5*(par[4]+2)/(1+2*par[1]*par[3]);
255
256 TF2 fbeta("fbeta","TMath::TanH(([0]+[1]*TMath::Cos(2*x))*TMath::Power(y,[2]))*y*(1+2*[3]*cos(2*x))",0,2*TMath::Pi(),0,1);
257 fbeta.SetNpx(1000);
258 fbeta.SetNpy(1000);
259
260 fbeta.SetParameter(0,maxRho);
261 fbeta.SetParameter(1,2*par[3]*maxRho);
262 fbeta.SetParameter(2,par[4]);
263 fbeta.SetParameter(3,par[1]);
264
265 return fbeta.Integral(0.,2*TMath::Pi(),0.,1.)/TMath::Pi();
266}
267//------------------------------------------------------------------------------
268void AliBlastwaveFit2D::SwitchOffFlow(TMinuit *m) const{
269 m->FixParameter(kParS2);
270 m->FixParameter(kParRho2);
271
272 printf("AliBlastwaveFit2D: No flow histos -> Flow parameters put to zero\n");
273}