#include <TNamed.h>
+/*
+ Ionut Cristian Arsene, iarsene@cern.ch
+ */
+
/*
Monte Carlo signal definition:
Leg #1 <-- Mother #1 <-- Grandmother #1
|
Leg #2 <-- Mother #2 <-- Grandmother #2
- All particles can be classified as:
+
+ For every leg, mother or grand-mother, a PDG code and a source can be specified.
+
+ 1.) For the PDG codes, the PYTHIA standard is used.
+ A few non-existent PYTHIA codes are used to select more than one PYTHIA code. All these are described below
+ and implemented in AliDielectronMC::ComparePDG() function:
+ 0 - default, accepts all PYTHIA codes
+ 100 - light unflavoured mesons in the code range 100-199
+ 200 - --"-- 200-299
+ 300 - strange mesons in the code range 300-399
+ 400 - charmed mesons in the code range 400-499
+ 401 - open charm mesons (all D and D* mesons) 400-439
+ 402 - open charm mesons and baryons together 400-439, 4000-4399
+ 403 - all charm hadrons (mesons and baryons) 400-499, 4000-4999
+ 500 - beauty mesons in the code range 500-599
+ 501 - open beauty mesons 500-549
+ 502 - open beauty mesons and baryons 500-549, 5000-5499
+ 503 - all beauty hadrons 500-599, 5000-5999
+ 1000 - light unflavoured baryons in the code range 1000-1999
+ 2000 - --"-- 2000-2999
+ 3000 - strange baryons in the code range 3000-3999
+ 4000 - charmed baryons in the code range 4000-4999
+ 4001 - open charm baryons 4000-4399
+ 5000 - beauty baryons in the code range 5000-5999
+ 5001 - open beauty baryons 5000-5499
+
+ 2.) If the exclusion flags are turned ON then the PDG codes required and the conventional codes described above
+ are used to exclude the selected particles.
+
+ 3.) If the selection of both charges is switched ON then the PDG codes act on both particles and anti-particles.
+
+ 4.) Particles sources implemented:
1. Primary - particle originating in the physics event
- 2. Secondary - particle created during the GEANT propagation due to interaction of primaries with the material
- 3. Direct - particle directly created in the collision (has no mother)
- 4. Secondary - particle which is the product of the decay or reinteraction of another particle
- The 2 legs can originate from the same or different mother particles.
+ 2. FinalState- stable(final state) particles which reach the detector -> according to AliStack::IsPhysicalPrimary()
+ 3. Direct - primary particle which has no mother (e.g. J/psi's added to pythia MC events via generator cocktails,
+ particles generated in a sudden freeze-out in thermal models, initial state particles)
+ 4. Secondary - particle created during the GEANT propagation due to interaction of final state primaries with the material
+
+ 5.) The 2 legs can originate from the same or different mother particles. This can be specified via the SetMotherRelation()
+ method call.
+
+ 6.) The filling of the pure MC step can be switched on using SetFillPureMCStep() method call. This should be used
+ with care since at the pure MC information level there is no cut applied and for abundant particles the combinatorics
+ can be very high.
*/
public:
enum EBranchRelation {kUndefined=0, kSame, kDifferent};
- enum ESource {kDontCare=0, kPrimary, kSecondary, kDirect, kDecayProduct};
+ enum ESource {kDontCare=0, kPrimary, kFinalState, kDirect, kSecondary};
AliDielectronSignalMC();
AliDielectronSignalMC(const Char_t* name, const Char_t* title);
virtual ~AliDielectronSignalMC();
- void SetLegPDGs(Int_t pdg1, Int_t pdg2) {fLeg1 = pdg1; fLeg2 = pdg2;}
- void SetMotherPDGs(Int_t pdg1, Int_t pdg2) {fMother1 = pdg1; fMother2 = pdg2;}
- void SetGrandMotherPDGs(Int_t pdg1, Int_t pdg2) {fGrandMother1 = pdg1; fGrandMother2 = pdg2;}
- void SetLegSources(ESource s1, ESource s2) {fLeg1Source = s1; fLeg2Source = s2;}
- void SetMotherSources(ESource s1, ESource s2) {fMother1Source = s1; fMother2Source = s2;}
- void SetGrandMotherSources(ESource s1, ESource s2) {fGrandMother1Source = s1; fGrandMother2Source = s2;}
- void SetCheckBothChargesLegs(Bool_t flag1, Bool_t flag2) {fCheckBothChargesLeg1 = flag1; fCheckBothChargesLeg2 = flag2;}
- void SetCheckBothChargesMothers(Bool_t flag1, Bool_t flag2) {fCheckBothChargesMother1 = flag1; fCheckBothChargesMother2 = flag2;}
+ void SetLegPDGs(Int_t pdg1, Int_t pdg2, Bool_t exclude1=kFALSE, Bool_t exclude2=kFALSE)
+ {fLeg1 = pdg1; fLeg2 = pdg2; fLeg1Exclude=exclude1; fLeg2Exclude=exclude2;}
+ void SetMotherPDGs(Int_t pdg1, Int_t pdg2, Bool_t exclude1=kFALSE, Bool_t exclude2=kFALSE)
+ {fMother1 = pdg1; fMother2 = pdg2; fMother1Exclude=exclude1; fMother2Exclude=exclude2;}
+ void SetGrandMotherPDGs(Int_t pdg1, Int_t pdg2, Bool_t exclude1=kFALSE, Bool_t exclude2=kFALSE)
+ {fGrandMother1 = pdg1; fGrandMother2 = pdg2; fGrandMother1Exclude=exclude1; fGrandMother2Exclude=exclude2;}
+ void SetLegSources(ESource s1, ESource s2) {fLeg1Source = s1; fLeg2Source = s2;}
+ void SetMotherSources(ESource s1, ESource s2) {fMother1Source = s1; fMother2Source = s2;}
+ void SetGrandMotherSources(ESource s1, ESource s2) {fGrandMother1Source = s1; fGrandMother2Source = s2;}
+ void SetCheckBothChargesLegs(Bool_t flag1, Bool_t flag2) {fCheckBothChargesLeg1 = flag1; fCheckBothChargesLeg2 = flag2;}
+ 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 SetFillPureMCStep(Bool_t fill=kTRUE) {fFillPureMCStep = fill;}
-
- Int_t GetLegPDG(Int_t branch) const {return (branch==1 ? fLeg1 : fLeg2);}
- Int_t GetMotherPDG(Int_t branch) const {return (branch==1 ? fMother1 : fMother2);}
- Int_t GetGrandMotherPDG(Int_t branch) const {return (branch==1 ? fGrandMother1 : fGrandMother2);}
- ESource GetLegSource(Int_t branch) const {return (branch==1 ? fLeg1Source : fLeg2Source);}
- ESource GetMotherSource(Int_t branch) const {return (branch==1 ? fMother1Source : fMother2Source);}
- ESource GetGrandMotherSource(Int_t branch) const {return (branch==1 ? fGrandMother1Source : fGrandMother2Source);}
- Bool_t GetCheckBothChargesLegs(Int_t branch) const {return (branch==1 ? fCheckBothChargesLeg1 : fCheckBothChargesLeg2);}
- 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;}
- Bool_t GetFillPureMCStep() const {return fFillPureMCStep;}
+ void SetMothersRelation(EBranchRelation relation) {fMothersRelation = relation;}
+ void SetFillPureMCStep(Bool_t fill=kTRUE) {fFillPureMCStep = fill;}
+
+ Int_t GetLegPDG(Int_t branch) const {return (branch==1 ? fLeg1 : fLeg2);}
+ Int_t GetMotherPDG(Int_t branch) const {return (branch==1 ? fMother1 : fMother2);}
+ Int_t GetGrandMotherPDG(Int_t branch) const {return (branch==1 ? fGrandMother1 : fGrandMother2);}
+ Bool_t GetLegPDGexclude(Int_t branch) const {return (branch==1 ? fLeg1Exclude : fLeg2Exclude);}
+ Bool_t GetMotherPDGexclude(Int_t branch) const {return (branch==1 ? fMother1Exclude : fMother2Exclude);}
+ Bool_t GetGrandMotherPDGexclude(Int_t branch) const {return (branch==1 ? fGrandMother1Exclude : fGrandMother2Exclude);}
+ ESource GetLegSource(Int_t branch) const {return (branch==1 ? fLeg1Source : fLeg2Source);}
+ ESource GetMotherSource(Int_t branch) const {return (branch==1 ? fMother1Source : fMother2Source);}
+ ESource GetGrandMotherSource(Int_t branch) const {return (branch==1 ? fGrandMother1Source : fGrandMother2Source);}
+ Bool_t GetCheckBothChargesLegs(Int_t branch) const {return (branch==1 ? fCheckBothChargesLeg1 : fCheckBothChargesLeg2);}
+ 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;}
+ Bool_t GetFillPureMCStep() const {return fFillPureMCStep;}
private:
+ // PDG codes for legs, mothers and grand-mothers
Int_t fLeg1; // leg 1 PDG
Int_t fLeg2; // leg 2 PDG
Int_t fMother1; // mother 1 PDG
Int_t fMother2; // mother 2 PDG
Int_t fGrandMother1; // grandmother 1 PDG
Int_t fGrandMother2; // grandmother 2 PDG
+
+ // Toggle on/off the use of the PDG codes as inclusion or exclusion
+ // Example: if fLeg1=211 and fLeg1Exclude=kTRUE than all codes will be accepted for leg 1 with
+ // the exception of 211 (pions)
+ Bool_t fLeg1Exclude; // leg 1
+ Bool_t fLeg2Exclude; // leg 2
+ Bool_t fMother1Exclude; // mother 1
+ Bool_t fMother2Exclude; // mother 2
+ Bool_t fGrandMother1Exclude; // grandmother 1
+ Bool_t fGrandMother2Exclude; // grandmother 2
+ // Particle sources
ESource fLeg1Source; // leg 1 source
ESource fLeg2Source; // leg 2 source
ESource fMother1Source; // mother 1 source
ESource fGrandMother1Source; // grandmother 1 source
ESource fGrandMother2Source; // grandmother 2 source
+ // Flaggs whether to check both charges of a given PDG code
Bool_t fCheckBothChargesLeg1; // check both charges of the legs pdg
Bool_t fCheckBothChargesLeg2; // leg2
Bool_t fCheckBothChargesMother1; // mother 1