//Christine Nattrass, University of Tennessee at Knoxville
//This macro is to calculate the contributions to Et from various particles based on Levy fits to ALICE data at 900 GeV
//It uses d^2N/dpTdy from the papers, weighs it by Et, and integrates over all pT.
//A=0 for mesons
//A=1 for antinucleons since they would anihilate in the calorimeter if they were observed by a calorimeter
//A=-1 for nucleons since they would not anihilate and their mass would not be measured
//At the end this is used to calculate the pid calculation correction
class AliAnalysisLevyPtModified{
public:
virtual ~AliAnalysisLevyPtModified(){;};
Double_t Evaluate(Double_t *pt, Double_t *par)
{
Double_t ldNdy = par[0];
Double_t l2pi = 2*TMath::Pi();
Double_t lTemp = par[1];
Double_t lPower = par[2];
Double_t lMass = par[3];
Double_t A = par[4];
Double_t lMassEt = par[5];//only used for calculating Et
//this is the Et we would calculate if we had identified the particle as having a mass lMassEt
Double_t Et = TMath::Sqrt(pt[0]*pt[0]+lMassEt*lMassEt)+A*lMassEt;
Double_t lBigCoef = ((lPower-1)*(lPower-2)) / (l2pi*lPower*lTemp*(lPower*lTemp+lMass*(lPower-2)));
Double_t lInPower = 1 + (TMath::Sqrt(pt[0]*pt[0]+lMass*lMass)-lMass) / (lPower*lTemp);
//This is the density of particles times the Et weight
return ldNdy *Et* pt[0] * lBigCoef * TMath::Power(lInPower,(-1)*lPower);
}
ClassDef(AliAnalysisLevyPtModified, 1);
};
class AliAnalysisLevyPtModifiedStrangeness{
public:
virtual ~AliAnalysisLevyPtModifiedStrangeness(){;};
Double_t Evaluate(Double_t *pt, Double_t *par)
{
Double_t ldNdy = par[0];
Double_t l2pi = 2*TMath::Pi();
Double_t lTemp = par[1];
Double_t lPower = par[2];
Double_t lMass = par[3];
Double_t A = par[4];
Double_t lMassEt = par[5];//only used for calculating Et
//this is the Et we would calculate if we had identified the particle as having a mass lMassEt
Double_t Et = TMath::Sqrt(pt[0]*pt[0]+lMassEt*lMassEt)+A*lMassEt;
Double_t lBigCoef = ((lPower-1)*(lPower-2)) / (l2pi*lPower*lTemp*(lPower*lTemp+lMass*(lPower-2)));
Double_t lInPower = 1 + (TMath::Sqrt(pt[0]*pt[0]+lMass*lMass)-lMass) / (lPower*lTemp);
Double_t strangeness = (0.4333333*pt[0]-0.0666666)/(0.2333333333*pt[0]-0.01666666);
if(strangeness<1.0 || pt[0]<0.1) strangeness = 1.0;
//This is the density of particles times the Et weight
return ldNdy *strangeness* Et* pt[0] * lBigCoef * TMath::Power(lInPower,(-1)*lPower);
}
ClassDef(AliAnalysisLevyPtModifiedStrangeness, 1);
};
class AliAnalysisLevyPtModifiedBaryonEnhanced{
public:
virtual ~AliAnalysisLevyPtModifiedBaryonEnhanced(){;};
Double_t Evaluate(Double_t *pt, Double_t *par)
{
Double_t ldNdy = par[0];
Double_t l2pi = 2*TMath::Pi();
Double_t lTemp = par[1];
Double_t lPower = par[2];
Double_t lMass = par[3];
Double_t A = par[4];
Double_t lMassEt = par[5];//only used for calculating Et
Double_t lBary0 = par[6];
Double_t lBary1 = par[7];
Double_t lBary2 = par[8];
Double_t lBary3 = par[9];
Double_t lBary4 = par[10];
Double_t lBary5 = par[11];
//this is the Et we would calculate if we had identified the particle as having a mass lMassEt
Double_t Et = TMath::Sqrt(pt[0]*pt[0]+lMassEt*lMassEt)+A*lMassEt;
Double_t lBigCoef = ((lPower-1)*(lPower-2)) / (l2pi*lPower*lTemp*(lPower*lTemp+lMass*(lPower-2)));
Double_t lInPower = 1 + (TMath::Sqrt(pt[0]*pt[0]+lMass*lMass)-lMass) / (lPower*lTemp);
//this is the baryon enhancement factor
Double_t baryonEnhancement = lBary0*pow(pt[0],lBary1)*exp(-pow(pt[0]/lBary2,lBary3))/(lBary4+lBary5*pt[0]);
if(baryonEnhancement<1.0) baryonEnhancement = 1.0;
Double_t strangeness = (0.4333333*pt[0]-0.0666666)/(0.2333333333*pt[0]-0.01666666);
if(strangeness<1.0 || pt[0]<0.1) strangeness = 1.0;
//This is the density of particles times the Et weight
return ldNdy *Et*strangeness* baryonEnhancement*pt[0] * lBigCoef * TMath::Power(lInPower,(-1)*lPower); }
ClassDef(AliAnalysisLevyPtModifiedBaryonEnhanced, 1);
};
class AliAnalysisLevyPtModifiedStrangenessBaryonEnhanced{
public:
virtual ~AliAnalysisLevyPtModifiedStrangenessBaryonEnhanced(){;};
Double_t Evaluate(Double_t *pt, Double_t *par)
{
Double_t ldNdy = par[0];
Double_t l2pi = 2*TMath::Pi();
Double_t lTemp = par[1];
Double_t lPower = par[2];
Double_t lMass = par[3];
Double_t A = par[4];
Double_t lMassEt = par[5];//only used for calculating Et
Double_t lBary0 = par[6];
Double_t lBary1 = par[7];
Double_t lBary2 = par[8];
Double_t lBary3 = par[9];
Double_t lBary4 = par[10];
Double_t lBary5 = par[11];
//this is the Et we would calculate if we had identified the particle as having a mass lMassEt
Double_t Et = TMath::Sqrt(pt[0]*pt[0]+lMassEt*lMassEt)+A*lMassEt;
Double_t lBigCoef = ((lPower-1)*(lPower-2)) / (l2pi*lPower*lTemp*(lPower*lTemp+lMass*(lPower-2)));
Double_t lInPower = 1 + (TMath::Sqrt(pt[0]*pt[0]+lMass*lMass)-lMass) / (lPower*lTemp);
//this is the baryon enhancement factor
Double_t baryonEnhancement = lBary0*pow(pt[0],lBary1)*exp(-pow(pt[0]/lBary2,lBary3))/(lBary4+lBary5*pt[0]);
if(baryonEnhancement<1.0) baryonEnhancement = 1.0;
//This is the density of particles times the Et weight
return ldNdy *Et* baryonEnhancement*pt[0] * lBigCoef * TMath::Power(lInPower,(-1)*lPower); }
ClassDef(AliAnalysisLevyPtModifiedStrangenessBaryonEnhanced, 1);
};
void CorrPIDLevyFit(bool hadronic = false){
//pt cuts where we can identify things
float protoncut = 0.9+0.25;
float protoncuterr = 0.25;
float kaoncut = 0.45+0.25;
float kaoncuterr = 0.25;
//pt cut
float ptcut = 0.1;
// particle & $\frac{dN}{dy}$ & T (GeV) & n & $\frac{dE_T}{dy}$& a &\ET \\ \hline
// $\pi^{+}+\pi^{-}$ & 2.977 $\pm$ 0.15 & 0.126 $\pm$ 0.001 & 7.82 $\pm$ 0.1 & & & \\
AliAnalysisLevyPtModified *function = new AliAnalysisLevyPtModified();
fPion = new TF1("fPion",function, &AliAnalysisLevyPtModified::Evaluate,0,50,6,"AliAnalysisLevyPtModified","Evaluate");
fPion->SetParameter(0,2.977);//dN/dy
fPion->SetParameter(1,0.126);//T
fPion->SetParameter(2,7.82);//n
fPion->SetParameter(3,0.13957);//mass
fPion->SetParameter(4,0);//A=0 for pions
fPion->SetParameter(5,0.13957);//mass et
float integralPion = fPion->Integral(ptcut,50);
float integralErrPion = integralPion*0.007/2.977;
float myerrorPionT = 0.0;
float myerrorPionn = 0.0;
float tmpPion;
float T = 0.126;
float Terr = 0.001;
float n = 7.82;
float nerr = 0.1;
fPion->SetParameter(1,T+Terr);//T
tmpPion = fPion->Integral(ptcut,50);
myerrorPionT = TMath::Abs(integralPion-tmpPion);
fPion->SetParameter(1,T-Terr);//T
tmpPion = fPion->Integral(ptcut,50);
if(TMath::Abs(integralPion-tmpPion)>myerrorPionT) myerrorPionT = TMath::Abs(integralPion-tmpPion);
fPion->SetParameter(1,T);//T
fPion->SetParameter(2,n+nerr);//n
tmpPion = fPion->Integral(ptcut,50);
myerrorPionn = TMath::Abs(integralPion-tmpPion);
fPion->SetParameter(2,n-nerr);//n
tmpPion = fPion->Integral(ptcut,50);
if(TMath::Abs(integralPion-tmpPion)>myerrorPionn) myerrorPionn = TMath::Abs(integralPion-tmpPion);
//This isn't strictly correct because the errors on the parameters should be correlated but it's close
//To get the correct error one would have to fit the spectra data to get the covariance matrix...
cout<<"Errors: dN/dy "<<integralErrPion<<" T "<<myerrorPionT<<" n "<<myerrorPionn<<endl;
integralErrPion = TMath::Sqrt(TMath::Power(integralErrPion,2)+TMath::Power(myerrorPionT,2)+TMath::Power(myerrorPionn,2));
cout<<"Pion Et = "<<integralPion<<"$\\pm$"<<integralErrPion<<endl;
// particle & $\frac{dN}{dy}$ & T (GeV) & n & $\frac{dE_T}{dy}$& a &\ET \\ \hline
// $K^{+}+K^{-}$ & 0.366 $\pm$ 0.03 & 0.160 $\pm$ 0.006 & 6.087 $\pm$ 0.4 & & & \\
fKaon = new TF1("fKaon",function, &AliAnalysisLevyPtModified::Evaluate,0,50,6,"AliAnalysisLevyPtModified","Evaluate");
fKaon->SetParameter(0,0.366);//dN/dy
fKaon->SetParameter(1,0.160);//T
fKaon->SetParameter(2,6.087);//n
fKaon->SetParameter(3,0.493677);//mass
fKaon->SetParameter(4,0);//A=0 for kaons
fKaon->SetParameter(5,0.493677);//mass et
fKaonStrange = new TF1("fKaonStrange",function, &AliAnalysisLevyPtModifiedStrangeness::Evaluate,0,50,6,"AliAnalysisLevyPtModifiedStrangeness","Evaluate");
for(int i=0;i<6;i++){fKaonStrange->SetParameter(i,fKaon->GetParameter(i));}
float integralKaon = fKaon->Integral(ptcut,50);
float integralKaonStrange = fKaonStrange->Integral(ptcut,50);
float integralErrKaon = integralKaon*0.006/0.366;
float myerrorKaonT = 0.0;
float myerrorKaonn = 0.0;
float tmpKaon;
float T = 0.160;
float Terr = 0.006;
float n = 6.087;
float nerr = 0.4;
fKaon->SetParameter(1,T+Terr);//T
tmpKaon = fKaon->Integral(ptcut,50);
myerrorKaonT = TMath::Abs(integralKaon-tmpKaon);
fKaon->SetParameter(1,T-Terr);//T
tmpKaon = fKaon->Integral(ptcut,50);
if(TMath::Abs(integralKaon-tmpKaon)>myerrorKaonT) myerrorKaonT = TMath::Abs(integralKaon-tmpKaon);
fKaon->SetParameter(1,T);//T
fKaon->SetParameter(2,n+nerr);//n
tmpKaon = fKaon->Integral(ptcut,50);
myerrorKaonn = TMath::Abs(integralKaon-tmpKaon);
fKaon->SetParameter(2,n-nerr);//n
tmpKaon = fKaon->Integral(ptcut,50);
if(TMath::Abs(integralKaon-tmpKaon)>myerrorKaonn) myerrorKaonn = TMath::Abs(integralKaon-tmpKaon);
//This isn't strictly correct because the errors on the parameters should be correlated but it's close
cout<<"Errors: dN/dy "<<integralErrKaon<<" T "<<myerrorKaonT<<" n "<<myerrorKaonn<<endl;
integralErrKaon = TMath::Sqrt(TMath::Power(integralErrKaon,2)+TMath::Power(myerrorKaonT,2)+TMath::Power(myerrorKaonn,2));
cout<<"Kaon Et = "<<integralKaon<<"$\\pm$"<<integralErrKaon<<endl;
cout<<"Kaon Et Strangeness Enhanced = "<<integralKaonStrange<<endl;
//now calculate the integral for kaons we can identify:
float integralKaonLowPtMean = fKaon->Integral(ptcut,kaoncut);
float integralKaonLowPtPlus = fKaon->Integral(ptcut,kaoncut+kaoncuterr);
float integralKaonLowPtMinus = fKaon->Integral(ptcut,kaoncut-kaoncuterr);
float integralKaonStrangeLowPtMinus = fKaonStrange->Integral(ptcut,kaoncut-kaoncuterr);
//now we switch the kaon mass to the pion mass
fKaon->SetParameter(5,0.13957);//mass et
fKaonStrange->SetParameter(5,0.13957);//mass et
//and do the integrals
float integralKaonHighPtMean = fKaon->Integral(kaoncut,50);
float integralKaonHighPtPlus = fKaon->Integral(kaoncut+kaoncuterr,50);
float integralKaonHighPtMinus = fKaon->Integral(kaoncut-kaoncuterr,50);
float integralKaonStrangeHighPtMinus = fKaonStrange->Integral(kaoncut-kaoncuterr,50);
float integralKaonNoID = fKaon->Integral(ptcut,50);
cout<<"Kaon Et as pion = "<<integralKaonHighPtMean+integralKaonLowPtMean<<endl;
cout<<"Kaon Et Strange as pion = "<<integralKaonStrangeHighPtMinus+integralKaonStrangeLowPtMinus<<endl;
TF1 *fKaonPion = fKaon->Clone("fKaonPion");
//and change it back just to avoid confusion
fKaon->SetParameter(5,0.493677);//mass et
fKaonStrange->SetParameter(5,0.493677);//mass et
// particle & $\frac{dN}{dy}$ & T (GeV) & n & $\frac{dE_T}{dy}$& a &\ET \\ \hline
// $p + \bar{p}$ & 0.157 $\pm$ 0.012 & 0.196 $\pm$ 0.009 & 8.6 $\pm$ 1.1 & & & \\
fProton = new TF1("fProton",function, &AliAnalysisLevyPtModified::Evaluate,0,50,6,"AliAnalysisLevyPtModified","Evaluate");
fProton->SetParameter(0,0.08);//dN/dy
fProton->SetParameter(1,0.196);//T
fProton->SetParameter(2,8.6);//n
fProton->SetParameter(3,0.938272);//mass
fProton->SetParameter(4,-1);//A=0 for protons
fProton->SetParameter(5,0.938272);//mass et
fProtonEnhanced = new TF1("fProtonEnhanced",function, &AliAnalysisLevyPtModifiedBaryonEnhanced::Evaluate,0,50,12,"AliAnalysisLevyPtModifiedBaryonEnhanced","Evaluate");
for(int i=0;i<6;i++){fProtonEnhanced->SetParameter(i,fProton->GetParameter(i));}//set all of the spectra parameters to their normal values
//and now set the baryon enhancement parameters
fProtonEnhanced->SetParameter(6,0.900878);
fProtonEnhanced->SetParameter(7,1.38882);
fProtonEnhanced->SetParameter(8,2.6361);
fProtonEnhanced->SetParameter(9,1.37751);
fProtonEnhanced->SetParameter(10,0.5);
fProtonEnhanced->SetParameter(11,-0.03);
float integralProton = fProton->Integral(ptcut,50);
float integralErrProton = integralProton*0.002/0.08;
float myerrorProtonT = 0.0;
float myerrorProtonn = 0.0;
float tmpProton;
float T = 0.196;
float Terr = 0.009;
float n = 8.6;
float nerr = 1.1;
fProton->SetParameter(1,T+Terr);//T
tmpProton = fProton->Integral(ptcut,50);
myerrorProtonT = TMath::Abs(integralProton-tmpProton);
fProton->SetParameter(1,T-Terr);//T
tmpProton = fProton->Integral(ptcut,50);
if(TMath::Abs(integralProton-tmpProton)>myerrorProtonT) myerrorProtonT = TMath::Abs(integralProton-tmpProton);
fProton->SetParameter(1,T);//T
fProton->SetParameter(2,n+nerr);//n
tmpProton = fProton->Integral(ptcut,50);
myerrorProtonn = TMath::Abs(integralProton-tmpProton);
fProton->SetParameter(2,n-nerr);//n
tmpProton = fProton->Integral(ptcut,50);
if(TMath::Abs(integralProton-tmpProton)>myerrorProtonn) myerrorProtonn = TMath::Abs(integralProton-tmpProton);
//This isn't strictly correct because the errors on the parameters should be correlated but it's close
cout<<"Errors: dN/dy "<<integralErrProton<<" T "<<myerrorProtonT<<" n "<<myerrorProtonn<<endl;
integralErrProton = TMath::Sqrt(TMath::Power(integralErrProton,2)+TMath::Power(myerrorProtonT,2)+TMath::Power(myerrorProtonn,2));
cout<<"Proton Et = "<<integralProton<<"$\\pm$"<<integralErrProton<<endl;
//now calculate the integral for kaons we can identify:
float integralProtonLowPtMean = fProton->Integral(ptcut,protoncut);
float integralProtonLowPtPlus = fProton->Integral(ptcut,protoncut+protoncuterr);
float integralProtonLowPtMinus = fProton->Integral(ptcut,protoncut-protoncuterr);
float integralProtonEnhancedTrue =integralProtonLowPtMinus+ fProtonEnhanced->Integral(protoncut-protoncuterr,50);
fProtonEnhanced->SetParameter(6,1.2*fProtonEnhanced->GetParameter(6));
float integralProtonReallyEnhancedTrue = integralProtonLowPtMinus+ fProtonEnhanced->Integral(protoncut-protoncuterr,50);
fProtonEnhanced->SetParameter(6,1.0/1.2*fProtonEnhanced->GetParameter(6));
//now we switch the kaon mass to the pion mass
fProton->SetParameter(5,0.13957);//mass et
fProton->SetParameter(4,0);//A=0 for pions
//and do the integrals
float integralProtonHighPtMean = fProton->Integral(protoncut,50);
float integralProtonHighPtPlus = fProton->Integral(protoncut+protoncuterr,50);
float integralProtonHighPtMinus = fProton->Integral(protoncut-protoncuterr,50);
//now we switch the kaon mass to the pion mass
fProtonEnhanced->SetParameter(5,0.13957);//mass et
fProtonEnhanced->SetParameter(4,0);//A=0 for pions
float integralProtonHighPtMinusEnhanced = fProtonEnhanced->Integral(protoncut-protoncuterr,50);
fProtonEnhanced->SetParameter(6,1.2*fProtonEnhanced->GetParameter(6));
float integralProtonHighPtMinusReallyEnhanced = fProtonEnhanced->Integral(protoncut-protoncuterr,50);
fProtonEnhanced->SetParameter(6,1.0/1.2*fProtonEnhanced->GetParameter(6));
float integralProtonNoID = fProton->Integral(ptcut,50);
float integralProtonEnhancedNoID = integralProtonHighPtMinusEnhanced+integralProtonLowPtMinus;
float integralProtonReallyEnhancedNoID = integralProtonHighPtMinusReallyEnhanced+integralProtonLowPtMinus;
cout<<"Proton Et as pion = "<<integralProtonHighPtMean+integralProtonLowPtMean<<endl;
cout<<"Proton Et really enhanced = "<<integralProtonReallyEnhancedTrue<<"("<<integralProtonHighPtMinusReallyEnhanced+integralProtonLowPtMinus<<")"<<endl;
TF1 *fProtonPion = fProton->Clone("fProtonPion");
//and change it back just to avoid confusion
fProton->SetParameter(5,0.938272);//mass et
fProton->SetParameter(4,-1);//A=0 for protons
fProtonEnhanced->SetParameter(5,0.938272);//mass et
fProtonEnhanced->SetParameter(4,-1);//A=0 for protons
//Antiprotons...
fProton->SetParameter(0,0.077);//dN/dy
fProton->SetParameter(2,n);//n
fProton->SetParameter(4,1);//A=0 for protons
fAntiProtonEnhanced = new TF1("fAntiProtonEnhanced",function, &AliAnalysisLevyPtModifiedBaryonEnhanced::Evaluate,0,50,12,"AliAnalysisLevyPtModifiedBaryonEnhanced","Evaluate");
for(int i=0;i<6;i++){fAntiProtonEnhanced->SetParameter(i,fProton->GetParameter(i));}//set all of the spectra parameters to their normal values
//and now set the baryon enhancement parameters
fAntiProtonEnhanced->SetParameter(6,0.900878);
fAntiProtonEnhanced->SetParameter(7,1.38882);
fAntiProtonEnhanced->SetParameter(8,2.6361);
fAntiProtonEnhanced->SetParameter(9,1.37751);
fAntiProtonEnhanced->SetParameter(10,0.5);
fAntiProtonEnhanced->SetParameter(11,-0.03);
float integralAntiProton = fProton->Integral(ptcut,50);
float integralErrAntiProton = integralAntiProton*0.002/0.077;
float myerrorAntiProtonT = 0.0;
float myerrorAntiProtonn = 0.0;
float tmpAntiProton;
float T = 0.196;
float Terr = 0.009;
float n = 8.6;
float nerr = 1.1;
fProton->SetParameter(1,T+Terr);//T
tmpAntiProton = fProton->Integral(ptcut,50);
myerrorAntiProtonT = TMath::Abs(integralAntiProton-tmpAntiProton);
fProton->SetParameter(1,T-Terr);//T
tmpAntiProton = fProton->Integral(ptcut,50);
if(TMath::Abs(integralAntiProton-tmpAntiProton)>myerrorAntiProtonT) myerrorAntiProtonT = TMath::Abs(integralAntiProton-tmpAntiProton);
fProton->SetParameter(1,T);//T
fProton->SetParameter(2,n+nerr);//n
tmpAntiProton = fProton->Integral(ptcut,50);
myerrorAntiProtonn = TMath::Abs(integralAntiProton-tmpAntiProton);
fProton->SetParameter(2,n-nerr);//n
tmpAntiProton = fProton->Integral(ptcut,50);
if(TMath::Abs(integralAntiProton-tmpAntiProton)>myerrorAntiProtonn) myerrorAntiProtonn = TMath::Abs(integralAntiProton-tmpAntiProton);
//This isn't strictly correct because the errors on the parameters should be correlated but it's close
cout<<"Errors: dN/dy "<<integralErrAntiProton<<" T "<<myerrorAntiProtonT<<" n "<<myerrorAntiProtonn<<endl;
integralErrAntiProton = TMath::Sqrt(TMath::Power(integralErrAntiProton,2)+TMath::Power(myerrorAntiProtonT,2)+TMath::Power(myerrorAntiProtonn,2));
cout<<"AntiProton Et = "<<integralAntiProton<<"$\\pm$"<<integralErrAntiProton<<endl;
TF1 *fAntiProton = fProton->Clone("fAntiProton");
//now calculate the integral for kaons we can identify:
float integralAntiProtonLowPtMean = fProton->Integral(ptcut,protoncut);
float integralAntiProtonLowPtPlus = fProton->Integral(ptcut,protoncut+protoncuterr);
float integralAntiProtonLowPtMinus = fProton->Integral(ptcut,protoncut-protoncuterr);
float integralAntiProtonEnhancedTrue =integralAntiProtonLowPtMinus+ fAntiProtonEnhanced->Integral(protoncut-protoncuterr,50);
fAntiProtonEnhanced->SetParameter(6,1.2*fAntiProtonEnhanced->GetParameter(6));
float integralAntiProtonReallyEnhancedTrue = integralAntiProtonLowPtMinus+ fAntiProtonEnhanced->Integral(protoncut-protoncuterr,50);
fAntiProtonEnhanced->SetParameter(6,1.0/1.2*fAntiProtonEnhanced->GetParameter(6));
//now we switch the kaon mass to the pion mass
fProton->SetParameter(5,0.13957);//mass et
fProton->SetParameter(4,0);//A=0 for pions
//and do the integrals
float integralAntiProtonHighPtMean = fProton->Integral(protoncut,50);
float integralAntiProtonHighPtPlus = fProton->Integral(protoncut+protoncuterr,50);
float integralAntiProtonHighPtMinus = fProton->Integral(protoncut-protoncuterr,50);
//now we switch the kaon mass to the pion mass
fAntiProtonEnhanced->SetParameter(5,0.13957);//mass et
fAntiProtonEnhanced->SetParameter(4,0);//A=0 for pions
float integralAntiProtonHighPtMinusEnhanced = fAntiProtonEnhanced->Integral(protoncut-protoncuterr,50);
fAntiProtonEnhanced->SetParameter(6,1.2*fAntiProtonEnhanced->GetParameter(6));
float integralAntiProtonHighPtMinusReallyEnhanced = fAntiProtonEnhanced->Integral(protoncut-protoncuterr,50);
fAntiProtonEnhanced->SetParameter(6,1.0/1.2*fAntiProtonEnhanced->GetParameter(6));
float integralAntiProtonNoID = fProton->Integral(ptcut,50);
cout<<"AntiProton Et as pion = "<<integralAntiProtonHighPtMean+integralAntiProtonLowPtMean<<endl;
cout<<"AntiProton Et really enhanced = "<<integralAntiProtonReallyEnhancedTrue<<"("<<integralAntiProtonHighPtMinusReallyEnhanced+integralAntiProtonLowPtMinus<<")"<<endl;
TF1 *fAntiProtonPion = fProton->Clone("fAntiProtonPion");
//and change it back just to avoid confusion
fProton->SetParameter(5,0.938272);//mass
//cout<<"CHECK "<<fProton->GetParameter(5)<<endl;
fProton->SetParameter(4,-1);//A=0 for protons
fAntiProtonEnhanced->SetParameter(5,0.938272);//mass et
fAntiProtonEnhanced->SetParameter(4,-1);//A=0 for protons
float totTrue = integralPion + integralKaon + integralProton + integralAntiProton;
float totTrueErr = TMath::Sqrt(TMath::Power(integralErrAntiProton,2)+TMath::Power(integralErrProton,2)+TMath::Power(integralErrKaon,2)+TMath::Power(integralErrPion,2));
float totTrueEnhanced = integralPion + integralKaon + integralProtonEnhancedTrue + integralAntiProtonEnhancedTrue;
float totTrueReallyEnhanced = integralPion + integralKaon + integralProtonReallyEnhancedTrue + integralAntiProtonReallyEnhancedTrue;
float totTrueStrange = integralPion + integralKaonStrange + integralProton + integralAntiProton;
float totTrueStrangeEnhanced = integralPion + integralKaonStrange + integralProtonReallyEnhancedTrue + integralAntiProtonReallyEnhancedTrue;
cout<<"totEt "<<totTrue<<"+/-"<<totTrueErr<<endl;
float measEt = integralPion+integralKaonLowPtMean+integralKaonHighPtMean+integralProtonLowPtMean+integralProtonHighPtMean+integralAntiProtonLowPtMean+integralAntiProtonHighPtMean;
float measEtPlus = integralPion+integralKaonLowPtPlus+integralKaonHighPtPlus+integralProtonLowPtPlus+integralProtonHighPtPlus+integralAntiProtonLowPtPlus+integralAntiProtonHighPtPlus;
float measEtMinus = integralPion+integralKaonLowPtMinus+integralKaonHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinus+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinus;
float measEtMinusStrange = integralPion+integralKaonStrangeLowPtMinus+integralKaonStrangeHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinus+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinus;
float measEtEnhanced = integralPion+integralKaonLowPtMinus+integralKaonHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinusEnhanced+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinusEnhanced;
float measEtReallyEnhanced = integralPion+integralKaonLowPtMinus+integralKaonHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinusReallyEnhanced+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinusReallyEnhanced;
cout<<"measEt "<<measEt<<" "<<measEtPlus<<" "<<measEtMinus<<endl;
float measEtStrangeEnhanced = integralPion+integralKaonStrangeLowPtMinus+integralKaonStrangeHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinusReallyEnhanced+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinusReallyEnhanced;
cout<<"measEt "<<measEt<<" "<<measEtPlus<<" "<<measEtMinus<<endl;
float measNoID = integralPion+integralKaonNoID+integralProtonNoID+integralAntiProtonNoID;
float fpid = measEt/totTrue;
float fpiderr = fpid*totTrueErr/totTrue;
float fpidsyserr = TMath::Abs(measEtMinus-measEt)/totTrue;
float fnopid = measNoID/totTrue;
float fnopiderr = fnopid*totTrueErr/totTrue;
if(TMath::Abs(measEtPlus-measEt)> fpidsyserr) fpidsyserr = TMath::Abs(measEtPlus-measEt);
cout<<"fpid "<<fpid<<" +/- "<<fpiderr<<" +/- "<<fpidsyserr<<endl;
cout<<"fpid (no pt uncertainty) "<<measEtMinus/totTrue<<" +/- "<<(measEtMinus/totTrue)*totTrueErr/totTrue<<endl;
cout<<"For no id fpid "<<fnopid<<" +/- "<<fnopiderr<<endl;
cout<<"fpid enhanced "<<measEtEnhanced/totTrueEnhanced<<endl;
cout<<"fpid strange "<<measEtMinusStrange/totTrueStrange<<endl;
cout<<"fpid strange enhanced "<<measEtStrangeEnhanced/totTrueStrangeEnhanced<<endl;
cout<<"fpid really enhanced "<<measEtReallyEnhanced/totTrueReallyEnhanced<<endl;
gStyle->SetOptTitle(0);
gStyle->SetOptStat(0);
gStyle->SetOptFit(0);
TCanvas *c1 = new TCanvas("c1","c1",500,400);
c1->SetTopMargin(0.02);
c1->SetRightMargin(0.02);
c1->SetBorderSize(0);
c1->SetFillColor(0);
c1->SetFillColor(0);
c1->SetBorderMode(0);
c1->SetFrameFillColor(0);
c1->SetFrameBorderMode(0);
c1->SetLogy();
fPion->SetLineColor(1);
fKaon->SetLineColor(2);
fKaonPion->SetLineColor(2);
fKaonPion->SetLineStyle(2);
fProton->SetLineColor(4);
fProtonPion->SetLineColor(4);
fProtonPion->SetLineStyle(2);
fAntiProton->SetLineColor(TColor::kCyan);
fAntiProtonPion->SetLineColor(TColor::kCyan);
fAntiProtonPion->SetLineStyle(2);
// cout<<"Kaon pion mass "<<Form("%2.4f",fKaonPion->GetParameter(5))<<" A "<<fKaonPion->GetParameter(4)<<endl;
// cout<<"Proton pion mass "<<fProtonPion->GetParameter(5)<<" A "<<fProtonPion->GetParameter(4)<<endl;
// cout<<"AntiProton pion mass "<<fAntiProtonPion->GetParameter(5)<<" A "<<fAntiProtonPion->GetParameter(4)<<endl;
// cout<<"Kaon mass "<<Form("%2.4f",fKaon->GetParameter(5))<<" A "<<fKaon->GetParameter(4)<<endl;
// cout<<"Proton mass "<<fProton->GetParameter(5)<<" A "<<fProton->GetParameter(4)<<endl;
// cout<<"AntiProton mass "<<fAntiProton->GetParameter(5)<<" A "<<fAntiProton->GetParameter(4)<<endl;
TH1F *frame = new TH1F("frame","frame",1,0,2);
frame->GetYaxis()->SetTitle("1/N_{eve}d^{2}NE_{T}/dydp_{T}");
frame->GetXaxis()->SetTitle("p_{T}");
//fPion->SetRange(0,2);
frame->SetMinimum(1e-4);
frame->SetMaximum(0.5);
frame->Draw();
fPion->Draw("same");
fKaon->Draw("same");
fProton->Draw("same");
fAntiProton->Draw("same");
fKaonPion->Draw("same");
fProtonPion->Draw("same");
fAntiProtonPion->Draw("same");
TLegend *leg = new TLegend(0.782258,0.774194,0.925403,0.962366);
leg->AddEntry(fPion,"#pi");
leg->AddEntry(fProton,"p");
leg->AddEntry(fKaon,"K");
leg->AddEntry(fAntiProton,"#bar{p}");
leg->SetFillStyle(0);
leg->SetFillColor(0);
leg->SetBorderSize(0);
leg->SetTextSize(0.06);
leg->Draw();
TLine *lineProton = new TLine(protoncut-protoncuterr,frame->GetMinimum(),protoncut-protoncuterr,frame->GetMaximum());
lineProton->SetLineColor(fProton->GetLineColor());
lineProton->SetLineStyle(3);
lineProton->SetLineWidth(2);
lineProton->Draw();
TLine *lineKaon = new TLine(kaoncut-kaoncuterr,frame->GetMinimum(),kaoncut-kaoncuterr,frame->GetMaximum());
lineKaon->SetLineColor(fKaon->GetLineColor());
lineKaon->SetLineStyle(3);
lineKaon->SetLineWidth(2);
lineKaon->Draw();
TCanvas *c2 = new TCanvas("c2","c2",500,400);
c2->SetTopMargin(0.02);
c2->SetRightMargin(0.02);
c2->SetBorderSize(0);
c2->SetFillColor(0);
c2->SetFillColor(0);
c2->SetBorderMode(0);
c2->SetFrameFillColor(0);
c2->SetFrameBorderMode(0);
c2->SetLogy();
fPionSpectrum = (TF1*) fPion->Clone("fPionSpectrum");
fKaonSpectrum = (TF1*) fKaon->Clone("fKaonSpectrum");
fProtonSpectrum = (TF1*) fProton->Clone("fProtonSpectrum");
fAntiProtonSpectrum = (TF1*) fAntiProton->Clone("fAntiProtonSpectrum");
fPionSpectrum->SetLineColor(1);
fKaonSpectrum->SetLineColor(2);
fProtonSpectrum->SetLineColor(4);
fAntiProtonSpectrum->SetLineColor(TColor::kCyan);
fKaonSpectrum->SetParameter(5,0.0);//mass et
fProtonSpectrum->SetParameter(5,0.0);//mass et
fPionSpectrum->SetParameter(5,0.0);//mass et
fAntiProtonSpectrum->SetParameter(5,0.0);//mass et
TH1F *frame2 = new TH1F("frame2","frame2",1,0,2);
frame2->GetYaxis()->SetTitle("1/N_{eve}d^{2}N/dydp_{T}");
frame2->GetXaxis()->SetTitle("p_{T}");
//fPionSpectrum->SetRange(0,2);
frame2->SetMinimum(1e-5);
frame2->SetMaximum(1);
frame2->Draw();
fPionSpectrum->Draw("same");
fKaonSpectrum->Draw("same");
fProtonSpectrum->Draw("same");
//fAntiProtonSpectrum->Draw("same");
TLegend *leg2 = new TLegend(0.782258,0.774194,0.925403,0.962366);
leg2->AddEntry(fPionSpectrum,"#pi");
leg2->AddEntry(fProtonSpectrum,"p,#bar{p}");
leg2->AddEntry(fKaonSpectrum,"K");
leg2->SetFillStyle(0);
leg2->SetFillColor(0);
leg2->SetBorderSize(0);
leg2->SetTextSize(0.06);
leg2->Draw();
TCanvas *c3 = new TCanvas("c3","c3",500,400);
c3->SetTopMargin(0.02);
c3->SetRightMargin(0.02);
c3->SetBorderSize(0);
c3->SetFillColor(0);
c3->SetFillColor(0);
c3->SetBorderMode(0);
c3->SetFrameFillColor(0);
c3->SetFrameBorderMode(0);
//c3->SetLogy();
TH1F *frame3 = new TH1F("frame3","frame3",1,0,2);
frame3->GetYaxis()->SetTitle("E_{T}");
frame3->GetXaxis()->SetTitle("p_{T}");
//fPionSpectrum->SetRange(0,2);
frame3->SetMinimum(0.0);
frame3->SetMaximum(4);
frame3->Draw();
TF1 *fPionEt = new TF1("fPionEt","sqrt(x*x+[0]*[0])",0,2);
fPionEt->SetParameter(0,0.13957);
fPionEt->Draw("same");
TF1 *fKaonEt = new TF1("fKaonEt","sqrt(x*x+[0]*[0])",0,2);
fKaonEt->SetParameter(0,0.493677);
fKaonEt->Draw("same");
TF1 *fProtonEt = new TF1("fProtonEt","sqrt(x*x+[0]*[0])-[0]",0,2);
fProtonEt->SetParameter(0,0.938272);
fProtonEt->Draw("same");
TF1 *fAntiProtonEt = new TF1("fAntiProtonEt","sqrt(x*x+[0]*[0])+[0]",0,2);
fAntiProtonEt->SetParameter(0,0.938272);
fAntiProtonEt->Draw("same");
fPionEt->SetLineColor(1);
fKaonEt->SetLineColor(2);
fProtonEt->SetLineColor(4);
fAntiProtonEt->SetLineColor(TColor::kCyan);
TLegend *leg3 = new TLegend(0.782258,0.774194,0.925403,0.962366);
leg3->AddEntry(fPionEt,"#pi");
leg3->AddEntry(fProtonEt,"p");
leg3->AddEntry(fAntiProtonEt,"#bar{p}");
leg3->AddEntry(fKaonEt,"K");
leg3->SetFillStyle(0);
leg3->SetFillColor(0);
leg3->SetBorderSize(0);
leg3->SetTextSize(0.06);
leg3->Draw();
c1->SaveAs("pics/PIDEtweight.eps");
c2->SaveAs("pics/PIDSpectra.eps");
c3->SaveAs("pics/PIDEt.eps");
}