00001 #ifndef MCTRUTHCLASSIFIER_MCTRUTHCLASSIFIER_H
00002 #define MCTRUTHCLASSIFIER_MCTRUTHCLASSIFIER_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "AsgTools/AsgTool.h"
00014 #include "MCTruthClassifier/MCTruthClassifierDefs.h"
00015 #include "MCTruthClassifier/IMCTruthClassifier.h"
00016
00017
00018 #include "xAODTruth/TruthParticleContainerFwd.h"
00019 #include "xAODTruth/TruthVertexFwd.h"
00020
00021
00022 #ifndef XAOD_ANALYSIS
00023 #include "GaudiKernel/ToolHandle.h"
00024 #include "ParticlesInConeTools/ITruthParticlesInConeTool.h"
00025 namespace HepMC {
00026 class GenParticle;
00027 }
00028
00029 namespace Trk {
00030 class IParticleCaloExtensionTool;
00031 }
00032 #endif
00033
00034
00035 class MCTruthClassifier : virtual public IMCTruthClassifier , public asg::AsgTool {
00036
00037 ASG_TOOL_CLASS(MCTruthClassifier, IMCTruthClassifier)
00038 public:
00039
00040
00041 MCTruthClassifier(const std::string& type);
00042
00043 ~MCTruthClassifier();
00044
00045
00046 StatusCode initialize();
00047 virtual StatusCode execute();
00048 StatusCode finalize();
00049
00050
00051 #ifndef XAOD_ANALYSIS
00052 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(const HepMC::GenParticle *);
00053 bool compareTruthParticles(const HepMC::GenParticle *genPart, const xAOD::TruthParticle *truthPart);
00054 #endif
00055 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(const xAOD::TruthParticle *);
00056 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(const xAOD::TrackParticle *);
00057 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(const xAOD::Electron* );
00058 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(const xAOD::Photon* );
00059 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(const xAOD::Muon* );
00060 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(const xAOD::CaloCluster* );
00061 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> particleTruthClassifier(const xAOD::Jet*, bool DR );
00062
00063 MCTruthPartClassifier::ParticleOutCome getParticleOutCome(){return m_ParticleOutCome;}
00064
00065 float getProbTrktoTruth(){return m_probability;}
00066
00067 const xAOD::TruthParticle* getGenPart(const xAOD::TrackParticle *);
00068 const xAOD::TruthParticle* getGenPart(){return m_thePart;}
00069 const xAOD::TruthParticle* getMother(const xAOD::TruthParticle*);
00070 const xAOD::TruthParticle* getMother(){return m_Mother;}
00071
00072 int getMotherPDG(){return m_MotherPDG;};
00073 int getMotherBarcode(){return m_MotherBarcode;};
00074
00075 const xAOD::TruthParticle* getPhotonMother(){return m_PhotonMother;}
00076 int getPhotonMotherPDG(){return m_PhotonMotherPDG;}
00077 int getPhotonMotherBarcode(){return m_PhotonMotherBarcode;}
00078
00079 std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin>
00080 checkOrigOfBkgElec(const xAOD::TruthParticle* thePart);
00081
00082 const xAOD::TruthParticle* getBkgElecMother(){return m_BkgElecMother;}
00083
00084 std::vector<const xAOD::TruthParticle*>* getTauFinalState(){return &m_tauFinalStatePart;}
00085
00086 float getdeltaRMatch(){return m_deltaRMatch;}
00087 float getdeltaPhiMatch(){return m_deltaPhi;}
00088 uint8_t getNumOfSiHits(){return m_NumOfSiHits;}
00089
00090 std::vector<const xAOD::TruthParticle*> getEGPartPntr(){return m_egPartPtr;}
00091 std::vector<float> getEGPartdR(){return m_egPartdR;}
00092 std::vector<std::pair<MCTruthPartClassifier::ParticleType,MCTruthPartClassifier::ParticleOrigin> > getEGPartClas(){return m_egPartClas;}
00093
00094 std::vector<const xAOD::TrackParticle*> getCnvPhotTrkPtr() {return m_cnvPhtTrkPtr;}
00095 std::vector<const xAOD::TruthParticle*> getCnvPhotTrkToTruthPart(){return m_cnvPhtTrPart;}
00096 std::vector<MCTruthPartClassifier::ParticleType> getCnvPhotPartType() {return m_cnvPhtPartType;}
00097 std::vector<MCTruthPartClassifier::ParticleOrigin> getCnvPhotPartOrig() {return m_cnvPhtPartOrig;}
00098
00099 private:
00100
00101 float detEta(float x, float y ) {return fabs(x-y);}
00102 float detPhi(float , float );
00103 float rCone (float x, float y ){return sqrt(x*x + y*y);}
00104
00105 MCTruthPartClassifier::ParticleType defTypeOfElectron(MCTruthPartClassifier::ParticleOrigin);
00106 MCTruthPartClassifier::ParticleOrigin defOrigOfElectron(const xAOD::TruthParticleContainer* xTruthParticleContainer ,const xAOD::TruthParticle*);
00107 MCTruthPartClassifier::ParticleOutCome defOutComeOfElectron(const xAOD::TruthParticle*);
00108
00109 MCTruthPartClassifier::ParticleType defTypeOfMuon(MCTruthPartClassifier::ParticleOrigin);
00110 MCTruthPartClassifier::ParticleOrigin defOrigOfMuon(const xAOD::TruthParticleContainer* m_xTruthParticleContainer ,const xAOD::TruthParticle*);
00111 MCTruthPartClassifier::ParticleOutCome defOutComeOfMuon(const xAOD::TruthParticle*);
00112
00113 MCTruthPartClassifier::ParticleType defTypeOfTau(MCTruthPartClassifier::ParticleOrigin);
00114 MCTruthPartClassifier::ParticleOrigin defOrigOfTau(const xAOD::TruthParticleContainer* m_xTruthParticleContainer ,const xAOD::TruthParticle*);
00115 MCTruthPartClassifier::ParticleOutCome defOutComeOfTau(const xAOD::TruthParticle*);
00116
00117 MCTruthPartClassifier::ParticleType defTypeOfPhoton(MCTruthPartClassifier::ParticleOrigin);
00118 MCTruthPartClassifier::ParticleOrigin defOrigOfPhoton(const xAOD::TruthParticleContainer* m_xTruthParticleContainer ,const xAOD::TruthParticle*);
00119 MCTruthPartClassifier::ParticleOutCome defOutComeOfPhoton(const xAOD::TruthParticle*);
00120
00121 MCTruthPartClassifier::ParticleOrigin defOrigOfNeutrino(const xAOD::TruthParticleContainer* m_xTruthParticleContainer ,const xAOD::TruthParticle*);
00122
00123 MCTruthPartClassifier::ParticleOrigin defHadronType(long);
00124 bool isHadron(const xAOD::TruthParticle*);
00125 MCTruthPartClassifier::ParticleType defTypeOfHadron(long);
00126 MCTruthPartClassifier::ParticleOrigin convHadronTypeToOrig(MCTruthPartClassifier::ParticleType pType);
00127
00128 const xAOD::TruthVertex* findEndVert(const xAOD::TruthParticle*);
00129 bool isHardScatVrtx(const xAOD::TruthVertex* );
00130
00131 std::vector<const xAOD::TruthParticle*> findFinalStatePart(const xAOD::TruthVertex*);
00132
00133 double partCharge(const xAOD::TruthParticle*);
00134 #ifndef XAOD_ANALYSIS
00135 bool genPartToCalo(const xAOD::CaloCluster* , const xAOD::TruthParticle* , bool, double&, bool& );
00136 const xAOD::TruthParticle* egammaClusMatch(const xAOD::CaloCluster*, bool );
00137 #endif
00138
00139 void findAllJetMothers(const xAOD::TruthParticle* thePart,std::set<const xAOD::TruthParticle*>&);
00140 double deltaR(const xAOD::TruthParticle& v1, const xAOD::Jet & v2) ;
00141 MCTruthPartClassifier::ParticleOrigin defJetOrig(std::set<const xAOD::TruthParticle*>);
00142
00143
00145 const xAOD::TruthParticle* barcode_to_particle(const xAOD::TruthParticleContainer*,int );
00146
00147 const xAOD::TruthParticle* m_thePart;
00148 const xAOD::TruthParticle* m_Mother;
00149
00150 int m_MotherPDG;
00151 int m_MotherStatus;
00152 long m_MotherBarcode;
00153 int m_NumOfParents;
00154 int m_NumOfDaug;
00155
00156 const xAOD::TruthVertex* m_MothOriVert;
00157
00158 bool m_isPrompt;
00159
00160 const xAOD::TruthParticle* m_PhotonMother;
00161 int m_PhotonMotherPDG;
00162 long m_PhotonMotherBarcode;
00163 long m_PhotonMotherStatus;
00164
00165 const xAOD::TruthParticle* m_BkgElecMother;
00166
00167 std::vector<const xAOD::TruthParticle*> m_tauFinalStatePart;
00168
00169 float m_deltaRMatch;
00170 float m_deltaPhi;
00171 float m_NumOfSiHits;
00172 float m_probability;
00173
00174 std::vector<const xAOD::TruthParticle*> m_egPartPtr;
00175 std::vector<float> m_egPartdR;
00176 std::vector<std::pair<MCTruthPartClassifier::ParticleType,MCTruthPartClassifier::ParticleOrigin> > m_egPartClas;
00177
00178 MCTruthPartClassifier::ParticleOutCome m_ParticleOutCome;
00179
00180 std::vector< const xAOD::TrackParticle*> m_cnvPhtTrkPtr;
00181 std::vector<const xAOD::TruthParticle*> m_cnvPhtTrPart;
00182 std::vector<MCTruthPartClassifier::ParticleType> m_cnvPhtPartType;
00183 std::vector<MCTruthPartClassifier::ParticleOrigin> m_cnvPhtPartOrig;
00184
00185
00186
00187
00188
00189
00190 #ifndef XAOD_ANALYSIS
00191 ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtensionTool;
00192 ToolHandle<xAOD::ITruthParticlesInConeTool> m_truthInConeTool;
00193 std::string m_truthLinkVecName;
00194 float m_FwdElectronTruthExtrEtaCut;
00195 float m_FwdElectronTruthExtrEtaWindowCut;
00196 float m_partExtrConeEta;
00197 float m_partExtrConePhi;
00198 bool m_useCaching;
00199 float m_phtClasConePhi;
00200 float m_phtClasConeEta;
00201 float m_phtdRtoTrCut;
00202 float m_fwrdEledRtoTrCut;
00203 bool m_ROICone;
00204 #endif
00205
00206 std::string m_xaodTruthParticleContainerName ;
00207 float m_deltaRMatchCut;
00208 float m_deltaPhiMatchCut;
00209 int m_NumOfSiHitsCut;
00210 float m_pTChargePartCut;
00211 float m_pTNeutralPartCut;
00212 long m_barcodeShift;
00213 long m_barcodeG4Shift;
00214 float m_jetPartDRMatch;
00215 bool m_inclG4part;
00216 bool m_inclEgammaPhoton;
00217 bool m_inclEgammaFwrdEle;
00218 bool m_LQpatch;
00219
00220 };
00221 #endif // MCTRUTHCLASSIFIER_MCTRUTHCLASSIFIER_H