]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/FEMTOSCOPY/macros/Fit_c3.C
Provide setters for Normalization points
[u/mrichter/AliRoot.git] / PWGCF / FEMTOSCOPY / macros / Fit_c3.C
CommitLineData
cbf4f1cb 1#include <math.h>
2#include <time.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <Riostream.h>
6#include <assert.h>
7
8#include "TVector2.h"
9#include "TFile.h"
10#include "TString.h"
11#include "TF1.h"
12#include "TF3.h"
13#include "TH1.h"
14#include "TH2.h"
15#include "TH3.h"
16#include "TProfile.h"
17#include "TProfile2D.h"
18#include "TProfile3D.h"
19#include "TMath.h"
20#include "TText.h"
21#include "TRandom3.h"
22#include "TArray.h"
23#include "TLegend.h"
24#include "TStyle.h"
25#include "TMinuit.h"
26#include "TCanvas.h"
27#include "TLatex.h"
28#include "TPaveStats.h"
29#include "TASImage.h"
30#include "TGraph.h"
31#include "TSpline.h"
32#include "TVirtualFitter.h"
33
34#define BohrR 1963.6885 // Bohr Radius for pions
35#define FmToGeV 0.19733 // conversion to fm
36#define PI 3.1415926
37#define masspiC 0.1395702 // pi+ mass (GeV/c^2)
38
39using namespace std;
40
41//
42int CollisionType_def=1;// PbPb, pPb, pp
43int FitType=0;// (0)Edgeworth, (1)Laguerre, (2)Levy
44//
45int Mbin=0;// 0-9: centrality bin in widths of 5%
46int CHARGE=-1;// -1 or +1: + or - pions for same-charge case, --+ or -++, ---+ or -+++
47//
48int EDbin=0;// 0 or 1: Kt3 bin
49double G_def = 90.;// coherent %
50//
51bool MRC=1;// Momentum Resolution Corrections?
52bool MuonCorrection=1;// correct for Muons?
53//
54int f_choice=0;// 0(Core/Halo), 1(40fm), 2(70fm), 3(100fm)
55//
56//
57//
58//
59bool SaveToFile_def=0;
60int fFSIindex=0;
61float TwoFrac;// Lambda parameter
62float OneFrac;// Lambda^{1/2}
63float ThreeFrac;// Lambda^{3/2}
64double Qcut_pp = 0.6;// 0.6
65double Qcut_PbPb = 0.1;
66double NormQcutLow_pp = 1.0;
67double NormQcutHigh_pp = 1.5;
68double NormQcutLow_PbPb = .15;
69double NormQcutHigh_PbPb = .2;// was .175
70
71
72const int BINRANGE_3=60;// q12,q13,q23
73int BINLIMIT_3;
74double A_3[BINRANGE_3][BINRANGE_3][BINRANGE_3];// q12,q13,q23
75double A_3_e[BINRANGE_3][BINRANGE_3][BINRANGE_3];// q12,q13,q23
76double B_3[BINRANGE_3][BINRANGE_3][BINRANGE_3];// q12,q13,q23
77double BinCenters[400];
78double Chi2_c3;
79double NFitPoints_c3;
80double Q3LimitLow;
81double Q3LimitHigh;
82void fcn_c3(int&, double*, double&, double[], int);
83
84int RbinMRC;
85
86TH1D *fFSIss[12];
87TH1D *fFSIos[12];
88
89void SetFSICorrelations();
90void SetFSIindex(Float_t);
91Float_t FSICorrelation(Int_t, Int_t, Float_t);
92void SetMuonCorrections();
93void SetMomResCorrections();
94double Gamov(int, double);
95
96//
97float fact(float);
98
99
100
101TH1D *MRC_SC_3[3];
102TH1D *C3muonCorrectionSC[2];
103
104double AvgQinvSS[30];
105double AvgQinvOS[30];
106double BinCentersQ4[20];
107
108
109
110void Fit_c3(bool SaveToFile=SaveToFile_def, int CollisionType=CollisionType_def, double G=G_def){
111
112 SaveToFile_def=SaveToFile;
113 CollisionType_def=CollisionType;
114 G /= 100.;
115 G_def=G;
116
117 TFile *_file0;
118 if(CollisionType==0){// PbPb
119 _file0 = new TFile("Results/PDC_11h_3Dhistos.root","READ");
120 }else if(CollisionType==1){// pPb
121 _file0 = new TFile("Results/PDC_13bc_kINT7.root","READ");
122 }else{// pp
123 _file0 = new TFile("Results/PDC_10bcde_kMB.root","READ");
124 }
125
126 TList *MyList;
127 TDirectoryFile *tdir = (TDirectoryFile*)_file0->Get("PWGCF.outputFourPionAnalysis.root");
128 MyList=(TList*)tdir->Get("FourPionOutput_1");
129 //MyList=(TList*)_file0->Get("MyList");
130
131 _file0->Close();
132
133
134 if(CollisionType==0) {Q3LimitLow = 0.02; Q3LimitHigh = 0.06;}// 0.01 and 0.08
135 else {Q3LimitLow = 0.08; Q3LimitHigh = 0.2;}// 0.01 and 0.25
136
137
138 //
139 TwoFrac=0.7;
140 OneFrac = sqrt(TwoFrac);
141 ThreeFrac = pow(TwoFrac, 1.5);
142
143 //// Core/Halo, 40fm, 70fm, 100fm
144 float ThermShift_f33[4]={0., 0.06933, 0.01637, 0.006326};
145 float ThermShift_f32[4]={0., -0.0185, -0.005301, -0.002286};
146 float ThermShift_f31[4]={0., -0.01382, -0.0004682, 0.0005337};
147 float f33prime = ThreeFrac;
148 float f32prime = TwoFrac*(1-OneFrac);
149 float f31prime = pow(1-OneFrac,3) + 3*OneFrac*pow(1-OneFrac,2);
150 f33prime += ThermShift_f33[f_choice];
151 f32prime += ThermShift_f32[f_choice];
152 f31prime += ThermShift_f31[f_choice];
153 float f33 = f33prime;
154 float f32 = f32prime/TwoFrac;
155 float f31 = f31prime - 3*((1-TwoFrac)*(1-OneFrac) + ThermShift_f32[f_choice]*(1-TwoFrac)/TwoFrac);
156 //cout<<f33 + 3*f32 + f31<<endl;
157
158
159 cout<<"Mbin = "<<Mbin<<" KT3 = "<<EDbin<<endl;
160
161 if(CollisionType==0){
162 if(Mbin==0) {RbinMRC=10;}
163 else if(Mbin==1) {RbinMRC=9;}
164 else if(Mbin<=3) {RbinMRC=8;}
165 else if(Mbin<=5) {RbinMRC=7;}
166 else {RbinMRC=6;}
167 }else{
168 RbinMRC=2;
169 }
170
171
172 if(CollisionType==0) BINLIMIT_3=20;
173 else BINLIMIT_3=30;
174
175 // bin centers from QS+FSI
176 double BinCenterPbPbCentral[40]={0.00206385, 0.00818515, 0.0129022, 0.0177584, 0.0226881, 0.027647, 0.032622, 0.0376015, 0.042588, 0.0475767, 0.0525692, 0.0575625, 0.0625569, 0.0675511, 0.0725471, 0.0775436, 0.0825399, 0.0875364, 0.0925339, 0.0975321, 0.102529, 0.107527, 0.112525, 0.117523, 0.122522, 0.12752, 0.132519, 0.137518, 0.142516, 0.147515, 0.152514, 0.157513, 0.162513, 0.167512, 0.172511, 0.177511, 0.18251, 0.187509, 0.192509, 0.197509};
177 double BinCenterpPbAndpp[40]={0.00359275, 0.016357, 0.0257109, 0.035445, 0.045297, 0.0552251, 0.0651888, 0.0751397, 0.0851088, 0.0951108, 0.105084, 0.115079, 0.12507, 0.135059, 0.145053, 0.155049, 0.16505, 0.175038, 0.185039, 0.195034, 0.205023, 0.215027, 0.225024, 0.235023, 0.245011, 0.255017, 0.265017, 0.275021, 0.285021, 0.295017, 0.305018, 0.315018, 0.325013, 0.335011, 0.345016, 0.355019, 0.365012, 0.375016, 0.385017, 0.395016};
178 if(CollisionType==0){
179 for(int i=0; i<40; i++) BinCenters[i] = BinCenterPbPbCentral[i];
180 }else{
181 for(int i=0; i<40; i++) BinCenters[i] = BinCenterpPbAndpp[i];
182 }
183
184 // extend BinCenters for high q
185 for(int index=40; index<400; index++){
186 if(CollisionType==0) BinCenters[index] = (index+0.5)*(0.005);
187 else BinCenters[index] = (index+0.5)*(0.010);
188 }
189 // Set 0's to 3-particle fit arrays
190 for(int i=1; i<=BINLIMIT_3; i++){// bin number
191 for(int j=1; j<=BINLIMIT_3; j++){// bin number
192 for(int k=1; k<=BINLIMIT_3; k++){// bin number
193 A_3[i-1][j-1][k-1]=0;
194 A_3_e[i-1][j-1][k-1]=0;
195 B_3[i-1][j-1][k-1]=0;
196 }
197 }
198 }
199
200
201 //
202 TH3D *ThreeParticle[2][2][2][5];// ch1,ch2,ch3,term
203 TProfile3D *K3avg[2][2][2][4];
204 double norm_3[5]={0};
205 //
206
207 gStyle->SetOptStat(0);
208 gStyle->SetOptDate(0);
209 gStyle->SetOptFit(0111);
210
211
212
213 SetFSIindex(10.);
214 SetFSICorrelations();
215 SetMomResCorrections();
216 SetMuonCorrections();
217 //
218 /////////////////////////////////////////////////////////
219
220
221
222 TH1D *Events = (TH1D*)MyList->FindObject("fEvents2");
223 //
224
225 cout<<"#Events = "<<Events->Integral(Mbin+1,Mbin+1)<<endl;
226
227
228
229 ///////////////////////////////////
230 // Get Histograms
231
232 for(int term=0; term<5; term++){
233
234 TString *name3 = new TString("ThreeParticle_Charge1_");
235 *name3 += 0;
236 name3->Append("_Charge2_");
237 *name3 += 0;
238 name3->Append("_Charge3_");
239 *name3 += 0;
240 name3->Append("_M_");
241 *name3 += Mbin;
242 name3->Append("_ED_");
243 *name3 += EDbin;
244 name3->Append("_Term_");
245 *name3 += term+1;
246
247 TString *nameNorm3=new TString(name3->Data());
248 nameNorm3->Append("_Norm");
249 //
250 TString *nameK3=new TString(name3->Data());
251 nameK3->Append("_Kfactor3D");
252 //
253 name3->Append("_3D");
254
255
256
257 norm_3[term] = ((TH1D*)MyList->FindObject(nameNorm3->Data()))->Integral();
258 ThreeParticle[0][0][0][term] = (TH3D*)MyList->FindObject(name3->Data());
259 ThreeParticle[0][0][0][term]->Sumw2();
260 //if(0==0 && 0==0) cout<<"3-pion norms "<<norm_3[term]<<endl;
261 ThreeParticle[0][0][0][term]->Scale(norm_3[0]/norm_3[term]);
262 ThreeParticle[0][0][0][term]->SetMarkerStyle(20);
263 ThreeParticle[0][0][0][term]->SetTitle("");
264 //
265
266 //
267 if(term<4){
268 K3avg[0][0][0][term] = (TProfile3D*)MyList->FindObject(nameK3->Data());
269 }
270
271 //
272 }// term
273
274
275
276
277 cout<<"Done getting Histograms"<<endl;
278
279 TF1 *Unity=new TF1("Unity","1",0,100);
280 Unity->SetLineStyle(2);
281
282
283 int ch1=0,ch2=0,ch3=0;
284
285
286
287 ///////////////////////////////////////////////////////////
288 // 3-pion
289 cout<<"3-pion section"<<endl;
290
291 TCanvas *can2 = new TCanvas("can2", "can2",600,53,700,500);
292 can2->SetHighLightColor(2);
293 can2->Range(-0.7838115,-1.033258,0.7838115,1.033258);
294 gStyle->SetOptFit(0111);
295 can2->SetFillColor(10);
296 can2->SetBorderMode(0);
297 can2->SetBorderSize(2);
298 can2->SetGridx();
299 can2->SetGridy();
300 can2->SetFrameFillColor(0);
301 can2->SetFrameBorderMode(0);
302 can2->SetFrameBorderMode(0);
303 gPad->SetRightMargin(0.02); gPad->SetTopMargin(0.02);
304
305 int Q3BINS=12;
306 float Q3HistoLimit=0.12;
307 if(CollisionType!=0){ Q3BINS=60; Q3HistoLimit=0.6;}
308
309 TH1D *c3_hist = new TH1D("c3_hist","",Q3BINS,0,Q3HistoLimit);
310 TH1D *Combinatorics_1d = new TH1D("Combinatorics_1d","",Q3BINS,0,Q3HistoLimit);
311 TH1D *GenSignalExpected_num=new TH1D("GenSignalExpected_num","",Q3BINS,0,Q3HistoLimit);
312 TH1D *GenSignalExpected_den=new TH1D("GenSignalExpected_den","",Q3BINS,0,Q3HistoLimit);
313 double c3_e[100]={0};
314
315
316 double value_num;
317 double value_num_e;
318 double N3_QS;
319 double N3_QS_e;
320
321 for(int i=2; i<=ThreeParticle[0][0][0][0]->GetNbinsX(); i++){// bin number
322 double Q12 = BinCenters[i-1];// true center
323 //int Q12bin = int(Q12/0.01)+1;
324 //
325 for(int j=2; j<=ThreeParticle[0][0][0][0]->GetNbinsY(); j++){// bin number
326 double Q13 = BinCenters[j-1];// true center
327 //int Q13bin = int(Q13/0.01)+1;
328 //
329 for(int k=2; k<=ThreeParticle[0][0][0][0]->GetNbinsZ(); k++){// bin number
330 double Q23 = BinCenters[k-1];// true center
331 //int Q23bin = int(Q23/0.01)+1;
332 //
333
334 if(Q12 < sqrt(pow(Q13,2)+pow(Q23,2) - 2*Q13*Q23)) continue;// not all configurations are possible
335 if(Q12 > sqrt(pow(Q13,2)+pow(Q23,2) + 2*Q13*Q23)) continue;// not all configurations are possible
336
337 double Q3 = sqrt(pow(Q12,2) + pow(Q13,2) + pow(Q23,2));
338 int Q3bin = c3_hist->GetXaxis()->FindBin(Q3);
339
340 //
341 double K3 = K3avg[0][0][0][0]->GetBinContent(i,j,k);
342 double K2_12 = K3avg[0][0][0][1]->GetBinContent(i,j,k);
343 double K2_13 = K3avg[0][0][0][2]->GetBinContent(i,j,k);
344 double K2_23 = K3avg[0][0][0][3]->GetBinContent(i,j,k);
345
346
347 if(K3==0) continue;
348
349 double TERM1=ThreeParticle[ch1][ch2][ch3][0]->GetBinContent(i,j,k);// N3 (3-pion yield per q12,q13,q23 cell). 3-pions from same-event
350 double TERM2=ThreeParticle[ch1][ch2][ch3][1]->GetBinContent(i,j,k);// N2*N1. 1 and 2 from same-event
351 double TERM3=ThreeParticle[ch1][ch2][ch3][2]->GetBinContent(i,j,k);// N2*N1. 1 and 3 from same-event
352 double TERM4=ThreeParticle[ch1][ch2][ch3][3]->GetBinContent(i,j,k);// N2*N1. 2 and 3 from same-event
353 double TERM5=ThreeParticle[ch1][ch2][ch3][4]->GetBinContent(i,j,k);// N1*N1*N1. All from different events (pure combinatorics)
354
355
356 if(TERM1==0 && TERM2==0 && TERM3==0 && TERM4==0 && TERM5==0) continue;
357 if(TERM1==0 || TERM2==0 || TERM3==0 || TERM4==0 || TERM5==0) continue;
358
359 //
360 if(MRC){
361 TERM1 *= MRC_SC_3[0]->GetBinContent(MRC_SC_3[0]->GetXaxis()->FindBin(Q3));
362 TERM2 *= MRC_SC_3[1]->GetBinContent(MRC_SC_3[1]->GetXaxis()->FindBin(Q3));
363 TERM3 *= MRC_SC_3[1]->GetBinContent(MRC_SC_3[1]->GetXaxis()->FindBin(Q3));
364 TERM4 *= MRC_SC_3[1]->GetBinContent(MRC_SC_3[1]->GetXaxis()->FindBin(Q3));
365 TERM5 *= MRC_SC_3[2]->GetBinContent(MRC_SC_3[2]->GetXaxis()->FindBin(Q3));
366 }
367 double MuonCorr1=1, MuonCorr2=1, MuonCorr3=1, MuonCorr4=1;
368 if(MuonCorrection){
369 MuonCorr1 = C3muonCorrectionSC[0]->GetBinContent(C3muonCorrectionSC[0]->GetXaxis()->FindBin(Q3));
370 MuonCorr2 = C3muonCorrectionSC[1]->GetBinContent(C3muonCorrectionSC[0]->GetXaxis()->FindBin(Q3));
371 MuonCorr3 = MuonCorr2;
372 MuonCorr4 = MuonCorr2;
373 }
374
375
376
377 // Purify. Isolate pure 3-pion QS correlations using Lambda and K3 (removes lower order correlations)
378 N3_QS = TERM1;
379 N3_QS -= ( pow(1-OneFrac,3) + 3*OneFrac*pow(1-OneFrac,2) )*TERM5;
380 N3_QS -= (1-OneFrac)*(TERM2 + TERM3 + TERM4 - 3*(1-TwoFrac)*TERM5);
381 N3_QS /= ThreeFrac;
382 N3_QS *= K3;
383 N3_QS *= MuonCorr1;
384
385
386 // Isolate 3-pion cumulant
387 value_num = N3_QS;
388 value_num -= (TERM2 - (1-TwoFrac)*TERM5)*K2_12/TwoFrac * MuonCorr2;
389 value_num -= (TERM3 - (1-TwoFrac)*TERM5)*K2_13/TwoFrac * MuonCorr3;
390 value_num -= (TERM4 - (1-TwoFrac)*TERM5)*K2_23/TwoFrac * MuonCorr4;
391 value_num += 2*TERM5;
392
393
394
395
396 // errors
397 N3_QS_e = TERM1;
398 N3_QS_e += pow(( pow(1-OneFrac,3) +3*OneFrac*pow(1-OneFrac,2) )*sqrt(TERM5),2);
399 N3_QS_e += (pow((1-OneFrac),2)*(TERM2 + TERM3 + TERM4) + pow((1-OneFrac)*3*(1-TwoFrac)*sqrt(TERM5),2));
400 N3_QS_e /= pow(ThreeFrac,2);
401 N3_QS_e *= pow(K3,2);
402 //
403 value_num_e = N3_QS_e;
404 value_num_e += (pow(K2_12/TwoFrac*sqrt(TERM2),2) + pow((1-TwoFrac)*K2_12/TwoFrac*sqrt(TERM5),2));
405 value_num_e += (pow(K2_13/TwoFrac*sqrt(TERM3),2) + pow((1-TwoFrac)*K2_13/TwoFrac*sqrt(TERM5),2));
406 value_num_e += (pow(K2_23/TwoFrac*sqrt(TERM4),2) + pow((1-TwoFrac)*K2_23/TwoFrac*sqrt(TERM5),2));
407 value_num_e += pow(2*sqrt(TERM5),2);
408
409 c3_e[Q3bin-1] += value_num_e + TERM5;// add baseline stat error
410
411
412 // Fill histograms
413 c3_hist->Fill(Q3, value_num + TERM5);// for cumulant correlation function
414 Combinatorics_1d->Fill(Q3, TERM5);
415
416 //
417 A_3[i-1][j-1][k-1] = value_num + TERM5;
418 B_3[i-1][j-1][k-1] = TERM5;
419 A_3_e[i-1][j-1][k-1] = sqrt(value_num_e + TERM5);
420 //if(i==j && i==k && i==4) cout<<A_3[i-1][j-1][k-1]<<" "<<B_3[i-1][j-1][k-1]<<" "<<A_3_e[i-1][j-1][k-1]<<endl;
421 ///////////////////////////////////////////////////////////
422
423 }
424 }
425 }
426
427
428
429 ////////////////////////////
430
431 // Intermediate steps
432 for(int i=0; i<Q3BINS; i++) {c3_hist->SetBinError(i+1, sqrt(c3_e[i]));}
433
434 c3_hist->Divide(Combinatorics_1d);
435
436 ///////////////////////////////////////////////////////////////////////////////////////////////////
437
438
439
440 c3_hist->GetXaxis()->SetTitle("#font[12]{Q}_{3} (GeV/#font[12]{c})");
441 c3_hist->GetYaxis()->SetTitle("#font[12]{#bf{c}}_{3}");
442 c3_hist->GetYaxis()->SetTitleSize(0.045); c3_hist->GetXaxis()->SetTitleSize(0.045);
443 c3_hist->GetYaxis()->SetTitleOffset(1.1);
444 c3_hist->GetXaxis()->SetRangeUser(0,Q3LimitHigh);
445 c3_hist->GetYaxis()->SetRangeUser(0.9,4);
446 c3_hist->SetMarkerStyle(25);
447 c3_hist->SetMarkerColor(2);
448 c3_hist->SetLineColor(2);
449 c3_hist->SetMaximum(3);
450 c3_hist->SetMinimum(.7);
451 c3_hist->Draw();
452 //legend2->AddEntry(c3_hist,"#font[12]{#bf{c}}_{3} (cumulant correlation)","p");
453
454
455
456 const int npar_c3=7;
457 TMinuit MyMinuit_c3(npar_c3);
458 MyMinuit_c3.SetFCN(fcn_c3);
459 int ierflg_c3=0;
460 double arglist_c3 = 0;
461 MyMinuit_c3.mnexcm("SET NOWarnings",&arglist_c3,1, ierflg_c3);
462 arglist_c3 = -1;
463 MyMinuit_c3.mnexcm("SET PRint",&arglist_c3,1, ierflg_c3);
464 //arglist_c3=2;// improve Minimization Strategy (1 is default)
465 //MyMinuit_c3.mnexcm("SET STR",&arglist_c3,1,ierflg_c3);
466 //arglist_c3 = 0;
467 //MyMinuit_c3.mnexcm("SCAN", &arglist_c3,1,ierflg_c3);
468 arglist_c3 = 5000;
469 MyMinuit_c3.mnexcm("MIGRAD", &arglist_c3 ,1,ierflg_c3);
470
471
472 TF1 *c3Fit1D_Expan;
473 if(FitType==0) {
474 c3Fit1D_Expan=new TF1("c3Fit1D_Expan","[0]*(1+[1]*exp(-pow([2]*x/0.19733,2)/2.) * pow(1 + ([3]/(6.*pow(2.,1.5))*(8.*pow([2]*x/sqrt(3.)/0.19733,3) - 12.*pow([2]*x/sqrt(3.)/0.19733,1))) + ([4]/(24.*pow(2.,2))*(16.*pow([2]*x/sqrt(3.)/0.19733,4) -48.*pow([2]*x/sqrt(3.)/0.19733,2) + 12)) + [5]/(120.*pow(2.,2.5))*(32.*pow(x/sqrt(3.)*[2]/0.19733,5) - 160.*pow(x/sqrt(3.)*[2]/0.19733,3) + 120*x/sqrt(3.)*[2]/0.19733) ,3))",0,1);
475 }else if(FitType==1){
476 c3Fit1D_Expan=new TF1("c3Fit1D_Expan","[0]*(1+[1]*exp(-[2]*x/0.19733 * sqrt(3.)/2.) * pow(1 + [3]*([2]*x/sqrt(3.)/0.19733 - 1) + [4]/2*(pow([2]*x/sqrt(3.)/0.19733,2) - 4*[2]*x/sqrt(3.)/0.19733 + 2) + [5]/6.*(-pow(x/sqrt(3.)*[1]/0.19733,3) + 9*pow(x/sqrt(3.)*[1]/0.19733,2) - 18*x/sqrt(3.)*[1]/0.19733 + 6),3))",0,1);
477 }else{
478 c3Fit1D_Expan=new TF1("c3Fit1D_Expan","[0]*(1+[1]*exp(-pow([2]*x/0.19733, [3])))",0,1);
479 }
480
481
482 double OutputPar_c3[npar_c3]={0};
483 double OutputPar_c3_e[npar_c3]={0};
484
485 double par_c3[npar_c3]; // the start values
486 double stepSize_c3[npar_c3]; // step sizes
487 double minVal_c3[npar_c3]; // minimum bound on parameter
488 double maxVal_c3[npar_c3]; // maximum bound on parameter
489 string parName_c3[npar_c3];
490 // 1.0 1.5 10. 0. 0. 0. 1.5
491 par_c3[0] = 1.0; par_c3[1] = 1.5; par_c3[2] = 10.; par_c3[3] = 0.; par_c3[4] = 0.; par_c3[5] = 0; par_c3[6] = 1.5;
492 stepSize_c3[0] = 0.01; stepSize_c3[1] = 0.1; stepSize_c3[2] = 0.1; stepSize_c3[3] = 0.01; stepSize_c3[4] = 0.01; stepSize_c3[5] = 0.01; stepSize_c3[6] = 0.1;
493 minVal_c3[0] = 0.8; minVal_c3[1] = 0.4; minVal_c3[2] = 4.; minVal_c3[3] = -2; minVal_c3[4] = -1; minVal_c3[5] = -1; minVal_c3[6] = 0.5;
494 maxVal_c3[0] = 1.1; maxVal_c3[1] = 2000.; maxVal_c3[2] = 100.; maxVal_c3[3] = +2; maxVal_c3[4] = +1; maxVal_c3[5] = +1; maxVal_c3[6] = 2.5;
495 parName_c3[0] = "N"; parName_c3[1] = "#lambda_{3}"; parName_c3[2] = "R_{inv}"; parName_c3[3] = "coeff_{3}"; parName_c3[4] = "coeff_{4}"; parName_c3[5] = "coeff_{5}"; parName_c3[6] = "#alpha";
496
497 if(CollisionType==0){
498 if(FitType!=0) {
499 par_c3[2]=15.; minVal_c3[2] = 8.;
500 }
501 }else{
502 if(FitType==0) {par_c3[2] = 2.0; minVal_c3[2] = 1.0;}
503 else {
504 par_c3[1] = 4.0; minVal_c3[1] = 1.0;
505 //
506 par_c3[2] = 1.3; minVal_c3[2] = .9; maxVal_c3[2] = 10.;
507 }
508 }
509
510 if(FitType==0) {par_c3[6] = 2.;}
511 if(FitType==1) {par_c3[6] = 1.;}
512 if(FitType==2) {par_c3[3] = 0; par_c3[4] = 0; par_c3[5] = 0;}
513
514 if(FitType==2) {maxVal_c3[1] = 10.;}
515
516 for (int i=0; i<npar_c3; i++){
517 MyMinuit_c3.DefineParameter(i, parName_c3[i].c_str(), par_c3[i], stepSize_c3[i], minVal_c3[i], maxVal_c3[i]);
518 }
519 if(FitType==0 || FitType==1) { MyMinuit_c3.FixParameter(6);}
520 if(FitType==2){
521 MyMinuit_c3.FixParameter(3);
522 MyMinuit_c3.FixParameter(4);
523 MyMinuit_c3.FixParameter(5);
524 }
525 MyMinuit_c3.FixParameter(0);
526 //MyMinuit_c3.FixParameter(1);
527 //MyMinuit_c3.FixParameter(2);
528 //MyMinuit_c3.FixParameter(3);
529 //MyMinuit_c3.FixParameter(4);
530 MyMinuit_c3.FixParameter(5);
531
532 /////////////////////////////////////////////////////////////
533 // Do the minimization!
534 cout<<"Start Three-d fit"<<endl;
535 MyMinuit_c3.Migrad();// Minuit's best minimization algorithm
536 cout<<"End Three-d fit"<<endl;
537 /////////////////////////////////////////////////////////////
538 MyMinuit_c3.mnexcm("SHOw PARameters", &arglist_c3, 1, ierflg_c3);
539 cout<<"c3 Fit: Chi2 = "<<Chi2_c3<<" NDF = "<<(NFitPoints_c3-MyMinuit_c3.GetNumFreePars())<<endl;
540 cout<<" Chi2/NDF = "<<Chi2_c3 / (NFitPoints_c3-MyMinuit_c3.GetNumFreePars())<<endl;
541
542 for(int i=0; i<npar_c3; i++){
543 MyMinuit_c3.GetParameter(i,OutputPar_c3[i],OutputPar_c3_e[i]);
544 }
545
546 cout<<"Tij Norm = "<<pow(OutputPar_c3[1]/2., 1/3.)<<endl;
547
548 if(FitType!=2){
549 c3Fit1D_Expan->FixParameter(0,OutputPar_c3[0]);
550 c3Fit1D_Expan->FixParameter(1,OutputPar_c3[1]);
551 c3Fit1D_Expan->FixParameter(2,OutputPar_c3[2]);
552 c3Fit1D_Expan->FixParameter(3,OutputPar_c3[3]);
553 c3Fit1D_Expan->FixParameter(4,OutputPar_c3[4]);
554 c3Fit1D_Expan->FixParameter(5,OutputPar_c3[5]);
555 }else{// Levy
556 c3Fit1D_Expan->FixParameter(0,OutputPar_c3[0]);
557 c3Fit1D_Expan->FixParameter(1,OutputPar_c3[1]);
558 c3Fit1D_Expan->FixParameter(2,OutputPar_c3[2]);
559 c3Fit1D_Expan->FixParameter(3,OutputPar_c3[6]);
560 }
561 c3Fit1D_Expan->SetLineStyle(1);
562 //c3Fit1D_Expan->Draw("same");
563
564
565 // project 3D EW fit onto 1D histogram
566 for(int i=2; i<=BINLIMIT_3; i++){// bin number
567 double Q12 = BinCenters[i-1];// true center
568 for(int j=2; j<=BINLIMIT_3; j++){// bin number
569 double Q13 = BinCenters[j-1];// true center
570 for(int k=2; k<=BINLIMIT_3; k++){// bin number
571 double Q23 = BinCenters[k-1];// true center
572 //
573 double Q3 = sqrt(pow(Q12,2) + pow(Q13,2) + pow(Q23,2));
574
575 if(Q12 < sqrt(pow(Q13,2)+pow(Q23,2) - 2*Q13*Q23)) continue;// not all configurations are possible
576 if(Q12 > sqrt(pow(Q13,2)+pow(Q23,2) + 2*Q13*Q23)) continue;// not all configurations are possible
577
578 double TERM5=ThreeParticle[ch1][ch2][ch3][4]->GetBinContent(i,j,k);// N1*N1*N1. All from different events (pure combinatorics)
579 if(TERM5==0) continue;
580
581
582 if(MRC) TERM5 *= MRC_SC_3[2]->GetBinContent(MRC_SC_3[2]->GetXaxis()->FindBin(Q3));
583 //
584 double radius = OutputPar_c3[2]/FmToGeV;
585 double arg12 = Q12*radius;
586 double arg13 = Q13*radius;
587 double arg23 = Q23*radius;
588 double Expan12=1, Expan13=1, Expan23=1;
589 if(FitType==0){
590 Expan12 += OutputPar_c3[3]/pow(2.,3/2.)/(6.)*(8*pow(arg12,3) - 12*pow(arg12,1));
591 Expan12 += OutputPar_c3[4]/pow(2.,4/2.)/(24.)*(16*pow(arg12,4) -48*pow(arg12,2) + 12);
592 Expan12 += OutputPar_c3[5]/pow(2.,5/2.)/(120.)*(32.*pow(arg12,5) - 160.*pow(arg12,3) + 120*arg12);
593 //
594 Expan13 += OutputPar_c3[3]/pow(2.,3/2.)/(6.)*(8*pow(arg13,3) - 12*pow(arg13,1));
595 Expan13 += OutputPar_c3[4]/pow(2.,4/2.)/(24.)*(16*pow(arg13,4) -48*pow(arg13,2) + 12);
596 Expan13 += OutputPar_c3[5]/pow(2.,5/2.)/(120.)*(32.*pow(arg13,5) - 160.*pow(arg13,3) + 120*arg13);
597 //
598 Expan23 += OutputPar_c3[3]/pow(2.,3/2.)/(6.)*(8*pow(arg23,3) - 12*pow(arg23,1));
599 Expan23 += OutputPar_c3[4]/pow(2.,4/2.)/(24.)*(16*pow(arg23,4) -48*pow(arg23,2) + 12);
600 Expan23 += OutputPar_c3[5]/pow(2.,5/2.)/(120.)*(32.*pow(arg23,5) - 160.*pow(arg23,3) + 120*arg23);
601 }else if(FitType==1){
602 Expan12 += OutputPar_c3[3]*(arg12 - 1);
603 Expan12 += OutputPar_c3[4]/2.*(pow(arg12,2) - 4*arg12 + 2);
604 Expan12 += OutputPar_c3[5]/6.*(-pow(arg12,3) + 9*pow(arg12,2) - 18*arg12 + 6);
605 //
606 Expan13 += OutputPar_c3[3]*(arg13 - 1);
607 Expan13 += OutputPar_c3[4]/2.*(pow(arg13,2) - 4*arg13 + 2);
608 Expan13 += OutputPar_c3[5]/6.*(-pow(arg13,3) + 9*pow(arg13,2) - 18*arg13 + 6);
609 //
610 Expan23 += OutputPar_c3[3]*(arg23 - 1);
611 Expan23 += OutputPar_c3[4]/2.*(pow(arg23,2) - 4*arg23 + 2);
612 Expan23 += OutputPar_c3[5]/6.*(-pow(arg23,3) + 9*pow(arg23,2) - 18*arg23 + 6);
613 }else{}
614
615 //
616 double C = OutputPar_c3[1] * pow(1-G,3)*exp(-(pow(arg12,OutputPar_c3[6])+pow(arg13,OutputPar_c3[6])+pow(arg23,OutputPar_c3[6]))/2.)*Expan12*Expan13*Expan23;
617 C += pow(OutputPar_c3[1], 2/3.) * G*pow(1-G,2)*exp(-(pow(arg12,OutputPar_c3[6])+pow(arg13,OutputPar_c3[6]))/2.)*Expan12*Expan13;
618 C += pow(OutputPar_c3[1], 2/3.) * G*pow(1-G,2)*exp(-(pow(arg12,OutputPar_c3[6])+pow(arg23,OutputPar_c3[6]))/2.)*Expan12*Expan23;
619 C += pow(OutputPar_c3[1], 2/3.) * G*pow(1-G,2)*exp(-(pow(arg13,OutputPar_c3[6])+pow(arg23,OutputPar_c3[6]))/2.)*Expan13*Expan23;
620 C += 1.0;
621 //if(Q3<0.026) cout<<Q3<<" "<<C<<endl;
622 C *= TERM5;
623 C *= OutputPar_c3[0];
624 //if(Q3<0.018) continue;
625 GenSignalExpected_num->Fill(Q3, C);
626 GenSignalExpected_den->Fill(Q3, TERM5);
627 //if(Q3<0.02) cout<<Q3<<" "<<TERM5<<endl;
628 ///////////////////////////////////////////////////////////
629
630
631
632 }
633 }
634 }
635
636
637 GenSignalExpected_num->Sumw2();
638 GenSignalExpected_num->Divide(GenSignalExpected_den);
639
640 TSpline3 *c3Fit1D_ExpanSpline = new TSpline3(GenSignalExpected_num);
641 c3Fit1D_ExpanSpline->SetLineWidth(2);
642 double xpoints[1000], ypoints[1000];
643 bool splineOnly=kFALSE;
644 for(int iii=0; iii<1000; iii++){
645 xpoints[iii] = 0 + (iii+0.5)*0.001;
646 //ypoints[iii] = c3Fit1D_ExpanSpline->Eval(xpoints[iii]);// to skip spline
647 splineOnly=kTRUE;// to skip 1D approximation
648 if(CollisionType==0) splineOnly=kTRUE;
649 if(CollisionType!=0 && xpoints[iii] > 0.06) splineOnly=kTRUE;
650 if(!splineOnly){
651 ypoints[iii] = c3Fit1D_Expan->Eval(xpoints[iii]);
652 if(c3Fit1D_Expan->Eval(xpoints[iii])<2. && fabs(c3Fit1D_Expan->Eval(xpoints[iii])-c3Fit1D_ExpanSpline->Eval(xpoints[iii])) < 0.01) splineOnly=kTRUE;
653 }
654 else {ypoints[iii] = c3Fit1D_ExpanSpline->Eval(xpoints[iii]); splineOnly=kTRUE;}
655 }
656 TGraph *gr_c3Spline = new TGraph(1000,xpoints,ypoints);
657 gr_c3Spline->SetLineWidth(2);
658 if(CollisionType==0) gr_c3Spline->SetLineColor(1);
659 if(CollisionType==1) gr_c3Spline->SetLineColor(2);
660 if(CollisionType==2) gr_c3Spline->SetLineColor(4);
661
662 gr_c3Spline->Draw("c same");
663
664 /*
665 double ChiSqSum_1D=0, SumNDF_1D=0;
666 for(int bin=1; bin<=300; bin++){
667 double binCenter = c3_hist->GetXaxis()->GetBinCenter(bin);
668 if(binCenter > Q3Limit) continue;
669 if(c3_hist->GetBinError(bin)==0) continue;
670 if(binCenter < 0.01) continue;
671 int grIndex=1;
672 for(int gr=0; gr<999; gr++){
673 if(binCenter > xpoints[gr] && (binCenter < xpoints[gr+1])) {grIndex=gr; break;}
674 }
675
676 ChiSqSum_1D += pow((c3_hist->GetBinContent(bin)-ypoints[grIndex]) / c3_hist->GetBinError(bin),2);
677 //cout<<c3_hist->GetBinContent(bin)<<" "<<ypoints[grIndex]<<" "<<c3_hist->GetBinError(bin)<<endl;
678 cout<<pow((c3_hist->GetBinContent(bin)-ypoints[grIndex]) / c3_hist->GetBinError(bin),2)<<endl;
679 SumNDF_1D++;
680 }
681 cout<<"1D Chi2/NDF = "<<ChiSqSum_1D / (SumNDF_1D-5.)<<endl;
682 */
683
684
685
686
687 if(SaveToFile){
688 TString *savefilename = new TString("FitFiles/FitFile_CT");
689 *savefilename += CollisionType;
690 savefilename->Append("_FT");
691 *savefilename += FitType;
692 savefilename->Append("_G");
693 *savefilename += int((G+0.001)/0.02);
694 savefilename->Append(".root");
695 TFile *savefile = new TFile(savefilename->Data(),"RECREATE");
696 MyMinuit_c3.Write("MyMinuit_c3");
697 //
698 savefile->Close();
699 }
700
701
702}
703
704//________________________________________________________________________
705void SetFSICorrelations(){
706 // read in 2-particle and 3-particle FSI correlations = K2 & K3
707 // 2-particle input histo from file is binned in qinv. 3-particle in qinv of each pair
708 TFile *fsifile = new TFile("KFile.root","READ");
709 if(!fsifile->IsOpen()) {
710 cout<<"No FSI file found!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
711 }
712
713 TH1D *temphistoSS[12];
714 TH1D *temphistoOS[12];
715 for(Int_t MB=0; MB<12; MB++) {
716 TString *nameK2SS = new TString("K2ss_");
717 *nameK2SS += MB;
718 temphistoSS[MB] = (TH1D*)fsifile->Get(nameK2SS->Data());
719 //
720 TString *nameK2OS = new TString("K2os_");
721 *nameK2OS += MB;
722 temphistoOS[MB] = (TH1D*)fsifile->Get(nameK2OS->Data());
723 //
724 fFSIss[MB] = (TH1D*)temphistoSS[MB]->Clone();
725 fFSIos[MB] = (TH1D*)temphistoOS[MB]->Clone();
726 fFSIss[MB]->SetDirectory(0);
727 fFSIos[MB]->SetDirectory(0);
728 }
729 //
730
731 fsifile->Close();
732
733}
734
735double Gamov(int chargeProduct, double qinv){
736
737 double arg = chargeProduct*2.*PI/(BohrR*qinv/2.);
738
739 return arg/(exp(arg)-1);
740}
741
742void SetMomResCorrections(){
743
744 TString *momresfilename = new TString("MomResFile");
745 if(CollisionType_def!=0) momresfilename->Append("_ppAndpPb");
746 momresfilename->Append(".root");
747
748 TFile *MomResFile = new TFile(momresfilename->Data(),"READ");
749
750 TString *proName[28];
751 for(int ii=0; ii<28; ii++){
752 proName[ii] = new TString("MRC_pro_");
753 *proName[ii] += ii;
754 }
755
756
757 //
758 MRC_SC_3[0] = (TH1D*)(((TH2D*)MomResFile->Get("MRC_3_SC_term1"))->ProjectionY(proName[4]->Data(), RbinMRC, RbinMRC));
759 MRC_SC_3[1] = (TH1D*)(((TH2D*)MomResFile->Get("MRC_3_SC_term2"))->ProjectionY(proName[5]->Data(), RbinMRC, RbinMRC));
760 MRC_SC_3[2] = (TH1D*)(((TH2D*)MomResFile->Get("MRC_3_SC_term3"))->ProjectionY(proName[6]->Data(), RbinMRC, RbinMRC));
761 MRC_SC_3[0]->SetDirectory(0); MRC_SC_3[1]->SetDirectory(0); MRC_SC_3[2]->SetDirectory(0);
762 //
763
764 if(!MRC){
765 for(int bin=1; bin<=MRC_SC_3[0]->GetNbinsX(); bin++){
766 MRC_SC_3[0]->SetBinContent(bin, 1.0); MRC_SC_3[1]->SetBinContent(bin, 1.0); MRC_SC_3[2]->SetBinContent(bin, 1.0);
767 }
768
769 }
770 MomResFile->Close();
771
772}
773
774
775float fact(float n){
776 return (n < 1.00001) ? 1 : fact(n - 1) * n;
777}
778//________________________________________________________________________________________
779void SetMuonCorrections(){
780 TString *name = new TString("MuonCorrection");
781 if(CollisionType_def!=0) name->Append("_ppAndpPb");
782
783 name->Append(".root");
784 TFile *MuonFile=new TFile(name->Data(),"READ");
785 TString *proName[22];
786 for(int ii=0; ii<22; ii++){
787 proName[ii] = new TString("MuonCorr_pro_");
788 *proName[ii] += ii;
789 }
790
791 //
792 C3muonCorrectionSC[0] = (TH1D*)(((TH2D*)MuonFile->Get("C3muonCorrection_SC_term1"))->ProjectionY(proName[3]->Data(), RbinMRC, RbinMRC));
793 C3muonCorrectionSC[1] = (TH1D*)(((TH2D*)MuonFile->Get("C3muonCorrection_SC_term2"))->ProjectionY(proName[4]->Data(), RbinMRC, RbinMRC));
794
795 C3muonCorrectionSC[0]->SetDirectory(0); C3muonCorrectionSC[1]->SetDirectory(0);
796
797 //
798 if(!MuonCorrection){
799 for(int bin=1; bin<=C3muonCorrectionSC[0]->GetNbinsX(); bin++){
800 C3muonCorrectionSC[0]->SetBinContent(bin, 1.0); C3muonCorrectionSC[1]->SetBinContent(bin, 1.0);
801 }
802 }
803
804 MuonFile->Close();
805}
806//________________________________________________________________________
807void SetFSIindex(Float_t R){
808 if(CollisionType_def==0){
809 if(Mbin==0) fFSIindex = 0;//0-5%
810 else if(Mbin==1) fFSIindex = 1;//5-10%
811 else if(Mbin<=3) fFSIindex = 2;//10-20%
812 else if(Mbin<=5) fFSIindex = 3;//20-30%
813 else if(Mbin<=7) fFSIindex = 4;//30-40%
814 else if(Mbin<=9) fFSIindex = 5;//40-50%
815 else if(Mbin<=12) fFSIindex = 6;//40-50%
816 else if(Mbin<=15) fFSIindex = 7;//40-50%
817 else if(Mbin<=18) fFSIindex = 8;//40-50%
818 else fFSIindex = 8;//90-100%
819 }else fFSIindex = 9;// pp and pPb
820
821}
822//________________________________________________________________________
823Float_t FSICorrelation(Int_t charge1, Int_t charge2, Float_t qinv){
824 // returns 2-particle Coulomb correlations = K2
825 Int_t qbinL = fFSIss[fFSIindex]->GetXaxis()->FindBin(qinv-fFSIss[fFSIindex]->GetXaxis()->GetBinWidth(1)/2.);
826 Int_t qbinH = qbinL+1;
827 if(qbinL <= 0) return 1.0;
828 if(qbinH > fFSIss[fFSIindex]->GetNbinsX()) {// Scaled Gamov approximation
829 int chargeproduct = 1;
830 if(charge1!=charge2) {
831 chargeproduct = -1;
832 Float_t ScaleFac = (fFSIos[fFSIindex]->GetBinContent(fFSIos[fFSIindex]->GetNbinsX()-1) - 1);
833 ScaleFac /= (Gamov(chargeproduct, fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(fFSIos[fFSIindex]->GetNbinsX()-1)) - 1);
834 return ( (Gamov(chargeproduct, qinv)-1)*ScaleFac + 1);
835 }else{
836 Float_t ScaleFac = (fFSIss[fFSIindex]->GetBinContent(fFSIss[fFSIindex]->GetNbinsX()-1) - 1);
837 ScaleFac /= (Gamov(chargeproduct, fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(fFSIss[fFSIindex]->GetNbinsX()-1)) - 1);
838 return ( (Gamov(chargeproduct, qinv)-1)*ScaleFac + 1);
839 }
840 }
841
842 Float_t slope=0;
843 if(charge1==charge2){
844 slope = fFSIss[fFSIindex]->GetBinContent(qbinL) - fFSIss[fFSIindex]->GetBinContent(qbinH);
845 slope /= fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
846 return (slope*(qinv - fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSIss[fFSIindex]->GetBinContent(qbinL));
847 }else {
848 slope = fFSIos[fFSIindex]->GetBinContent(qbinL) - fFSIos[fFSIindex]->GetBinContent(qbinH);
849 slope /= fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
850 return (slope*(qinv - fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSIos[fFSIindex]->GetBinContent(qbinL));
851 }
852}
853//__________________________________________________________________________
854void fcn_c3(int& npar, double* deriv, double& f, double par[], int flag){
855
856 double q12=0, q13=0, q23=0;
857 double Expan12=0, Expan13=0, Expan23=0;
858 double C=0;
859 double Rch=par[2]/FmToGeV;
860 double SumChi2=0;
861 //double lnL=0, term1=0, term2=0;
862 NFitPoints_c3=0;
863 //double SumChi2_test=0;
864
865 for(int i=0; i<=BINLIMIT_3; i++){// q12
866 for(int j=0; j<=BINLIMIT_3; j++){// q13
867 for(int k=0; k<=BINLIMIT_3; k++){// q23
868
869 if(B_3[i][j][k] == 0) continue;
870 if(A_3[i][j][k] == 0) continue;
871 if(A_3_e[i][j][k] == 0) continue;
872
873 q12 = BinCenters[i];
874 q13 = BinCenters[j];
875 q23 = BinCenters[k];
876 double q3 = sqrt(pow(q12,2)+pow(q13,2)+pow(q23,2));
877 if(q3 > Q3LimitHigh) continue;
878 if(q3 < Q3LimitLow) continue;
879 //
880 double arg12 = q12*Rch;
881 double arg13 = q13*Rch;
882 double arg23 = q23*Rch;
883 if(FitType==0){// Edgeworth expansion
884 Expan12 = 1;
885 Expan12 += par[3]/pow(2.,3/2.)/(6.)*(8*pow(arg12,3) - 12*pow(arg12,1));
886 Expan12 += par[4]/pow(2.,4/2.)/(24.)*(16*pow(arg12,4) -48*pow(arg12,2) + 12);
887 Expan12 += par[5]/pow(2.,5/2.)/(120.)*(32.*pow(arg12,5) - 160.*pow(arg12,3) + 120*arg12);
888 //
889 Expan13 = 1;
890 Expan13 += par[3]/pow(2.,3/2.)/(6.)*(8*pow(arg13,3) - 12*pow(arg13,1));
891 Expan13 += par[4]/pow(2.,4/2.)/(24.)*(16*pow(arg13,4) -48*pow(arg13,2) + 12);
892 Expan13 += par[5]/pow(2.,5/2.)/(120.)*(32.*pow(arg13,5) - 160.*pow(arg13,3) + 120*arg13);
893 //
894 Expan23 = 1;
895 Expan23 += par[3]/pow(2.,3/2.)/(6.)*(8*pow(arg23,3) - 12*pow(arg23,1));
896 Expan23 += par[4]/pow(2.,4/2.)/(24.)*(16*pow(arg23,4) -48*pow(arg23,2) + 12);
897 Expan23 += par[5]/pow(2.,5/2.)/(120.)*(32.*pow(arg23,5) - 160.*pow(arg23,3) + 120*arg23);
898 }else if(FitType==1){// Laguerre expansion
899 Expan12 = 1;
900 Expan12 += par[3]*(arg12 - 1);
901 Expan12 += par[4]/2.*(pow(arg12,2) - 4*arg12 + 2);
902 Expan12 += par[5]/6.*(-pow(arg12,3) + 9*pow(arg12,2) - 18*arg12 + 6);
903 //
904 Expan13 = 1;
905 Expan13 += par[3]*(arg13 - 1);
906 Expan13 += par[4]/2.*(pow(arg13,2) - 4*arg13 + 2);
907 Expan13 += par[5]/6.*(-pow(arg13,3) + 9*pow(arg13,2) - 18*arg13 + 6);
908 //
909 Expan23 = 1;
910 Expan23 += par[3]*(arg23 - 1);
911 Expan23 += par[4]/2.*(pow(arg23,2) - 4*arg23 + 2);
912 Expan23 += par[5]/6.*(-pow(arg23,3) + 9*pow(arg23,2) - 18*arg23 + 6);
913 }else{Expan12=1.0; Expan13=1.0; Expan23=1.0;}
914 //
915
916 C = par[1] * pow(1-G_def,3)*exp(-(pow(arg12,par[6])+pow(arg13,par[6])+pow(arg23,par[6]))/2.)*Expan12*Expan13*Expan23;
917 C += pow(par[1],2/3.) * G_def*pow(1-G_def,2)*exp(-(pow(arg12,par[6])+pow(arg13,par[6]))/2.)*Expan12*Expan13;
918 C += pow(par[1],2/3.) * G_def*pow(1-G_def,2)*exp(-(pow(arg12,par[6])+pow(arg23,par[6]))/2.)*Expan12*Expan23;
919 C += pow(par[1],2/3.) * G_def*pow(1-G_def,2)*exp(-(pow(arg13,par[6])+pow(arg23,par[6]))/2.)*Expan13*Expan23;
920 C += 1.0;
921 C *= par[0];// Norm
922
923
924 double error = pow(A_3_e[i][j][k]/B_3[i][j][k],2);
925 error += pow(sqrt(B_3[i][j][k])*A_3[i][j][k]/pow(B_3[i][j][k],2),2);
926 error = sqrt(error);
927 SumChi2 += pow( (C - A_3[i][j][k]/B_3[i][j][k])/error,2);
928
929 //if(q3<0.05) SumChi2_test += pow( (C - A_3[i][j][k]/B_3[i][j][k])/error,2);
930 //
931 /*if(A_3[i][j][k] >= 1) term1 = C*(A_3[i][j][k]+B_3[i][j][k])/(A_3[i][j][k]*(C+1));
932 else term1 = 0;
933 term2 = (A_3[i][j][k]+B_3[i][j][k])/(B_3[i][j][k]*(C+1));
934
935 if(term1 > 0.0 && term2 > 0.0){
936 lnL += A_3[i][j][k]*log(term1) + B_3[i][j][k]*log(term2);
937 }else if(term1==0 && term2 > 0.0){
938 lnL += B_3[i][j][k]*log(term2);
939 }else {cout<<"WARNING -- term1 and term2 are negative"<<endl;}
940 */
941
942 NFitPoints_c3++;
943
944 }
945 }
946 }
947 //f = -2.0*lnL;// log-liklihood minimization
948 f = SumChi2;// Chi2 minimization
949 Chi2_c3 = f;
950 //Chi2_c3 = SumChi2_test;
951
952}