Last active
August 29, 2015 14:19
-
-
Save jdbrice/8be2aa67cc6291754a9b to your computer and use it in GitHub Desktop.
Kong's Simultaneous Blast Wave fit code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| #include <fstream> | |
| #include <math.h> | |
| #include "TMath.h" | |
| #include <stdio.h> | |
| #include <iomanip> | |
| #include <vector> | |
| #include "TGraph.h" | |
| #include "TF1.h" | |
| #include "TH1D.h" | |
| #include "TFile.h" | |
| #include "makeMultiPanelCanvas.C" | |
| #include "fitting.h" | |
| using namespace RooFit; | |
| using namespace std; | |
| vector<double> x,ex, y,ey,x1,ex1,y1,ey1,x2,ex2,y2,ey2; | |
| double getChi2; | |
| int getNdf; | |
| const double R = 1.0; | |
| const double dr = 1e-2; // FIXME | |
| double integral(double beta_T, double T, double n, double pt, double mt) | |
| { | |
| double s = 0.; | |
| for(double r = dr/2; r < R; r += dr) | |
| { | |
| double beta_r = (beta_T*(n+2)/2) * TMath::Power((r/R),n); | |
| double rho = TMath::ATanH(beta_r); | |
| s += r * dr * TMath::BesselK1((mt*cosh(rho))/T) * TMath::BesselI0((pt*sinh(rho))/T); | |
| } | |
| return s; | |
| } | |
| void function(int &npar, double *gin, double &f, double *par, int flag) | |
| { | |
| double aka = par[0]; | |
| double aka1 = par[4]; | |
| double aka2 = par[5]; | |
| double T = par[2]; | |
| double beta_T = par[1]; | |
| double n = par[3]; | |
| double chi2 = 0.; | |
| for(int i = 0; i < int(x.size()); i++) | |
| { | |
| double m = 0.497; | |
| double pt = x[i]; | |
| double mt = sqrt(m*m + pt*pt); | |
| double a = 0.; | |
| a = aka; | |
| double theo = a * mt * integral(beta_T, T, n, pt, mt); | |
| double q = (y[i] - theo)/ey[i]; | |
| chi2 += q*q; | |
| } | |
| for(i = 0; i < int(x1.size()); i++){ | |
| double m1 = 1.115; | |
| double pt1 = x1[i]; | |
| double mt1 = sqrt(m1*m1 + pt1*pt1); | |
| double a1 = 0.; | |
| a1 = aka1; | |
| double theo1 = a1 * mt1 * integral(beta_T,T,n,pt1,mt1); | |
| double q1 = (y1[i]-theo1)/ey1[i]; | |
| chi2 += q1*q1; | |
| } | |
| for(i = 0; i < int(x2.size()); i++){ | |
| double m2 = 1.314; | |
| double pt2 = x2[i]; | |
| double mt2 = sqrt(m2*m2 + pt2*pt2); | |
| double a2 = 0.; | |
| a2 = aka2; | |
| double theo2 = a2 * mt2 * integral(beta_T,T,n,pt2,mt2); | |
| double q2 = (y2[i]-theo2)/ey2[i]; | |
| chi2 += q2*q2; | |
| } | |
| f = chi2; | |
| getChi2 = f; | |
| getNdf = x.size() + x1.size() + x2.size() - 6 - 1; | |
| } | |
| double MyFunc( double *pt, double *p){ | |
| double mass = 0.497; | |
| double temp = 0.; | |
| double mt = sqrt(pt[0]*pt[0]+mass*mass); | |
| temp = p[2] * mt * integral(p[0],p[1],p[3],pt[0],mt); | |
| return temp; | |
| } | |
| double MyFunc1( double *pt, double *p){ | |
| double mass = 1.115; | |
| double temp = 0.; | |
| double mt = sqrt(pt[0]*pt[0]+mass*mass); | |
| temp = p[2] * mt * integral(p[0],p[1],p[3],pt[0],mt); | |
| return temp; | |
| } | |
| double MyFunc2( double *pt, double *p){ | |
| double mass = 1.314; | |
| double temp = 0.; | |
| double mt = sqrt(pt[0]*pt[0]+mass*mass); | |
| temp = p[2] * mt * integral(p[0],p[1],p[3],pt[0],mt); | |
| return temp; | |
| } | |
| double beta_T(double beta_s,double n){ | |
| return (beta_s*2)/(n+2); | |
| } | |
| void MeanPtFromMidRapidityCombinedBlastWaveFit(){ | |
| gStyle->SetErrorX(0); | |
| TFile* file = new TFile("/Users/kongkong/2015Research/Spectra/pPb2013/rpyDependence/new_files/MidRpy0_0.8_v1.root"); | |
| TH1D* ksSpectra[8]; | |
| TH1D* laSpectra[8]; | |
| stringstream ksHistName; | |
| stringstream laHistName; | |
| for (int mult = 0; mult < 8; mult++){ | |
| ksHistName.str(""); | |
| laHistName.str(""); | |
| ksHistName << "ksSpectra_vtx_"; | |
| ksHistName << mult+1; | |
| laHistName << "laSpectra_vtx_"; | |
| laHistName << mult+1; | |
| ksSpectra[mult] = (TH1D*)file->Get(ksHistName.str().c_str()); | |
| laSpectra[mult] = (TH1D*)file->Get(laHistName.str().c_str()); | |
| } | |
| TFile* file1 = new TFile("/Users/kongkong/2015Research/Spectra/pPb2013/XiSpectra/SpectraWithVtxWeight_Combine_V18.root"); | |
| TH1D* xiSpectra[8]; | |
| TH1D* xiSpectra[8]; | |
| xiSpectra[0] = (TH1D*)file1->Get("Spectra_NtrkOffline0_35"); | |
| xiSpectra[1] = (TH1D*)file1->Get("Spectra_NtrkOffline35_60"); | |
| xiSpectra[2] = (TH1D*)file1->Get("Spectra_NtrkOffline60_90"); | |
| xiSpectra[3] = (TH1D*)file1->Get("Spectra_NtrkOffline90_120"); | |
| xiSpectra[4] = (TH1D*)file1->Get("Spectra_NtrkOffline120_150"); | |
| xiSpectra[5] = (TH1D*)file1->Get("Spectra_NtrkOffline150_185"); | |
| xiSpectra[6] = (TH1D*)file1->Get("Spectra_NtrkOffline185_220"); | |
| xiSpectra[7] = (TH1D*)file1->Get("Spectra_NtrkOffline220_inf"); | |
| double ks_pTbinsBound[34] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,24,26,28,30,34,38,42,46,50,56,66,90}; | |
| double ks_ptbins[34] = {0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,2.8,3.0,3.4,3.8,4.2,4.6,5.0,5.6,6.6,9.0}; | |
| double ks_binwidth[33] = {0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.2,0.2,0.2,0.2,0.2,0.4,0.4,0.4,0.4,0.4,0.6,1.0,2.4}; | |
| double ks_ptbincenter[33] = {0.05,0.15,0.25,0.35,0.45,0.55,0.65,0.75,0.85,0.95,1.05,1.15,1.25,1.35,1.45,1.55,1.65,1.75,1.85,1.95,2.1,2.3,2.5,2.7,2.9,3.2,3.6,4.0,4.4,4.8,5.3,6.1,7.8}; | |
| double la_pTbinsBound[22] = {4,6,8,10,12,14,16,18,20,22,24,26,28,30,34,38,42,46,50,56,66,90}; | |
| double la_ptbins[22] = {0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.4,2.6,2.8,3.0,3.4,3.8,4.2,4.6,5.0,5.6,6.6,9.0}; | |
| double la_ptbincenter[21] = {0.5,0.7,0.9,1.1,1.3,1.5,1.7,1.9,2.1,2.3,2.5,2.7,2.9,3.2,3.6,4.0,4.4,4.8,5.3,6.1,7.8}; | |
| double la_binwidth[21] = {0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.4,0.4,0.4,0.4,0.4,0.6,1.0,2.4}; | |
| double xi_pTbinsBound[21] = {6,8,10,12,14,16,18,20,22,24,26,28,30,34,38,42,46,50,56,66,90}; | |
| double xi_ptbins[21] = {0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.4,2.6,2.8,3.0,3.4,3.8,4.2,4.6,5.0,5.6,6.6,9.0}; | |
| double xi_ptbincenter[20] = {0.7,0.9,1.1,1.3,1.5,1.7,1.9,2.1,2.3,2.5,2.7,2.9,3.2,3.6,4.0,4.4,4.8,5.3,6.1,7.8}; | |
| double xi_binwidth[20] = {0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.4,0.4,0.4,0.4,0.4,0.6,1.0,2.4}; | |
| TCanvas* c1 = new TCanvas(); | |
| c1->Divide(4,2,0,0); | |
| double beta_T[8],Tkin[8],aka[8],aka1[8],aka2[8],n[8]; | |
| double ebeta_T[8],eTkin[8],eaka[8],eaka1[8],eaka2[8],en[8]; | |
| stringstream f1Name; | |
| stringstream f2Name; | |
| stringstream f3Name; | |
| TF1* f1[8]; | |
| TF1* f2[8]; | |
| TF1* f3[8]; | |
| TH1D* f1_hist[8]; | |
| TH1D* f2_hist[8]; | |
| TH1D* f3_hist[8]; | |
| stringstream f1HistName; | |
| stringstream f2HistName; | |
| stringstream f3HistName; | |
| double ks_ptbins_histo[34] = {0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,2.8,3.0,3.4,3.8,4.2,4.6,5.0,5.6,6.6,9.0}; | |
| double la_ptbins_histo[24] = {0.0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.4,2.6,2.8,3.0,3.4,3.8,4.2,4.6,5.0,5.6,6.6,9.0}; | |
| double xi_ptbins_histo[24] = {0.0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.4,2.6,2.8,3.0,3.4,3.8,4.2,4.6,5.0,5.6,6.6,9.0}; | |
| for(int mult = 0; mult < 8; mult++){ | |
| f1HistName.str(""); | |
| f2HistName.str(""); | |
| f1HistName << "ks_fitFuncHist_"; | |
| f1HistName << mult+1; | |
| f2HistName << "la_fitFuncHist_"; | |
| f2HistName << mult+1; | |
| f1_hist[mult] = new TH1D(f1HistName.str().c_str(),f1HistName.str().c_str(),33,ks_ptbins_histo); | |
| f2_hist[mult] = new TH1D(f2HistName.str().c_str(),f2HistName.str().c_str(),23,la_ptbins_histo); | |
| } | |
| for(mult = 0; mult < 8; mult++){ | |
| f3HistName.str(""); | |
| f3HistName << "xi_fitFuncHist_"; | |
| f3HistName << mult+1; | |
| f3_hist[mult] = new TH1D(f3HistName.str().c_str(),f3HistName.str().c_str(),23,xi_ptbins_histo); | |
| } | |
| TLatex* ratio[8]; | |
| ratio[0] = new TLatex(2.5,45,"2 < N^{offline}_{trk} < 35"); | |
| ratio[1] = new TLatex(2.5,45,"35 < N^{offline}_{trk} < 60"); | |
| ratio[2] = new TLatex(2.5,45,"60 < N^{offline}_{trk} < 90"); | |
| ratio[3] = new TLatex(2.5,45,"90 < N^{offline}_{trk} < 120"); | |
| ratio[4] = new TLatex(2.5,45,"120 < N^{offline}_{trk} < 150"); | |
| ratio[5] = new TLatex(2.5,45,"150 < N^{offline}_{trk} < 185"); | |
| ratio[6] = new TLatex(2.5,45,"185 < N^{offline}_{trk} < 220"); | |
| ratio[7] = new TLatex(2.5,45,"220 < N^{offline}_{trk} < #infty"); | |
| TLine* l1 = new TLine(0,1,9.0,1.0); | |
| l1->SetLineWidth(2); | |
| l1->SetLineColor(kRed); | |
| l1->SetLineStyle(2); | |
| TLegend *w1 = new TLegend(0.25,0.4,0.5,0.5); | |
| w1->SetLineColor(kWhite); | |
| w1->SetFillColor(0); | |
| w1->AddEntry(ksSpectra[7],"K^{0}_{s}","P"); | |
| w1->AddEntry(laSpectra[7],"#Lambda/#bar{#Lambda}","P"); | |
| w1->AddEntry(xiSpectra[7],"#Xi^{0}","P"); | |
| TGraph* test[8]; | |
| for(int mult = 0; mult < 8; mult++){ | |
| x.clear(); | |
| ex.clear(); | |
| y.clear(); | |
| ey.clear(); | |
| x1.clear(); | |
| ex1.clear(); | |
| y1.clear(); | |
| ey1.clear(); | |
| x2.clear(); | |
| ex2.clear(); | |
| y2.clear(); | |
| ey2.clear(); | |
| for (int pt = 3; pt < 18; pt++){ | |
| x.push_back( ks_ptbincenter[pt] ); | |
| ex.push_back(0.0); | |
| y.push_back( ksSpectra[mult]->GetBinContent(pt+1) ); | |
| ey.push_back( (ksSpectra[mult]->GetBinError(pt+1)) ); | |
| } | |
| for(pt = 1; pt < 12; pt++){ | |
| x1.push_back( la_ptbincenter[pt] ); | |
| ex1.push_back(0.0); | |
| y1.push_back( laSpectra[mult]->GetBinContent(pt+2) ); | |
| ey1.push_back( (laSpectra[mult]->GetBinError(pt+2)) ); | |
| } | |
| for(pt = 0; pt < 11; pt++){ | |
| x2.push_back( xi_ptbincenter[pt] ); | |
| ex2.push_back(0.0); | |
| y2.push_back( xiSpectra[mult]->GetBinContent(pt+1) ); | |
| ey2.push_back( (xiSpectra[mult]->GetBinError(pt+1)) ); | |
| } | |
| /** | |
| * simultaneous fit for K0s and Lambda: | |
| */ | |
| TMinuit * gMinuit[8]; | |
| gMinuit[mult] = new TMinuit(6); | |
| //set the function to minimize with minuit; | |
| gMinuit[mult]->SetFCN(function); | |
| double arglist[10]; | |
| arglist[0] = -1; | |
| gMinuit[mult]->mnexcm("SET ERR", arglist, 1, 0); | |
| gMinuit[mult]->mnparm(0, "aka", 10, 0.1, 1, 10000, 0); | |
| gMinuit[mult]->mnparm(1, "beta_T", 0.32, 0.0001, 0.005, 1.0, 0); | |
| gMinuit[mult]->mnparm(2, "Tkin", 0.17, 0.0001, 0.005, 1.0, 0); | |
| gMinuit[mult]->mnparm(3, "n", 1.0, 0.01, 0.1, 10.0, 0); | |
| gMinuit[mult]->mnparm(4, "aka1", 10, 0.1, 1, 10000, 0); | |
| gMinuit[mult]->mnparm(5, "aka2", 10, 0.1, 1, 10000, 0); | |
| gMinuit[mult]->mnexcm("MIGRAD", arglist, 1, 0); | |
| gMinuit[mult]->mnexcm("MINOS", arglist, 1, 0); | |
| gMinuit[mult]->mnexcm("CALL FCN", arglist, 1, 0); | |
| //gMinuit[mult]->mnexcm("HESSE", arglist, 1, 0); | |
| gMinuit[mult]->GetParameter(0, aka[mult], eaka[mult]); | |
| gMinuit[mult]->GetParameter(1, beta_T[mult], ebeta_T[mult]); | |
| gMinuit[mult]->GetParameter(2, Tkin[mult], eTkin[mult]); | |
| gMinuit[mult]->GetParameter(3, n[mult], en[mult]); | |
| gMinuit[mult]->GetParameter(4, aka1[mult], eaka1[mult]); | |
| gMinuit[mult]->GetParameter(5, aka2[mult], eaka2[mult]); | |
| /** | |
| * define the fit function by using the parameters from fit: | |
| */ | |
| double xmin = 0.3; | |
| double xmax = 1.8; | |
| double xmin1 = 0.6; | |
| double xmax1 = 3.0; | |
| double xmin2 = 0.6; | |
| double xmax2 = 3.0; | |
| f1Name.str(""); | |
| f2Name.str(""); | |
| f3Name.str(""); | |
| f1Name << "f1_"; | |
| f1Name << mult+1; | |
| f2Name << "f2_"; | |
| f2Name << mult+1; | |
| f3Name << "f3_"; | |
| f3Name << mult+1; | |
| f1[mult] = new TF1(f1Name.str().c_str(),MyFunc,xmin,xmax,4); | |
| f1[mult]->SetParameter(0,beta_T[mult]); | |
| f1[mult]->SetParameter(1,Tkin[mult]); | |
| f1[mult]->SetParameter(2,aka[mult]); | |
| f1[mult]->SetParameter(3,n[mult]); | |
| f2[mult] = new TF1(f2Name.str().c_str(),MyFunc1,xmin1,xmax1,4); | |
| f2[mult]->SetParameter(0,beta_T[mult]); | |
| f2[mult]->SetParameter(1,Tkin[mult]); | |
| f2[mult]->SetParameter(2,aka1[mult]); | |
| f2[mult]->SetParameter(3,n[mult]); | |
| f3[mult] = new TF1(f3Name.str().c_str(),MyFunc2,xmin2,xmax2,4); | |
| f3[mult]->SetParameter(0,beta_T[mult]); | |
| f3[mult]->SetParameter(1,Tkin[mult]); | |
| f3[mult]->SetParameter(2,aka2[mult]); | |
| f3[mult]->SetParameter(3,n[mult]); | |
| c1->cd(mult+1); | |
| gPad->SetLogy(1); | |
| ksSpectra[mult]->SetMarkerSize(1.3); | |
| ksSpectra[mult]->SetMarkerStyle(20); | |
| ksSpectra[mult]->SetMarkerColor(kBlue); | |
| ksSpectra[mult]->SetStats(kFALSE); | |
| ksSpectra[mult]->SetTitle(""); | |
| ksSpectra[mult]->SetXTitle("P^{}_{T,V0}(GeV/c)"); | |
| ksSpectra[mult]->SetYTitle("1/N^{}_{ev}1/(2#PiP^{}_{T}d^{2}N/(dP^{}_{T}dy) [(GeV/c)^{-2}]"); | |
| ksSpectra[mult]->GetYaxis()->SetRangeUser(0.0000001,1000); | |
| laSpectra[mult]->SetMarkerSize(1.3); | |
| laSpectra[mult]->SetMarkerStyle(20); | |
| laSpectra[mult]->SetMarkerColor(kBlack); | |
| xiSpectra[mult]->SetMarkerSize(1.3); | |
| xiSpectra[mult]->SetMarkerStyle(20); | |
| xiSpectra[mult]->SetMarkerColor(kYellow-2); | |
| ksSpectra[mult]->Draw("P"); | |
| laSpectra[mult]->Draw("Psame"); | |
| xiSpectra[mult]->Draw("Psame"); | |
| ratio[mult]->Draw("same"); | |
| f2[mult]->Draw("same"); | |
| f1[mult]->Draw("same"); | |
| f3[mult]->Draw("same"); | |
| double la_ptbincenter_extrapolate[23] = {0.1,0.3,0.5,0.7,0.9,1.1,1.3,1.5,1.7,1.9,2.1,2.3,2.5,2.7,2.9,3.2,3.6,4.0,4.4,4.8,5.3,6.1,7.8}; | |
| double ks_ptbincenter_extrapolate[33] = {0.05,0.15,0.25,0.35,0.45,0.55,0.65,0.75,0.85,0.95,1.05,1.15,1.25,1.35,1.45,1.55,1.65,1.75,1.85,1.95, | |
| 2.1,2.3,2.5,2.7,2.9,3.2,3.6,4.0,4.4,4.8,5.3,6.1,7.8}; | |
| double xi_ptbincenter_extrapolate[23] = {0.1,0.3,0.5,0.7,0.9,1.1,1.3,1.5,1.7,1.9,2.1,2.3,2.5,2.7,2.9,3.2,3.6,4.0,4.4,4.8,5.3,6.1,7.8}; | |
| for(int pt = 0; pt < 2; pt++){ | |
| double mass = 1.115; | |
| double temp = 0.; | |
| double mt = sqrt(la_ptbincenter_extrapolate[pt]*la_ptbincenter_extrapolate[pt]+mass*mass); | |
| temp = aka1[mult] * mt * integral(beta_T[mult],Tkin[mult],n[mult],la_ptbincenter_extrapolate[pt],mt); | |
| f2_hist[mult]->SetBinContent(pt+1, temp); | |
| f2_hist[mult]->SetBinError(pt+1, 0.01*temp); | |
| } | |
| for(int pt = 0; pt < 3; pt++){ | |
| double mass = 1.314; | |
| double temp = 0.; | |
| double mt = sqrt(xi_ptbincenter_extrapolate[pt]*xi_ptbincenter_extrapolate[pt]+mass*mass); | |
| temp = aka2[mult] * mt * integral(beta_T[mult],Tkin[mult],n[mult],xi_ptbincenter_extrapolate[pt],mt); | |
| f3_hist[mult]->SetBinContent(pt+1, temp); | |
| f3_hist[mult]->SetBinError(pt+1, 0.01*temp); | |
| } | |
| } | |
| for(mult = 0; mult < 8; mult++){ | |
| for(pt = 0; pt < 33; pt++){ | |
| double temp = ksSpectra[mult]->GetBinContent(pt+1); | |
| double temp_err = ksSpectra[mult]->GetBinError(pt+1); | |
| f1_hist[mult]->SetBinContent(pt+1, temp); | |
| f1_hist[mult]->SetBinError(pt+1, temp_err); | |
| } | |
| for(pt = 0; pt < 21; pt++){ | |
| double temp = laSpectra[mult]->GetBinContent(pt+2); | |
| double temp_err = laSpectra[mult]->GetBinError(pt+2); | |
| f2_hist[mult]->SetBinContent(pt+3, temp); | |
| f2_hist[mult]->SetBinError(pt+3, temp_err); | |
| } | |
| for(pt = 0; pt < 20; pt++){ | |
| double temp = xiSpectra[mult]->GetBinContent(pt+1); | |
| double temp_err = xiSpectra[mult]->GetBinError(pt+1); | |
| f3_hist[mult]->SetBinContent(pt+4, temp); | |
| f3_hist[mult]->SetBinError(pt+4, temp_err); | |
| } | |
| } | |
| TFile savefile("../files/meanPtSpectra_3particles.root","new"); | |
| for(mult = 0; mult < 8; mult++){ | |
| f1_hist[mult]->Write(); | |
| f2_hist[mult]->Write(); | |
| f3_hist[mult]->Write(); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment