#include "TObjArray.h"
#include "AliESDEvent.h"
#include "AliAODEvent.h"
#include "AliESDtrackCuts.h"
#include "AliVTrack.h"
#include "AliMultiplicity.h"
#include "AliCDMesonTracks.h"
#include "assert.h"
AliCDMesonTracks::AliCDMesonTracks()
: fAODEvent(0x0)
, fESDEvent(0x0)
, fDoAOD(kFALSE)
, fDoSoft(kTRUE)
, fIsValid(kFALSE)
, fNTrk0(-999)
, fNch(-999)
, fNsoft(-999)
, fNcombined(-999)
, fNITSpureSA(-999)
, fNtrackletsCentralBarrel(-999)
, fNtrackletsForward(-999)
, fTracks(0x0)
, fSoftTracks(0x0)
{
}
AliCDMesonTracks::AliCDMesonTracks(const AliCDMesonTracks& tracks)
: fAODEvent(tracks.fAODEvent)
, fESDEvent(tracks.fESDEvent)
, fDoAOD(tracks.fDoAOD)
, fDoSoft(tracks.fDoSoft)
, fIsValid(tracks.fIsValid)
, fNTrk0(tracks.fNTrk0)
, fNch(tracks.fNch)
, fNsoft(tracks.fNsoft)
, fNcombined(tracks.fNcombined)
, fNITSpureSA(tracks.fNITSpureSA)
, fNtrackletsCentralBarrel(tracks.fNtrackletsCentralBarrel)
, fNtrackletsForward(tracks.fNtrackletsForward)
, fTracks(tracks.fTracks)
, fSoftTracks(tracks.fSoftTracks)
{
}
AliCDMesonTracks& AliCDMesonTracks::operator=(const AliCDMesonTracks& tracks)
{
if (this != &tracks) {
}
return *this;
}
AliCDMesonTracks::~AliCDMesonTracks()
{
if (fTracks) {
fTracks->SetOwner(kTRUE);
fTracks->Clear();
delete fTracks;
fTracks = 0x0;
}
if (fSoftTracks) {
fSoftTracks->SetOwner(kTRUE);
fSoftTracks->Clear();
delete fSoftTracks;
fSoftTracks = 0x0;
}
}
Bool_t AliCDMesonTracks::ProcessEvent(AliAODEvent* aodEvent,
AliESDEvent* esdEvent,
Bool_t doSoft )
{
if ((aodEvent && esdEvent) || (!aodEvent && !esdEvent)) {
return fIsValid = fDoAOD = kFALSE;
}
else if (aodEvent) {
fAODEvent = aodEvent;
fESDEvent = 0x0;
fDoAOD = kTRUE;
}
else if (esdEvent) {
fAODEvent = 0x0;
fESDEvent = esdEvent;
fDoAOD = kFALSE;
}
fDoSoft = doSoft;
ApplyCuts();
if (!fDoAOD) GetRemainingTracklets();
fIsValid = kTRUE;
return kTRUE;
}
AliVTrack* AliCDMesonTracks::GetTrack(UInt_t index) const
{
if (!fIsValid) return 0x0;
if ((((Int_t)index >= fNch) && !fDoSoft) ||
((Int_t)index >= fNcombined)) return 0x0;
if ((Int_t)index < fNch) return (AliVTrack*)((*fTracks)[index]);
else if ((Int_t)index < fNcombined) {
return (AliVTrack*)((*fSoftTracks)[index - fNch]);
}
else return 0x0;
}
Double_t AliCDMesonTracks::GetInvariantMass(Bool_t includeSoftTracks )
{
TLorentzVector sum;
for (Int_t iTrack = 0; iTrack < fTracks->GetEntriesFast(); ++iTrack) {
AliVTrack* track = (AliVTrack*)fTracks->UncheckedAt(iTrack);
TLorentzVector temp(track->Px(), track->Py(), track->Pz(), track->E());
sum += temp;
}
if (includeSoftTracks) {
for (Int_t iSoftTrack = 0; iSoftTrack < fSoftTracks->GetEntriesFast();
++iSoftTrack) {
AliVTrack* track = (AliVTrack*)fSoftTracks->UncheckedAt(iSoftTrack);
TLorentzVector temp(track->Px(), track->Py(), track->Pz(), track->E());
sum += temp;
}
}
return sum.M();
}
void AliCDMesonTracks::ApplyCuts()
{
fNTrk0 = (fDoAOD) ?
fAODEvent->GetNumberOfTracks() : fESDEvent->GetNumberOfTracks();
fNch = -999;
fNsoft = -999;
fNcombined = -999;
fNITSpureSA = -999;
if (fDoAOD) {
CutTrack(fAODEvent);
CutTrack(fAODEvent, 2);
}
else {
CutTrack(fESDEvent);
CutTrack(fESDEvent, 2);
}
if (fDoSoft) {
if (fDoAOD) {
CutTrack(fAODEvent, 1);
}
else {
CutTrack(fESDEvent, 1);
}
fNcombined = fNch + fNsoft;
for (Int_t iSoft = 0; iSoft < fNsoft; iSoft++) {
Int_t iTrk = 0;
while (iTrk < fNch) {
++iTrk;
}
}
}
else {
fNcombined = fNch;
}
}
void AliCDMesonTracks::CutTrack(AliESDEvent *ESDEvent, Int_t mode )
{
const Double_t etacut = 0.9;
AliESDtrackCuts esdTrackCuts;
if (mode == 0) {
if (fTracks) {
fTracks->Clear();
delete fTracks;
fTracks = 0x0;
}
esdTrackCuts.SetMinNClustersTPC(70);
esdTrackCuts.SetMaxChi2PerClusterTPC(4);
esdTrackCuts.SetAcceptKinkDaughters(kFALSE);
esdTrackCuts.SetRequireTPCRefit(kTRUE);
esdTrackCuts.SetRequireITSRefit(kTRUE);
esdTrackCuts.SetClusterRequirementITS(AliESDtrackCuts::kSPD,
AliESDtrackCuts::kAny);
esdTrackCuts.SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
esdTrackCuts.SetMaxDCAToVertexZ(2);
esdTrackCuts.SetDCAToVertex2D(kFALSE);
esdTrackCuts.SetRequireSigmaToVertex(kFALSE);
esdTrackCuts.SetEtaRange(-etacut, etacut);
fTracks = esdTrackCuts.GetAcceptedTracks(ESDEvent);
fNch = fTracks->GetEntriesFast();
}
else if (mode == 1) {
if (fSoftTracks) {
fSoftTracks->Clear();
delete fSoftTracks;
fSoftTracks = 0x0;
}
esdTrackCuts.SetRequireITSStandAlone(kTRUE);
esdTrackCuts.SetRequireITSPureStandAlone(kFALSE);
esdTrackCuts.SetRequireITSRefit(kTRUE);
esdTrackCuts.SetMinNClustersITS(4);
esdTrackCuts.SetClusterRequirementITS(AliESDtrackCuts::kSPD,
AliESDtrackCuts::kAny);
esdTrackCuts.SetMaxChi2PerClusterITS(1.);
esdTrackCuts.SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
esdTrackCuts.SetEtaRange(-etacut, etacut);
fSoftTracks = esdTrackCuts.GetAcceptedTracks(ESDEvent);
fNsoft = fSoftTracks->GetEntriesFast();
}
else {
esdTrackCuts.SetRequireITSPureStandAlone(kTRUE);
TObjArray* arr = esdTrackCuts.GetAcceptedTracks(ESDEvent);
fNITSpureSA = arr->GetEntriesFast();
delete arr;
arr = 0x0;
}
}
void AliCDMesonTracks::CutTrack(AliAODEvent *AODEvent, Int_t mode )
{
UInt_t bit = 0x0;
TObjArray* trks = 0x0;
Int_t* ntrks = 0x0;
if (mode == 0) {
bit = 0x1 << 14;
if (fTracks) {
fTracks->SetOwner(kTRUE);
fTracks->Clear();
}
else {
fTracks = new TObjArray();
fTracks->SetOwner(kTRUE);
}
trks = fTracks;
ntrks = &fNch;
}
else if (mode == 1) {
bit = 0x1 << 15;
if (fSoftTracks) {
fSoftTracks->SetOwner(kTRUE);
fSoftTracks->Clear();
}
else {
fSoftTracks = new TObjArray();
fSoftTracks->SetOwner(kTRUE);
}
trks = fSoftTracks;
ntrks = &fNsoft;
}
else {
bit = 0x1 << 16;
trks = 0x0;
ntrks = &fNITSpureSA;
}
for (Int_t iTrk = 0; iTrk < AODEvent->GetNumberOfTracks(); iTrk++) {
const AliAODTrack* trk = dynamic_cast<const AliAODTrack*>(AODEvent->GetTrack(iTrk));
assert(trk&&"Not a standard AOD");
if (trk->TestFilterBit(bit)) {
if (trks) {
trks->Add((TObject*)trk);
}
else {
++(*ntrks);
}
}
}
if (trks) {
(*ntrks) = trks->GetEntriesFast();
}
}
void AliCDMesonTracks::GetRemainingTracklets()
{
if (!fESDEvent) return;
const AliMultiplicity *mult = fESDEvent->GetMultiplicity();
if (mult) {
fNtrackletsCentralBarrel = 0;
fNtrackletsForward = 0;
for (Int_t iTracklet = 0; iTracklet < mult->GetNumberOfTracklets();
iTracklet++) {
Int_t id1 = -1, id2 = -1;
if (!mult->GetTrackletTrackIDs(iTracklet, 0, id1, id2)) {
float_t eta = mult->GetEta(iTracklet);
if ((eta < -0.9) || (eta > 0.9)) {
++fNtrackletsForward;
}
else {
++fNtrackletsCentralBarrel;
}
}
}
}
}