#include <TClonesArray.h>
#include <TParticle.h>
+#include <TMCProcess.h>
#include "AliDielectronSignalMC.h"
#include "AliDielectronMC.h"
}
+//________________________________________________________________________________
+Bool_t AliDielectronMC::CheckGEANTProcess(Int_t label, TMCProcess process) const {
+ //
+ // Check the GEANT process for the particle
+ // NOTE: for tracks the absolute label should be passed
+ //
+ if(label<0) return kFALSE;
+ if(fAnaType==kAOD) {
+ if(!fMcArray) return kFALSE;
+ UInt_t processID = static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(label))->GetMCProcessCode();
+ // printf("process: id %d --> %s \n",processID,TMCProcessName[processID]);
+ return (process==processID);
+ } else if(fAnaType==kESD) {
+ if (!fMCEvent) return kFALSE;
+ AliError(Form("return of GEANT process not implemented for ESD "));
+ return kFALSE;
+ }
+ return kFALSE;
+
+}
+
//________________________________________________________________________________
Bool_t AliDielectronMC::CheckParticleSource(Int_t label, AliDielectronSignalMC::ESource source) const {
//
AliError(Form("Could not find MC particle with label %d",label));
return kFALSE;
}
-
+
+ // check geant process if set
+ if(signalMC->GetCheckGEANTProcess() && !CheckGEANTProcess(label,signalMC->GetGEANTProcess())) return kFALSE;
+
// check the leg
if(!ComparePDG(part->PdgCode(),signalMC->GetLegPDG(branch),signalMC->GetLegPDGexclude(branch),signalMC->GetCheckBothChargesLegs(branch))) return kFALSE;
if(!CheckParticleSource(label, signalMC->GetLegSource(branch))) return kFALSE;
if(signalMC->GetMothersRelation()==AliDielectronSignalMC::kDifferent) {
motherRelation = motherRelation && !HaveSameMother(pair);
}
-
- return ((directTerm || crossTerm) && motherRelation);
+
+ // check geant process if set
+ Bool_t processGEANT = kTRUE;
+ if(signalMC->GetCheckGEANTProcess()) {
+ if(!CheckGEANTProcess(labelD1,signalMC->GetGEANTProcess()) &&
+ !CheckGEANTProcess(labelD2,signalMC->GetGEANTProcess()) ) processGEANT= kFALSE;
+ }
+
+ return ((directTerm || crossTerm) && motherRelation && processGEANT);
}
#ifndef ROOT_TObject
#include <TObject.h>
+#include <TMCProcess.h>
#endif
class AliESDEvent;
class AliHFEpid;
Int_t GetPdgFromLabel(Int_t label) const;
Bool_t IsPhysicalPrimary(Int_t label) const; // checks if a particle is physical primary
+ Bool_t CheckGEANTProcess(Int_t label, TMCProcess process) const;
Bool_t IsSecondaryFromWeakDecay(Int_t label) const;
Bool_t IsSecondaryFromMaterial(Int_t label) const;
fCheckBothChargesMother2(kFALSE),
fCheckBothChargesGrandMother1(kFALSE),
fCheckBothChargesGrandMother2(kFALSE),
+ fCheckGEANTProcess(kFALSE),
fMothersRelation(kUndefined),
+ fGEANTProcess(kPPrimary),
fJpsiRadiative(kAll),
fFillPureMCStep(kFALSE) {
fCheckBothChargesMother2(kFALSE),
fCheckBothChargesGrandMother1(kFALSE),
fCheckBothChargesGrandMother2(kFALSE),
+ fCheckGEANTProcess(kFALSE),
fMothersRelation(kUndefined),
+ fGEANTProcess(kPPrimary),
fJpsiRadiative(kAll),
fFillPureMCStep(kFALSE) {
#define ALIDIELECTRONSIGNALMC_H
#include <TNamed.h>
-
+#include <TMCProcess.h>
/*
Ionut Cristian Arsene, iarsene@cern.ch
void SetCheckBothChargesMothers(Bool_t flag1, Bool_t flag2) {fCheckBothChargesMother1 = flag1; fCheckBothChargesMother2 = flag2;}
void SetCheckBothChargesGrandMothers(Bool_t flag1, Bool_t flag2) {fCheckBothChargesGrandMother1 = flag1; fCheckBothChargesGrandMother2 = flag2;}
void SetMothersRelation(EBranchRelation relation) {fMothersRelation = relation;}
+ void SetGEANTProcess(TMCProcess processID) {fGEANTProcess = processID; fCheckGEANTProcess=kTRUE;}
void SetFillPureMCStep(Bool_t fill=kTRUE) {fFillPureMCStep = fill;}
Int_t GetLegPDG(Int_t branch) const {return (branch==1 ? fLeg1 : fLeg2);}
Bool_t GetCheckBothChargesMothers(Int_t branch) const {return (branch==1 ? fCheckBothChargesMother1 : fCheckBothChargesMother2);}
Bool_t GetCheckBothChargesGrandMothers(Int_t branch) const {return (branch==1 ? fCheckBothChargesGrandMother1 : fCheckBothChargesGrandMother2);}
EBranchRelation GetMothersRelation() const {return fMothersRelation;}
+ TMCProcess GetGEANTProcess() const {return fGEANTProcess;}
+ Bool_t GetCheckGEANTProcess() const {return fCheckGEANTProcess;}
Bool_t GetFillPureMCStep() const {return fFillPureMCStep;}
void SetJpsiRadiative(EJpsiRadiativ rad) { fJpsiRadiative=rad; }
Bool_t fCheckBothChargesMother2; // mother 2
Bool_t fCheckBothChargesGrandMother1; // grand mother 1
Bool_t fCheckBothChargesGrandMother2; // grand mother 2
+ Bool_t fCheckGEANTProcess; // GEANT process
EBranchRelation fMothersRelation; // mother 1&2 relation (same, different or whatever)
-
+ TMCProcess fGEANTProcess; // GEANT process ID (see roots TMCProcess)
EJpsiRadiativ fJpsiRadiative; // check for J/psi radiative decay
Bool_t fFillPureMCStep; // check and fill the pure MC step
- ClassDef(AliDielectronSignalMC,2);
+ ClassDef(AliDielectronSignalMC,3);
};
#endif
} //if(mc->HasMC())
if(Req(kTOFPIDBit)) values[AliDielectronVarManager::kTOFPIDBit]=(particle->GetStatus()&AliESDtrack::kTOFpid? 1: 0);
+ values[AliDielectronVarManager::kLegEff]=0.0;
+ values[AliDielectronVarManager::kOneOverLegEff]=0.0;
if(Req(kLegEff) || Req(kOneOverLegEff)) {
- values[AliDielectronVarManager::kLegEff] = GetSingleLegEff(values);
- values[AliDielectronVarManager::kOneOverLegEff] = (values[AliDielectronVarManager::kLegEff]>0.0 ? 1./values[AliDielectronVarManager::kLegEff] : 0.0);
- }
+ values[AliDielectronVarManager::kLegEff] = GetSingleLegEff(values);
+ values[AliDielectronVarManager::kOneOverLegEff] = (values[AliDielectronVarManager::kLegEff]>0.0 ? 1./values[AliDielectronVarManager::kLegEff] : 0.0);
+ }
}
Double_t valuesLeg1[AliDielectronVarManager::kNMaxValues];
Double_t valuesLeg2[AliDielectronVarManager::kNMaxValues];
+ values[AliDielectronVarManager::kPairEff]=0.0;
+ values[AliDielectronVarManager::kOneOverPairEff]=0.0;
+ values[AliDielectronVarManager::kOneOverPairEffSq]=0.0;
if (leg1 && leg2 && fgLegEffMap) {
Fill(leg1, valuesLeg1);
Fill(leg2, valuesLeg2);
else if(fgPairEffMap) {
values[AliDielectronVarManager::kPairEff] = GetPairEff(values);
}
- values[AliDielectronVarManager::kOneOverPairEff] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff] : 1.0);
- values[AliDielectronVarManager::kOneOverPairEffSq] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff]/values[AliDielectronVarManager::kPairEff] : 1.0);
+ if(fgLegEffMap || fgPairEffMap) {
+ values[AliDielectronVarManager::kOneOverPairEff] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff] : 1.0);
+ values[AliDielectronVarManager::kOneOverPairEffSq] = (values[AliDielectronVarManager::kPairEff]>0.0 ? 1./values[AliDielectronVarManager::kPairEff]/values[AliDielectronVarManager::kPairEff] : 1.0);
+ }
if(kRndmPair) values[AliDielectronVarManager::kRndmPair] = gRandom->Rndm();
}