#include <TClass.h>
#include <TMath.h>
#include <TParticle.h>
#include <TString.h>
#include "AliAODTrack.h"
#include "AliAODMCParticle.h"
#include "AliESDtrack.h"
#include "AliLog.h"
#include "AliMCEvent.h"
#include "AliMCParticle.h"
#include "AliVParticle.h"
#include "TClonesArray.h"
#include "AliHFEsignalCuts.h"
#include "AliHFEmcQA.h"
ClassImp(AliHFEsignalCuts)
AliHFEsignalCuts::AliHFEsignalCuts():
AliAnalysisCuts(),
fMC(NULL),
fAODArrayMCInfo(NULL),
fMCQA(NULL)
{
}
AliHFEsignalCuts::AliHFEsignalCuts(const Char_t *name, const Char_t *title):
AliAnalysisCuts(name, title),
fMC(NULL),
fAODArrayMCInfo(NULL),
fMCQA(NULL)
{
fMCQA = new AliHFEmcQA;
if(fMCQA) fMCQA->Init();
}
AliHFEsignalCuts::AliHFEsignalCuts(const AliHFEsignalCuts &ref):
AliAnalysisCuts(ref),
fMC(ref.fMC),
fAODArrayMCInfo(NULL),
fMCQA(ref.fMCQA)
{
}
AliHFEsignalCuts &AliHFEsignalCuts::operator=(const AliHFEsignalCuts &ref){
if(this != &ref){
fMCQA = ref.fMCQA;
}
return *this;
}
AliHFEsignalCuts::~AliHFEsignalCuts(){
if(fMCQA) delete fMCQA;
}
void AliHFEsignalCuts::SetMCEvent(AliMCEvent *mc){
fMC = mc;
if(fMCQA) fMCQA->SetMCEvent(mc);
}
void AliHFEsignalCuts::SetMCAODInfo(TClonesArray *mcarray){
fAODArrayMCInfo = mcarray;
if(fMCQA) fMCQA->SetMCArray(mcarray);
}
Bool_t AliHFEsignalCuts::IsSelected(TObject *o){
return IsCharmElectron(o) || IsBeautyElectron(o);
}
AliHFEsignalCuts::ESignalSource_t AliHFEsignalCuts::GetSignalSource(const TObject *const o) const{
ESignalSource_t source = kOther;
const AliVParticle *v = dynamic_cast<const AliVParticle *>(o);
if(!v) return source;
Int_t esources = GetElecSource(v);
if(esources == AliHFEmcQA::kDirectCharm) source = kEleCharm;
else if(esources == AliHFEmcQA::kDirectBeauty || esources == AliHFEmcQA::kBeautyCharm) source = kEleBeauty;
else if(esources >= AliHFEmcQA::kGammaPi0 && esources <= AliHFEmcQA::kGammaRho0) source = kEleGamma;
else if(esources == AliHFEmcQA:: kPi0 || esources == AliHFEmcQA::kEta || esources == AliHFEmcQA::kOmega || esources == AliHFEmcQA::kPhi || esources == AliHFEmcQA::kEtaPrime || esources == AliHFEmcQA::kRho0) source = kEleNonHFE;
else if(esources == AliHFEmcQA::kJpsi) source = kEleJPsi;
else if(esources == AliHFEmcQA::kB2Jpsi) source = kEleBtoJPsi;
else if(esources == AliHFEmcQA::kKe3) source = kEleKe3;
return source;
}
Bool_t AliHFEsignalCuts::IsCharmElectronOld(const TObject * const o) const {
const AliVParticle *v = dynamic_cast<const AliVParticle *>(o);
if(!v) return kFALSE;
Int_t esources = GetElecSource(v);
if(esources == AliHFEmcQA::kDirectCharm)
return kTRUE;
else
return kFALSE;
}
Bool_t AliHFEsignalCuts::IsBeautyElectronOld(const TObject * const o) const {
const AliVParticle *v = dynamic_cast<const AliVParticle *>(o);
if(!v) return kFALSE;
Int_t esources = GetElecSource(v);
if(esources == AliHFEmcQA::kDirectBeauty || esources == AliHFEmcQA::kBeautyCharm)
return kTRUE;
else
return kFALSE;
}
Bool_t AliHFEsignalCuts::IsGammaElectronOld(const TObject * const o) const {
const AliVParticle *v = dynamic_cast<const AliVParticle *>(o);
if(!v) return kFALSE;
Int_t esources = GetElecSource(v);
if(esources >= AliHFEmcQA::kGammaPi0 && esources <= AliHFEmcQA::kGammaRho0 )
return kTRUE;
else
return kFALSE;
}
Bool_t AliHFEsignalCuts::IsNonHFElectronOld(const TObject * const o) const {
const AliVParticle *v = dynamic_cast<const AliVParticle *>(o);
if(!v) return kFALSE;
Int_t esources = GetElecSource(v);
if(esources == AliHFEmcQA:: kPi0 || esources == AliHFEmcQA::kEta || esources == AliHFEmcQA::kOmega || esources == AliHFEmcQA::kPhi || esources == AliHFEmcQA::kEtaPrime || esources == AliHFEmcQA::kRho0)
return kTRUE;
else
return kFALSE;
}
Bool_t AliHFEsignalCuts::IsJpsiElectronOld(const TObject * const o) const {
const AliVParticle *v = dynamic_cast<const AliVParticle *>(o);
if(!v) return kFALSE;
Int_t esources = GetElecSource(v);
if(esources == AliHFEmcQA::kJpsi)
return kTRUE;
else
return kFALSE;
}
Bool_t AliHFEsignalCuts::IsB2JpsiElectronOld(const TObject * const o) const {
const AliVParticle *v = dynamic_cast<const AliVParticle *>(o);
if(!v) return kFALSE;
Int_t esources = GetElecSource(v);
if(esources == AliHFEmcQA::kB2Jpsi)
return kTRUE;
else
return kFALSE;
}
Bool_t AliHFEsignalCuts::IsKe3ElectronOld(const TObject * const o) const {
const AliVParticle *v = dynamic_cast<const AliVParticle *>(o);
if(!v) return kFALSE;
Int_t esources = GetElecSource(v);
if(esources == AliHFEmcQA::kKe3)
return kTRUE;
else
return kFALSE;
}
Int_t AliHFEsignalCuts::GetMotherPDG(const AliVParticle * const track) const {
TClass *type = track->IsA();
const AliVParticle *motherParticle = NULL, *mctrack = NULL;
Int_t label = TMath::Abs(track->GetLabel());
if(type == AliESDtrack::Class()){
if(!fMC) {
AliDebug(1, "No MC Event Available\n");
return 0;
}
if(label) mctrack = fMC->GetTrack(TMath::Abs(label));
}
else if(type == AliAODTrack::Class()) {
if(!fAODArrayMCInfo) {
AliDebug(1, "No MC Event Available\n");
return 0;
}
if(label && label < fAODArrayMCInfo->GetEntriesFast())
mctrack = (AliVParticle *) fAODArrayMCInfo->At(label);
}
else {
mctrack=track;
}
if(!mctrack) return 0;
Int_t motherPDG = 0;
if(TString(mctrack->IsA()->GetName()).CompareTo("AliMCParticle") == 0){
const AliMCParticle *esdmctrack = dynamic_cast<const AliMCParticle *>(mctrack);
if(esdmctrack) {
if(!fMC) {
AliDebug(1, "No MC Event Available\n");
return 0;
}
motherParticle = fMC->GetTrack(esdmctrack->Particle()->GetFirstMother());
}
if(motherParticle){
const AliMCParticle *esdmcmother = dynamic_cast<const AliMCParticle *>(motherParticle);
if(esdmcmother) motherPDG = TMath::Abs(esdmcmother->Particle()->GetPdgCode());
}
} else {
const AliAODMCParticle *aodmctrack = dynamic_cast<const AliAODMCParticle *>(mctrack);
if(aodmctrack) {
if(!fAODArrayMCInfo) {
AliDebug(1, "No MC Event Available\n");
return 0;
}
if(aodmctrack->GetMother() && aodmctrack->GetMother() < fAODArrayMCInfo->GetEntriesFast())
motherParticle = (AliVParticle *) fAODArrayMCInfo->At(aodmctrack->GetMother());
}
if(motherParticle){
const AliAODMCParticle *aodmcmother = dynamic_cast<const AliAODMCParticle *>(motherParticle);
if(aodmcmother) motherPDG = TMath::Abs(aodmcmother->GetPdgCode());
}
}
return motherPDG;
}
Int_t AliHFEsignalCuts::GetTrackPDG(const AliVParticle * const track) const {
TClass *type = track->IsA();
const AliVParticle *mctrack = NULL;
Int_t label = TMath::Abs(track->GetLabel());
if(type == AliESDtrack::Class()){
if(!fMC) {
AliDebug(1, "No MC Event Available\n");
return 0;
}
if(label) mctrack = fMC->GetTrack(TMath::Abs(label));
}
else if(type == AliAODTrack::Class()) {
if(!fAODArrayMCInfo) {
AliDebug(1, "No MC Event Available\n");
return 0;
}
if(label && label < fAODArrayMCInfo->GetEntriesFast())
mctrack = (AliVParticle *) fAODArrayMCInfo->At(label);
}
else {
mctrack=track;
}
if(!mctrack) return 0;
TString mctype = mctrack->IsA()->GetName();
Int_t trackPdg = 0;
if(!mctype.CompareTo("AliMCParticle")){
const AliMCParticle *esdmc = dynamic_cast<const AliMCParticle *>(mctrack);
if(esdmc) trackPdg = esdmc->Particle()->GetPdgCode();
} else {
const AliAODMCParticle *aodmc = dynamic_cast< const AliAODMCParticle *>(mctrack);
if(aodmc) trackPdg = aodmc->GetPdgCode();
}
return trackPdg;
}
Int_t AliHFEsignalCuts::GetElecSource(const AliVParticle * const track) const {
if(!track){
AliDebug(1, "Track not Available\n");
return 0;
}
TClass *type = track->IsA();
if(!fMCQA){
AliDebug(1, "No MCQA Available\n");
return 0;
}
const AliVParticle *mctrack = NULL;
TParticle *mcpart = NULL;
Int_t label = TMath::Abs(track->GetLabel());
AliMCParticle *esdmcmother = NULL;
if(type == AliESDtrack::Class()){
if(!fMC) {
AliDebug(1, "No MC Event Available\n");
return 0;
}
if(label) mctrack = fMC->GetTrack(TMath::Abs(label));
}
else if(type == AliAODTrack::Class()) {
if(!fAODArrayMCInfo) {
AliDebug(1, "No MC Event Available\n");
return 0;
}
if(label && label < fAODArrayMCInfo->GetEntriesFast())
mctrack = (AliVParticle *) fAODArrayMCInfo->At(label);
}
else {
mctrack=track;
}
if(!mctrack) return 0;
Int_t eSource = 0;
if(mctrack->IsA() == AliMCParticle::Class()){
const AliMCParticle *esdmc = dynamic_cast<const AliMCParticle *>(mctrack);
if(esdmc){
mcpart = esdmc->Particle();
eSource=fMCQA->GetElecSource(mcpart,kTRUE);
if(type == AliESDtrack::Class()){
if(eSource>=AliHFEmcQA::kGammaPi0 && eSource<=AliHFEmcQA::kGammaRho0) {
Int_t glabel=TMath::Abs(esdmc->GetMother());
if((esdmcmother= dynamic_cast<AliMCParticle *>(fMC->GetTrack(glabel)))){
glabel=TMath::Abs(esdmcmother->GetMother());
if((esdmcmother= dynamic_cast<AliMCParticle *>(fMC->GetTrack(glabel)))){
if(glabel>fMC->GetNumberOfPrimaries()) eSource=AliHFEmcQA::kScdryM;
}
}
}
else if(eSource==AliHFEmcQA::kPi0 || (eSource>=AliHFEmcQA::kEta && eSource<=AliHFEmcQA::kRho0) ){
Int_t glabel=TMath::Abs(esdmc->GetMother());
if((esdmcmother= dynamic_cast<AliMCParticle *>(fMC->GetTrack(glabel)))){
if(glabel>fMC->GetNumberOfPrimaries()) eSource=AliHFEmcQA::kScdryM;
}
}
}
}
} else {
eSource=fMCQA->GetElecSource(mctrack,kTRUE);
}
return eSource;
}