#include "AliAODDimuon.h"
#include "TLorentzVector.h"
#define AliAODDimuon_CXX
ClassImp(AliAODDimuon)
AliAODDimuon::AliAODDimuon():AliVParticle(),fP(0),fMProton(0.93827231)
{
fMu[0]=0;
fMu[1]=0;
}
AliAODDimuon::AliAODDimuon(const AliAODDimuon& dimu):
AliVParticle(dimu),
fP(0),fMProton(0.93827231)
{
fMu[0]=dimu.Mu(0);
fMu[1]=dimu.Mu(1);
}
AliAODDimuon &AliAODDimuon::operator=(const AliAODDimuon& dimu)
{
if(&dimu != this){
delete fP;
fP=0;
fMProton=0.93827231;
fMu[0]=dimu.Mu(0);
fMu[1]=dimu.Mu(1);
}
return *this;
}
AliAODDimuon::AliAODDimuon(TObject *mu0, TObject *mu1):
fP(0),fMProton(0.93827231)
{
fMu[0]=mu0;
fMu[1]=mu1;
}
AliAODDimuon::~AliAODDimuon()
{
delete fP;
}
Double_t AliAODDimuon::Px() const {
if(CheckPointers())return -999999999;
return ((AliAODTrack*)fMu[0].GetObject())->Px()+
((AliAODTrack*)fMu[1].GetObject())->Px();
}
Double_t AliAODDimuon::Py() const {
if(CheckPointers())return -999999999;
return ((AliAODTrack*)fMu[0].GetObject())->Py()+
((AliAODTrack*)fMu[1].GetObject())->Py();
}
Double_t AliAODDimuon::Pz() const {
if(CheckPointers())return -999999999;
return ((AliAODTrack*)fMu[0].GetObject())->Pz()+
((AliAODTrack*)fMu[1].GetObject())->Pz();
}
Double_t AliAODDimuon::Pt() const {
if(CheckPointers())return -999999999;
Double_t px=Px();
Double_t py=Py();
return TMath::Sqrt(px*px+py*py);
}
Double_t AliAODDimuon::E() const
{
if(CheckPointers())return -999999999;
return ((AliAODTrack*)fMu[0].GetObject())->E()+ ((AliAODTrack*)fMu[1].GetObject())->E();
}
Double_t AliAODDimuon::P() const {
if(CheckPointers())return -999999999;
return TLV()->P();
}
Double_t AliAODDimuon::M() const {
if(CheckPointers())return -999999999;
return TLV()->M();
}
Double_t AliAODDimuon::Eta() const {
if(CheckPointers())return -999999999;
return TLV()->Eta();
}
Double_t AliAODDimuon::Phi() const {
if(CheckPointers())return -999999999;
return TLV()->Phi();
}
Double_t AliAODDimuon::Theta() const {
if(CheckPointers())return -999999999;
return TLV()->Theta();
}
Double_t AliAODDimuon::Y() const {
if(CheckPointers())return -999999999;
return TLV()->Rapidity();
}
Short_t AliAODDimuon::Charge() const {
if(CheckPointers())return -999;
return ((AliAODTrack*)fMu[0].GetObject())->Charge()+
((AliAODTrack*)fMu[1].GetObject())->Charge();
}
Int_t AliAODDimuon::CheckPointers() const{
if(fMu[0]==0||fMu[1]==0){
printf("Dimuon not initialized\n");
return -999;
}
if((fMu[0].GetObject())==0||(fMu[1].GetObject())==0){
printf("Can not get objects\n");
return -999;
}
return 0;
}
void AliAODDimuon::SetMu(Int_t imu, AliAODTrack *mu){
if (imu==0||imu==1){
delete fP;
fP=0;
fMu[imu]=mu;
}
}
void AliAODDimuon::SetMuons(AliAODTrack *mu0, AliAODTrack *mu1){
fMu[0]=mu0;
fMu[1]=mu1;
delete fP;
fP=0;
}
Double_t AliAODDimuon::XF() {
if(CheckPointers())return -999999999;
Double_t ebeam = 3500.;
if(ebeam<=0){
printf("AliAODDimuon::xf: can not compute xf with EBeam=%f\n",ebeam);
return -999999999;
}
Double_t mDimu=M();
Double_t pMax=TMath::Sqrt(ebeam*ebeam-mDimu*mDimu);
return Pz()/pMax;
}
Double_t AliAODDimuon::CostCS(){
if(CheckPointers())return -999999999;
Double_t ebeam=3500.;
if(ebeam<=0){
printf("Can not compute costCS with EBeam=%f\n",ebeam);
return -999999999;
}
Double_t mp=fMProton;
Double_t pbeam=TMath::Sqrt(ebeam*ebeam-mp*mp);
Double_t pla10=((AliAODTrack*)fMu[0].GetObject())->Px();
Double_t pla11=((AliAODTrack*)fMu[0].GetObject())->Py();
Double_t pla12=((AliAODTrack*)fMu[0].GetObject())->Pz();
Double_t e1=((AliAODTrack*)fMu[0].GetObject())->E();
Double_t mu1Charge=((AliAODTrack*)fMu[0].GetObject())->Charge();
Double_t pla20=((AliAODTrack*)fMu[1].GetObject())->Px();
Double_t pla21=((AliAODTrack*)fMu[1].GetObject())->Py();
Double_t pla22=((AliAODTrack*)fMu[1].GetObject())->Pz();
Double_t e2=((AliAODTrack*)fMu[1].GetObject())->E();
Double_t mu2Charge=((AliAODTrack*)fMu[1].GetObject())->Charge();
TLorentzVector pProjCM(0.,0.,-pbeam,ebeam);
TLorentzVector pTargCM(0.,0., pbeam,ebeam);
TLorentzVector pMu1CM(pla10,pla11,pla12,e1);
TLorentzVector pMu2CM(pla20,pla21,pla22,e2);
TLorentzVector pDimuCM=pMu1CM+pMu2CM;
TVector3 beta=(-1./pDimuCM.E())*pDimuCM.Vect();
TLorentzVector pMu1Dimu=pMu1CM;
TLorentzVector pMu2Dimu=pMu2CM;
TLorentzVector pProjDimu=pProjCM;
TLorentzVector pTargDimu=pTargCM;
pMu1Dimu.Boost(beta);
pMu2Dimu.Boost(beta);
pProjDimu.Boost(beta);
pTargDimu.Boost(beta);
TVector3 zaxisCS=(((pProjDimu.Vect()).Unit())-((pTargDimu.Vect()).Unit())).Unit();
Double_t cost;
if(mu1Charge > 0) {
cost = zaxisCS.Dot((pMu1Dimu.Vect()).Unit());
if(mu2Charge > 0 && cost<0) cost=-cost;
} else {
cost = zaxisCS.Dot((pMu2Dimu.Vect()).Unit());
if(mu2Charge < 0 && cost<0) cost=-cost;
}
return cost;
}
Double_t AliAODDimuon::CostHe(){
if(CheckPointers())return -999999999;
Double_t ebeam=3500;
if(ebeam<=0){
printf("Can not compute costCS with EBeam=%f\n",ebeam);
return -999999999;
}
Double_t pla10=((AliAODTrack*)fMu[0].GetObject())->Px();
Double_t pla11=((AliAODTrack*)fMu[0].GetObject())->Py();
Double_t pla12=((AliAODTrack*)fMu[0].GetObject())->Pz();
Double_t e1=((AliAODTrack*)fMu[0].GetObject())->E();
Double_t mu1Charge=((AliAODTrack*)fMu[0].GetObject())->Charge();
Double_t pla20=((AliAODTrack*)fMu[1].GetObject())->Px();
Double_t pla21=((AliAODTrack*)fMu[1].GetObject())->Py();
Double_t pla22=((AliAODTrack*)fMu[1].GetObject())->Pz();
Double_t e2=((AliAODTrack*)fMu[1].GetObject())->E();
Double_t mu2Charge=((AliAODTrack*)fMu[1].GetObject())->Charge();
TLorentzVector pMu1CM(pla10,pla11,pla12,e1);
TLorentzVector pMu2CM(pla20,pla21,pla22,e2);
TLorentzVector pDimuCM=pMu1CM+pMu2CM;
TVector3 beta=(-1./pDimuCM.E())*pDimuCM.Vect();
TLorentzVector pMu1Dimu=pMu1CM;
TLorentzVector pMu2Dimu=pMu2CM;
pMu1Dimu.Boost(beta);
pMu2Dimu.Boost(beta);
TVector3 zaxis;
zaxis=(pDimuCM.Vect()).Unit();
Double_t cost;
if(mu1Charge > 0) {
cost = zaxis.Dot((pMu1Dimu.Vect()).Unit());
if(mu2Charge > 0 && cost<0) cost=-cost;
} else {
cost = zaxis.Dot((pMu2Dimu.Vect()).Unit());
if(mu2Charge < 0 && cost<0) cost=-cost;
}
return cost;
}
Double_t AliAODDimuon::PhiCS(){
if(CheckPointers())return -999999999;
Double_t ebeam=3500.;
if(ebeam<=0){
printf("Can not compute phiCS with EBeam=%f\n",ebeam);
return -999999999;
}
Double_t mp=fMProton;
Double_t pbeam=TMath::Sqrt(ebeam*ebeam-mp*mp);
Double_t pla10=((AliAODTrack*)fMu[0].GetObject())->Px();
Double_t pla11=((AliAODTrack*)fMu[0].GetObject())->Py();
Double_t pla12=((AliAODTrack*)fMu[0].GetObject())->Pz();
Double_t e1=((AliAODTrack*)fMu[0].GetObject())->E();
Double_t mu1Charge=((AliAODTrack*)fMu[0].GetObject())->Charge();
Double_t pla20=((AliAODTrack*)fMu[1].GetObject())->Px();
Double_t pla21=((AliAODTrack*)fMu[1].GetObject())->Py();
Double_t pla22=((AliAODTrack*)fMu[1].GetObject())->Pz();
Double_t e2=((AliAODTrack*)fMu[1].GetObject())->E();
TLorentzVector pProjCM(0.,0.,-pbeam,ebeam);
TLorentzVector pTargCM(0.,0., pbeam,ebeam);
TLorentzVector pMu1CM(pla10,pla11,pla12,e1);
TLorentzVector pMu2CM(pla20,pla21,pla22,e2);
TLorentzVector pDimuCM=pMu1CM+pMu2CM;
TVector3 beta=(-1./pDimuCM.E())*pDimuCM.Vect();
TLorentzVector pMu1Dimu=pMu1CM;
TLorentzVector pMu2Dimu=pMu2CM;
TLorentzVector pProjDimu=pProjCM;
TLorentzVector pTargDimu=pTargCM;
pMu1Dimu.Boost(beta);
pMu2Dimu.Boost(beta);
pProjDimu.Boost(beta);
pTargDimu.Boost(beta);
TVector3 zaxisCS=(((pProjDimu.Vect()).Unit())-((pTargDimu.Vect()).Unit())).Unit();
TVector3 yaxisCS=(((pProjDimu.Vect()).Unit()).Cross((pTargDimu.Vect()).Unit())).Unit();
TVector3 xaxisCS=(yaxisCS.Cross(zaxisCS)).Unit();
Double_t phi;
if(mu1Charge>0) phi = TMath::ATan2((pMu1Dimu.Vect()).Dot(yaxisCS),((pMu1Dimu.Vect()).Dot(xaxisCS)));
else phi = TMath::ATan2((pMu2Dimu.Vect()).Dot(yaxisCS),((pMu2Dimu.Vect()).Dot(xaxisCS)));
return phi;
}
Double_t AliAODDimuon::PhiHe(){
if(CheckPointers())return -999999999;
Double_t ebeam=3500;
if(ebeam<=0){
printf("Can not compute phiHE with EBeam=%f\n",ebeam);
return -999999999;
}
Double_t pbeam=TMath::Sqrt(ebeam*ebeam-fMProton*fMProton);
Double_t pla10=((AliAODTrack*)fMu[0].GetObject())->Px();
Double_t pla11=((AliAODTrack*)fMu[0].GetObject())->Py();
Double_t pla12=((AliAODTrack*)fMu[0].GetObject())->Pz();
Double_t e1=((AliAODTrack*)fMu[0].GetObject())->E();
Double_t mu1Charge=((AliAODTrack*)fMu[0].GetObject())->Charge();
Double_t pla20=((AliAODTrack*)fMu[1].GetObject())->Px();
Double_t pla21=((AliAODTrack*)fMu[1].GetObject())->Py();
Double_t pla22=((AliAODTrack*)fMu[1].GetObject())->Pz();
Double_t e2=((AliAODTrack*)fMu[1].GetObject())->E();
TLorentzVector pProjCM(0.,0.,-pbeam,ebeam);
TLorentzVector pTargCM(0.,0., pbeam,ebeam);
TLorentzVector pMu1CM(pla10,pla11,pla12,e1);
TLorentzVector pMu2CM(pla20,pla21,pla22,e2);
TLorentzVector pDimuCM=pMu1CM+pMu2CM;
TVector3 zaxis=(pDimuCM.Vect()).Unit();
TVector3 beta=(-1./pDimuCM.E())*pDimuCM.Vect();
TLorentzVector pMu1Dimu=pMu1CM;
TLorentzVector pMu2Dimu=pMu2CM;
pMu1Dimu.Boost(beta);
pMu2Dimu.Boost(beta);
TLorentzVector pProjDimu=pProjCM;
TLorentzVector pTargDimu=pTargCM;
pProjDimu.Boost(beta);
pTargDimu.Boost(beta);
TVector3 yaxis=((pProjDimu.Vect()).Cross(pTargDimu.Vect())).Unit();
TVector3 xaxis=(yaxis.Cross(zaxis)).Unit();
Double_t phi;
if(mu1Charge>0) phi = TMath::ATan2((pMu1Dimu.Vect()).Dot(yaxis),(pMu1Dimu.Vect()).Dot(xaxis));
else phi = TMath::ATan2((pMu2Dimu.Vect()).Dot(yaxis),(pMu2Dimu.Vect()).Dot(xaxis));
return phi;
}
Int_t AliAODDimuon::AnyPt(){
if(CheckPointers())return 0;
return (((AliAODTrack*)fMu[0].GetObject())->MatchTrigger())&&
(((AliAODTrack*)fMu[1].GetObject())->MatchTrigger());
}
Int_t AliAODDimuon::LowPt(){
if(CheckPointers())return 0;
return (((AliAODTrack*)fMu[0].GetObject())->MatchTriggerLowPt())&&
(((AliAODTrack*)fMu[1].GetObject())->MatchTriggerLowPt());
}
Int_t AliAODDimuon::HighPt(){
if(CheckPointers())return 0;
return (((AliAODTrack*)fMu[0].GetObject())->MatchTriggerHighPt())&&
(((AliAODTrack*)fMu[1].GetObject())->MatchTriggerHighPt());
}
Double_t AliAODDimuon::MaxChi2Match(){
if(CheckPointers())return -999999999;
return TMath::Max((((AliAODTrack*)fMu[0].GetObject())->GetChi2MatchTrigger()),
(((AliAODTrack*)fMu[1].GetObject())->GetChi2MatchTrigger()));
}
TLorentzVector* AliAODDimuon::TLV() const
{
delete fP;
fP = new TLorentzVector(Px(),Py(),Pz(),E());
return fP;
}