add proptections (marcel), add GEANT process for MC
authorjbook <jbook>
Thu, 24 Jul 2014 12:51:52 +0000 (14:51 +0200)
committerjbook <jbook@cern.ch>
Thu, 24 Jul 2014 12:51:52 +0000 (14:51 +0200)
PWGDQ/dielectron/AliDielectronMC.cxx
PWGDQ/dielectron/AliDielectronMC.h
PWGDQ/dielectron/AliDielectronSignalMC.cxx
PWGDQ/dielectron/AliDielectronSignalMC.h
PWGDQ/dielectron/AliDielectronVarManager.h

index 712385b..f34857b 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <TClonesArray.h>
 #include <TParticle.h>
+#include <TMCProcess.h>
 
 #include "AliDielectronSignalMC.h"
 #include "AliDielectronMC.h"
@@ -986,6 +987,27 @@ Bool_t AliDielectronMC::IsSecondaryFromMaterial(Int_t label) const {
 
 
 //________________________________________________________________________________
+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 {
   //
   //  Check the source for the particle 
@@ -1110,7 +1132,10 @@ Bool_t AliDielectronMC::IsMCTruth(Int_t label, AliDielectronSignalMC* signalMC,
     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;
@@ -1284,8 +1309,15 @@ Bool_t AliDielectronMC::IsMCTruth(const AliDielectronPair* pair, const AliDielec
   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);
 }
 
 
index fb349ce..ce4620e 100644 (file)
@@ -14,6 +14,7 @@
 
 #ifndef ROOT_TObject
 #include <TObject.h>
+#include <TMCProcess.h>
 #endif
 class AliESDEvent;
 class AliHFEpid;
@@ -72,6 +73,7 @@ public:
   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;
 
index 19b7ea9..4279f88 100644 (file)
@@ -59,7 +59,9 @@ AliDielectronSignalMC::AliDielectronSignalMC() :
   fCheckBothChargesMother2(kFALSE),
   fCheckBothChargesGrandMother1(kFALSE),
   fCheckBothChargesGrandMother2(kFALSE),
+  fCheckGEANTProcess(kFALSE),
   fMothersRelation(kUndefined),
+  fGEANTProcess(kPPrimary),
   fJpsiRadiative(kAll),
   fFillPureMCStep(kFALSE) {
 
@@ -96,7 +98,9 @@ AliDielectronSignalMC::AliDielectronSignalMC(const Char_t* name, const Char_t* t
   fCheckBothChargesMother2(kFALSE),
   fCheckBothChargesGrandMother1(kFALSE),
   fCheckBothChargesGrandMother2(kFALSE),
+  fCheckGEANTProcess(kFALSE),
   fMothersRelation(kUndefined),
+  fGEANTProcess(kPPrimary),
   fJpsiRadiative(kAll),
   fFillPureMCStep(kFALSE) {
 
index 640e8bb..526df1e 100644 (file)
@@ -2,7 +2,7 @@
 #define ALIDIELECTRONSIGNALMC_H
 
 #include <TNamed.h>
-
+#include <TMCProcess.h>
 
 /*
    Ionut Cristian Arsene, iarsene@cern.ch
@@ -86,6 +86,7 @@ class AliDielectronSignalMC : public TNamed {
   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);}
@@ -101,6 +102,8 @@ class AliDielectronSignalMC : public TNamed {
   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;    }
@@ -139,14 +142,15 @@ class AliDielectronSignalMC : public TNamed {
   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
index bbbd1a9..a75e1c3 100644 (file)
@@ -1042,10 +1042,12 @@ inline void AliDielectronVarManager::FillVarAODTrack(const AliAODTrack *particle
   } //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);
+  }
 
 }
 
@@ -1614,6 +1616,9 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa
 
   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);
@@ -1622,8 +1627,10 @@ inline void AliDielectronVarManager::FillVarDielectronPair(const AliDielectronPa
   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();
 }