00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ST_JET_CANDIDATE_H
00010 #define ST_JET_CANDIDATE_H
00011
00012 #include "TLorentzVector.h"
00013 #include "TRef.h"
00014 #include "TRefArray.h"
00015
00016 class StJetVertex;
00017 class StJetElement;
00018 class StJetTrack;
00019 class StJetTower;
00020 class StJetParticle;
00021
00022 class StJetCandidate : public TObject {
00023 public:
00024 StJetCandidate()
00025 : mPt(0)
00026 , mEta(0)
00027 , mPhi(0)
00028 , mE(0)
00029 , mDetEta(0)
00030 , mRt(0)
00031 {
00032 }
00033
00034 StJetCandidate(const TVector3& vertex, const TLorentzVector& fourMomentum);
00035
00036 TLorentzVector fourMomentum() const;
00037 TVector3 momentum() const;
00038
00039 float pt () const { return mPt ; }
00040 float eta() const { return mEta; }
00041 float phi() const { return mPhi; }
00042 float E () const { return mE ; }
00043 float px () const { return momentum().Px(); }
00044 float py () const { return momentum().Py(); }
00045 float pz () const { return momentum().Pz(); }
00046 float detEta() const { return mDetEta; }
00047 float detEta(const TVector3& vertex) const;
00048 bool getBarrelDetectorEta(const TVector3& vertex, float& detEta) const;
00049 bool getEndcapDetectorEta(const TVector3& vertex, float& detEta) const;
00050 float sumTrackPt() const;
00051 float sumTrackPt(float radius) const;
00052 float sumTowerPt() const;
00053 float sumTowerPt(float radius) const;
00054 float sumPt() const { return sumTrackPt() + sumTowerPt(); }
00055 float sumPt(float radius) const { return sumTrackPt(radius)+sumTowerPt(radius); }
00056 float profile(float radius) const { return sumPt(radius)/sumPt(); }
00057 float psi(float radius) const { return profile(radius); }
00058 float rt() const { return mRt; }
00059 float neutralFraction() const { return rt(); }
00060 float chargedFraction() const { return 1 - neutralFraction(); }
00061 StJetTrack* leadingChargedParticle() const;
00062 float deltaPhi(const StJetCandidate* jet) const { return momentum().DeltaPhi(jet->momentum()); }
00063 float deltaR(const StJetCandidate* jet) const { return momentum().DeltaR(jet->momentum()); }
00064 float deltaR(const StJetElement* element) const;
00065
00066 int numberOfTracks() const { return mTracks.GetEntriesFast(); }
00067 int numberOfTowers() const { return mTowers.GetEntriesFast(); }
00068 int numberOfParticles() const { return mParticles.GetEntriesFast(); }
00069
00070 StJetVertex* vertex() const { return (StJetVertex*)mVertex.GetObject(); }
00071 StJetTrack* track(int i) const { return (StJetTrack*)mTracks.At(i); }
00072 StJetTower* tower(int i) const { return (StJetTower*)mTowers.At(i); }
00073 StJetParticle* particle(int i) const { return (StJetParticle*)mParticles.At(i); }
00074
00075 StJetTrack* getTrackById(int id) const;
00076 StJetTower* getTowerById(int id) const;
00077
00078 const TRefArray& tracks() const { return mTracks; }
00079 const TRefArray& towers() const { return mTowers; }
00080 const TRefArray& particles() const { return mParticles; }
00081
00082
00083 static float getJetPatchPhi(int jetPatch);
00084 static bool getBarrelJetPatchEtaPhi(int id, float& eta, float& phi);
00085 static bool getEndcapJetPatchEtaPhi(int id, float& eta, float& phi);
00086 static bool getOverlapJetPatchEtaPhi(int id, float& eta, float& phi);
00087
00088 static bool getBarrelJetPatchId(float eta, float phi, int& id);
00089 static bool getEndcapJetPatchId(float eta, float phi, int& id);
00090 static bool getOverlapJetPatchId(float eta, float phi, int& id);
00091
00092 void setPtEtaPhiE(float pt, float eta, float phi, float E);
00093 void setPxPyPzE(float px, float py, float pz, float E);
00094 void setVertex(const StJetVertex* vertex) { mVertex = (TObject*)vertex; }
00095 StJetTrack* addTrack(StJetTrack* track) { mTracks.Add((TObject*)track); return (StJetTrack*)mTracks.Last(); }
00096 StJetTower* addTower(StJetTower* tower) { mTowers.Add((TObject*)tower); return (StJetTower*)mTowers.Last(); }
00097 StJetParticle* addParticle(StJetParticle* particle) { mParticles.Add((TObject*)particle); return (StJetParticle*)mParticles.Last(); }
00098
00099 private:
00100 friend class StjeJetEventTreeWriter;
00101 friend class StJetMaker2009;
00102
00103 float mPt;
00104 float mEta;
00105 float mPhi;
00106 float mE;
00107 float mDetEta;
00108 float mRt;
00109
00110 TRef mVertex;
00111 TRefArray mTracks;
00112 TRefArray mTowers;
00113 TRefArray mParticles;
00114
00115 ClassDef(StJetCandidate,4);
00116 };
00117
00118 inline TLorentzVector StJetCandidate::fourMomentum() const
00119 {
00120 TLorentzVector fourMom;
00121 fourMom.SetPtEtaPhiE(mPt, mEta, mPhi, mE);
00122 return fourMom;
00123 }
00124
00125 inline TVector3 StJetCandidate::momentum() const
00126 {
00127 TVector3 mom;
00128 mom.SetPtEtaPhi(mPt, mEta, mPhi);
00129 return mom;
00130 }
00131
00132 inline void StJetCandidate::setPtEtaPhiE(float pt, float eta, float phi, float E)
00133 {
00134 mPt = pt;
00135 mEta = eta;
00136 mPhi = phi;
00137 mE = E;
00138 }
00139
00140 inline void StJetCandidate::setPxPyPzE(float px, float py, float pz, float E)
00141 {
00142 TVector3 mom(px, py, pz);
00143 mPt = mom.Pt();
00144 mEta = mom.Eta();
00145 mPhi = mom.Phi();
00146 mE = E;
00147 }
00148
00149 #endif // ST_JET_CANDIDATE_H