#include "AliEventShape.h"
#include "AliStack.h"
#include "AliLog.h"
#include "AliMCEventHandler.h"
#include "AliMCEvent.h"
#include <TMatrixDSym.h>
#include <TVectorD.h>
#include <TMatrixDSymEigen.h>
#include <TParticle.h>
#include <TParticlePDG.h>
ClassImp(AliEventShape)
TArrayD * AliEventShape::GetThrustParamMC(AliMCEvent* mcEvent, Int_t nstudymin, Double_t ptcutoff, Double_t etacutoff, Bool_t chom)
{
AliStack* stack = 0;
stack = mcEvent->Stack();
Double_t * ptT = 0;
Double_t * pxT = 0;
Double_t * pyT = 0;
Double_t ptsuma = 0;
Double_t pxsuma = 0;
Double_t pysuma = 0;
TArrayD* evsh = new TArrayD(3);
Int_t nPrim = stack->GetNprimary();
Int_t nmctracks = 0;
for (Int_t iMCTracks = 0; iMCTracks < nPrim; iMCTracks++) {
TParticle* trackmc = stack->Particle(iMCTracks);
if (!trackmc) continue;
Double_t etamc =trackmc ->Eta();
Double_t ptmc=trackmc->Pt();
Int_t pdgCode = TMath::Abs(trackmc->GetPdgCode());
if (TMath::Abs(etamc) > etacutoff) continue;
if(ptmc < ptcutoff) continue;
Bool_t isprimary = stack->IsPhysicalPrimary(iMCTracks);
if(isprimary == 0) continue;
TParticlePDG* pdgPart =trackmc ->GetPDG();
if(chom == 1){
if (pdgCode == 22 || pdgCode == 12 || pdgCode == 14 || pdgCode == 16) continue;
nmctracks++;
}
else{
if (pdgPart->Charge() == 0)continue;
nmctracks++;
}
}
if(nmctracks < nstudymin){
evsh->AddAt(-2,0);
evsh->AddAt(-2,1);
evsh->AddAt(-2,2);
return evsh;
}
Int_t j=0;
pxT = new Double_t[nmctracks];
pyT = new Double_t[nmctracks];
ptT = new Double_t[nmctracks];
for (Int_t i = 0; i < nmctracks; i++)
{
pxT[i] = 0;
pyT[i] = 0;
ptT[i] = 0;
}
for (Int_t iMCTracks = 0; iMCTracks < nPrim; ++iMCTracks) {
TParticle* trackmc = stack->Particle(iMCTracks);
if (!trackmc) continue;
Double_t etamc = trackmc ->Eta();
Double_t pxmc = trackmc->Px();
Double_t pymc = trackmc->Py();
Double_t ptmc = trackmc->Pt();
Int_t pdgCode = TMath::Abs(trackmc->GetPdgCode());
if (TMath::Abs(etamc) > etacutoff) continue;
if(ptmc < ptcutoff) continue;
Bool_t isprimary = stack->IsPhysicalPrimary(iMCTracks);
if(isprimary==0) continue;
TParticlePDG* pdgPart =trackmc ->GetPDG();
if(chom==1){
if (pdgCode == 22 || pdgCode == 12 || pdgCode == 14 || pdgCode == 16)continue;
} else {
if (pdgPart->Charge() == 0) continue;
}
ptT[j] = ptmc;
pxT[j] = pxmc;
pyT[j] = pymc;
ptsuma += ptmc;
pxsuma+=pxmc;
pysuma+=pymc;
j++;
}
Double_t numerador = 0;
Double_t numerador2 = 0;
Double_t phimax = -1;
Double_t pFull = -1;
Double_t pMax = 0;
Double_t phi = 0;
Double_t thrust = 80;
Double_t thrustminor = 80;
Double_t nx = 0;
Double_t ny = 0;
Double_t phiparam = 0;
for(Int_t i = 0; i < 360; ++i){
numerador = 0;
phiparam = 0;
nx = 0;
ny = 0;
phiparam=((TMath::Pi()) * i) / 180;
nx = TMath::Cos(phiparam);
ny = TMath::Sin(phiparam);
for(Int_t i1 = 0; i1 < nmctracks; ++i1){
numerador += TMath::Abs(nx * pxT[i1] + ny * pyT[i1]);
}
pFull=numerador / ptsuma;
if(pFull > pMax)
{
pMax = pFull;
phi = phiparam;
}
}
phimax=(phi * 180) / TMath::Pi();
Double_t nx1 = TMath::Cos(phi);
Double_t ny1 = TMath::Sin(phi);
for(Int_t i2 =0; i2 < nmctracks; ++i2){
numerador2 += TMath::Abs(pxT[i2] * ny1 - nx1 * pyT[i2]);
}
thrust = 1 - pMax;
thrustminor = numerador2 / ptsuma;
Double_t recoil = TMath::Abs(TMath::Sqrt(pxsuma * pxsuma + pysuma * pysuma)) / (ptsuma);
evsh->AddAt(thrust, 0);
evsh->AddAt(thrustminor, 1);
evsh->AddAt(recoil, 2);
delete [] ptT;
delete [] pxT;
delete [] pyT;
return evsh;
}
Double_t AliEventShape::GetCircularityMC(AliMCEvent* mcEvent, Int_t nstudymin, Double_t ptcutoff, Double_t etacutoff, Bool_t chom)
{
AliStack* stack = 0;
stack = mcEvent->Stack();
TMatrixDSym s(2);
Double_t s00 = 0;
Double_t s01 = 0;
Double_t s10 = 0;
Double_t s11 = 0;
Double_t ptot = 0;
Double_t circularity = -2;
Int_t nmctracks = 0;
Int_t nPrim = stack->GetNprimary();
for (Int_t iMCTracks = 0; iMCTracks < nPrim; ++iMCTracks) {
TParticle* trackmc = stack->Particle(iMCTracks);
if (!trackmc) continue;
Double_t etamc = trackmc ->Eta();
Double_t ptmc = trackmc->Pt();
Double_t pxmc = trackmc->Px();
Double_t pymc = trackmc->Py();
Int_t pdgCode = TMath::Abs(trackmc->GetPdgCode());
if (TMath::Abs(etamc) > etacutoff) continue;
if (ptmc < ptcutoff) continue;
Bool_t isprimary = stack->IsPhysicalPrimary(iMCTracks);
if (isprimary == 0) continue;
TParticlePDG* pdgPart = trackmc ->GetPDG();
if(chom == kTRUE){
if (pdgCode == 22 || pdgCode == 12 || pdgCode == 14 || pdgCode == 16) continue;
}
else{
if (pdgPart->Charge() == 0)continue;
}
ptot = ptot + (ptmc * ptmc);
s00 = s00 + (pxmc * pxmc);
s01 = s01 + (pxmc * pymc);
s10 = s10 + (pymc * pxmc);
s11 = s11 + (pymc * pymc);
nmctracks++;
}
if (nmctracks < nstudymin) {
Printf("Too few particles, stopping");
return -2;
}
if(ptot != 0){
s(0,0) = s00 / ptot;
s(0,1) = s01 / ptot;
s(1,0) = s10 / ptot;
s(1,1) = s11 / ptot;
const TMatrixDSymEigen eigen(s);
const TVectorD eigenVal=eigen.GetEigenValues();
circularity = 2 * (1 - eigenVal(0));
}
return circularity;
}