#include <iostream>
#include <TClass.h>
#include <TList.h>
#include <TMath.h>
#include "AliLog.h"
#include "AliAODEvent.h"
#include "AliAODv0.h"
#include "AliESDEvent.h"
#include "AliESDv0.h"
#include "AliHFEV0taginfo.h"
ClassImp(AliHFEV0taginfo)
ClassImp(AliHFEV0taginfo::AliHFEV0tag)
AliHFEV0taginfo::AliHFEV0taginfo():
TNamed(),
fIsAODana(NULL),
fTaggedTracks(NULL),
fV0finder(NULL),
fAODV0finder(NULL)
{
}
AliHFEV0taginfo::AliHFEV0taginfo(const char* name):
TNamed(name, ""),
fIsAODana(kFALSE),
fTaggedTracks(NULL),
fV0finder(NULL),
fAODV0finder(NULL)
{
fTaggedTracks = new TList();
if(fTaggedTracks){
fTaggedTracks->SetOwner();
}
fV0finder = new AliESDv0KineCuts();
fAODV0finder = new AliAODv0KineCuts();
}
AliHFEV0taginfo::AliHFEV0taginfo(const AliHFEV0taginfo &ref):
TNamed(ref),
fIsAODana(ref.fIsAODana),
fTaggedTracks(NULL),
fV0finder(ref.fV0finder),
fAODV0finder(ref.fAODV0finder)
{
fTaggedTracks = new TList();
if(fTaggedTracks){
fTaggedTracks->SetOwner();
}
AliHFEV0tag *tmp = NULL;
for(Int_t ien = 0; ien < ref.fTaggedTracks->GetEntries(); ien++){
tmp = static_cast<AliHFEV0tag *>(ref.fTaggedTracks->At(ien));
fTaggedTracks->Add(new AliHFEV0tag(tmp->GetTrackID(),tmp->GetPinfo(),tmp->GetProdR()));
}
}
AliHFEV0taginfo &AliHFEV0taginfo::operator=(const AliHFEV0taginfo &ref){
if(this == &ref) return *this;
this->~AliHFEV0taginfo();
TNamed::operator=(ref);
fIsAODana = ref.fIsAODana;
fTaggedTracks = new TList();
AliHFEV0tag *tmp = NULL;
for(Int_t ien = 0; ien < ref.fTaggedTracks->GetEntries(); ien++){
tmp = static_cast<AliHFEV0tag *>(ref.fTaggedTracks->At(ien));
fTaggedTracks->Add(new AliHFEV0tag(tmp->GetTrackID(),tmp->GetPinfo(),tmp->GetProdR()));
}
fV0finder=ref.fV0finder;
fAODV0finder=ref.fAODV0finder;
return *this;
}
AliHFEV0taginfo::~AliHFEV0taginfo(){
delete fTaggedTracks;
delete fV0finder;
delete fAODV0finder;
AliDebug(6, "DESTRUCTOR");
}
void AliHFEV0taginfo::TagV0Tracks(AliVEvent *fEvent){
if (!fEvent) return;
const Int_t nTracks = fEvent->GetNumberOfTracks();
if(nTracks < 2) return;
const Int_t nV0s = fEvent->GetNumberOfV0s();
if(nV0s < 1) return;
AliDebug(3,Form("%d V0s found!",nV0s));
if(fEvent->IsA() == AliESDEvent::Class()){
AliDebug(4, "ESD part");
AliESDEvent *esdevent = static_cast<AliESDEvent *>(fEvent);
fV0finder->SetEvent(esdevent);
for(Int_t i=0; i<nV0s; ++i){
Int_t pdgP = 0;
Int_t pdgN = 0;
AliESDv0 *fV0 = esdevent->GetV0(i);
if(!fV0) continue;
if(fV0finder->ProcessV0(fV0,pdgP,pdgN)){
AliDebug(5,Form("V0 has: pos pdg: %d, neg pdg: %d",pdgP,pdgN));
AddTrack(fV0->GetPindex(),pdgP,TMath::Sqrt(fV0->Xv()*fV0->Xv()+fV0->Yv()*fV0->Yv()));
AddTrack(fV0->GetNindex(),pdgN,TMath::Sqrt(fV0->Xv()*fV0->Xv()+fV0->Yv()*fV0->Yv()));
}
}
} else if(fEvent->IsA() == AliAODEvent::Class()){
AliDebug(4,"AOD part");
AliAODEvent *aodevent = static_cast<AliAODEvent *>(fEvent);
fAODV0finder->SetEvent(aodevent);
for(Int_t i=0; i<nV0s; ++i){
Int_t pdgP = 0;
Int_t pdgN = 0;
AliAODv0 *fV0 = aodevent->GetV0(i);
if(!fV0) continue;
if(fAODV0finder->ProcessV0(fV0,pdgP,pdgN)){
AliDebug(5,Form("V0 has: pos pdg: %d, neg pdg: %d",pdgP,pdgN));
AddTrack(fV0->GetPosID(),pdgP,fV0->RadiusV0());
AddTrack(fV0->GetNegID(),pdgN,fV0->RadiusV0());
}
}
}
}
void AliHFEV0taginfo::AddTrack(Int_t TrackID, Int_t pdgCode, Double_t prodR){
if(TrackID<0) return;
AliPID::EParticleType Pinfo;
switch (TMath::Abs(pdgCode)){
case 11:
Pinfo = AliPID::kElectron;
break;
case 211:
Pinfo = AliPID::kPion;
break;
case 2212:
Pinfo = AliPID::kProton;
break;
default:
return;
}
fTaggedTracks->Add(new AliHFEV0tag(TrackID, Pinfo, prodR));
AliDebug(4,Form("Added new Track ID: %d with PID: %d, #entry: %d",TrackID, Pinfo, fTaggedTracks->GetEntries()));
}
AliPID::EParticleType AliHFEV0taginfo::GetV0Info(Int_t trackID){
AliHFEV0tag test(trackID, AliPID::kUnknown,0);
AliHFEV0tag *result = dynamic_cast<AliHFEV0tag *>(fTaggedTracks->FindObject(&test));
if(!result){
AliDebug(6, Form("Could not find track ID %d", trackID));
return AliPID::kUnknown;
}
return result->GetPinfo();
}
Float_t AliHFEV0taginfo::GetV0ProdR(Int_t trackID){
AliHFEV0tag test(trackID, AliPID::kUnknown, 0);
AliHFEV0tag *result = dynamic_cast<AliHFEV0tag *>(fTaggedTracks->FindObject(&test));
if(!result){
AliDebug(6, Form("Could not find track ID %d", trackID));
return -0.1;
}
return result->GetProdR();
}
void AliHFEV0taginfo::Reset(){
fTaggedTracks->Delete();
}
AliHFEV0taginfo::AliHFEV0tag::AliHFEV0tag():
TObject(),
fTrackID(0),
fPinfo(AliPID::kUnknown),
fProdR(0)
{
}
AliHFEV0taginfo::AliHFEV0tag::AliHFEV0tag(Int_t TrackID, AliPID::EParticleType Pinfo, Double_t ProdR):
TObject(),
fTrackID(TrackID),
fPinfo(Pinfo),
fProdR(ProdR)
{
}
AliHFEV0taginfo::AliHFEV0tag::AliHFEV0tag(const AliHFEV0tag &ref):
TObject(ref),
fTrackID(ref.fTrackID),
fPinfo(ref.fPinfo),
fProdR(ref.fProdR)
{
}
AliHFEV0taginfo::AliHFEV0tag &AliHFEV0taginfo::AliHFEV0tag::operator=(const AliHFEV0tag &ref){
if(this != &ref){
TObject::operator=(ref);
fTrackID = ref.fTrackID;
fPinfo = ref.fPinfo;
fProdR = ref.fProdR;
}
return *this;
}
AliHFEV0taginfo::AliHFEV0tag::~AliHFEV0tag(){
AliDebug(6, "DESTRUCTOR");
}
void AliHFEV0taginfo::AliHFEV0tag::SetTrack(Int_t trackID, AliPID::EParticleType Pinfo){
fTrackID = trackID;
fPinfo = Pinfo;
}
void AliHFEV0taginfo::AliHFEV0tag::SetProdR(Int_t trackID, Double_t prodR){
fTrackID = trackID;
fProdR = prodR;
}
Bool_t AliHFEV0taginfo::AliHFEV0tag::IsEqual(const TObject *ref) const {
const AliHFEV0tag *refObj = dynamic_cast<const AliHFEV0tag *>(ref);
if(!refObj) return kFALSE;
return (fTrackID == refObj->GetTrackID());
}
Int_t AliHFEV0taginfo::AliHFEV0tag::Compare(const TObject *ref) const{
const AliHFEV0tag *refObj = static_cast<const AliHFEV0tag *>(ref);
if(fTrackID < refObj->GetTrackID()) return -1;
else if(fTrackID > refObj->GetTrackID()) return 1;
else{
if(fPinfo < refObj->GetPinfo()) return -1;
else if(fPinfo > refObj->GetPinfo()) return 1;
else return 0;
}
}