17 #include "TProfile2D.h"
27 #include "TPaveStats.h"
32 #define BohrR 1963.6885 // Bohr Radius for pions
33 #define FmToGeV 0.19733 // conversion to fm
35 #define masspiC 0.1395702 // pi+ mass (GeV/c^2)
36 double kappa3 = 0.1; // 0.1 (default),
37 double kappa4 = 0.5; // 0.5 (default),
41 int CollisionType_def=2;// 0=PbPb, 1=pPb, 2=pp
42 bool MCcase_def=0;// MC data?
43 int CHARGE_def=-1;// -1 or +1: + or - pions for same-charge case, --+ or ++- for mixed-charge case
44 bool SameCharge_def=kTRUE;// 3-pion same-charge?
46 bool Gaussian=0;// Gaussian or Exponential?
47 bool UseC2Bkg=1;// use Pythia/DPMJET bkg?
49 bool MuonCorrection=1;// apply Muon correction?
50 bool IncludeExpansion=kTRUE;// Include EdgeWorth coefficients?
51 bool FixExpansionAvg=1;
52 int Mbin_def=16;// 0-19 (0=1050-2000 pions, 19=0-5 pions)
53 int EDbin_def=0;// 0-2: Kt3 bin
54 int Ktbin_def=1;// 1-6, 10=full range
55 double MRCShift=1.0;// 1.0=full Momentum Resolution Correction. 1.1 for 10% systematic increase
56 bool FitRangeShift=0;// 30% reduction in Fit Range
57 bool ExtremeFitRangeC2=0;// 1.2 GeV/c fit range for C2?
60 bool SaveToFile_def=kFALSE;// Save outputs to file?
61 int SourceType=0;// 0=Therminator, 1=Therminator with 50fm cut (keep at 0 for default), 2=Gaussian
62 bool ConstantFSI=kFALSE;// Constant FSI's for each kt bin?
63 bool GofP=kFALSE;// Include momentum dependence of coherent fraction?
64 bool ChargeConstraint=kFALSE;// Include Charge Constraint for coherent states?
65 bool LinkN=kFALSE;// Make N(++)=N(+-)?
66 bool GeneratedSignal=kFALSE;// Was the QS+FSI signal generated in MC?
67 bool Tricubic=kFALSE;// Tricubic or Trilinear interpolation? Tricubic was found to be unstable.
68 bool IncludeSS=kTRUE;// Include same-charge two-pion correlations in the fit?
69 bool IncludeOS=kFALSE;// Include mixed-charge two-pion correlations in the fit?
72 double ExpPower=2;// default Gaussian(2), Exponential(1)
75 const int Sbins_2=1;// 2-particle Species bins. 1=Pion-Pion only. max=6 (pi-pi, pi-k, pi-p, k-p, k-k, p-p)
76 const int Sbins_3=1;// 3-particle Species bins. 1=Pion-Pion-Pion only. max=10
77 const int fitlimitLowBin = 3;
78 const int fitlimitHighBin = 14;// max = 20 (100MeV)
79 bool LHC11h=kTRUE;// always kTRUE
80 bool ExplicitLoop=kFALSE;// always kFALSE
81 bool PairCut=kTRUE;// always kTRUE
85 int MomResCentBin;// momentum resolution centrality bin
86 float TwoFrac;// Lambda parameter
87 float OneFrac;// Lambda^{1/2}
88 float ThreeFrac;// Lambda^{3/2}
92 double lambda_PM = 0.7;
97 TH1D *CoulCorr2SS_2;// for interpolation in transition from Therminator to Gauss K factors
98 TH1D *CoulCorr2OS_2;// for interpolation in transition from Therminator to Gauss K factors
101 void ReadCoulCorrections(int);
102 void ReadMomResFile(int);
103 void ReadMuonCorrections(int,int);
104 double CoulCorr2(int, double);
105 double CoulCorrGRS(bool, double, double, double);
106 double Dfitfunction_c3(Double_t *x, Double_t *par);
107 double Gamov(int, double);
108 double C2ssFitFunction(Double_t *x, Double_t *par);
109 double C2osFitFunction(Double_t *x, Double_t *par);
110 double cubicInterpolate(double[4], double);
111 double bicubicInterpolate(double[4][4], double, double);
112 double tricubicInterpolate(double[4][4][4], double, double, double);
113 void DrawALICELogo(Bool_t, Float_t, Float_t, Float_t, Float_t);
116 void fcnC2_Global(int&, double*, double&, double[], int);
118 const int BINRANGE_C2global=400;// 40
119 double C2ssFitting[BINRANGE_C2global];
120 double C2osFitting[BINRANGE_C2global];
121 double C2ssFitting_e[BINRANGE_C2global];
122 double C2osFitting_e[BINRANGE_C2global];
123 double K2SS[BINRANGE_C2global];
124 double K2OS[BINRANGE_C2global];
125 double K2SS_e[BINRANGE_C2global];
126 double K2OS_e[BINRANGE_C2global];
127 double Chi2_C2global;
128 double NFitPoints_C2global;
129 double Chi2_C3global;
130 double NFitPoints_C3global;
132 const int BINS_OSL=40;// out,side,long bins
133 double A[BINS_OSL][BINS_OSL][BINS_OSL];// out,side,long
134 double B[BINS_OSL][BINS_OSL][BINS_OSL];// out,side,long
135 double A_e[BINS_OSL][BINS_OSL][BINS_OSL];// out,side,long
136 double B_e[BINS_OSL][BINS_OSL][BINS_OSL];// out,side,long
137 double avg_q[BINS_OSL][BINS_OSL][BINS_OSL];// out,side,long
138 double K_OSL[BINS_OSL][BINS_OSL][BINS_OSL];// out,side,long
139 double K_OSL_e[BINS_OSL][BINS_OSL][BINS_OSL];// out,side,long
141 double NFitPoints_OSL;
143 const int BINRANGE_3=40;// q12,q13,q23
145 double A_3[BINRANGE_3][BINRANGE_3][BINRANGE_3];// q12,q13,q23
146 double A_3_e[BINRANGE_3][BINRANGE_3][BINRANGE_3];// q12,q13,q23
147 double B_3[BINRANGE_3][BINRANGE_3][BINRANGE_3];// q12,q13,q23
148 double BinCenters[400];
151 double NFitPoints_c3;
152 void fcn_c3(int&, double*, double&, double[], int);
154 double C3_base[BINRANGE_3][BINRANGE_3][BINRANGE_3];
155 double N_term1[BINRANGE_3][BINRANGE_3][BINRANGE_3];
156 double N_term2[BINRANGE_3][BINRANGE_3][BINRANGE_3];
157 double N_term3[BINRANGE_3][BINRANGE_3][BINRANGE_3];
158 double N_term4[BINRANGE_3][BINRANGE_3][BINRANGE_3];
159 double N_term5[BINRANGE_3][BINRANGE_3][BINRANGE_3];
162 TH3D *MomRes3d[2][5];// SC/MC, term#
163 TH1D *MomRes1d[2][5];// SC/MC, term#
164 TH1D *MomResC2[2];// SC/MC
165 int MRC2index;// index for C2 MRC
167 double AvgP[6][20];// kt bin, qinv bin
169 TH1D *C2muonCorrection_SC;
170 TH1D *C2muonCorrection_MC;
171 TH1D *C3muonCorrection;
173 TF1 *StrongSC;// same-charge pion strong FSI
174 TF1 *MixedChargeSysFit;// mixed-charge 3-pion cumulant residue obtained from Plot_plotsTPR.C
175 TF1 *BkgMCFit;// Pythia or DPMJET fit
179 void Plot_PDCumulants_TPR(bool SaveToFile=SaveToFile_def, int CollisionType=CollisionType_def, bool MCcase=MCcase_def, bool SameCharge=SameCharge_def, int EDbin=EDbin_def, int CHARGE=CHARGE_def, int Mbin=Mbin_def, int Ktbin=Ktbin_def){
183 CollisionType_def=CollisionType;
184 SaveToFile_def=SaveToFile;
187 SameCharge_def=SameCharge;// 3-pion same-charge
190 if(CollisionType==0){
191 Q3Limit = 0.1 + 0.1*Mbin/16.;
193 Q3Limit = 0.3 + 0.2*fabs(Mbin-10)/9.;
195 if(FitRangeShift) Q3Limit -= 0.3*Q3Limit;
196 Q2Limit = Q3Limit/sqrt(2.);
197 if(ExtremeFitRangeC2) Q2Limit = 1.2;
198 //Q2Limit = (0.3 + 0.2*fabs(Mbin-10)/9.) / sqrt(2.);
199 //cout<<Q2Limit<<endl;
202 // PbPb then pPb then pp
203 //double Nch_means[3][20]={{1828,1407,1071,896,757,619,496,402,324,252,171,117,83,63,50,36, 36,36,36,36}, {71,71,71,71,71,71,71,71,71,71,71,71, 71,57,45,32,23,16,9.7,5}, {47,47,47,47,47,47,47,47,47,47,47,47,47, 47,37,27,20,15,8.6,4.6}};
207 //kappa3 = 0.05 + 0.25*(Mbin/19.);// linear dependence of kappa3
209 //double MainFitParams[8]={0};
211 //double RefMainFitParams[8]={6.71377, 5.39974, 1.3822, 1.82065, 6.71377, 5.39974, 1.3822, 1.82065};
213 if(Gaussian) ExpPower=2.;
216 if(CollisionType==0){
217 if(Mbin==0) FSIindex = 0;// 0-5% Therm
218 else if(Mbin==1) FSIindex = 1;// 0-10% Therm
219 else if(Mbin<=3) FSIindex = 2;// 10-20% Therm
220 else if(Mbin<=5) FSIindex = 3;// 20-30% Therm
221 else if(Mbin<=7) FSIindex = 4;// 30-40% Therm
222 else if(Mbin<=9) FSIindex = 5;// 40-50% Therm
223 else FSIindex = 6;// EW R=4.0 fm
224 // next bin is 3.0 fm which is used for interpolation
226 if(Mbin<=14) FSIindex = 8;// EW R=2.5 fm
227 else if(Mbin<=16) FSIindex = 9;// EW R=2.0 fm
228 else FSIindex = 10;// EW R=1.7 fm
229 // last bin is 1.25 fm which is used for interpolation
232 // chooses lambda=0.7 for R=10,8,6,4,2
233 if(Mbin<=2) MRC2index=138;
234 else if(Mbin<=5) MRC2index=106;
235 else if(Mbin<=9) MRC2index=74;
236 else if(Mbin<=13) MRC2index=42;// was 9 by mistake, now 13 (corrected on 22/10/2013)
242 OneFrac = sqrt(TwoFrac);
243 ThreeFrac = pow(TwoFrac,3/2.);
245 if(CollisionType==0 && Mbin<10) BINLIMIT_3=20;
248 Ktlowbin=(Ktbin)*2+3;// kt bins are 0.5 GeV/c wide (0-0.5, 0.5-1.0 ...)
249 Kthighbin=(Ktbin)*2+4;
250 if(Ktbin==2) {cout<<"Kthighbin increased"<<endl; Kthighbin = 20;}// to make <KT3> comparible to <kT>
253 BkgMCFit=new TF1("BkgMCFit","[0]*([1] + [2]*exp(-pow([3]*x,2)))",0,2.0);
254 BkgMCFit->SetParameter(0,1);
255 BkgMCFit->SetParameter(1,1.001);
256 BkgMCFit->SetParameter(2,0.04102);
257 BkgMCFit->SetParameter(3,1.874);
258 BkgMCFit->SetLineColor(1);
260 // kt bin(0.2<kt<0.3, 0.3<kt<1.0), Mult bin(low to high)
261 float paramsPP_0[2][10]={{1.00014,1.00019,9.99733e-01,9.99379e-01,9.99488e-01, 9.99488e-01,9.99488e-01,9.99488e-01,9.99488e-01,9.99488e-01},{9.97267e-01,9.98918e-01,9.99117e-01,9.98878e-01,9.99457e-01, 9.99457e-01,9.99457e-01,9.99457e-01,9.99457e-01,9.99457e-01}};
262 float paramsPP_1[2][10]={{1.00198,1.00156,1.00109,1.00068,1.00079, 1.00079,1.00079,1.00079,1.00079,1.00079},
263 {9.98091e-01,9.98893e-01,9.99782e-01,9.99595e-01,1.00037, 1.00037,1.00037,1.00037,1.00037,1.00037}};
264 float paramsPP_2[2][10]={{4.51532e-02,4.30415e-02,4.10306e-02,3.42739e-02,2.95607e-02, 2.95607e-02,2.95607e-02,2.95607e-02,2.95607e-02,2.95607e-02},
265 {9.89882e-02,1.00657e-01,8.93560e-02,7.55225e-02,6.52689e-02, 6.52689e-02,6.52689e-02,6.52689e-02,6.52689e-02,6.52689e-02}};
266 float paramsPP_3[2][10]={{1.57172,1.91807,1.87353,1.88549,2.22286, 2.22286,2.22286,2.22286,2.22286,2.22286},
267 {1.49834,1.65562,1.66501,1.75097,1.78597, 1.78597,1.78597,1.78597,1.78597,1.78597}};
269 float paramsPPb_0[2][10]={{9.99479e-01,9.98772e-01,9.99295e-01,9.99532e-01,9.99430e-01,9.99642e-01,9.99424e-01, 9.99424e-01,9.99424e-01,9.99424e-01},
270 {9.91941e-01,9.96569e-01,9.97183e-01,9.98106e-01,9.98591e-01,9.98717e-01,9.98517e-01, 9.98517e-01,9.98517e-01,9.98517e-01}};
271 float paramsPPb_1[2][10]={{1.00093,1.00023,1.00068,1.00082,1.00077,1.00087,1.00069, 1.00069,1.00069,1.00069},
272 {9.93727e-01,9.98118e-01,9.98630e-01,9.99584e-01,1.00005,1.00017,9.99972e-01, 9.99972e-01,9.99972e-01,9.99972e-01}};
273 float paramsPPb_2[2][10]={{3.05502e-02,2.21034e-02,1.39907e-02,9.82480e-03,6.48672e-03,5.37259e-03,4.54498e-03, 4.54498e-03,4.54498e-03,4.54498e-03},
274 {8.86336e-02,5.53244e-02,3.59877e-02,2.57145e-02,1.82072e-02,1.44253e-02,1.28923e-02, 1.28923e-02,1.28923e-02, 1.28923e-02}};
275 float paramsPPb_3[2][10]={{1.69217,1.51289,1.63134,1.71567,1.71918,1.78037,2.10736, 2.10736,2.10736,2.10736},
276 {1.21996,1.34570,1.35660,1.37801,1.39951,1.39093,1.33747, 1.33747,1.33747,1.33747}};
278 int ktindexBkg = Ktbin - 1;
279 if(ktindexBkg > 1) ktindexBkg = 1;
280 if(CollisionType==2){
281 BkgMCFit->FixParameter(0, paramsPP_0[ktindexBkg][19-Mbin]);
282 BkgMCFit->FixParameter(1, paramsPP_1[ktindexBkg][19-Mbin]);
283 BkgMCFit->FixParameter(2, paramsPP_2[ktindexBkg][19-Mbin]);
284 BkgMCFit->FixParameter(3, paramsPP_3[ktindexBkg][19-Mbin]);
285 }else if(CollisionType==1){
286 BkgMCFit->FixParameter(0, paramsPPb_0[ktindexBkg][19-Mbin]);
287 BkgMCFit->FixParameter(1, paramsPPb_1[ktindexBkg][19-Mbin]);
288 BkgMCFit->FixParameter(2, paramsPPb_2[ktindexBkg][19-Mbin]);
289 BkgMCFit->FixParameter(3, paramsPPb_3[ktindexBkg][19-Mbin]);
290 }else{// no Bkg for PbPb
291 BkgMCFit->FixParameter(0, 1);
292 BkgMCFit->FixParameter(1, 1);
293 BkgMCFit->FixParameter(2, 0);
294 BkgMCFit->FixParameter(3, 1);
298 // Core-Halo modeling of single-particle and triple-particle core fraction
299 //float AvgN[10]={1.99266, 3.97789, 6.4624, 8.94042, 11.4194, 13.8987, 16.385, 18.8756, 21.3691, 26.0742};// 13c (avg total pion mult)/2. 2.0sigma
302 // bin centers from QS+FSI
303 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};
304 double BinCenterPbPbPeripheral[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};
305 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};
306 if(CollisionType==0){
307 for(int i=0; i<40; i++){
308 if(Mbin<10) BinCenters[i] = BinCenterPbPbCentral[i];
309 else BinCenters[i] = BinCenterPbPbPeripheral[i];
313 for(int i=0; i<40; i++){
314 BinCenters[i] = BinCenterpPbAndpp[i];
320 // extend BinCenters for high q
321 for(int index=40; index<400; index++){
322 if(CollisionType==0) BinCenters[index] = (index+0.5)*(0.005);
323 else BinCenters[index] = (index+0.5)*(0.010);
325 // Set 0's to 3-particle fit arrays
326 for(int i=1; i<=BINLIMIT_3; i++){// bin number
327 for(int j=1; j<=BINLIMIT_3; j++){// bin number
328 for(int k=1; k<=BINLIMIT_3; k++){// bin number
329 A_3[i-1][j-1][k-1]=0;
330 A_3_e[i-1][j-1][k-1]=0;
331 B_3[i-1][j-1][k-1]=0;
336 // same-charge pion strong FSI (obtained from ratio of CoulStrong to Coul at R=7 Gaussian from Lednicky's code)
337 StrongSC=new TF1("StrongSC","[0]+[1]*exp(-pow([2]*x,2))",0,1000);
338 StrongSC->FixParameter(0,9.99192e-01);
339 StrongSC->FixParameter(1,-8.01113e-03);
340 StrongSC->FixParameter(2,5.35912e-02);
341 // mixed-charge 3-pion cumulant residue obtained from Plot_plotsTPR.C
342 MixedChargeSysFit=new TF1("MixedChargeSysFit","[0]+[1]*exp(-pow([2]*x/0.19733,2))",0,.5);
343 MixedChargeSysFit->FixParameter(0,1);
344 MixedChargeSysFit->FixParameter(1,.06);
345 MixedChargeSysFit->FixParameter(2,5.5 - 6*(Mbin/19.));
348 gStyle->SetOptStat(0);
349 gStyle->SetOptDate(0);
350 gStyle->SetOptFit(0111);
353 if(CollisionType==0){// PbPb
356 _file0 = new TFile("Results/PDC_12a17a_R10_2.root","READ");
358 _file0 = new TFile("Results/PDC_12a17e_R10.root","READ");
361 //_file0 = new TFile("Results/PDC_10h_11h_0to50_50to100.root","READ");
362 //_file0 = new TFile("Results/PDC_10h_11h_0to50_50to100_3Ktbins.root","READ");
363 //_file0 = new TFile("Results/PDC_10h_2Kt3bins.root","READ");
364 //_file0 = new TFile("Results/PDC_10h_NewNorm.root","READ");
365 //_file0 = new TFile("Results/PDC_10h_dEta0p03dPhi0p03.root","READ");
366 //_file0 = new TFile("Results/PDC_10h_noPID.root","READ");
367 //_file0 = new TFile("Results/PDC_10h_1percentCentral.root","READ");
368 //_file0 = new TFile("Results/PDC_10h_11h_2Kt3bins.root","READ");// v5 and before
369 //_file0 = new TFile("Results/PDC_10h_dEta0p025dPhi0p055.root","READ");
370 //_file0 = new TFile("Results/PDC_11h_3Kt3bins_FB5and7overlap.root","READ");
371 //_file0 = new TFile("Results/PDC_10h_11h_V0binning.root","READ");
372 //_file0 = new TFile("Results/PDC_10h_11h_lowerMultBins.root","READ");
373 _file0 = new TFile("Results/PDC_10h_11h_NclsFix.root","READ");// standard
375 }else if(CollisionType==1){// pPb
377 //_file0 = new TFile("Results/PDC_13c_kMB.root","READ");
378 //_file0 = new TFile("Results/PDC_13bc.root","READ");
379 //_file0 = new TFile("Results/PDC_13bc_3Ktbins.root","READ");
380 //_file0 = new TFile("Results/PDC_13bc_kAnyINT_kINT7.root","READ");
381 //_file0 = new TFile("Results/PDC_13bc_2Kt3bins.root","READ");
382 //_file0 = new TFile("Results/PDC_13bc_kINT7.root","READ");// paper v1
383 //_file0 = new TFile("Results/PDC_13c_posEta.root","READ");// eta sub-range
384 //_file0 = new TFile("Results/PDC_13c_negEta.root","READ");// eta sub-range
385 //_file0 = new TFile("Results/PDC_13c_0p4to0p8eta.root","READ");// eta sub-range
386 //_file0 = new TFile("Results/PDC_13c_neg0p4toneg0p8eta.root","READ");// eta sub-range
387 //_file0 = new TFile("Results/PDC_13bc_dEta0p025dPhi0p055_kINT7_kHighMult.root","READ");
388 //_file0 = new TFile("Results/PDC_13bc_FB5and7overlap_V0binning.root","READ");
389 //_file0 = new TFile("Results/PDC_13bc_kAnyINT_V0binning.root","READ");
390 //_file0 = new TFile("Results/PDC_13bcd_kHighMult.root","READ");
391 //_file0 = new TFile("Results/PDC_13bcd_kINT7.root","READ");
392 //_file0 = new TFile("Results/PDC_13f_kHighMult.root","READ");
393 //_file0 = new TFile("Results/PDC_13e_kHighMult.root","READ");
394 //_file0 = new TFile("Results/PDC_13bcd_kINT7_plus_kHighMult.root","READ");// v5 and before
395 //_file0 = new TFile("Results/PDC_13bcde_kINT7_NclsFix.root","READ");
396 //_file0 = new TFile("Results/PDC_13e_kHighMult_NclsFix.root","READ");
397 _file0 = new TFile("Results/PDC_13bcde_kINT7_kHighMult_NclsFix.root","READ");// standard
399 _file0 = new TFile("Results/PDC_13b2_efix_p1234_R2_2Ktbins.root","READ");// standard (gen level)
400 //_file0 = new TFile("Results/PDC_13b2_efix_p1234_R2_RecLevel.root","READ");// Reconstructed tracks
401 //_file0 = new TFile("Results/PDC_13b2_p1_noTTC.root","READ");
405 //_file0 = new TFile("Results/PDC_10cde.root","READ");
406 //_file0 = new TFile("Results/PDC_10cde_3Ktbins.root","READ");
407 //_file0 = new TFile("Results/PDC_10e_kHighMult.root","READ");
408 //_file0 = new TFile("Results/PDC_10e_kAnyINT.root","READ");
409 //_file0 = new TFile("Results/PDC_10cde_kAnyINT.root","READ");
410 //_file0 = new TFile("Results/PDC_10cde_kAnyINT_Plus_kHighMult.root","READ");
411 //_file0 = new TFile("Results/K0sRange_10cde.root","READ");// for K0s peak removal
412 //_file0 = new TFile("Results/PDC_10cde_2Kt3bins.root","READ");
413 //_file0 = new TFile("Results/PDC_10e_kHighMult.root","READ");
414 //_file0 = new TFile("Results/PDC_10cde_kMB.root","READ");
415 //_file0 = new TFile("Results/PDC_10cde_kMB_plus_kHighMult_2Kt3bins.root","READ");// v2 paper
416 //_file0 = new TFile("Results/PDC_10cde_kMB_plus_kHighMult_AOD147.root","READ");// v5 and before
417 //_file0 = new TFile("Results/PDC_10cde_FB5and7overlap.root","READ");
418 //_file0 = new TFile("Results/PDC_10d_noTTC.root","READ");
419 //_file0 = new TFile("Results/PDC_10cde_kMB.root","READ");
420 _file0 = new TFile("Results/PDC_10cde_kMB_kHighMult_NclsFix.root","READ");// standard
422 _file0 = new TFile("Results/PDC_10f6a_R2_2Ktbins.root","READ");// standard
423 //_file0 = new TFile("Results/PDC_10f6a_R2_AOD161.root","READ");
424 //_file0 = new TFile("Results/PDC_10f6a_R10_genLevel_2Ktbins.root","READ");
428 ReadCoulCorrections(FSIindex);
429 ReadMomResFile(Mbin);
430 ReadMuonCorrections(CollisionType,Mbin);
432 /////////////////////////////////////////////////////////
437 if(CollisionType==0) {// PbPb
439 NormQcutLow = 0.15;// was 0.15
440 NormQcutHigh = 0.175;// was 0.175
442 NormQcutLow = 0.3;// was 0.3
443 NormQcutHigh = 0.35;// was 0.35
446 NormQcutLow = 1.0;// was 1.0
447 NormQcutHigh = 1.2;// was 1.2
452 TDirectoryFile *tdir;
453 if(!MCcase) tdir = (TDirectoryFile*)_file0->Get("PWGCF.outputThreePionRadiiAnalysis.root");
456 if(CollisionType==0){
458 if(Mbin<6) MyList=(TList*)tdir->Get("ThreePionRadiiOutput_1");
459 else MyList=(TList*)tdir->Get("ThreePionRadiiOutput_2");
461 MyList=(TList*)_file0->Get("MyList");
465 if(CollisionType==2 && Mbin<15) MyList=(TList*)tdir->Get("ThreePionRadiiOutput_2");
466 else MyList=(TList*)tdir->Get("ThreePionRadiiOutput_1");
467 }else MyList=(TList*)_file0->Get("MyList");
471 TH1D *Events = (TH1D*)MyList->FindObject("fEvents2");
473 cout<<"#Events = "<<Events->Integral(Mbin+1,Mbin+1)<<endl;
475 // below lines determine fractional cross-sections without correction for efficiency
476 //TH1F *fMultDist3 = (TH1F*)MyList->FindObject("fMultDist3");// total event count before track cuts
477 //for(int mm=19; mm>=10; mm--){
478 //cout<<"fracton of cross-section = "<<Events->GetBinContent(mm+1)/fMultDist3->GetEntries()<<endl;
481 TF1 *Unity = new TF1("Unity","1",0,10);
482 Unity->SetLineStyle(2); Unity->SetLineColor(1);
484 // Explicit Loop Histos
485 TH2D *Two_ex_2d[2][2][Sbins_2][2];
486 TH1D *Two_ex[2][2][Sbins_2][2];
489 double NormH_pc[5]={0};
491 double norm_ex_2[6][2]={{0}};
493 // 3d method histograms
494 TH3D *Three_3d[2][2][2][Sbins_3][5];
495 TH1D *Three_1d[2][2][2][Sbins_3][5];
496 ///////////////////////////////////
500 for(int c1=0; c1<2; c1++){
501 for(int c2=0; c2<2; c2++){
502 for(int sc=0; sc<Sbins_2; sc++){
503 for(int term=0; term<2; term++){
505 TString *name2_ex = new TString("Explicit2_Charge1_");
507 name2_ex->Append("_Charge2_");
509 name2_ex->Append("_SC_");
511 name2_ex->Append("_M_");
513 name2_ex->Append("_ED_");
514 *name2_ex += 0;// EDbin
515 name2_ex->Append("_Term_");
518 if(sc==0 || sc==3 || sc==5){
519 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
522 Two_ex_2d[c1][c2][sc][term] = (TH2D*)MyList->FindObject(name2_ex->Data());
523 Two_ex_2d[c1][c2][sc][term]->Sumw2();
524 TString *proname = new TString(name2_ex->Data());
525 proname->Append("_pro");
527 if(Ktbin==10) {Ktlowbin=1; Kthighbin=Two_ex_2d[c1][c2][sc][term]->GetNbinsX();}//full kt interval
528 Two_ex[c1][c2][sc][term] = (TH1D*)Two_ex_2d[c1][c2][sc][term]->ProjectionY(proname->Data(),Ktlowbin,Kthighbin);// bins:5-6 (kt:0.2-0.3)
530 norm_ex_2[sc][term] = Two_ex[c1][c2][sc][term]->Integral(Two_ex[c1][c2][sc][term]->GetXaxis()->FindBin(NormQcutLow),Two_ex[c1][c2][sc][term]->GetXaxis()->FindBin(NormQcutHigh));
531 Two_ex[c1][c2][sc][term]->Scale(norm_ex_2[sc][0]/norm_ex_2[sc][term]);
533 Two_ex[c1][c2][sc][term]->SetMarkerStyle(20);
534 Two_ex[c1][c2][sc][term]->GetXaxis()->SetTitle("#font[12]{q}_{inv}");
535 Two_ex[c1][c2][sc][term]->GetYaxis()->SetTitle("#font[12]{C}_{2}");
536 Two_ex[c1][c2][sc][term]->SetTitle("");
542 for(int c3=0; c3<2; c3++){
543 for(int sc=0; sc<Sbins_3; sc++){
544 for(int term=0; term<5; term++){
546 TString *name3_ex = new TString("Explicit3_Charge1_");
548 name3_ex->Append("_Charge2_");
550 name3_ex->Append("_Charge3_");
552 name3_ex->Append("_SC_");
554 name3_ex->Append("_M_");
556 name3_ex->Append("_ED_");
558 name3_ex->Append("_Term_");
562 TString *name3_pc = new TString("PairCut3_Charge1_");
564 name3_pc->Append("_Charge2_");
566 name3_pc->Append("_Charge3_");
568 name3_pc->Append("_SC_");
570 name3_pc->Append("_M_");
572 name3_pc->Append("_ED_");
574 name3_pc->Append("_Term_");
577 ///////////////////////////////////////
578 // skip degenerate histograms
579 if(sc==0 || sc==6 || sc==9){// Identical species
580 if( (c1+c2+c3)==1) {if(c1!=0 || c2!=0 || c3!=1) continue;}
581 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
583 if( (c1+c2)==1) {if(c1!=0) continue;}
584 }else {}// do nothing for pi-k-p case
586 /////////////////////////////////////////
591 TString *nameNorm=new TString("PairCut3_Charge1_");
593 nameNorm->Append("_Charge2_");
595 nameNorm->Append("_Charge3_");
597 nameNorm->Append("_SC_");
599 nameNorm->Append("_M_");
601 nameNorm->Append("_ED_");
602 *nameNorm += 0;// EDbin
603 nameNorm->Append("_Term_");
605 nameNorm->Append("_Norm");
606 NormH_pc[term] = ((TH1D*)MyList->FindObject(nameNorm->Data()))->Integral();
608 if(NormH_pc[term] > 0){
612 TString *name_3d = new TString(name3_pc->Data());
613 name_3d->Append("_3D");
614 Three_3d[c1][c2][c3][sc][term] = (TH3D*)MyList->FindObject(name_3d->Data());
615 Three_3d[c1][c2][c3][sc][term]->Sumw2();
616 Three_3d[c1][c2][c3][sc][term]->Scale(NormH_pc[0]/NormH_pc[term]);
617 TString *name_Q3 = new TString(name3_pc->Data());
618 name_Q3->Append("_Q3");
619 Three_1d[c1][c2][c3][sc][term] = (TH1D*)MyList->FindObject(name_Q3->Data());
620 Three_1d[c1][c2][c3][sc][term]->Sumw2();
621 Three_1d[c1][c2][c3][sc][term]->Scale(NormH_pc[0]/NormH_pc[term]);
622 //cout<<"Scale factor = "<<NormH_pc[0]/NormH_pc[term]<<endl;
628 cout<<"normalization = 0. Skipping this SC. SC="<<sc<<" c1="<<c1<<" c2="<<c2<<" c3="<<c3<<endl;
645 cout<<"Done getting Histograms"<<endl;
649 TCanvas *can1 = new TCanvas("can1", "can1",11,53,800,800);
650 can1->SetHighLightColor(2);
651 //can1->Range(-0.7838115,-1.033258,0.7838115,1.033258);
652 gStyle->SetOptFit(0111);
653 can1->SetFillColor(10);
654 can1->SetBorderMode(0);
655 can1->SetBorderSize(2);
656 can1->SetFrameFillColor(0);
657 can1->SetFrameBorderMode(0);
658 can1->SetFrameBorderMode(0);
659 gPad->SetRightMargin(0.025); gPad->SetLeftMargin(0.1); gPad->SetTopMargin(0.02);
662 TLegend *legend1 = new TLegend(.4,.67,.87,.87,NULL,"brNDC");
663 legend1->SetBorderSize(1);
664 legend1->SetTextSize(.04);// small .03; large .036
665 legend1->SetFillColor(0);
667 TLatex *Specif_System = new TLatex(0.23, 0.9,"ALICE p-Pb #sqrt{#font[12]{s}_{NN}}=5.02 TeV, #LT#font[12]{N}_{ch}#GT = 9.8 #pm 0.5");
668 TLatex *Specif_KT3 = new TLatex(0.23, 0.8,"0.16<#font[12]{K}_{T,3}<0.3 GeV/#font[12]{c}");
669 TLatex *Specif_kT = new TLatex(0.23, 0.8,"0.2<#font[12]{k}_{T}<0.3 GeV/#font[12]{c}");
670 TLatex *Specif_FSI = new TLatex(0.23, 0.7,"FSI uncorrected");
671 TLatex *Specif_Disclaimer = new TLatex(0.23, 0.6,"Statistical errors only");
672 Specif_FSI->SetTextFont(42); Specif_System->SetTextFont(42); Specif_KT3->SetTextFont(42); Specif_Disclaimer->SetTextFont(42);
673 Specif_kT->SetTextFont(42);
674 Specif_FSI->SetTextSize(0.04); Specif_System->SetTextSize(0.04); Specif_KT3->SetTextSize(0.04); Specif_Disclaimer->SetTextSize(0.04);
675 Specif_kT->SetTextSize(0.04);
676 Specif_FSI->SetNDC(); Specif_System->SetNDC(); Specif_KT3->SetNDC(); Specif_Disclaimer->SetNDC();
679 /////////////////////////
687 /////////////////////////
688 TH1D *Two_pipi_mp = (TH1D*)Two_ex[0][1][0][0]->Clone();
689 Two_pipi_mp->Divide(Two_ex[0][1][0][1]);
691 // Normalization range counting. Just to evaluate required normalization width in qinv.
692 //cout<<Two_ex[0][0][0][0]->Integral(Two_ex[0][0][0][0]->GetXaxis()->FindBin(0), Two_ex[0][0][0][0]->GetXaxis()->FindBin(0.1))<<endl;
693 //cout<<Two_ex[0][0][0][0]->Integral(Two_ex[0][0][0][0]->GetXaxis()->FindBin(1.06), Two_ex[0][0][0][0]->GetXaxis()->FindBin(1.1))<<endl;
694 //cout<<Two_ex[0][0][0][0]->Integral(Two_ex[0][0][0][0]->GetXaxis()->FindBin(0.15), Two_ex[0][0][0][0]->GetXaxis()->FindBin(0.175))<<endl;
700 TH1D *Two_ex_clone_mm=(TH1D*)Two_ex[0][0][SCOI_2][0]->Clone();
701 Two_ex_clone_mm->Divide(Two_ex[0][0][SCOI_2][1]);
702 TH1D *Two_ex_clone_mp=(TH1D*)Two_ex[0][1][SCOI_2][0]->Clone();
703 Two_ex_clone_mp->Divide(Two_ex[0][1][SCOI_2][1]);
704 TH1D *Two_ex_clone_pp=(TH1D*)Two_ex[1][1][SCOI_2][0]->Clone();
705 Two_ex_clone_pp->Divide(Two_ex[1][1][SCOI_2][1]);
708 Two_ex_clone_mm->GetYaxis()->SetTitle("#font[12]{C}_{2}");
709 Two_ex_clone_mm->SetTitle("");
710 Two_ex_clone_mp->GetYaxis()->SetTitle("#font[12]{C}_{2}");
711 Two_ex_clone_mm->SetMarkerColor(2);
712 Two_ex_clone_mm->SetLineColor(2);
713 Two_ex_clone_mp->SetMarkerColor(1);
714 Two_ex_clone_pp->SetMarkerColor(4);
715 Two_ex_clone_pp->SetLineColor(4);
716 Two_ex_clone_mm->GetXaxis()->SetRangeUser(0,0.6);
717 Two_ex_clone_mm->SetMinimum(0.95);
718 Two_ex_clone_mm->SetMaximum(2.4);
722 Two_ex_clone_mp->SetMarkerColor(4);
723 Two_ex_clone_mp->SetLineColor(4);
724 Two_ex_clone_mm->Add(Two_ex_clone_pp);
725 Two_ex_clone_mm->Scale(0.5);
726 Two_ex_clone_mm->GetYaxis()->SetTitle("#font[12]{C}_{2}^{MC}");
727 Two_ex_clone_mm->GetYaxis()->SetTitleOffset(1.3);
728 Two_ex_clone_mm->SetMinimum(0.95);
729 Two_ex_clone_mm->SetMaximum(1.3);
730 Two_ex_clone_mm->DrawCopy();
731 gStyle->SetOptFit(1111);
732 Two_ex_clone_mm->Fit(BkgMCFit,"","",0,1.8);
733 //BkgMCFit->Draw("same");
734 Two_ex_clone_mp->DrawCopy("same");
735 legend1->AddEntry(Two_ex_clone_mm,"same-charge","p");
736 //legend1->AddEntry(Two_ex_clone_pp,"++","p");
737 legend1->AddEntry(Two_ex_clone_mp,"mixed-charge","p");
738 legend1->Draw("same");
741 //for(int i=0; i<100; i++){
742 //cout<<Two_ex_clone_mm->GetBinContent(i+1)<<", ";
745 TF1 *C2osFit_CMS = new TF1("C2osFit_CMS","[0] + [1]*exp(-pow([2]*x,2))",0,2);
746 C2osFit_CMS->FixParameter(0, 9.93558e-01);
747 C2osFit_CMS->FixParameter(1, 5.19578e-02);
748 C2osFit_CMS->FixParameter(2, 1.89425e+00);
750 /////////////////////////////////////////////////////
751 // Global fitting C2os and C2ss
752 double C2ssSys_e[BINRANGE_C2global]={0};
753 double C2osSys_e[BINRANGE_C2global]={0};
755 const int npar=10;// 10
756 TMinuit MyMinuit(npar);
757 MyMinuit.SetFCN(fcnC2_Global);
758 double arglist_C2 = 0; int dummy=0;
759 MyMinuit.mnexcm("SET NOWarnings",&arglist_C2,1, dummy);
761 MyMinuit.mnexcm("SET PRint",&arglist_C2,1, dummy);
762 double OutputPar[npar]={0};
763 double OutputPar_e[npar]={0};
765 double par[npar]; // the start values
766 double stepSize[npar]; // step sizes
767 double minVal[npar]; // minimum bound on parameter
768 double maxVal[npar]; // maximum bound on parameter
769 string parName[npar];
771 TH1D *temp_mm=(TH1D*)Two_ex[0][0][SCOI_2][0]->Clone();
772 temp_mm->Divide(Two_ex[0][0][SCOI_2][1]);
773 TH1D *temp_mp=(TH1D*)Two_ex[0][1][SCOI_2][0]->Clone();
774 temp_mp->Divide(Two_ex[0][1][SCOI_2][1]);
775 TH1D *temp_pp=(TH1D*)Two_ex[1][1][SCOI_2][0]->Clone();
776 temp_pp->Divide(Two_ex[1][1][SCOI_2][1]);
777 TH1D *C2ssRaw=(TH1D*)temp_mm->Clone();// MRC uncorrected
778 TH1D *C2osRaw=(TH1D*)temp_mp->Clone();// MRC uncorrected
779 C2ssRaw->SetMarkerStyle(24);
780 C2osRaw->SetMarkerStyle(21);//21
781 C2ssRaw->SetMarkerColor(2);
782 C2osRaw->SetMarkerColor(4);
784 for(int i=0; i<BINRANGE_C2global; i++){
785 if(i >= temp_mm->GetNbinsX()) continue;// bin limit
787 C2ssFitting[i] = (temp_mm->GetBinContent(i+1) + temp_pp->GetBinContent(i+1))/2.;
790 if(MomResC2[0]->GetBinContent(i+1) > 0) MRC_SC = (MomResC2[0]->GetBinContent(i+1)-1)*MRCShift + 1;
791 if(MomResC2[1]->GetBinContent(i+1) > 0) MRC_MC = (MomResC2[1]->GetBinContent(i+1)-1)*MRCShift + 1;
792 if(!GeneratedSignal && !MCcase) C2ssFitting[i] *= MRC_SC;
793 C2ssFitting_e[i] = pow(MRC_SC*sqrt(pow(temp_mm->GetBinError(i+1),2) + pow(temp_pp->GetBinError(i+1),2))/sqrt(2.),2);
794 C2ssRaw->SetBinContent(i+1, (temp_mm->GetBinContent(i+1) + temp_pp->GetBinContent(i+1))/2.);
795 C2ssRaw->SetBinError(i+1, pow(sqrt(pow(temp_mm->GetBinError(i+1),2) + pow(temp_pp->GetBinError(i+1),2))/sqrt(2.),2));
796 C2ssFitting_e[i] = sqrt(C2ssFitting_e[i]);
797 C2osFitting[i] = temp_mp->GetBinContent(i+1);
798 if(!GeneratedSignal && !MCcase) C2osFitting[i] *= MRC_MC;
799 C2osFitting_e[i] = pow(MRC_MC*temp_mp->GetBinError(i+1),2);
800 C2osRaw->SetBinContent(i+1, temp_mp->GetBinContent(i+1));
801 C2osRaw->SetBinError(i+1, temp_mp->GetBinError(i+1));
802 C2osFitting_e[i] += pow((MRC_MC-1)*0.1 * temp_mp->GetBinContent(i+1),2);
803 C2osFitting_e[i] = sqrt(C2osFitting_e[i]);
805 C2ssSys_e[i] = pow((MRC_SC-1)*0.1 * (temp_mm->GetBinContent(i+1) + temp_pp->GetBinContent(i+1))/2.,2);
806 C2ssSys_e[i] = sqrt(C2ssSys_e[i]);
807 C2osSys_e[i] = pow((MRC_MC-1)*0.1 * temp_mp->GetBinContent(i+1),2);
808 C2osSys_e[i] = sqrt(C2osSys_e[i]);
810 if(UseC2Bkg) C2ssFitting[i] /= BkgMCFit->Eval(BinCenters[i]);
812 // method with undilution for plotting purposes
813 //C2ssFitting[i] = (C2ssFitting[i] - (1-lambda_PM)) / (CoulCorr2(+1, BinCenters[i]) * lambda_PM);
814 // divide CMS background
815 //C2ssFitting[i] /= C2osFit_CMS->Eval(BinCenters[i]);
817 K2SS[i] = CoulCorr2(+1, BinCenters[i]);
818 K2OS[i] = CoulCorr2(-1, BinCenters[i]);
830 C2ssFitting[0]=-1000; C2osFitting[0]=-1000;
831 C2ssFitting_e[0]=1000; C2osFitting_e[0]=1000;
832 K2SS_e[0]=1000; K2OS_e[0]=1000;
835 //arglist[0]=2;// improve Minimization Strategy (1 is default)
836 //MyMinuit.mnexcm("SET STR",arglist,1,ierflg);
838 //MyMinuit.mnexcm("SCAN", arglist,1,ierflg);
839 arglist[0] = 5000;// 5000
840 MyMinuit.mnexcm("MIGRAD", arglist ,1,ierflg);
842 TF1 *fitC2ss_Base = new TF1("fitC2ss_Base",C2ssFitFunction, 0.005,2, npar);//0.2
843 TF1 *fitC2ss_Expan = new TF1("fitC2ss_Expan",C2ssFitFunction, 0.005,2, npar);//0.2
844 fitC2ss_Base->SetLineStyle(2);
845 TH1D *fitC2ss_h = new TH1D("fitC2ss_h","",Two_ex_clone_mm->GetNbinsX(),Two_ex_clone_mm->GetXaxis()->GetBinLowEdge(1), Two_ex_clone_mm->GetXaxis()->GetBinUpEdge(Two_ex_clone_mm->GetNbinsX()));
847 for(int ft=0; ft<2; ft++){// Gaussian or EW
848 if(ft==1 && !IncludeExpansion) continue;
849 par[0] = 1.0; par[1]=0.7; par[2]=0.5; par[3]=7.2; par[4] = .1; par[5] = .0; par[6] = .0; par[7] = 0.; par[8] = 0.; par[9] = 0.;// was par[1]=0.5
850 stepSize[0] = 0.01; stepSize[1] = 0.01; stepSize[2] = 0.02; stepSize[3] = 0.2; stepSize[4] = 0.01; stepSize[5] = 0.001; stepSize[6] = 0.001; stepSize[7] = 0.001; stepSize[8]=0.001; stepSize[9]=0.01;
851 minVal[0] = 0.955; minVal[1] = 0.5; minVal[2] = 0.; minVal[3] = 0.1; minVal[4] = 0.001; minVal[5] = -10.; minVal[6] = -10.; minVal[7] = -10.; minVal[8]=-10; minVal[9] = 0.995;// minVal[1] was 0.2
852 maxVal[0] = 1.1; maxVal[1] = 1.3; maxVal[2] = 0.99; maxVal[3] = 15.; maxVal[4] = 2.; maxVal[5] = 10.; maxVal[6] = 10.; maxVal[7] = 10.; maxVal[8]=10.; maxVal[9]=1.1;// maxVal[1] was 1.0
853 if(Gaussian==kFALSE) {maxVal[1]=2.0; maxVal[3]=20.0;}
855 parName[0] = "Norm"; parName[1] = "#Lambda"; parName[2] = "G"; parName[3] = "Rch"; parName[4] = "Rcoh";
856 parName[5] = "coeff_3"; parName[6] = "coeff_4"; parName[7] = "coeff_5"; parName[8]="coeff_6"; parName[9]="Norm_2";
858 for (int i=0; i<npar; i++){
859 MyMinuit.DefineParameter(i, parName[i].c_str(), par[i], stepSize[i], minVal[i], maxVal[i]);
862 //MyMinuit.DefineParameter(1, parName[1].c_str(), 0.7, stepSize[1], minVal[1], maxVal[1]); MyMinuit.FixParameter(1);// lambda
863 //MyMinuit.DefineParameter(0, parName[0].c_str(), .998, stepSize[0], minVal[0], maxVal[0]); MyMinuit.FixParameter(0);// N
864 MyMinuit.DefineParameter(2, parName[2].c_str(), 0., stepSize[2], minVal[2], maxVal[2]); MyMinuit.FixParameter(2);// G
865 MyMinuit.DefineParameter(4, parName[4].c_str(), 0., stepSize[4], minVal[4], maxVal[4]); MyMinuit.FixParameter(4);// Rcoh
866 MyMinuit.DefineParameter(7, parName[7].c_str(), 0, stepSize[7], minVal[7], maxVal[7]); MyMinuit.FixParameter(7);// k5
867 MyMinuit.DefineParameter(8, parName[8].c_str(), 0, stepSize[8], minVal[8], maxVal[8]); MyMinuit.FixParameter(8);// k6
871 MyMinuit.DefineParameter(5, parName[5].c_str(), 0, stepSize[5], minVal[5], maxVal[5]); MyMinuit.FixParameter(5);// k3
872 MyMinuit.DefineParameter(6, parName[6].c_str(), 0, stepSize[6], minVal[6], maxVal[6]); MyMinuit.FixParameter(6);// k4
873 }else{// IncludeExpansion
876 MyMinuit.DefineParameter(5, parName[5].c_str(), kappa3, stepSize[5], minVal[5], maxVal[5]); MyMinuit.FixParameter(5);// k3
877 MyMinuit.DefineParameter(6, parName[6].c_str(), kappa4, stepSize[6], minVal[6], maxVal[6]); MyMinuit.FixParameter(6);// k4
879 MyMinuit.DefineParameter(5, parName[5].c_str(), 0, stepSize[5], minVal[5], maxVal[5]); MyMinuit.FixParameter(5);// k3
880 MyMinuit.DefineParameter(6, parName[6].c_str(), 0, stepSize[6], minVal[6], maxVal[6]); MyMinuit.FixParameter(6);// k4
886 MyMinuit.mnexcm( "RELease", tmp, 1, err );// kappa3
888 MyMinuit.mnexcm( "RELease", tmp, 1, err );// kappa4
893 if(IncludeSS==kFALSE){
894 MyMinuit.DefineParameter(3, parName[3].c_str(), 9.1, stepSize[3], minVal[3], maxVal[3]); MyMinuit.FixParameter(3);// Rch
895 MyMinuit.DefineParameter(0, parName[0].c_str(), .998, stepSize[0], minVal[0], maxVal[0]); MyMinuit.FixParameter(0);// N
896 MyMinuit.DefineParameter(5, parName[5].c_str(), 0, stepSize[5], minVal[5], maxVal[5]); MyMinuit.FixParameter(5);// k3
897 MyMinuit.DefineParameter(6, parName[6].c_str(), 0, stepSize[6], minVal[6], maxVal[6]); MyMinuit.FixParameter(6);// k4
899 if(IncludeOS==kFALSE){
900 MyMinuit.DefineParameter(9, parName[9].c_str(), 1.002, stepSize[9], minVal[9], maxVal[9]); MyMinuit.FixParameter(9);// N_2
904 // Do the minimization!
906 cout<<"Start C2 Global fit"<<endl;
907 MyMinuit.Migrad();// generally the best minimization algorithm
908 cout<<"End C2 Global fit"<<endl;
910 for (int i=0; i<npar; i++){
911 MyMinuit.GetParameter(i,OutputPar[i],OutputPar_e[i]);
913 MyMinuit.mnexcm("SHOw PARameters", &arglist_C2, 1, ierflg);
914 cout<<"C2 fit: Chi2/NDF = "<<Chi2_C2global/(NFitPoints_C2global - MyMinuit.GetNumFreePars())<<" Chi^2="<<Chi2_C2global<<endl;
916 if(ft==0){// Gaussian or Exponential
917 for(int i=0; i<npar; i++) {
918 fitC2ss_Base->FixParameter(i,OutputPar[i]);
919 fitC2ss_Base->SetParError(i,OutputPar_e[i]);
921 for(int bin=1; bin<=Two_ex_clone_mm->GetNbinsX(); bin++){
922 double qinv = Two_ex_clone_mm->GetXaxis()->GetBinCenter(bin);
923 if(!MCcase) fitC2ss_h->SetBinContent(bin, fitC2ss_Base->Eval(qinv));// Base fit
926 }else{// Edgeworth or Laguerre
927 for(int i=0; i<npar; i++) {
928 fitC2ss_Expan->FixParameter(i,OutputPar[i]);
929 fitC2ss_Expan->SetParError(i,OutputPar_e[i]);
931 for(int bin=1; bin<=Two_ex_clone_mm->GetNbinsX(); bin++){
932 //double qinv = Two_ex_clone_mm->GetXaxis()->GetBinCenter(bin);
933 //if(!MCcase) fitC2ss_h->SetBinContent(bin, fitC2ss_Expan->Eval(qinv));// uncomment to show expansion
936 double lambdaStar=0, lambdaStar_e=0;
938 lambdaStar = OutputPar[1]*pow(1 + OutputPar[6]/8.,2);
939 lambdaStar_e = pow(OutputPar_e[1]*(1 + OutputPar[6]/8.),2);
940 lambdaStar_e = sqrt(lambdaStar_e);
942 lambdaStar = OutputPar[1]*pow(1 - OutputPar[5] + OutputPar[6],2);
943 lambdaStar_e = pow(OutputPar_e[1]*(1 - OutputPar[5] + OutputPar[6]),2);
944 lambdaStar_e = sqrt(lambdaStar_e);
946 cout<<"lambda* = "<<lambdaStar<<" +- "<<lambdaStar_e<<endl;
948 //if(ft==0) {MainFitParams[0]=OutputPar[3]; MainFitParams[2]=OutputPar[1];}
949 //else {MainFitParams[4]=OutputPar[3]; MainFitParams[6]=OutputPar[1];}
953 TH1D *C2_ss=(TH1D*)Two_ex_clone_mm->Clone();
954 TH1D *C2_os=(TH1D*)Two_ex_clone_mp->Clone();
955 TH1D *C2_ss_Momsys=(TH1D*)Two_ex_clone_mm->Clone();
956 TH1D *C2_os_Momsys=(TH1D*)Two_ex_clone_mp->Clone();
957 TH1D *C2_ss_Ksys=(TH1D*)Two_ex_clone_mm->Clone();
958 TH1D *C2_os_Ksys=(TH1D*)Two_ex_clone_mp->Clone();
959 TH1D *K2_ss = (TH1D*)Two_ex_clone_mm->Clone();
960 TH1D *K2_os = (TH1D*)Two_ex_clone_mp->Clone();
962 for(int i=0; i<BINRANGE_C2global; i++){
963 C2_ss->SetBinContent(i+1, C2ssFitting[i]);
964 C2_os->SetBinContent(i+1, C2osFitting[i]);
965 C2_ss_Momsys->SetBinContent(i+1, C2ssFitting[i]);
966 C2_os_Momsys->SetBinContent(i+1, C2osFitting[i]);
967 C2_ss_Ksys->SetBinContent(i+1, C2ssFitting[i]);
968 C2_os_Ksys->SetBinContent(i+1, C2osFitting[i]);
969 double Toterror_ss = sqrt(fabs(pow(C2ssFitting_e[i],2)-pow(C2ssSys_e[i],2)));
970 double Toterror_os = sqrt(fabs(pow(C2osFitting_e[i],2)-pow(C2osSys_e[i],2)));
971 C2_ss->SetBinError(i+1, Toterror_ss);
972 C2_os->SetBinError(i+1, Toterror_os);
973 C2_ss_Momsys->SetBinError(i+1, C2ssSys_e[i]);
974 C2_os_Momsys->SetBinError(i+1, C2osSys_e[i]);
975 C2_ss_Ksys->SetBinError(i+1, OutputPar[1]*K2SS_e[i]);
976 C2_os_Ksys->SetBinError(i+1, OutputPar[1]*K2OS_e[i]);
978 K2_ss->SetBinContent(i+1, K2SS[i]); K2_ss->SetBinError(i+1, 0);
979 K2_os->SetBinContent(i+1, K2OS[i]); K2_os->SetBinError(i+1, 0);
982 C2_ss_Momsys->SetMarkerSize(0);
983 C2_ss_Momsys->SetFillStyle(1000);
984 C2_ss_Momsys->SetFillColor(kRed-10);
985 C2_os_Momsys->SetMarkerSize(0);
986 C2_os_Momsys->SetFillStyle(1000);
987 C2_os_Momsys->SetFillColor(kBlue-10);
988 C2_ss_Ksys->SetMarkerSize(0);
989 C2_ss_Ksys->SetFillStyle(3004);
990 C2_ss_Ksys->SetFillColor(kRed);
991 C2_os_Ksys->SetMarkerSize(0);
992 C2_os_Ksys->SetFillStyle(3004);
993 C2_os_Ksys->SetFillColor(kBlue);
996 C2_ss->GetXaxis()->SetRangeUser(0,Q2Limit);// 0,0.098
997 C2_ss->GetYaxis()->SetRangeUser(0.95,2.4);//0.98,1.3
998 C2_ss->GetXaxis()->SetTitleOffset(.8);
999 C2_ss->GetYaxis()->SetTitleOffset(.85);
1000 C2_ss->GetXaxis()->SetTitle("#font[12]{q} (GeV/c)");
1001 C2_ss->GetYaxis()->SetTitle("#font[12]{C}_{2}");
1002 C2_ss->GetXaxis()->SetTitleSize(0.05);
1003 C2_ss->GetYaxis()->SetTitleSize(0.05);
1004 C2_os->GetXaxis()->SetRangeUser(0,0.6);
1005 C2_os->GetYaxis()->SetRangeUser(0.98,1.3);
1006 C2_os->GetXaxis()->SetTitleOffset(.8);
1007 C2_os->GetYaxis()->SetTitleOffset(.8);
1008 C2_os->GetXaxis()->SetTitle("#font[12]{q} (GeV/c)");
1009 C2_os->GetXaxis()->SetTitleSize(0.05);
1010 C2_os->GetYaxis()->SetTitleSize(0.05);
1012 //C2_ss->SetMarkerSize(1.5);
1013 //C2_os->SetMarkerSize(1.5);
1014 C2_os->SetMarkerStyle(25);
1015 C2_os->SetMarkerColor(4);
1018 fitC2ss_h->SetLineWidth(2);
1019 fitC2ss_h->SetLineColor(2);
1021 TH1D *temp_hist_ss=new TH1D("temp_hist_ss","",100,0,0.5);
1022 TH1D *temp_hist_os=new TH1D("temp_hist_os","",100,0,0.5);
1023 TH1D *temp_fit=new TH1D("temp_fit","",100,0,0.5);
1026 double temp_points_ss[100]={-1000, 1.31587, 1.40841, 1.4426, 1.36602, 1.37548, 1.34059, 1.30318, 1.27143, 1.28487, 1.26105, 1.21905, 1.2025, 1.19743, 1.15297, 1.16947, 1.14259, 1.13562, 1.13135, 1.10088, 1.10227, 1.08037, 1.0824, 1.08069, 1.0657, 1.06808, 1.05341, 1.0493, 1.05081, 1.04546, 1.04644, 1.03703, 1.03975, 1.04479, 1.03218, 1.02657, 1.02588, 1.02756, 1.02345, 1.02306, 1.02024, 1.01551, 1.01133, 1.01025, 1.00697, 1.01819, 1.00651, 1.01293, 1.00529, 0.997971, 1.00141, 1.00665, 1.01479, 1.01668, 1.00657, 1.01188, 1.0042, 0.995877, 1.01094, 1.0036, 1.00312, 0.994031, 1.0084, 1.00604, 1.00329, 1.00677, 0.997553, 0.992874, 0.993799, 0.995368, 0.999215, 1.00508, 0.993053, 0.996744, 0.990297, 0.990715, 1.00114, 0.996376, 0.984527, 0.99474, 0.993457, 1.00723, 0.999042, 0.996589, 0.988385, 0.9916, 0.995184, 0.988197, 1.00019, 0.998052, 0.985506, 0.99024, 0.996102, 0.995797, 0.991887, 0.99276, 0.992561, 0.991261, 0.996243};
1027 double temp_points_ss_e[100]={1000, 0.206703, 0.0920405, 0.0637848, 0.0465513, 0.0380257, 0.0318382, 0.0270753, 0.0236593, 0.0216127, 0.0195971, 0.0176654, 0.0163346, 0.0153927, 0.0141902, 0.0136715, 0.0128887, 0.0124019, 0.0119795, 0.0113642, 0.0111615, 0.0106718, 0.0104775, 0.0102842, 0.0100296, 0.00990822, 0.00962737, 0.0094588, 0.00935572, 0.00923423, 0.0091266, 0.00897368, 0.00889453, 0.00883246, 0.00864815, 0.00853381, 0.00846384, 0.00839173, 0.00829825, 0.00822044, 0.00817065, 0.00805352, 0.00798793, 0.00791266, 0.00784862, 0.00788769, 0.00775376, 0.00772075, 0.00766719, 0.00757909, 0.00754696, 0.00755056, 0.00756756, 0.00754031, 0.00746571, 0.00745114, 0.00739226, 0.00729679, 0.00737659, 0.00730319, 0.00730321, 0.0072228, 0.00728131, 0.00726075, 0.0072364, 0.00723868, 0.00716992, 0.00712198, 0.00713157, 0.00713724, 0.00714391, 0.007175, 0.00708838, 0.00711573, 0.00709965, 0.00707786, 0.00713124, 0.00712164, 0.00703573, 0.00712383, 0.00709407, 0.00720098, 0.00713966, 0.00716466, 0.00710145, 0.00711087, 0.00714815, 0.00710751, 0.00717636, 0.00718936, 0.00712875, 0.00715855, 0.00718908, 0.00719846, 0.00719133, 0.00720147, 0.00721384, 0.00720763, 0.0072536};
1030 for(int bin=1; bin<100; bin++){
1031 //cout<<C2_ss->GetBinContent(bin)<<", ";
1032 //cout<<C2_ss->GetBinError(bin)<<", ";
1033 //cout<<fitC2ss_h->GetBinContent(bin)<<", ";
1034 temp_hist_ss->SetBinContent(bin, temp_points_ss[bin-1]);
1035 temp_hist_ss->SetBinError(bin, temp_points_ss_e[bin-1]);
1036 //temp_hist_os->SetBinContent(bin, temp_points_os[bin-1]);
1037 //temp_hist_os->SetBinError(bin, temp_points_os_e[bin-1]);
1038 //temp_fit->SetBinContent(bin, temp_points_fit[bin-1]);
1041 temp_hist_ss->SetMarkerStyle(20);
1042 temp_hist_ss->SetMarkerColor(1);
1043 temp_hist_os->SetMarkerStyle(24);
1044 temp_hist_os->SetMarkerColor(1);
1045 temp_fit->SetLineColor(1);
1046 C2_os->SetMarkerStyle(24);
1047 C2_os->SetMarkerColor(2);
1051 //C2_ss->SetMaximum(1.6);
1053 //legend1->AddEntry(C2_ss,"same-charge","p");
1054 C2_os->DrawCopy("same");
1055 //legend1->AddEntry(C2_os,"mixed-charge","p");
1057 Specif_System->Draw("same");
1058 Specif_kT->Draw("same");
1059 Specif_FSI->Draw("same");
1060 Specif_Disclaimer->Draw("same");
1062 TLatex *Stats1 = new TLatex(.5,.55, "#lambda = 0.41 #pm 0.004");
1064 Stats1->SetTextSize(0.06);
1065 //Stats1->Draw("same");
1066 TLatex *Stats2 = new TLatex(.5,.45, "R_{inv} = 1.59 #pm 0.01 fm");
1068 Stats2->SetTextSize(0.06);
1070 //Stats2->Draw("same");
1071 /*TF1 *BkgFitC2 = new TF1("BkgFitC2","1+[0]*exp(-pow([1]*x/0.19733,2))",0,1);
1072 BkgFitC2->SetParameter(0,0.08);
1073 BkgFitC2->SetParameter(1,0.5);
1074 BkgFitC2->SetLineColor(1);
1075 C2_ss->Fit(BkgFitC2,"IME","",0.2,0.8);
1076 BkgFitC2->Draw("same");*/
1078 //fitC2ss_h->SetLineColor(1);
1079 Unity->Draw("same");
1080 fitC2ss_h->Draw("C same");
1081 //temp_hist_ss->Draw("same");
1082 //temp_hist_os->Draw("same");
1083 //temp_fit->Draw("C same");
1084 //fitC2ss_Base->Draw("C same");
1085 //fitC2ss_Expan->Draw("C same");
1086 //legend1->AddEntry(C2_ss,"p-Pb (++)","p");
1087 //legend1->AddEntry(C2_os,"p-Pb (-+)","p");
1088 //legend1->AddEntry(temp_hist_ss,"Pb-Pb (++), Mbin 16","p");
1089 //legend1->AddEntry(temp_hist_os,"Pb-Pb (-+), <Nch>=36","p");
1090 legend1->Draw("same");
1095 cout<<"============================================"<<endl;
1096 cout<<"Start 3-pion section"<<endl;
1098 TCanvas *can2 = new TCanvas("can2", "can2",800,0,800,800);//800,0,600,900
1099 can2->SetHighLightColor(2);
1100 gStyle->SetOptFit(0111);
1101 can2->SetFillColor(10);
1102 can2->SetBorderMode(0);
1103 can2->SetBorderSize(2);
1106 can2->SetFrameFillColor(0);
1107 can2->SetFrameBorderMode(0);
1108 can2->SetFrameBorderMode(0);
1110 gPad->SetRightMargin(0.02);
1112 TLegend *legend2 = new TLegend(.58,.55, .97,.65,NULL,"brNDC");
1113 legend2->SetBorderSize(1);
1114 legend2->SetTextSize(.03);// small .03; large .06
1115 legend2->SetFillColor(0);
1117 /////////////////////////////////////////////
1118 TH3D *C3QS_3d = new TH3D("C3QS_3d","",BINRANGE_3,0,.4, BINRANGE_3,0,.4, BINRANGE_3,0,.4);
1119 TH3D *Combinatorics_3d = new TH3D("Combinatorics_3d","",BINRANGE_3,0,.4, BINRANGE_3,0,.4, BINRANGE_3,0,.4);
1122 const float Q3HistoLimit=0.5;
1123 const int Q3BINS = int((Q3HistoLimit+0.0001)/0.01);
1124 TH1D *num_withRS = new TH1D("num_withRS","",Q3BINS,0,Q3HistoLimit);
1125 TH1D *num_withGRS = new TH1D("num_withGRS","",Q3BINS,0,Q3HistoLimit);
1126 TH1D *num_withTM = new TH1D("num_withTM","",Q3BINS,0,Q3HistoLimit);
1127 TH1D *Cterm1 = new TH1D("Cterm1","",Q3BINS,0,Q3HistoLimit);
1128 TH1D *Cterm1_noMRC = new TH1D("Cterm1_noMRC","",Q3BINS,0,Q3HistoLimit);
1129 TH1D *Cterm2 = new TH1D("Cterm2","",Q3BINS,0,Q3HistoLimit);
1130 TH1D *Cterm3 = new TH1D("Cterm3","",Q3BINS,0,Q3HistoLimit);
1131 TH1D *Cterm4 = new TH1D("Cterm4","",Q3BINS,0,Q3HistoLimit);
1132 TH1D *num_QS = new TH1D("num_QS","",Q3BINS,0,Q3HistoLimit);
1133 TH1D *Combinatorics_1d = new TH1D("Combinatorics_1d","",Q3BINS,0,Q3HistoLimit);
1134 TH1D *Combinatorics_1d_noMRC = new TH1D("Combinatorics_1d_noMRC","",Q3BINS,0,Q3HistoLimit);
1135 TH1D *Coul_Riverside = new TH1D("Coul_Riverside","",Q3BINS,0,Q3HistoLimit);
1136 TH1D *Coul_GRiverside = new TH1D("Coul_GRiverside","",Q3BINS,0,Q3HistoLimit);
1137 TH1D *c3_hist = new TH1D("c3_hist","",Q3BINS,0,Q3HistoLimit);
1139 if(SameCharge) {Cterm1_noMRC->Sumw2(); Combinatorics_1d_noMRC->Sumw2();}
1141 double num_QS_e[Q3BINS];
1142 double c3_e[Q3BINS];
1144 for(int ii=0; ii<Q3BINS; ii++){
1149 // CB=Charge Bin. 0 means pi-, 1 means pi+
1150 int CB1=0, CB2=0, CB3=0;
1151 int CP12=1, CP13=1, CP23=1;
1152 int CB1_2=0, CB2_2=0, CB3_2=0;
1154 if(SameCharge) {CB1=0; CB2=0; CB3=0;}
1155 else {CB1=0; CB2=0; CB3=1; CP12=+1, CP13=-1, CP23=-1;}
1157 if(SameCharge) {CB1=1; CB2=1; CB3=1;}
1158 else {CB1=0; CB2=1; CB3=1; CP12=-1, CP13=-1, CP23=+1;}
1162 if(SameCharge) {CB1_2=1; CB2_2=1; CB3_2=1;}
1163 else {CB1_2=0; CB2_2=1; CB3_2=1;};
1165 if(SameCharge) {CB1_2=0; CB2_2=0; CB3_2=0;}
1166 else {CB1_2=0; CB2_2=0; CB3_2=1;}
1171 // SC = species combination. Always 0 meaning pi-pi-pi.
1175 TH1D *GenSignalExpected_num=new TH1D("GenSignalExpected_num","",Q3BINS,0,Q3HistoLimit);
1176 TH1D *GenSignalExpected_den=new TH1D("GenSignalExpected_den","",Q3BINS,0,Q3HistoLimit);
1183 for(int i=2; i<=BINLIMIT_3; i++){// bin number
1184 double Q12 = BinCenters[i-1];// true center
1185 //int Q12bin = int(Q12/0.01)+1;
1187 for(int j=2; j<=BINLIMIT_3; j++){// bin number
1188 double Q13 = BinCenters[j-1];// true center
1189 //int Q13bin = int(Q13/0.01)+1;
1191 for(int k=2; k<=BINLIMIT_3; k++){// bin number
1192 double Q23 = BinCenters[k-1];// true center
1193 //int Q23bin = int(Q23/0.01)+1;
1196 double Q3 = sqrt(pow(Q12,2) + pow(Q13,2) + pow(Q23,2));
1197 int Q3bin = Cterm1->GetXaxis()->FindBin(Q3);
1199 if(Q12 < sqrt(pow(Q13,2)+pow(Q23,2) - 2*Q13*Q23)) continue;// not all configurations are possible
1200 if(Q12 > sqrt(pow(Q13,2)+pow(Q23,2) + 2*Q13*Q23)) continue;// not all configurations are possible
1204 double G_12 = Gamov(CP12, Q12);// point-source Coulomb correlation
1205 double G_13 = Gamov(CP13, Q13);
1206 double G_23 = Gamov(CP23, Q23);
1207 double K2_12 = CoulCorr2(CP12, Q12);// finite-source Coulomb+Strong correlation from Therminator.
1208 double K2_13 = CoulCorr2(CP13, Q13);
1209 double K2_23 = CoulCorr2(CP23, Q23);
1210 double K3 = 1.;// 3-body Coulomb+Strong correlation
1211 if(SameCharge || CHARGE==-1) K3 = CoulCorrGRS(SameCharge, Q12, Q13, Q23);
1212 else K3 = CoulCorrGRS(SameCharge, Q23, Q12, Q13);
1214 if(MCcase && !GeneratedSignal) { K2_12=1.; K2_13=1.; K2_23=1.; K3=1.;}
1217 double TERM1=Three_3d[CB1][CB2][CB3][SCBin][0]->GetBinContent(i,j,k);// N3 (3-pion yield per q12,q13,q23 cell). 3-pions from same-event
1218 double TERM2=Three_3d[CB1][CB2][CB3][SCBin][1]->GetBinContent(i,j,k);// N2*N1. 1 and 2 from same-event
1219 double TERM3=Three_3d[CB1][CB2][CB3][SCBin][2]->GetBinContent(i,j,k);// N2*N1. 1 and 3 from same-event
1220 double TERM4=Three_3d[CB1][CB2][CB3][SCBin][3]->GetBinContent(i,j,k);// N2*N1. 2 and 3 from same-event
1221 double TERM5=Three_3d[CB1][CB2][CB3][SCBin][4]->GetBinContent(i,j,k);// N1*N1*N1. All from different events (pure combinatorics)
1223 if(CHARGE==-1){// base is (SC,MC,MC)
1224 TERM1 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][0]->GetBinContent(j,k,i);
1225 TERM2 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][1]->GetBinContent(j,k,i);
1226 TERM3 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][2]->GetBinContent(j,k,i);
1227 TERM4 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][3]->GetBinContent(j,k,i);
1228 TERM5 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][4]->GetBinContent(j,k,i);
1229 }else {// base is (MC,MC,SC)
1230 TERM1 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][0]->GetBinContent(k,i,j);
1231 TERM2 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][1]->GetBinContent(k,i,j);
1232 TERM3 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][2]->GetBinContent(k,i,j);
1233 TERM4 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][3]->GetBinContent(k,i,j);
1234 TERM5 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][4]->GetBinContent(k,i,j);
1238 if(TERM1==0 && TERM2==0 && TERM3==0 && TERM4==0 && TERM5==0) continue;
1239 if(TERM1==0 || TERM2==0 || TERM3==0 || TERM4==0 || TERM5==0) continue;
1241 double muonCorr_C3=1.0, muonCorr_C2_12=1.0, muonCorr_C2_13=1.0, muonCorr_C2_23=1.0;
1242 if(MuonCorrection && !MCcase){
1244 muonCorr_C3 = C3muonCorrection->GetBinContent(C3muonCorrection->GetXaxis()->FindBin(Q3));
1245 muonCorr_C2_12 = C2muonCorrection_SC->GetBinContent(C2muonCorrection_SC->GetXaxis()->FindBin(Q12));
1246 muonCorr_C2_13 = C2muonCorrection_SC->GetBinContent(C2muonCorrection_SC->GetXaxis()->FindBin(Q13));
1247 muonCorr_C2_23 = C2muonCorrection_SC->GetBinContent(C2muonCorrection_SC->GetXaxis()->FindBin(Q23));
1249 muonCorr_C3 = C3muonCorrection->GetBinContent(C3muonCorrection->GetXaxis()->FindBin(Q3));
1250 if(CHARGE==-1){// pi-pi-pi+
1251 muonCorr_C2_12 = C2muonCorrection_SC->GetBinContent(C2muonCorrection_SC->GetXaxis()->FindBin(Q12));
1252 muonCorr_C2_13 = C2muonCorrection_MC->GetBinContent(C2muonCorrection_MC->GetXaxis()->FindBin(Q13));
1253 muonCorr_C2_23 = C2muonCorrection_MC->GetBinContent(C2muonCorrection_MC->GetXaxis()->FindBin(Q23));
1255 muonCorr_C2_12 = C2muonCorrection_MC->GetBinContent(C2muonCorrection_MC->GetXaxis()->FindBin(Q12));
1256 muonCorr_C2_13 = C2muonCorrection_MC->GetBinContent(C2muonCorrection_MC->GetXaxis()->FindBin(Q13));
1257 muonCorr_C2_23 = C2muonCorrection_SC->GetBinContent(C2muonCorrection_SC->GetXaxis()->FindBin(Q23));
1262 // apply momentum resolution correction
1263 if(!MCcase && !GeneratedSignal){
1264 int MRC_Q3bin = int(Q3/0.01) + 1;
1266 TERM1 *= (MomRes1d[0][0]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1267 TERM2 *= (MomRes1d[0][1]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1268 TERM3 *= (MomRes1d[0][2]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1269 TERM4 *= (MomRes1d[0][3]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1270 TERM5 *= (MomRes1d[0][4]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1272 // removed due to over-correction of 1-D MRC approximation
1273 TERM1 *= (MomRes1d[1][0]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1274 TERM2 *= (MomRes1d[1][1]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1275 TERM3 *= (MomRes1d[1][2]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1276 TERM4 *= (MomRes1d[1][3]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1277 TERM5 *= (MomRes1d[1][4]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1282 TwoFrac=lambda_PM;// 0.7
1283 OneFrac=pow(TwoFrac,.5); ThreeFrac=pow(TwoFrac,1.5);
1286 // Purify. Isolate pure 3-pion QS correlations using Lambda and K3 (removes lower order correlations)
1288 N3_QS -= ( pow(1-OneFrac,3) + 3*OneFrac*pow(1-OneFrac,2) )*TERM5;
1289 N3_QS -= (1-OneFrac)*(TERM2 + TERM3 + TERM4 - 3*(1-TwoFrac)*TERM5);
1292 N3_QS *= muonCorr_C3;
1294 num_QS->Fill(Q3, N3_QS);
1296 // Isolate 3-pion cumulant
1298 value_num -= (TERM2 - (1-TwoFrac)*TERM5)/K2_12/TwoFrac * muonCorr_C2_12;
1299 value_num -= (TERM3 - (1-TwoFrac)*TERM5)/K2_13/TwoFrac * muonCorr_C2_13;
1300 value_num -= (TERM4 - (1-TwoFrac)*TERM5)/K2_23/TwoFrac * muonCorr_C2_23;
1301 value_num += 2*TERM5;
1308 N3_QS_e += pow(( pow(1-OneFrac,3) +3*OneFrac*pow(1-OneFrac,2) )*sqrt(TERM5),2);
1309 N3_QS_e += (pow((1-OneFrac),2)*(TERM2 + TERM3 + TERM4) + pow((1-OneFrac)*3*(1-TwoFrac)*sqrt(TERM5),2));
1310 N3_QS_e /= pow(ThreeFrac,2);
1311 N3_QS_e /= pow(K3,2);
1312 num_QS_e[Q3bin-1] += N3_QS_e;
1314 value_num_e = N3_QS_e;
1315 value_num_e += (pow(1/K2_12/TwoFrac*sqrt(TERM2),2) + pow((1-TwoFrac)/K2_12/TwoFrac*sqrt(TERM5),2));
1316 value_num_e += (pow(1/K2_13/TwoFrac*sqrt(TERM3),2) + pow((1-TwoFrac)/K2_13/TwoFrac*sqrt(TERM5),2));
1317 value_num_e += (pow(1/K2_23/TwoFrac*sqrt(TERM4),2) + pow((1-TwoFrac)/K2_23/TwoFrac*sqrt(TERM5),2));
1318 value_num_e += pow(2*sqrt(TERM5),2);
1320 c3_e[Q3bin-1] += value_num_e + TERM5;// add baseline stat error
1324 c3_hist->Fill(Q3, value_num + TERM5);// for cumulant correlation function
1325 C3QS_3d->SetBinContent(i,j,k, N3_QS);
1326 C3QS_3d->SetBinError(i,j,k, N3_QS_e);
1328 Coul_Riverside->Fill(Q3, G_12*G_13*G_23*TERM5);
1329 Coul_GRiverside->Fill(Q3, TERM5*CoulCorrGRS(SameCharge, Q12, Q13, Q23));
1330 num_withGRS->Fill(Q3, N3_QS);
1331 Cterm1->Fill(Q3, TERM1);
1332 Cterm2->Fill(Q3, TERM2);
1333 Cterm3->Fill(Q3, TERM3);
1334 Cterm4->Fill(Q3, TERM4);
1335 Combinatorics_1d->Fill(Q3, TERM5);
1336 Combinatorics_3d->Fill(Q12,Q13,Q23, TERM5);
1338 double Q3_m = sqrt(pow((i-0.5)*(0.005),2) + pow((j-0.5)*(0.005),2) + pow((k-0.5)*(0.005),2));
1339 Cterm1_noMRC->Fill(Q3_m, Three_3d[CB1][CB2][CB3][SCBin][0]->GetBinContent(i,j,k));
1340 Combinatorics_1d_noMRC->Fill(Q3_m, Three_3d[CB1][CB2][CB3][SCBin][4]->GetBinContent(i,j,k));
1343 A_3[i-1][j-1][k-1] = value_num + TERM5;
1344 B_3[i-1][j-1][k-1] = TERM5;
1345 A_3_e[i-1][j-1][k-1] = sqrt(value_num_e + TERM5);
1347 //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;
1348 ///////////////////////////////////////////////////////////
1356 ////////////////////////////
1358 // Intermediate steps
1359 num_withRS->Sumw2();
1360 num_withGRS->Sumw2();
1361 num_withTM->Sumw2();
1366 Combinatorics_1d->Sumw2();
1367 Combinatorics_3d->Sumw2();
1368 for(int i=0; i<Q3BINS; i++) {c3_hist->SetBinError(i+1, sqrt(c3_e[i])); num_QS->SetBinError(i+1, sqrt(num_QS_e[i]));}
1371 num_withRS->Divide(Combinatorics_1d);
1372 num_withGRS->Divide(Combinatorics_1d);
1373 num_withTM->Divide(Combinatorics_1d);
1374 Cterm1->Divide(Combinatorics_1d);
1375 Cterm1_noMRC->Divide(Combinatorics_1d_noMRC);
1376 Cterm2->Divide(Combinatorics_1d);
1377 Cterm3->Divide(Combinatorics_1d);
1378 Cterm4->Divide(Combinatorics_1d);
1379 c3_hist->Divide(Combinatorics_1d);
1380 num_QS->Divide(Combinatorics_1d);
1384 ///////////////////////////////////////////////////////////////////////////////////////////////////
1387 Cterm1->SetMarkerStyle(20);
1388 Cterm1->SetMarkerColor(4);
1389 Cterm1->SetLineColor(4);
1390 Cterm1->GetXaxis()->SetTitle("#font[12]{Q}_{3} (GeV/#font[12]{c})");
1391 Cterm1->GetYaxis()->SetTitle("#font[12]{C}_{3}");
1392 //Cterm1->SetTitle("#pi^{-}#pi^{-}#pi^{-}");
1393 Cterm1->SetMinimum(0.97);
1394 Cterm1->SetMaximum(5.7);// 6.1 for same-charge
1395 Cterm1->GetXaxis()->SetRangeUser(0,Q3Limit);
1396 Cterm1->GetYaxis()->SetTitleOffset(1.4);
1398 legend2->AddEntry(Cterm1,"#font[12]{C}_{3} raw","p");
1400 Cterm2->SetMarkerStyle(20);
1401 Cterm2->SetMarkerColor(7);
1403 Cterm3->SetMarkerStyle(25);
1404 Cterm3->SetMarkerColor(8);
1405 Cterm4->SetMarkerStyle(26);
1406 Cterm4->SetMarkerColor(9);
1407 //Cterm2->Draw("same");
1408 //Cterm3->Draw("same");
1409 //Cterm4->Draw("same");
1410 //legend2->AddEntry(Cterm1,"++-","p");
1414 double C3points_HIJING_mmm[10]={0, 0.961834, 1.01827, 0.999387, 1.00202, 1.00081, 1.00082, 1.00037, 0.999074, 0.999099};
1415 double C3points_HIJING_mmm_e[10]={0, 0.0833895, 0.015158, 0.0047978, 0.00235067, 0.00138155, 0.00087485, 0.000612203, 0.000450162, 0.000346943};
1416 double C3points_HIJING_ppp[10]={0, 1.13015, 1.00623, 1.00536, 1.00293, 0.999964, 1.00116, 1.0007, 1.00037, 1.00105};
1417 double C3points_HIJING_ppp_e[10]={0, 0.0977058, 0.0150694, 0.0048196, 0.00235518, 0.00138376, 0.000877562, 0.000614069, 0.000452051, 0.00034856};
1418 TH1D *C3_HIJING_mmm=(TH1D*)Cterm1->Clone();
1419 TH1D *C3_HIJING_ppp=(TH1D*)Cterm1->Clone();
1420 for(int i=0; i<10; i++){
1421 C3_HIJING_mmm->SetBinContent(i+1, C3points_HIJING_mmm[i]);
1422 C3_HIJING_mmm->SetBinError(i+1, C3points_HIJING_mmm_e[i]);
1423 C3_HIJING_ppp->SetBinContent(i+1, C3points_HIJING_ppp[i]);
1424 C3_HIJING_ppp->SetBinError(i+1, C3points_HIJING_ppp_e[i]);
1426 C3_HIJING_mmm->SetMarkerColor(2);
1427 C3_HIJING_mmm->SetLineColor(2);
1428 C3_HIJING_ppp->SetMarkerColor(4);
1429 C3_HIJING_ppp->SetLineColor(4);
1430 //C3_HIJING_mmm->Draw("same");
1431 //C3_HIJING_ppp->Draw("same");
1432 //legend2->AddEntry(C3_HIJING_mmm,"---","p");
1433 //legend2->AddEntry(C3_HIJING_ppp,"+++","p");
1436 num_QS->SetMarkerStyle(24);
1437 num_QS->SetMarkerColor(4);
1438 num_QS->SetLineColor(4);
1439 num_QS->GetXaxis()->SetTitle("#font[12]{Q}_{3}");
1440 num_QS->GetYaxis()->SetTitle("#font[12]{C}_{3}^{QS}");
1441 num_QS->GetXaxis()->SetRangeUser(0,.12);
1442 num_QS->SetMaximum(6);
1443 //num_QS->Draw("same");
1444 //legend2->AddEntry(num_QS,"C_{3}^{QS}","p");
1446 c3_hist->GetXaxis()->SetTitle("#font[12]{Q}_{3} (GeV/#font[12]{c})");
1447 c3_hist->GetYaxis()->SetTitle("#font[12]{C}_{3} or #font[12]{#bf{c}}_{3}");
1448 c3_hist->GetYaxis()->SetTitleOffset(1.4);
1449 c3_hist->GetXaxis()->SetRangeUser(0,Q3Limit);
1450 c3_hist->GetYaxis()->SetRangeUser(0.9,4);
1451 c3_hist->SetMarkerStyle(25);
1452 c3_hist->SetMarkerColor(2);
1453 c3_hist->SetLineColor(2);
1454 c3_hist->SetMaximum(3);
1455 c3_hist->SetMinimum(.7);
1456 if(!MCcase) c3_hist->Draw("same");
1457 legend2->AddEntry(c3_hist,"#font[12]{#bf{c}}_{3} (cumulant correlation)","p");
1460 //for(int i=1; i<=15; i++) cout<<c3_hist->GetBinContent(i)<<", ";
1462 //for(int i=1; i<=15; i++) cout<<c3_hist->GetBinError(i)<<", ";
1465 const int npar_c3=5;// 10
1466 TMinuit MyMinuit_c3(npar_c3);
1467 MyMinuit_c3.SetFCN(fcn_c3);
1469 double arglist_c3 = 0;
1470 MyMinuit_c3.mnexcm("SET NOWarnings",&arglist_c3,1, ierflg_c3);
1472 MyMinuit_c3.mnexcm("SET PRint",&arglist_c3,1, ierflg_c3);
1473 //arglist_c3=2;// improve Minimization Strategy (1 is default)
1474 //MyMinuit_c3.mnexcm("SET STR",&arglist_c3,1,ierflg_c3);
1476 //MyMinuit_c3.mnexcm("SCAN", &arglist_c3,1,ierflg_c3);
1478 MyMinuit_c3.mnexcm("MIGRAD", &arglist_c3 ,1,ierflg_c3);
1480 TF1 *c3Fit1D_Base=new TF1("c3Fit1D_Base","[0]*(1+[1]*exp(-pow([2]*x/0.19733,[3]) * [4]/2.))",0,1);
1481 c3Fit1D_Base->FixParameter(3,ExpPower);
1484 c3Fit1D_Base->FixParameter(4,1.0);
1485 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)),3))",0,1);
1487 c3Fit1D_Base->FixParameter(4,sqrt(3.));
1488 c3Fit1D_Expan=new TF1("c3Fit1D_Expan","[0]*(1+[1]*exp(-pow([2]*x/0.19733,1) * 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),3))",0,1);
1490 double OutputPar_c3[npar_c3]={0};
1491 double OutputPar_c3_e[npar_c3]={0};
1493 double par_c3[npar_c3]; // the start values
1494 double stepSize_c3[npar_c3]; // step sizes
1495 double minVal_c3[npar_c3]; // minimum bound on parameter
1496 double maxVal_c3[npar_c3]; // maximum bound on parameter
1497 string parName_c3[npar_c3];
1498 if(SameCharge && !MCcase){
1499 for(int ft=0; ft<2; ft++){// Gaussian, Edgeworth
1500 if(ft==1 && !IncludeExpansion) continue;
1501 par_c3[0] = 1.0; par_c3[1] = .5; par_c3[2] = 5; par_c3[3] = kappa3; par_c3[4] = kappa4;// was par_c3[3] = 0.; par_c3[4] = 0.;
1502 stepSize_c3[0] = 0.01; stepSize_c3[1] = 0.1; stepSize_c3[2] = 0.2; stepSize_c3[3] = 0.01; stepSize_c3[4] = 0.01;
1503 minVal_c3[0] = 0.95; minVal_c3[1] = 0.2; minVal_c3[2] = 0.5; minVal_c3[3] = -1; minVal_c3[4] = -1;// was minVal_c3[3] = -1; minVal_c3[4] = -1;
1504 maxVal_c3[0] = 1.1; maxVal_c3[1] = 2.5; maxVal_c3[2] = 15.; maxVal_c3[3] = +1; maxVal_c3[4] = +1;// was minVal_c3[3] = +1; minVal_c3[4] = +1;
1505 parName_c3[0] = "N"; parName_c3[1] = "#lambda_{3}"; parName_c3[2] = "R_{inv}"; parName_c3[3] = "coeff_{3}"; parName_c3[4] = "coeff_{4}";
1506 c3Fit1D_Base->SetParName(0,"N"); c3Fit1D_Base->SetParName(1,"#lambda_{3}"); c3Fit1D_Base->SetParName(2,"R_{inv}");
1507 if(!Gaussian) {maxVal_c3[1] = 5.0; maxVal_c3[2] = 20.;}
1508 for (int i=0; i<npar_c3; i++){
1509 MyMinuit_c3.DefineParameter(i, parName_c3[i].c_str(), par_c3[i], stepSize_c3[i], minVal_c3[i], maxVal_c3[i]);
1512 if(!FixExpansionAvg) {
1515 if(CollisionType==0) RadiusFix = 10 - 7*Mbin/15.;
1516 else RadiusFix = 2.5 - 1.25*(Mbin-12)/7.;
1517 MyMinuit_c3.DefineParameter(2, parName_c3[2].c_str(), RadiusFix, stepSize_c3[2], minVal_c3[2], maxVal_c3[2]); MyMinuit_c3.FixParameter(2);
1518 MyMinuit_c3.DefineParameter(1, parName_c3[1].c_str(), 2.0, stepSize_c3[1], minVal_c3[1], maxVal_c3[1]); MyMinuit_c3.FixParameter(1);
1521 // kappa_3 and kappa_4
1522 if(ft==0){// Gaussian
1523 MyMinuit_c3.DefineParameter(3, parName_c3[3].c_str(), 0., stepSize_c3[3], minVal_c3[3], maxVal_c3[3]); MyMinuit_c3.FixParameter(3);
1524 MyMinuit_c3.DefineParameter(4, parName_c3[4].c_str(), 0., stepSize_c3[4], minVal_c3[4], maxVal_c3[4]); MyMinuit_c3.FixParameter(4);
1526 if(FixExpansionAvg){
1528 MyMinuit_c3.DefineParameter(3, parName_c3[3].c_str(), kappa3, stepSize_c3[3], minVal_c3[3], maxVal_c3[3]); MyMinuit_c3.FixParameter(3);
1529 MyMinuit_c3.DefineParameter(4, parName_c3[4].c_str(), kappa4, stepSize_c3[4], minVal_c3[4], maxVal_c3[4]); MyMinuit_c3.FixParameter(4);
1531 MyMinuit_c3.DefineParameter(3, parName_c3[3].c_str(), 0, stepSize_c3[3], minVal_c3[3], maxVal_c3[3]); MyMinuit_c3.FixParameter(3);
1532 MyMinuit_c3.DefineParameter(4, parName_c3[4].c_str(), 0, stepSize_c3[4], minVal_c3[4], maxVal_c3[4]); MyMinuit_c3.FixParameter(4);
1538 MyMinuit_c3.mnexcm( "RELease", tmp, 1, err );// kappa3
1540 MyMinuit_c3.mnexcm( "RELease", tmp, 1, err );// kappa4
1545 /////////////////////////////////////////////////////////////
1546 // Do the minimization!
1547 cout<<"Start Three-d fit"<<endl;
1548 MyMinuit_c3.Migrad();// Minuit's best minimization algorithm
1549 cout<<"End Three-d fit"<<endl;
1550 /////////////////////////////////////////////////////////////
1551 MyMinuit_c3.mnexcm("SHOw PARameters", &arglist_c3, 1, ierflg);
1552 cout<<"c3 Fit: Chi2 = "<<Chi2_c3<<" NDF = "<<(NFitPoints_c3-MyMinuit_c3.GetNumFreePars())<<endl;
1554 for(int i=0; i<npar_c3; i++){
1555 MyMinuit_c3.GetParameter(i,OutputPar_c3[i],OutputPar_c3_e[i]);
1558 c3Fit1D_Base->SetParameter(0,OutputPar_c3[0]); c3Fit1D_Base->SetParError(0,OutputPar_c3_e[0]);
1559 c3Fit1D_Base->SetParameter(1,OutputPar_c3[1]); c3Fit1D_Base->SetParError(1,OutputPar_c3_e[1]);
1560 c3Fit1D_Base->SetParameter(2,OutputPar_c3[2]); c3Fit1D_Base->SetParError(2,OutputPar_c3_e[2]);
1561 c3Fit1D_Base->SetLineStyle(2);
1562 c3Fit1D_Base->Draw("same");
1564 c3Fit1D_Expan->SetParameter(0,OutputPar_c3[0]); c3Fit1D_Expan->SetParError(0,OutputPar_c3_e[0]);
1565 c3Fit1D_Expan->SetParameter(1,OutputPar_c3[1]); c3Fit1D_Expan->SetParError(1,OutputPar_c3_e[1]);
1566 c3Fit1D_Expan->SetParameter(2,OutputPar_c3[2]); c3Fit1D_Expan->SetParError(2,OutputPar_c3_e[2]);
1567 c3Fit1D_Expan->SetParameter(3,OutputPar_c3[3]); c3Fit1D_Expan->SetParError(3,OutputPar_c3_e[3]);
1568 c3Fit1D_Expan->SetParameter(4,OutputPar_c3[4]); c3Fit1D_Expan->SetParError(4,OutputPar_c3_e[4]);
1569 c3Fit1D_Expan->SetLineStyle(1);
1570 //c3Fit1D_Expan->Draw("same");
1571 double lambdaStar=0, lambdaStar_e=0;
1573 lambdaStar = OutputPar_c3[1]*pow(1 + OutputPar_c3[4]/8.,3);
1574 lambdaStar_e = pow(OutputPar_c3_e[1]*pow(1 + OutputPar_c3[4]/8.,3),2);
1575 lambdaStar_e = sqrt(lambdaStar_e);
1577 lambdaStar = OutputPar_c3[1]*pow(1 - OutputPar_c3[3] + OutputPar_c3[4],3);
1578 lambdaStar_e = pow(OutputPar_c3_e[1]*pow(1 - OutputPar_c3[3] + OutputPar_c3[4],3),2);
1579 lambdaStar_e = sqrt(lambdaStar_e);
1581 cout<<"lambda*_3 = "<<lambdaStar<<" +- "<<lambdaStar_e<<endl;
1583 //if(ft==0) {MainFitParams[1]=OutputPar_c3[2]; MainFitParams[3]=OutputPar_c3[1];}
1584 //else {MainFitParams[5]=OutputPar_c3[2]; MainFitParams[7]=OutputPar_c3[1];}
1588 // project 3D EW fit onto 1D histogram
1589 if(SameCharge && !MCcase){
1590 for(int i=2; i<=BINLIMIT_3; i++){// bin number
1591 double Q12 = BinCenters[i-1];// true center
1592 for(int j=2; j<=BINLIMIT_3; j++){// bin number
1593 double Q13 = BinCenters[j-1];// true center
1594 for(int k=2; k<=BINLIMIT_3; k++){// bin number
1595 double Q23 = BinCenters[k-1];// true center
1597 double Q3 = sqrt(pow(Q12,2) + pow(Q13,2) + pow(Q23,2));
1599 if(Q12 < sqrt(pow(Q13,2)+pow(Q23,2) - 2*Q13*Q23)) continue;// not all configurations are possible
1600 if(Q12 > sqrt(pow(Q13,2)+pow(Q23,2) + 2*Q13*Q23)) continue;// not all configurations are possible
1602 double TERM5=Three_3d[CB1][CB2][CB3][SCBin][4]->GetBinContent(i,j,k);// N1*N1*N1. All from different events (pure combinatorics)
1603 if(TERM5==0) continue;
1606 if(CHARGE==-1){// base is (SC,MC,MC)
1607 TERM5 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][4]->GetBinContent(j,k,i);
1608 }else {// base is (MC,MC,SC)
1609 TERM5 += Three_3d[CB1_2][CB2_2][CB3_2][SCBin][4]->GetBinContent(k,i,j);
1613 int MRC_Q3bin = int(Q3/0.01) + 1;
1614 TERM5 *= (MomRes1d[0][4]->GetBinContent(MRC_Q3bin)-1)*MRCShift+1;
1616 double radius_exp = c3Fit1D_Expan->GetParameter(2)/FmToGeV;
1617 double arg12 = Q12*radius_exp;
1618 double arg13 = Q13*radius_exp;
1619 double arg23 = Q23*radius_exp;
1621 Float_t EW12 = 1 + c3Fit1D_Expan->GetParameter(3)/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
1622 EW12 += c3Fit1D_Expan->GetParameter(4)/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
1623 Float_t EW13 = 1 + c3Fit1D_Expan->GetParameter(3)/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13);
1624 EW13 += c3Fit1D_Expan->GetParameter(4)/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12);
1625 Float_t EW23 = 1 + c3Fit1D_Expan->GetParameter(3)/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23);
1626 EW23 += c3Fit1D_Expan->GetParameter(4)/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12);
1628 double cumulant_fitvalue=0;
1629 cumulant_fitvalue = c3Fit1D_Expan->GetParameter(0)*(c3Fit1D_Expan->GetParameter(1)*EW12*EW13*EW23*exp(-pow(radius_exp,ExpPower)/2. * (pow(Q12,ExpPower)+pow(Q13,ExpPower)+pow(Q23,ExpPower)))*TERM5 + TERM5);
1631 GenSignalExpected_num->Fill(Q3, cumulant_fitvalue);
1632 GenSignalExpected_den->Fill(Q3, TERM5);
1633 ///////////////////////////////////////////////////////////
1641 GenSignalExpected_num->Sumw2();
1642 GenSignalExpected_num->Divide(GenSignalExpected_den);
1644 TSpline3 *c3Fit1D_ExpanSpline = new TSpline3(GenSignalExpected_num);
1645 if(CollisionType==0) c3Fit1D_ExpanSpline->SetLineColor(1);
1646 if(CollisionType==1) c3Fit1D_ExpanSpline->SetLineColor(2);
1647 if(CollisionType==2) c3Fit1D_ExpanSpline->SetLineColor(4);
1648 c3Fit1D_ExpanSpline->SetLineWidth(2);
1649 double xpoints[1000], ypoints[1000];
1650 bool splineOnly=kFALSE;
1651 for(int iii=0; iii<1000; iii++){
1652 xpoints[iii] = 0 + (iii+0.5)*0.001;
1653 if(!Gaussian && CollisionType!=0 && c3Fit1D_Expan->Eval(xpoints[iii]) < 2.2) splineOnly=kTRUE;
1654 if(!Gaussian && CollisionType==0 && c3Fit1D_Expan->Eval(xpoints[iii]) < 2.0) splineOnly=kTRUE;// 2.0 or 1.4 for Mbin=3 in Fig 2
1656 ypoints[iii] = c3Fit1D_Expan->Eval(xpoints[iii]);
1657 if(c3Fit1D_Expan->Eval(xpoints[iii])<2 && fabs(c3Fit1D_Expan->Eval(xpoints[iii])-c3Fit1D_ExpanSpline->Eval(xpoints[iii])) < 0.01) splineOnly=kTRUE;
1659 else {ypoints[iii] = c3Fit1D_ExpanSpline->Eval(xpoints[iii]); splineOnly=kTRUE;}
1661 TGraph *gr_c3Spline = new TGraph(1000,xpoints,ypoints);
1662 gr_c3Spline->SetLineWidth(2);
1663 if(CollisionType==0) gr_c3Spline->SetLineColor(1);
1664 if(CollisionType==1) gr_c3Spline->SetLineColor(2);
1665 if(CollisionType==2) gr_c3Spline->SetLineColor(4);
1667 gr_c3Spline->Draw("c same");
1669 double ChiSqSum_1D=0, SumNDF_1D=0;
1670 for(int bin=1; bin<=300; bin++){
1671 double binCenter = c3_hist->GetXaxis()->GetBinCenter(bin);
1672 if(binCenter > Q3Limit) continue;
1673 if(c3_hist->GetBinError(bin)==0) continue;
1675 for(int gr=0; gr<999; gr++){
1676 if(binCenter > xpoints[gr] && (binCenter < xpoints[gr+1])) {grIndex=gr; break;}
1679 //ChiSqSum_1D += pow((c3_hist->GetBinContent(bin)-ypoints[grIndex]) / c3_hist->GetBinError(bin),2);
1680 ChiSqSum_1D += pow((c3_hist->GetBinContent(bin)-c3Fit1D_Base->Eval(binCenter)) / c3_hist->GetBinError(bin),2);
1681 //cout<<c3_hist->GetBinContent(bin)<<" "<<c3Fit1D_Base->Eval(binCenter)<<" "<<c3_hist->GetBinError(bin)<<endl;
1682 //cout<<c3_hist->GetBinContent(bin)<<" "<<ypoints[grIndex]<<" "<<c3_hist->GetBinError(bin)<<endl;
1686 cout<<"1D Chi2/NDF = "<<ChiSqSum_1D / (SumNDF_1D-3.)<<endl;
1688 // uncomment to display fit box
1689 //c3_hist->GetListOfFunctions()->Add(c3Fit1D_Base);
1691 // Fit Range Systematics
1692 //for(int i=0; i<8; i++){cout<<MainFitParams[i]<<", ";}
1694 //for(int i=0; i<4; i++){cout<<int(100*(MainFitParams[i]-RefMainFitParams[i])/MainFitParams[i])<<"$\\%$ & ";}// Gaussian
1696 //for(int i=4; i<8; i++){cout<<int(100*(MainFitParams[i]-RefMainFitParams[i])/MainFitParams[i])<<"$\\%$ & ";}// Edgeworth
1700 //TString *lamName=new TString("#lambda_{3}=");
1701 //TString *RName=new TString("#R_{inv,3}=");
1702 //*lamName += int(100*c3Fit1D_Base->GetParameter(1))/100.; lamName->Append(" #pm "); *lamName += int(100*c3Fit1D_Base->GetParError(1))/100.;
1703 //*RName += round(100*c3Fit1D_Base->GetParameter(2))/100; RName->Append(" #pm "); *RName += int(100*c3Fit1D_Base->GetParError(2))/100.; RName->Append(" fm");
1704 //TLatex *fitBox1=new TLatex(0.5,0.9,lamName->Data());
1705 //fitBox1->SetNDC(kTRUE);
1707 //TLatex *fitBox2=new TLatex(0.5,0.8,"R_{inv,3} = 2.62 #pm 0.12");
1708 //fitBox2->SetNDC(kTRUE);
1710 //TLatex *fitBox3=new TLatex(0.5,0.5,"<N_{rec,pions}>=103");
1711 //fitBox3->SetNDC(kTRUE);
1714 //TPaveStats *c3Stats=(TPaveStats*)c3Fit1D_Base->FindObject("stats");
1715 //c3Stats->SetX1NDC(0.15);
1716 //c3Stats->SetX2NDC(0.52);
1717 //c3Stats->SetY1NDC(.2);
1718 //c3Stats->SetY2NDC(.3);
1719 //c3Stats->Draw("same");
1722 // The below 1D fit method has less well defined bin centers
1723 //TF1 *c3Fit1D=new TF1("c3Fit1D","[0]*(1+[1]*exp(-pow([2]*x/0.19733,2)/2.))",0,1);
1724 //TF1 *c3Fit1D=new TF1("c3Fit1D","[0]*(1+[1]*exp(-pow([2]*x/0.19733,2)/2.) * (1 + (-0.12/(6.*pow(2,1.5))*(8.*pow([2]*x/0.19733,3) - 12.*pow([2]*x/0.19733,1))) + (0.43/(24.*pow(2,2))*(16.*pow([2]*x/0.19733,4) -48.*pow([2]*x/0.19733,2) + 12))))",0,1);
1725 //TF1 *c3Fit1D=new TF1("c3Fit1D","[0]*(1+[1]*exp(-pow([2]*x/0.19733,2)/2.) * (1 + ([3]/(6.*pow(2,1.5))*(8.*pow([2]*x/0.19733,3) - 12.*pow([2]*x/0.19733,1))) + ([4]/(24.*pow(2,2))*(16.*pow([2]*x/0.19733,4) -48.*pow([2]*x/0.19733,2) + 12))))",0,1);
1726 //c3Fit1D->SetLineColor(4);
1727 //c3Fit1D->SetParameter(0,1); c3Fit1D->SetParName(0,"N");
1728 //c3Fit1D->SetParameter(1,0.5); c3Fit1D->SetParName(1,"#lambda_{3}");
1729 //c3Fit1D->SetParameter(2,5); c3Fit1D->SetParName(2,"R_{inv}");
1730 //c3Fit1D->SetParLimits(2,0.5,15);
1731 //c3Fit1D->SetLineColor(1);
1733 //c3Fit1D->FixParameter(0,OutputPar_c3[0]);
1734 //c3Fit1D->FixParameter(1,OutputPar_c3[1]);
1735 //c3Fit1D->FixParameter(2,OutputPar_c3[2]);
1736 //c3Fit1D->SetParName(3,"coeff_{3}"); c3Fit1D->SetParName(4,"coeff_{4}");
1737 //c3Fit1D->SetParameter(3,.24); c3Fit1D->SetParameter(3,.16);
1738 //c3_hist->Fit(c3Fit1D,"IMEN","",0.0,Q3Limit);
1739 //c3Fit1D->Draw("same");
1740 //cout<<"1d fit: Chi2/NDF = "<<c3Fit1D->GetChisquare()/c3Fit1D->GetNDF()<<endl;
1741 //dentimesFit_c3->DrawCopy("l same");
1743 //c3Fit1D->FixParameter(0, fitcopy_c3->GetParameter(0));
1744 //c3Fit1D->FixParameter(1, fitcopy_c3->GetParameter(1));
1745 //c3Fit1D->FixParameter(2, fitcopy_c3->GetParameter(2));
1747 //TF1 *c3Fit1D_2=new TF1("c3Fit1D_2","[0]*(1+[1]*exp(-pow([2]*x/0.19733,2)/2.))",0,1);
1748 //c3Fit1D=new TF1("c3Fit1D","[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)),3))",0,1);
1749 //c3Fit1D->FixParameter(0,OutputPar_c3[0]);
1750 //c3Fit1D->FixParameter(1,OutputPar_c3[1]);
1751 //c3Fit1D->FixParameter(2,OutputPar_c3[2]);
1752 //c3Fit1D->FixParameter(3,OutputPar_c3[3]);
1753 //c3Fit1D->FixParameter(4,OutputPar_c3[4]);
1754 //c3Fit1D->SetLineColor(4);
1755 //c3Fit1D->Draw("same");
1758 //MomRes1d[1][0]->Draw();
1760 //for(int i=1; i<50; i++) cout<<c3_hist->GetBinContent(i)<<", ";
1762 //for(int i=1; i<50; i++) cout<<c3_hist->GetBinError(i)<<", ";
1766 Cterm1->Draw("same");
1767 legend2->Draw("same");
1769 /*if(SameCharge==kTRUE && MCcase==kFALSE){
1770 TString *savename=new TString("C3c3_SC_");
1771 if(CollisionType==0) savename->Append("PbPb_K");
1772 if(CollisionType==1) savename->Append("pPb_K");
1773 if(CollisionType==2) savename->Append("pp_K");
1775 savename->Append("_M");
1777 savename->Append(".eps");
1778 can2->SaveAs(savename->Data());
1781 //for(int ii=0; ii<10; ii++) cout<<c3_hist->GetBinContent(ii+1)<<", ";
1782 //Coul_GRiverside->Draw();
1783 //Coul_Riverside->Draw("same");
1785 TLegend *legend4 = new TLegend(.3,.8, .5,.95,NULL,"brNDC");
1786 legend4->SetBorderSize(0);
1787 legend4->SetTextFont(42);//42
1788 legend4->SetTextSize(.04);// small .03; large .06
1789 legend4->SetFillColor(0);
1791 gPad->SetRightMargin(0.025); gPad->SetLeftMargin(0.1); gPad->SetTopMargin(0.02);
1792 TwoFrac=lambda_PM; OneFrac=pow(TwoFrac,.5), ThreeFrac=pow(TwoFrac,1.5);
1796 TH1D *c3_Extended = (TH1D*)Three_1d[CB1][CB2][CB3][SCBin][0]->Clone();
1797 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][4], -( pow(1-OneFrac,3) + 3*OneFrac*pow(1-OneFrac,2) ));
1798 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][1], -(1-OneFrac));
1799 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][2], -(1-OneFrac));
1800 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][3], -(1-OneFrac));
1801 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][4], (1-OneFrac)*3*(1-TwoFrac));
1802 c3_Extended->Scale(1/ThreeFrac);
1804 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][1], -1/TwoFrac);
1805 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][2], -1/TwoFrac);
1806 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][3], -1/TwoFrac);
1807 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][4], 3*(1-TwoFrac)/TwoFrac);
1808 c3_Extended->Add(Three_1d[CB1][CB2][CB3][SCBin][4], 3);
1810 c3_Extended->Divide(Three_1d[CB1][CB2][CB3][SCBin][4]);
1811 c3_Extended->GetXaxis()->SetTitle("#font[12]{Q}_{3} (GeV/#font[12]{c})");
1812 c3_Extended->GetYaxis()->SetTitle("#font[12]{#bf{c}}_{3}^{#pm#pm#pm}");
1813 c3_Extended->SetMinimum(0.9); c3_Extended->SetMaximum(2.0);
1814 c3_Extended->SetMarkerStyle(24);
1815 c3_Extended->SetMarkerColor(2);
1816 c3_Extended->SetLineColor(2);
1819 TH1D *C3_Extended = (TH1D*)Three_1d[CB1][CB2][CB3][SCBin][0]->Clone();
1820 C3_Extended->Divide(Three_1d[CB1][CB2][CB3][SCBin][4]);
1821 C3_Extended->GetXaxis()->SetTitle("#font[12]{Q}_{3} (GeV/c)");
1822 C3_Extended->GetYaxis()->SetTitle("#font[12]{C}_{3}");
1823 c3_Extended->GetXaxis()->SetTitleOffset(0.83);
1824 c3_Extended->GetYaxis()->SetTitleOffset(0.8);
1825 c3_Extended->GetYaxis()->SetTitleSize(0.05);
1826 c3_Extended->GetXaxis()->SetTitleSize(0.05);
1827 C3_Extended->SetMarkerStyle(20);
1828 C3_Extended->SetMarkerColor(4);
1829 c3_Extended->GetXaxis()->SetRangeUser(0,2);
1830 c3_Extended->SetMarkerStyle(20);
1831 c3_Extended->Draw();
1832 //cout<<c3_Extended->GetBinError(40)<<" "<<Three_1d[CB1][CB2][CB3][SCBin][0]->GetBinError(40)/Three_1d[CB1][CB2][CB3][SCBin][4]->GetBinContent(40)<<" "<<Three_1d[CB1][CB2][CB3][SCBin][1]->GetBinError(40)/Three_1d[CB1][CB2][CB3][SCBin][4]->GetBinContent(40)<<endl;
1833 //legend4->AddEntry(c3_Extended,"c_{3}, #pi^{#pm}#pi^{#pm}#pi^{#pm}, Coulomb Uncorrected","p");
1834 //legend4->AddEntry(C3_Extended,"C_{3}, #pi^{#pm}#pi^{#pm}#pi^{#pm}, Coulomb Uncorrected","p");
1835 //legend4->Draw("same");
1836 //Unity->Draw("same");
1838 //Specif_System->Draw("same");
1839 //Specif_KT3->Draw("same");
1840 //Specif_FSI->Draw("same");
1841 //Specif_Disclaimer->Draw("same");
1845 gPad->SetGridx(0); gPad->SetGridy(0);
1848 //TwoFrac=0.9; OneFrac=pow(TwoFrac,0.5); ThreeFrac=pow(TwoFrac,1.5);
1849 TH1D *K0sProjection = (TH1D*)(Three_3d[0][0][1][SCBin][0]->ProjectionY("K0sProjection",binLow,binHigh,binLow,binHigh));
1850 TH1D *K0sProjection_term1 = (TH1D*)(Three_3d[0][0][1][SCBin][0]->ProjectionY("K0sProjection_term1",binLow,binHigh,binLow,binHigh));
1851 TH1D *K0sProjection_term2 = (TH1D*)(Three_3d[0][0][1][SCBin][1]->ProjectionY("K0sProjection_term2",binLow,binHigh,binLow,binHigh));
1852 TH1D *K0sProjection_term3 = (TH1D*)(Three_3d[0][0][1][SCBin][2]->ProjectionY("K0sProjection_term3",binLow,binHigh,binLow,binHigh));
1853 TH1D *K0sProjection_term4 = (TH1D*)(Three_3d[0][0][1][SCBin][3]->ProjectionY("K0sProjection_term4",binLow,binHigh,binLow,binHigh));
1854 TH1D *K0sProjection_term5 = (TH1D*)(Three_3d[0][0][1][SCBin][4]->ProjectionY("K0sProjection_term5",binLow,binHigh,binLow,binHigh));
1855 K0sProjection_term1->Add(K0sProjection_term5, -( pow(1-OneFrac,3) + 3*OneFrac*pow(1-OneFrac,2) ));
1856 K0sProjection_term1->Add(K0sProjection_term2, -(1-OneFrac));
1857 K0sProjection_term1->Add(K0sProjection_term3, -(1-OneFrac));
1858 K0sProjection_term1->Add(K0sProjection_term4, -(1-OneFrac));
1859 K0sProjection_term1->Add(K0sProjection_term5, (1-OneFrac)*3*(1-TwoFrac));
1860 K0sProjection_term1->Scale(1/ThreeFrac);
1862 K0sProjection_term1->Add(K0sProjection_term2, -1/TwoFrac);
1863 K0sProjection_term1->Add(K0sProjection_term3, -1/TwoFrac);
1864 K0sProjection_term1->Add(K0sProjection_term4, -1/TwoFrac);
1865 K0sProjection_term1->Add(K0sProjection_term5, 3*(1-TwoFrac)/TwoFrac);
1866 K0sProjection_term1->Add(K0sProjection_term5, 3);
1868 K0sProjection->Divide(K0sProjection_term5);
1869 K0sProjection_term1->Divide(K0sProjection_term5);
1870 K0sProjection_term1->GetXaxis()->SetRangeUser(0,.5);
1871 K0sProjection_term1->SetMarkerStyle(24);
1872 K0sProjection_term1->SetMarkerColor(4);
1873 K0sProjection->SetMarkerStyle(20);
1874 K0sProjection->SetMarkerColor(4);
1875 K0sProjection->SetMinimum(0.92);
1876 K0sProjection->GetXaxis()->SetTitle("#font[12]{q_{13}^{#pm#mp}} (GeV/#font[12]{c})");
1877 K0sProjection->GetYaxis()->SetTitle("#font[12]{C_{3}} or #font[12]{#bf{c}_{3}}");
1878 K0sProjection->GetXaxis()->SetTitleOffset(1.2); K0sProjection->GetYaxis()->SetTitleOffset(1.3);
1880 K0sProjection->Draw();
1882 TH1D *Sys_K0sProjection=(TH1D*)K0sProjection->Clone();
1883 TH1D *Sys_K0sProjection_term1=(TH1D*)K0sProjection_term1->Clone();
1884 Sys_K0sProjection->SetMarkerSize(0); Sys_K0sProjection_term1->SetMarkerSize(0);
1885 Sys_K0sProjection->SetFillColor(kBlue-10); Sys_K0sProjection_term1->SetFillColor(kBlue-10);
1886 Sys_K0sProjection->SetFillStyle(1000); Sys_K0sProjection_term1->SetFillStyle(1000);
1887 for(int i=0; i<Sys_K0sProjection->GetNbinsX(); i++) {
1888 Sys_K0sProjection->SetBinError(i+1, 0.01 * Sys_K0sProjection->GetBinContent(i+1));
1889 Sys_K0sProjection_term1->SetBinError(i+1, 0.01 * Sys_K0sProjection_term1->GetBinContent(i+1));
1891 for(int i=0; i<Sys_K0sProjection->GetNbinsX(); i++) cout<<K0sProjection->GetBinContent(i+1)<<", ";
1893 for(int i=0; i<Sys_K0sProjection->GetNbinsX(); i++) cout<<K0sProjection->GetBinError(i+1)<<", ";
1895 for(int i=0; i<Sys_K0sProjection->GetNbinsX(); i++) cout<<K0sProjection_term1->GetBinContent(i+1)<<", ";
1897 for(int i=0; i<Sys_K0sProjection->GetNbinsX(); i++) cout<<K0sProjection_term1->GetBinError(i+1)<<", ";
1900 Sys_K0sProjection->Draw("E2 same");
1901 Sys_K0sProjection_term1->Draw("E2 same");
1902 K0sProjection->Draw("same");
1903 K0sProjection_term1->Draw("same");
1905 //legend4->AddEntry(K0sProjection,"#font[12]{C_{3}^{#pm#pm#mp}} projection","p");
1906 //legend4->AddEntry(K0sProjection_term1,"#font[12]{#bf{c}_{3}^{#pm#pm#mp}} projection","p");
1907 //legend4->Draw("same");
1913 //////////////////////////////////////////////////////////////////////////////////////
1921 TString *savefilename = new TString("OutFiles/OutFile");
1922 if(!Gaussian) savefilename->Append("ExpFit");
1923 if(CollisionType==0) savefilename->Append("PbPb");
1924 else if(CollisionType==1) savefilename->Append("pPb");
1925 else savefilename->Append("pp");
1927 if(MCcase) savefilename->Append("MonteCarlo");
1929 if(SameCharge) savefilename->Append("SC");
1930 else savefilename->Append("MC");
1932 if(CHARGE==1) savefilename->Append("Pos");
1933 else savefilename->Append("Neg");
1936 savefilename->Append("Kt3_");
1937 *savefilename += EDbin+1;
1939 savefilename->Append("_M");
1940 *savefilename += Mbin;
1941 savefilename->Append(".root");
1942 TFile *savefile = new TFile(savefilename->Data(),"RECREATE");
1943 can1->Write("can1");
1944 C2_ss->Write("C2_ss");
1945 C2_os->Write("C2_os");
1946 fitC2ss_h->Write("fitC2ss_h");
1947 fitC2ss_Base->Write("fitC2ss_Base");
1948 fitC2ss_Expan->Write("fitC2ss_Expan");
1949 Cterm1->Write("C3");
1950 c3_hist->Write("c3");
1951 Combinatorics_1d->Write("Combinatorics_1d");
1952 c3Fit1D_Base->Write("c3Fit1D_Base");
1953 c3Fit1D_Expan->Write("c3Fit1D_Expan");
1954 c3Fit1D_ExpanSpline->Write("c3Fit1D_ExpanSpline");
1955 gr_c3Spline->Write("gr_c3Spline");
1956 MyMinuit_c3.Write("MyMinuit_c3");
1963 void ReadCoulCorrections(int index){
1964 ///////////////////////
1965 TString *fname2 = new TString("KFile.root");
1967 TFile *File=new TFile(fname2->Data(),"READ");
1968 if(index>=12) cout<<"FSI index not acceptable in 2-particle Coulomb read"<<endl;
1969 TString *nameSS = new TString("K2ss_");
1970 TString *nameOS = new TString("K2os_");
1973 TString *nameSS_2 = new TString("K2ss_");
1974 TString *nameOS_2 = new TString("K2os_");
1975 *nameSS_2 += index+1; *nameOS_2 += index+1;
1976 /*if(index<9) {*nameSS_2 += index+1; *nameOS_2 += index+1;}
1977 else {*nameSS_2 += index; *nameOS_2 += index;}*/
1978 TH1D *temp_ss = (TH1D*)File->Get(nameSS->Data());
1979 TH1D *temp_os = (TH1D*)File->Get(nameOS->Data());
1980 TH1D *temp_ss_2 = (TH1D*)File->Get(nameSS_2->Data());
1981 TH1D *temp_os_2 = (TH1D*)File->Get(nameOS_2->Data());
1983 CoulCorr2SS = (TH1D*)temp_ss->Clone();
1984 CoulCorr2OS = (TH1D*)temp_os->Clone();
1985 CoulCorr2SS_2 = (TH1D*)temp_ss_2->Clone();
1986 CoulCorr2OS_2 = (TH1D*)temp_os_2->Clone();
1989 CoulCorr2SS->SetDirectory(0);
1990 CoulCorr2OS->SetDirectory(0);
1991 CoulCorr2SS_2->SetDirectory(0);
1992 CoulCorr2OS_2->SetDirectory(0);
1996 double CoulCorr2(int chargeproduct, double Q2){// returns K2
2000 double value1=1.0, value2=1.0;
2002 indexL = int(fabs(Q2 - CoulCorr2SS->GetXaxis()->GetBinWidth(1)/2.)/(CoulCorr2SS->GetXaxis()->GetBinWidth(1)));
2006 if(indexH >= CoulCorr2SS->GetNbinsX()) {
2007 return (Gamov(chargeproduct, Q2) * CoulCorr2SS->GetBinContent(CoulCorr2SS->GetNbinsX()-1) / Gamov(chargeproduct, CoulCorr2SS->GetXaxis()->GetBinCenter(CoulCorr2SS->GetNbinsX()-1)));
2010 if(chargeproduct==1){
2011 slope = (CoulCorr2SS->GetBinContent(indexL+1) - CoulCorr2SS->GetBinContent(indexH+1));
2012 slope /= (CoulCorr2SS->GetXaxis()->GetBinCenter(indexL+1) - CoulCorr2SS->GetXaxis()->GetBinCenter(indexH+1));
2013 value1 = slope*(Q2 - CoulCorr2SS->GetXaxis()->GetBinCenter(indexL+1)) + CoulCorr2SS->GetBinContent(indexL+1);
2015 slope = (CoulCorr2OS->GetBinContent(indexL+1) - CoulCorr2OS->GetBinContent(indexH+1));
2016 slope /= (CoulCorr2OS->GetXaxis()->GetBinCenter(indexL+1) - CoulCorr2OS->GetXaxis()->GetBinCenter(indexH+1));
2017 value1 = slope*(Q2 - CoulCorr2OS->GetXaxis()->GetBinCenter(indexL+1)) + CoulCorr2OS->GetBinContent(indexL+1);
2020 if(chargeproduct==1){
2021 slope = (CoulCorr2SS_2->GetBinContent(indexL+1) - CoulCorr2SS_2->GetBinContent(indexH+1));
2022 slope /= (CoulCorr2SS_2->GetXaxis()->GetBinCenter(indexL+1) - CoulCorr2SS_2->GetXaxis()->GetBinCenter(indexH+1));
2023 value2 = slope*(Q2 - CoulCorr2SS_2->GetXaxis()->GetBinCenter(indexL+1)) + CoulCorr2SS_2->GetBinContent(indexL+1);
2025 slope = (CoulCorr2OS_2->GetBinContent(indexL+1) - CoulCorr2OS_2->GetBinContent(indexH+1));
2026 slope /= (CoulCorr2OS_2->GetXaxis()->GetBinCenter(indexL+1) - CoulCorr2OS_2->GetXaxis()->GetBinCenter(indexH+1));
2027 value2 = slope*(Q2 - CoulCorr2OS_2->GetXaxis()->GetBinCenter(indexL+1)) + CoulCorr2OS_2->GetBinContent(indexL+1);
2030 if(value1>0 && value2>0){// interpolation only done between 9 and 12 Mbin.
2031 return (value1 + (value2-value1)/(2.));// always use the half-way point.
2040 // old way with Gaussian sources for low mult systems
2041 /*if(indexH >= CoulCorr2SS->GetNbinsX()) {
2042 return (Gamov(chargeproduct, Q2) * CoulCorr2SS->GetBinContent(CoulCorr2SS->GetNbinsX()-1) / Gamov(chargeproduct, CoulCorr2SS->GetXaxis()->GetBinCenter(CoulCorr2SS->GetNbinsX()-1)));
2044 if(chargeproduct==1){
2045 slope = (CoulCorr2SS->GetBinContent(indexL+1) - CoulCorr2SS->GetBinContent(indexH+1));
2046 slope /= (CoulCorr2SS->GetXaxis()->GetBinCenter(indexL+1) - CoulCorr2SS->GetXaxis()->GetBinCenter(indexH+1));
2047 value1 = slope*(Q2 - CoulCorr2SS->GetXaxis()->GetBinCenter(indexL+1)) + CoulCorr2SS->GetBinContent(indexL+1);
2049 slope = (CoulCorr2OS->GetBinContent(indexL+1) - CoulCorr2OS->GetBinContent(indexH+1));
2050 slope /= (CoulCorr2OS->GetXaxis()->GetBinCenter(indexL+1) - CoulCorr2OS->GetXaxis()->GetBinCenter(indexH+1));
2051 value1 = slope*(Q2 - CoulCorr2OS->GetXaxis()->GetBinCenter(indexL+1)) + CoulCorr2OS->GetBinContent(indexL+1);
2053 if(Mbin_def<=9 || Mbin_def>12) return value1;
2054 else{// interpolate in K factor transition region
2055 if(chargeproduct==1){
2056 slope = (CoulCorr2SS_2->GetBinContent(indexL+1) - CoulCorr2SS_2->GetBinContent(indexH+1));
2057 slope /= (CoulCorr2SS_2->GetXaxis()->GetBinCenter(indexL+1) - CoulCorr2SS_2->GetXaxis()->GetBinCenter(indexH+1));
2058 value2 = slope*(Q2 - CoulCorr2SS_2->GetXaxis()->GetBinCenter(indexL+1)) + CoulCorr2SS_2->GetBinContent(indexL+1);
2060 slope = (CoulCorr2OS_2->GetBinContent(indexL+1) - CoulCorr2OS_2->GetBinContent(indexH+1));
2061 slope /= (CoulCorr2OS_2->GetXaxis()->GetBinCenter(indexL+1) - CoulCorr2OS_2->GetXaxis()->GetBinCenter(indexH+1));
2062 value2 = slope*(Q2 - CoulCorr2OS_2->GetXaxis()->GetBinCenter(indexL+1)) + CoulCorr2OS_2->GetBinContent(indexL+1);
2065 if(value1>0 && value2>0){// interpolation only done between 9 and 12 Mbin.
2066 return (value1 + (Mbin_def-9)*(value2-value1)/(3.));
2079 //----------------------------------------------------------------------
2082 //________________________________________________________________________
2083 void fcnC2_Global(int& npar, double* deriv, double& f, double par[], int flag){
2087 double Rch=par[3]/FmToGeV;
2088 double CSS=0, COS=0;
2091 NFitPoints_C2global=0;
2092 if(LinkN) par[9]=par[0];// Link N factors
2094 for(int i=1; i<BINRANGE_C2global; i++){
2096 qinvSS = BinCenters[i];
2097 if(qinvSS > Q2Limit) continue;
2100 double arg=qinvSS*Rch;
2101 if(Gaussian){// Edgeworth expansion
2102 Expan = 1 + par[5]/(6.*pow(2,1.5)) * (8.*pow(arg,3) - 12.*pow(arg,1));
2103 Expan += par[6]/(24.*pow(2,2)) * (16.*pow(arg,4) -48.*pow(arg,2) + 12);
2104 Expan += par[7]/(120.*pow(2,2.5)) * (32.*pow(arg,5) - 160.*pow(arg,3) + 120*arg);
2105 Expan += par[8]/(720.*pow(2,3)) * (64.*pow(arg,6) - 480.*pow(arg,4) + 720.*pow(arg,2) - 120);
2107 Expan = 1 + par[5] * (arg - 1);
2108 Expan += par[6]/2. * (pow(arg,2) - 4*arg + 2);
2109 Expan += par[7] * 0.;
2110 Expan += par[8] * 0.;
2115 // old way without undilution
2116 /*CSS = 1 + exp(-pow(Rch*qinvSS,ExpPower))*pow(Expan,2);
2117 CSS *= par[1]*K2SS[i];
2120 // undilution method
2121 //CSS = 1 + par[1]*exp(-pow(Rch*qinvSS,ExpPower))*pow(Expan,2);
2123 // undilution method with correct normalization location (was previously applied to C2^QS)
2124 CSS = 1 + par[1]*exp(-pow(Rch*qinvSS,ExpPower))*pow(Expan,2);
2125 CSS *= lambda_PM * K2SS[i];
2131 COS *= par[1]*K2OS[i];
2133 COS *= par[9];// different Norm
2135 if(C2ssFitting[i] > 0){
2137 //double errorSS = sqrt(pow( (CSS/par[0] - (1-par[1]))/K2SS[i] * K2SS_e[i] * par[0],2) + pow(C2ssFitting_e[i],2));
2138 double errorSS = sqrt(pow(C2ssFitting_e[i],2));// new way with undilution already done in C2ssFitting[i]
2139 SumChi2 += pow((CSS - C2ssFitting[i])/errorSS,2);
2140 NFitPoints_C2global++;
2144 double errorOS = sqrt(pow( (COS/par[9] - (1-par[1]))/K2OS[i] * K2OS_e[i] * par[9],2) + pow(C2osFitting_e[i],2));
2145 SumChi2 += pow((COS - C2osFitting[i])/errorOS,2);
2146 NFitPoints_C2global++;
2155 //________________________________________________________________________
2156 double C2ssFitFunction(Double_t *x, Double_t *par)
2158 double Rch=par[3]/FmToGeV;
2159 int qbin = int(fabs(x[0]/BinWidthQ2));
2161 double qinvSS = BinCenters[qbin];
2163 double arg=qinvSS*Rch;
2165 if(Gaussian){// Edgeworth expansion
2166 Expan += par[5]/(6.*pow(2,1.5))*(8.*pow(arg,3) - 12.*pow(arg,1));
2167 Expan += par[6]/(24.*pow(2,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
2168 Expan += par[7]/(120.*pow(2,2.5))*(32.*pow(arg,5) - 160.*pow(arg,3) + 120*arg);
2169 Expan += par[8]/(720.*pow(2,3))*(64.*pow(arg,6) - 480.*pow(arg,4) + 720.*pow(arg,2) - 120);
2171 Expan = 1 + par[5] * (arg - 1);
2172 Expan += par[6]/2. * (pow(arg,2) - 4*arg + 2);
2173 Expan += par[7] * 0.;
2174 Expan += par[8] * 0.;
2177 // old way without undilution
2178 /*double CSS = 1 + exp(-pow(Rch*qinvSS,ExpPower))*pow(Expan,2);
2180 if(qbin < BINRANGE_C2global) K2=K2SS[qbin];
2184 // undilution method
2185 //double CSS = 1 + par[1]*exp(-pow(Rch*qinvSS,ExpPower))*pow(Expan,2);
2187 // undilution method with correct normalization location (was previously applied to C2^QS)
2188 double CSS = 1 + par[1]*exp(-pow(Rch*qinvSS,ExpPower))*pow(Expan,2);
2189 CSS *= lambda_PM * K2SS[qbin];
2195 //________________________________________________________________________
2196 double C2osFitFunction(Double_t *x, Double_t *par)
2198 if(LinkN) par[9]=par[0];// Link N factors
2199 int qbin = int(fabs(x[0]/BinWidthQ2));
2201 //double qinvOS = BinCenters[qbin];
2205 if(qbin < BINRANGE_C2global) K2=K2OS[qbin];
2211 //__________________________________________________________________________
2213 void fcn_c3(int& npar, double* deriv, double& f, double par[], int flag){
2215 double q12=0, q13=0, q23=0;
2216 double Expan12=0, Expan13=0, Expan23=0;
2218 double Rch=par[2]/FmToGeV;
2220 //double lnL=0, term1=0, term2=0;
2222 //double SumChi2_test=0;
2224 for(int i=0; i<=BINLIMIT_3; i++){// q12
2225 for(int j=0; j<=BINLIMIT_3; j++){// q13
2226 for(int k=0; k<=BINLIMIT_3; k++){// q23
2228 if(B_3[i][j][k] == 0) continue;
2229 if(A_3[i][j][k] == 0) continue;
2230 if(A_3_e[i][j][k] == 0) continue;
2232 q12 = BinCenters[i];
2233 q13 = BinCenters[j];
2234 q23 = BinCenters[k];
2235 double q3 = sqrt(pow(q12,2)+pow(q13,2)+pow(q23,2));
2236 if(q3 > Q3Limit) continue;
2238 double arg12 = q12*Rch;
2239 double arg13 = q13*Rch;
2240 double arg23 = q23*Rch;
2241 if(Gaussian){// Edgeworth expansion
2242 Expan12 = 1 + par[3]/(6.*pow(2,1.5))*(8*pow(arg12,3) - 12*pow(arg12,1)) + par[4]/(24.*pow(2,2))*(16*pow(arg12,4) -48*pow(arg12,2) + 12);
2243 Expan13 = 1 + par[3]/(6.*pow(2,1.5))*(8*pow(arg13,3) - 12*pow(arg13,1)) + par[4]/(24.*pow(2,2))*(16*pow(arg13,4) -48*pow(arg13,2) + 12);
2244 Expan23 = 1 + par[3]/(6.*pow(2,1.5))*(8*pow(arg23,3) - 12*pow(arg23,1)) + par[4]/(24.*pow(2,2))*(16*pow(arg23,4) -48*pow(arg23,2) + 12);
2245 }else{// Laguerre expansion
2246 Expan12 = 1 + par[3]*(arg12 - 1) + par[4]/2.*(pow(arg12,2) - 4*arg12 + 2);
2247 Expan13 = 1 + par[3]*(arg13 - 1) + par[4]/2.*(pow(arg13,2) - 4*arg13 + 2);
2248 Expan23 = 1 + par[3]*(arg23 - 1) + par[4]/2.*(pow(arg23,2) - 4*arg23 + 2);
2251 C = 1 + par[1]*exp(-(pow(arg12,ExpPower)+pow(arg13,ExpPower)+pow(arg23,ExpPower))/2.)*Expan12*Expan13*Expan23;
2254 double error = pow(A_3_e[i][j][k]/B_3[i][j][k],2);
2255 error += pow(sqrt(B_3[i][j][k])*A_3[i][j][k]/pow(B_3[i][j][k],2),2);
2256 error = sqrt(error);
2257 SumChi2 += pow( (C - A_3[i][j][k]/B_3[i][j][k])/error,2);
2258 //if(q3<0.05) SumChi2_test += pow( (C - A_3[i][j][k]/B_3[i][j][k])/error,2);
2260 /*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));
2262 term2 = (A_3[i][j][k]+B_3[i][j][k])/(B_3[i][j][k]*(C+1));
2264 if(term1 > 0.0 && term2 > 0.0){
2265 lnL += A_3[i][j][k]*log(term1) + B_3[i][j][k]*log(term2);
2266 }else if(term1==0 && term2 > 0.0){
2267 lnL += B_3[i][j][k]*log(term2);
2268 }else {cout<<"WARNING -- term1 and term2 are negative"<<endl;}
2270 float DegenerateCount=1.;
2271 //if(i==j && i==k) DegenerateCount=1;
2272 //else if(i==j || i==k || j==k) DegenerateCount=3;//3
2273 //else DegenerateCount=6;//6
2274 NFitPoints_c3 += 1/DegenerateCount;
2279 //f = -2.0*lnL;// log-liklihood minimization
2280 f = SumChi2;// Chi2 minimization
2282 //Chi2_c3 = SumChi2_test;
2285 //________________________________________________________________________
2286 double Dfitfunction_c3(Double_t *x, Double_t *par)
2288 double Rch = par[2]/FmToGeV;
2289 double arg12 = x[0]*Rch;
2290 double arg13 = x[1]*Rch;
2291 double arg23 = x[2]*Rch;
2292 double Expan12 = 1, Expan13 = 1, Expan23 = 1;
2293 if(Gaussian){// Edworth Expansion
2294 Expan12 += par[3]/(6.*pow(2,1.5))*(8*pow(arg12,3) - 12*pow(arg12,1)) + par[4]/(24.*pow(2,2))*(16*pow(arg12,4) -48*pow(arg12,2) + 12);
2295 Expan13 += par[3]/(6.*pow(2,1.5))*(8*pow(arg13,3) - 12*pow(arg13,1)) + par[4]/(24.*pow(2,2))*(16*pow(arg13,4) -48*pow(arg13,2) + 12);
2296 Expan23 += par[3]/(6.*pow(2,1.5))*(8*pow(arg23,3) - 12*pow(arg23,1)) + par[4]/(24.*pow(2,2))*(16*pow(arg23,4) -48*pow(arg23,2) + 12);
2297 }else{// Laguerre Expansion
2298 Expan12 = 1 + par[3]*(arg12 - 1) + par[4]/2.*(pow(arg12,2) - 4*arg12 + 2);
2299 Expan13 = 1 + par[3]*(arg13 - 1) + par[4]/2.*(pow(arg13,2) - 4*arg13 + 2);
2300 Expan23 = 1 + par[3]*(arg23 - 1) + par[4]/2.*(pow(arg23,2) - 4*arg23 + 2);
2304 double C = 1 + par[1]*exp(-(pow(arg12,ExpPower)+pow(arg13,ExpPower)+pow(arg23,ExpPower))/2.)*Expan12*Expan13*Expan23;
2309 //________________________________________________________________________
2310 double CoulCorrGRS(bool SC, double Q_12, double Q_13, double Q_23){
2312 int index12L = int(fabs(Q_12 - CoulCorr2SS->GetXaxis()->GetBinWidth(1)/2.)/(CoulCorr2SS->GetXaxis()->GetBinWidth(1)));
2313 int index12H = index12L+1;
2314 int index13L = int(fabs(Q_13 - CoulCorr2SS->GetXaxis()->GetBinWidth(1)/2.)/(CoulCorr2SS->GetXaxis()->GetBinWidth(1)));
2315 int index13H = index13L+1;
2316 int index23L = int(fabs(Q_23 - CoulCorr2SS->GetXaxis()->GetBinWidth(1)/2.)/(CoulCorr2SS->GetXaxis()->GetBinWidth(1)));
2317 int index23H = index23L+1;
2320 // Tricubic Interpolation
2321 double arr[4][4][4]={{{0}}};
2322 for(int x=0; x<4; x++){
2323 for(int y=0; y<4; y++){
2324 for(int z=0; z<4; z++){
2326 arr[x][y][z] = CoulCorr2SS->GetBinContent((index12L)+x)*CoulCorr2SS->GetBinContent((index23L)+y)*CoulCorr2SS->GetBinContent((index13L)+z);
2328 arr[x][y][z] = CoulCorr2SS->GetBinContent((index12L)+x)*CoulCorr2OS->GetBinContent((index23L)+y)*CoulCorr2OS->GetBinContent((index13L)+z);
2334 return tricubicInterpolate(arr, Q_12, Q_23, Q_13);
2336 // Trilinear Interpolation. See for instance: https://en.wikipedia.org/wiki/Trilinear_interpolation
2338 double value1=1.0, value2=1.0;
2340 double xd = (Q_12-CoulCorr2SS->GetXaxis()->GetBinCenter(index12L+1));
2341 xd /= (CoulCorr2SS->GetXaxis()->GetBinCenter(index12H+1)-CoulCorr2SS->GetXaxis()->GetBinCenter(index12L+1));
2342 double yd = (Q_13-CoulCorr2SS->GetXaxis()->GetBinCenter(index13L+1));
2343 yd /= (CoulCorr2SS->GetXaxis()->GetBinCenter(index13H+1)-CoulCorr2SS->GetXaxis()->GetBinCenter(index13L+1));
2344 double zd = (Q_23-CoulCorr2SS->GetXaxis()->GetBinCenter(index23L+1));
2345 zd /= (CoulCorr2SS->GetXaxis()->GetBinCenter(index23H+1)-CoulCorr2SS->GetXaxis()->GetBinCenter(index23L+1));
2348 double c00 = CoulCorr2SS->GetBinContent(index12L+1)*CoulCorr2SS->GetBinContent(index13L+1)*CoulCorr2SS->GetBinContent(index23L+1)*(1-xd);
2349 c00 += CoulCorr2SS->GetBinContent(index12H+1)*CoulCorr2SS->GetBinContent(index13L+1)*CoulCorr2SS->GetBinContent(index23L+1)*xd;
2350 double c10 = CoulCorr2SS->GetBinContent(index12L+1)*CoulCorr2SS->GetBinContent(index13H+1)*CoulCorr2SS->GetBinContent(index23L+1)*(1-xd);
2351 c10 += CoulCorr2SS->GetBinContent(index12H+1)*CoulCorr2SS->GetBinContent(index13H+1)*CoulCorr2SS->GetBinContent(index23L+1)*xd;
2352 double c01 = CoulCorr2SS->GetBinContent(index12L+1)*CoulCorr2SS->GetBinContent(index13L+1)*CoulCorr2SS->GetBinContent(index23H+1)*(1-xd);
2353 c01 += CoulCorr2SS->GetBinContent(index12H+1)*CoulCorr2SS->GetBinContent(index13L+1)*CoulCorr2SS->GetBinContent(index23H+1)*xd;
2354 double c11 = CoulCorr2SS->GetBinContent(index12L+1)*CoulCorr2SS->GetBinContent(index13H+1)*CoulCorr2SS->GetBinContent(index23H+1)*(1-xd);
2355 c11 += CoulCorr2SS->GetBinContent(index12H+1)*CoulCorr2SS->GetBinContent(index13H+1)*CoulCorr2SS->GetBinContent(index23H+1)*xd;
2357 double c0 = c00*(1-yd) + c10*yd;
2358 double c1 = c01*(1-yd) + c11*yd;
2359 value1 = (c0*(1-zd) + c1*zd);
2361 double c00 = CoulCorr2SS->GetBinContent(index12L+1)*CoulCorr2OS->GetBinContent(index13L+1)*CoulCorr2OS->GetBinContent(index23L+1)*(1-xd);
2362 c00 += CoulCorr2SS->GetBinContent(index12H+1)*CoulCorr2OS->GetBinContent(index13L+1)*CoulCorr2OS->GetBinContent(index23L+1)*xd;
2363 double c10 = CoulCorr2SS->GetBinContent(index12L+1)*CoulCorr2OS->GetBinContent(index13H+1)*CoulCorr2OS->GetBinContent(index23L+1)*(1-xd);
2364 c10 += CoulCorr2SS->GetBinContent(index12H+1)*CoulCorr2OS->GetBinContent(index13H+1)*CoulCorr2OS->GetBinContent(index23L+1)*xd;
2365 double c01 = CoulCorr2SS->GetBinContent(index12L+1)*CoulCorr2OS->GetBinContent(index13L+1)*CoulCorr2OS->GetBinContent(index23H+1)*(1-xd);
2366 c01 += CoulCorr2SS->GetBinContent(index12H+1)*CoulCorr2OS->GetBinContent(index13L+1)*CoulCorr2OS->GetBinContent(index23H+1)*xd;
2367 double c11 = CoulCorr2SS->GetBinContent(index12L+1)*CoulCorr2OS->GetBinContent(index13H+1)*CoulCorr2OS->GetBinContent(index23H+1)*(1-xd);
2368 c11 += CoulCorr2SS->GetBinContent(index12H+1)*CoulCorr2OS->GetBinContent(index13H+1)*CoulCorr2OS->GetBinContent(index23H+1)*xd;
2370 double c0 = c00*(1-yd) + c10*yd;
2371 double c1 = c01*(1-yd) + c11*yd;
2372 value1 = (c0*(1-zd) + c1*zd);
2375 //if(Mbin_def<=9 || Mbin_def>12) return value1;// old way for v5
2377 // interpolation for K factor tansition
2379 double c00 = CoulCorr2SS_2->GetBinContent(index12L+1)*CoulCorr2SS_2->GetBinContent(index13L+1)*CoulCorr2SS_2->GetBinContent(index23L+1)*(1-xd);
2380 c00 += CoulCorr2SS_2->GetBinContent(index12H+1)*CoulCorr2SS_2->GetBinContent(index13L+1)*CoulCorr2SS_2->GetBinContent(index23L+1)*xd;
2381 double c10 = CoulCorr2SS_2->GetBinContent(index12L+1)*CoulCorr2SS_2->GetBinContent(index13H+1)*CoulCorr2SS_2->GetBinContent(index23L+1)*(1-xd);
2382 c10 += CoulCorr2SS_2->GetBinContent(index12H+1)*CoulCorr2SS_2->GetBinContent(index13H+1)*CoulCorr2SS_2->GetBinContent(index23L+1)*xd;
2383 double c01 = CoulCorr2SS_2->GetBinContent(index12L+1)*CoulCorr2SS_2->GetBinContent(index13L+1)*CoulCorr2SS_2->GetBinContent(index23H+1)*(1-xd);
2384 c01 += CoulCorr2SS_2->GetBinContent(index12H+1)*CoulCorr2SS_2->GetBinContent(index13L+1)*CoulCorr2SS_2->GetBinContent(index23H+1)*xd;
2385 double c11 = CoulCorr2SS_2->GetBinContent(index12L+1)*CoulCorr2SS_2->GetBinContent(index13H+1)*CoulCorr2SS_2->GetBinContent(index23H+1)*(1-xd);
2386 c11 += CoulCorr2SS_2->GetBinContent(index12H+1)*CoulCorr2SS_2->GetBinContent(index13H+1)*CoulCorr2SS_2->GetBinContent(index23H+1)*xd;
2388 double c0 = c00*(1-yd) + c10*yd;
2389 double c1 = c01*(1-yd) + c11*yd;
2390 value2 = (c0*(1-zd) + c1*zd);
2392 double c00 = CoulCorr2SS_2->GetBinContent(index12L+1)*CoulCorr2OS_2->GetBinContent(index13L+1)*CoulCorr2OS_2->GetBinContent(index23L+1)*(1-xd);
2393 c00 += CoulCorr2SS_2->GetBinContent(index12H+1)*CoulCorr2OS_2->GetBinContent(index13L+1)*CoulCorr2OS_2->GetBinContent(index23L+1)*xd;
2394 double c10 = CoulCorr2SS_2->GetBinContent(index12L+1)*CoulCorr2OS_2->GetBinContent(index13H+1)*CoulCorr2OS_2->GetBinContent(index23L+1)*(1-xd);
2395 c10 += CoulCorr2SS_2->GetBinContent(index12H+1)*CoulCorr2OS_2->GetBinContent(index13H+1)*CoulCorr2OS_2->GetBinContent(index23L+1)*xd;
2396 double c01 = CoulCorr2SS_2->GetBinContent(index12L+1)*CoulCorr2OS_2->GetBinContent(index13L+1)*CoulCorr2OS_2->GetBinContent(index23H+1)*(1-xd);
2397 c01 += CoulCorr2SS_2->GetBinContent(index12H+1)*CoulCorr2OS_2->GetBinContent(index13L+1)*CoulCorr2OS_2->GetBinContent(index23H+1)*xd;
2398 double c11 = CoulCorr2SS_2->GetBinContent(index12L+1)*CoulCorr2OS_2->GetBinContent(index13H+1)*CoulCorr2OS_2->GetBinContent(index23H+1)*(1-xd);
2399 c11 += CoulCorr2SS_2->GetBinContent(index12H+1)*CoulCorr2OS_2->GetBinContent(index13H+1)*CoulCorr2OS_2->GetBinContent(index23H+1)*xd;
2401 double c0 = c00*(1-yd) + c10*yd;
2402 double c1 = c01*(1-yd) + c11*yd;
2403 value2 = (c0*(1-zd) + c1*zd);
2406 if(value1>0 && value2>0){
2407 return (value1 + (value2-value1)/(2.));// always take the half-way point
2408 //return (value1 + (Mbin_def-9)*(value2-value1)/(3.));// old way for v5
2419 double Gamov(int chargeProduct, double qinv){
2421 double arg = chargeProduct*2.*PI/(BohrR*qinv/2.);
2423 return arg/(exp(arg)-1);
2425 void ReadMomResFile(int Mbin){
2427 int MRCindex_L=0, MRCindex_H=0;
2428 float MRCindex_weight=0;
2429 if(Mbin<=2) {MRCindex_L=0; MRCindex_H=1; MRCindex_weight = Mbin/2.;}
2430 else if(Mbin<=6) {MRCindex_L=1; MRCindex_H=2; MRCindex_weight = fabs(Mbin-3)/3.;}
2431 else if(Mbin<=11) {MRCindex_L=2; MRCindex_H=3; MRCindex_weight = fabs(Mbin-7)/4.;}
2432 else {MRCindex_L=3; MRCindex_H=4; MRCindex_weight = fabs(Mbin-12)/7.;}
2439 TString *momresfilenameL = new TString("MomResFile_M");
2440 *momresfilenameL += MRCindex_L;
2441 momresfilenameL->Append(".root");
2442 TFile *MomResFileL = new TFile(momresfilenameL->Data(),"READ");
2443 TString *names1D_L[2][5];// SC/MC, term#
2444 for(int ChProd=0; ChProd<2; ChProd++){
2445 for(int term=0; term<5; term++){
2447 if(ChProd==0) {names1D_L[ChProd][term] = new TString("MRC3_SC_term");}
2448 else {names1D_L[ChProd][term] = new TString("MRC3_MC_term");}
2449 *names1D_L[ChProd][term] += term+1;
2450 temp_L[ChProd][term] = (TH1D*)MomResFileL->Get(names1D_L[ChProd][term]->Data());
2451 temp_L[ChProd][term]->SetDirectory(0);
2454 TString *C2MRCname=new TString("MomResHisto_");
2455 if(ChProd==0) C2MRCname->Append("pp");
2456 else C2MRCname->Append("mp");
2457 tempC2_L[ChProd]=(TH1D*)(((TH2D*)(MomResFileL->Get(C2MRCname->Data())))->ProjectionY("C2MRCproL",MRC2index,MRC2index));
2458 tempC2_L[ChProd]->SetDirectory(0);
2462 TString *momresfilenameH = new TString("MomResFile_M");
2463 *momresfilenameH += MRCindex_H;
2464 momresfilenameH->Append(".root");
2465 TFile *MomResFileH = new TFile(momresfilenameH->Data(),"READ");
2466 TString *names1D_H[2][5];// SC/MC, term#
2467 for(int ChProd=0; ChProd<2; ChProd++){
2468 for(int term=0; term<5; term++){
2470 if(ChProd==0) {names1D_H[ChProd][term] = new TString("MRC3_SC_term");}
2471 else {names1D_H[ChProd][term] = new TString("MRC3_MC_term");}
2472 *names1D_H[ChProd][term] += term+1;
2473 temp_H[ChProd][term] = (TH1D*)MomResFileH->Get(names1D_H[ChProd][term]->Data());
2474 temp_H[ChProd][term]->SetDirectory(0);
2475 MomRes1d[ChProd][term] = (TH1D*)MomResFileH->Get(names1D_H[ChProd][term]->Data());
2476 MomRes1d[ChProd][term]->SetDirectory(0);
2478 TString *C2MRCname=new TString("MomResHisto_");
2479 if(ChProd==0) C2MRCname->Append("pp");
2480 else C2MRCname->Append("mp");
2481 tempC2_H[ChProd]=(TH1D*)(((TH2D*)(MomResFileH->Get(C2MRCname->Data())))->ProjectionY("C2MRCproH",MRC2index,MRC2index));
2482 tempC2_H[ChProd]->SetDirectory(0);
2483 TString *name=new TString("MomResC2_");
2485 MomResC2[ChProd] = (TH1D*)(((TH2D*)(MomResFileH->Get(C2MRCname->Data())))->ProjectionY(name->Data(),MRC2index,MRC2index));
2486 MomResC2[ChProd]->SetDirectory(0);
2489 for(int ChProd=0; ChProd<2; ChProd++){
2491 for(int term=0; term<5; term++){
2492 for(int bin=1; bin<=temp_H[ChProd][term]->GetNbinsX(); bin++){
2494 if(temp_L[ChProd][term]->GetBinContent(bin)>0 && temp_H[ChProd][term]->GetBinContent(bin)>0){// both have entries
2495 value = temp_L[ChProd][term]->GetBinContent(bin) + MRCindex_weight * temp_H[ChProd][term]->GetBinContent(bin);
2496 }else if(temp_L[ChProd][term]->GetBinContent(bin)>0){
2497 value = temp_L[ChProd][term]->GetBinContent(bin);
2498 }else if(temp_H[ChProd][term]->GetBinContent(bin)>0){
2499 value = temp_H[ChProd][term]->GetBinContent(bin);
2502 MomRes1d[ChProd][term]->SetBinContent(bin,value);
2506 for(int bin=1; bin<=tempC2_H[ChProd]->GetNbinsX(); bin++){
2508 if(tempC2_L[ChProd]->GetBinContent(bin)>0 && tempC2_H[ChProd]->GetBinContent(bin)>0){// both have entries
2509 value = tempC2_L[ChProd]->GetBinContent(bin)*(1-MRCindex_weight) + MRCindex_weight * tempC2_H[ChProd]->GetBinContent(bin);
2510 }else if(tempC2_L[ChProd]->GetBinContent(bin)>0){
2511 value = tempC2_L[ChProd]->GetBinContent(bin);
2512 }else if(tempC2_H[ChProd]->GetBinContent(bin)>0){
2513 value = tempC2_H[ChProd]->GetBinContent(bin);
2515 MomResC2[ChProd]->SetBinContent(bin,value);
2519 for(int ChProd=0; ChProd<2; ChProd++){
2520 for(int term=0; term<5; term++){
2521 for(int i=0; i<MomRes1d[0][0]->GetNbinsX(); i++){
2522 if(SourceType==0 && Mbin<10){
2523 if(MomRes1d[ChProd][term]->GetXaxis()->GetBinCenter(i+1) > 0.1) MomRes1d[ChProd][term]->SetBinContent(i+1, 1.0);
2524 }else if(SourceType==0 && Mbin>=10){
2525 if(MomRes1d[ChProd][term]->GetXaxis()->GetBinCenter(i+1) > 0.2) MomRes1d[ChProd][term]->SetBinContent(i+1, 1.0);
2527 if(MomRes1d[ChProd][term]->GetXaxis()->GetBinCenter(i+1) > 0.5) MomRes1d[ChProd][term]->SetBinContent(i+1, 1.0);
2535 MomResFileL->Close();
2536 MomResFileH->Close();
2539 double cubicInterpolate (double p[4], double x) {
2540 return p[1] + 0.5 * x*(p[2] - p[0] + x*(2.0*p[0] - 5.0*p[1] + 4.0*p[2] - p[3] + x*(3.0*(p[1] - p[2]) + p[3] - p[0])));// Paulinternet
2542 double bicubicInterpolate (double p[4][4], double x, double y) {
2544 arr[0] = cubicInterpolate(p[0], y);
2545 arr[1] = cubicInterpolate(p[1], y);
2546 arr[2] = cubicInterpolate(p[2], y);
2547 arr[3] = cubicInterpolate(p[3], y);
2548 return cubicInterpolate(arr, x);
2550 double tricubicInterpolate (double p[4][4][4], double x, double y, double z) {
2552 arr[0] = bicubicInterpolate(p[0], y, z);
2553 arr[1] = bicubicInterpolate(p[1], y, z);
2554 arr[2] = bicubicInterpolate(p[2], y, z);
2555 arr[3] = bicubicInterpolate(p[3], y, z);
2556 return cubicInterpolate(arr, x);
2558 //____________________________________________________________________________________________________
2559 void ReadMuonCorrections(int ct, int mbin){
2560 TString *name = new TString("MuonCorrection_");
2562 if(mbin<=1) *name += 0;
2563 else if(mbin<=3) *name += 1;
2564 else if(mbin<=5) *name += 2;
2565 else if(mbin<=7) *name += 3;
2566 else if(mbin<10) *name += 4;
2569 name->Append(".root");
2570 TFile *muonfile=new TFile(name->Data(),"READ");
2571 C2muonCorrection_SC = (TH1D*)muonfile->Get("C2muonCorrection_SC");
2572 C2muonCorrection_MC = (TH1D*)muonfile->Get("C2muonCorrection_MC");
2573 if(SameCharge_def) C3muonCorrection = (TH1D*)muonfile->Get("C3muonCorrection_SC");
2574 else C3muonCorrection = (TH1D*)muonfile->Get("C3muonCorrection_MC");
2576 C2muonCorrection_SC->SetDirectory(0);
2577 C2muonCorrection_MC->SetDirectory(0);
2578 C3muonCorrection->SetDirectory(0);
2582 //____________________________________________________________________________________________________
2583 void DrawALICELogo(Bool_t prel, Float_t x1, Float_t y1, Float_t x2, Float_t y2)
2585 // revision on July 24th or 25th 2012
2586 // correct for aspect ratio of figure plus aspect ratio of pad (coordinates are NDC!)
2587 x2 = x1 + (y2 - y1) * (466. / 523) * gPad->GetWh() * gPad->GetHNDC() / (gPad->GetWNDC() * gPad->GetWw());
2588 // Printf("%f %f %f %f", x1, x2, y1, y2);
2590 TPad *myPadLogo = new TPad("myPadLogo", "Pad for ALICE Logo", x1, y1, x2, y2);
2591 myPadLogo->SetLeftMargin(0);
2592 myPadLogo->SetTopMargin(0);
2593 myPadLogo->SetRightMargin(0);
2594 myPadLogo->SetBottomMargin(0);
2597 TASImage *myAliceLogo = new TASImage((prel) ? "~/Pictures/2011-Nov-24-ALICE_PRELIMARY_logo_BLACK_small_usage_design.eps" : "~/Pictures/2011-Nov-24-ALICE_PERFORMANCE_logo_BLACK_small_usage_design.eps");
2598 myAliceLogo->Draw();