1 |
|
//-------------------------------------------------------------------------------------------------- |
2 |
< |
// $ Id $ |
2 |
> |
// $Id$ |
3 |
|
// |
4 |
< |
// Calo Tower |
4 |
> |
// CaloTower |
5 |
|
// |
6 |
< |
// Details to be worked out... |
6 |
> |
// This class holds calo tower information. Note that the energy of the tower does not necessarily |
7 |
> |
// have to be greater 0. As such E() and Et() can return negative values. In those cases the |
8 |
> |
// FourVectorM will be 0, and also Pt() will return 0. |
9 |
|
// |
10 |
< |
// Authors: Si Xie |
10 |
> |
// Authors: S.Xie |
11 |
|
//-------------------------------------------------------------------------------------------------- |
12 |
|
|
13 |
< |
#ifndef DATATREE_CALOTOWER_H |
14 |
< |
#define DATATREE_CALOTOWER_H |
13 |
> |
#ifndef MITANA_DATATREE_CALOTOWER_H |
14 |
> |
#define MITANA_DATATREE_CALOTOWER_H |
15 |
|
|
16 |
|
#include <TMath.h> |
17 |
+ |
#include "MitCommon/DataFormats/interface/Vect3C.h" |
18 |
+ |
#include "MitAna/DataCont/interface/CacheFlag.h" |
19 |
|
#include "MitAna/DataTree/interface/DataObject.h" |
20 |
|
|
21 |
|
namespace mithep |
23 |
|
class CaloTower : public DataObject |
24 |
|
{ |
25 |
|
public: |
26 |
< |
CaloTower() {} |
27 |
< |
~CaloTower() {} |
28 |
< |
|
29 |
< |
void SetEmEnergy(Double_t EmEnergy) { fEmEnergy = EmEnergy; } |
30 |
< |
void SetPosition(Double_t x, Double_t y, Double_t z) |
31 |
< |
{ fPosition.SetXYZ(x,y,z); } |
32 |
< |
void SetHadEnergy(Double_t HadEnergy) { fHadEnergy = HadEnergy; } |
33 |
< |
void SetOuterEnergy(Double_t OuterEnergy) { fOuterEnergy = OuterEnergy; } |
34 |
< |
|
35 |
< |
const FourVectorM Mom() const; |
36 |
< |
Double_t Eta() const { return fPosition.Eta(); } |
37 |
< |
Double_t Phi() const { return fPosition.Phi(); } |
38 |
< |
Double_t Theta() const { return fPosition.Theta(); } |
39 |
< |
Double_t E() const { return (fEmEnergy + fHadEnergy); } |
40 |
< |
Double_t Et() const { return E()*TMath::Sin(Theta()); } |
41 |
< |
Double_t EtWithHO() const { return EWithHO()*TMath::Sin(Theta()); } |
42 |
< |
Double_t EWithHO() const { return (fEmEnergy + fHadEnergy + fOuterEnergy); } |
43 |
< |
Double_t EmEnergy() const { return fEmEnergy; } |
44 |
< |
const ThreeVectorC Position() const { return fPosition; } |
45 |
< |
Double_t HadEnergy() const { return fHadEnergy; } |
46 |
< |
Double_t OuterEnergy() const { return fOuterEnergy; } |
47 |
< |
Double_t EmEt() const { return fEmEnergy*TMath::Sin(Theta()); } |
48 |
< |
Double_t HadEt() const { return fHadEnergy*TMath::Sin(Theta()); } |
49 |
< |
Double_t OuterEt() const { return fOuterEnergy*TMath::Sin(Theta()); } |
26 |
> |
CaloTower() : fEmEnergy(0), fHadEnergy(0), fOuterEnergy(0), fMass(0) {} |
27 |
> |
|
28 |
> |
Double_t E() const { return (fEmEnergy + fHadEnergy); } |
29 |
> |
Double_t EmEt() const { return fEmEnergy*TMath::Sin(Theta()); } |
30 |
> |
Double_t Eta() const { return fPosition.Eta(); } |
31 |
> |
Double_t Et() const { return E()*TMath::Sin(Theta()); } |
32 |
> |
Double_t EtWithHO() const { return EWithHO()*TMath::Sin(Theta()); } |
33 |
> |
Double_t EWithHO() const { return (fEmEnergy + fHadEnergy + fOuterEnergy); } |
34 |
> |
Double_t EmEnergy() const { return fEmEnergy; } |
35 |
> |
Double_t HadEnergy() const { return fHadEnergy; } |
36 |
> |
Double_t HadEt() const { return fHadEnergy*TMath::Sin(Theta()); } |
37 |
> |
Double_t Mass() const { return fMass; } |
38 |
> |
const FourVectorM &Mom() const; |
39 |
> |
Double_t Phi() const { return fPosition.Phi(); } |
40 |
> |
Double_t Pt() const { Double_t r=Et(); if(r<0) r=0; return r; } |
41 |
> |
EObjType ObjType() const { return kCaloTower; } |
42 |
> |
Double_t OuterEnergy() const { return fOuterEnergy; } |
43 |
> |
Double_t OuterEt() const { return fOuterEnergy*TMath::Sin(Theta()); } |
44 |
> |
const ThreeVectorC &Position() const; |
45 |
> |
Double_t Theta() const { return Position().Theta(); } |
46 |
> |
void SetEmEnergy(Double_t emEnergy) |
47 |
> |
{ fEmEnergy = emEnergy; ClearMom(); } |
48 |
> |
void SetHadEnergy(Double_t hadEnergy) |
49 |
> |
{ fHadEnergy = hadEnergy; ClearMom(); } |
50 |
> |
void SetOuterEnergy(Double_t outerEnergy) |
51 |
> |
{ fOuterEnergy = outerEnergy; ClearMom(); } |
52 |
> |
void SetMass(Double_t mass) { fMass = mass; } |
53 |
> |
void SetPosition(Double_t x, Double_t y, Double_t z) |
54 |
> |
{ fPosition.SetXYZ(x,y,z); ClearMom(); ClearPos(); } |
55 |
|
|
56 |
|
protected: |
57 |
< |
ThreeVectorC32 fPosition; //Position of Tower |
58 |
< |
Double32_t fEmEnergy; //tower energy in Ecal |
59 |
< |
Double32_t fHadEnergy; //tower energy in Hcal |
60 |
< |
Double32_t fOuterEnergy; |
57 |
> |
void ClearMom() const { fCacheMomFlag.ClearCache(); } |
58 |
> |
void ClearPos() const { fCachePosFlag.ClearCache(); } |
59 |
> |
void GetMom() const; |
60 |
> |
void GetPos() const; |
61 |
> |
|
62 |
> |
Vect3C fPosition; //position of tower |
63 |
> |
Double32_t fEmEnergy; //[0,0,14]tower energy in Ecal |
64 |
> |
Double32_t fHadEnergy; //[0,0,14]tower energy in Hcal |
65 |
> |
Double32_t fOuterEnergy; //[0,0,14]tower energy in outer Hcal |
66 |
> |
Double32_t fMass; //[0,0,14]tower mass |
67 |
> |
mutable CacheFlag fCacheMomFlag; //||cache validity flag for momentum |
68 |
> |
mutable FourVectorM fCachedMom; //!cached momentum vector |
69 |
> |
mutable CacheFlag fCachePosFlag; //||cache validity flag for position |
70 |
> |
mutable ThreeVectorC fCachedPos; //!cached position vector |
71 |
|
|
72 |
< |
ClassDef(CaloTower, 1) // Generic particle class |
72 |
> |
ClassDef(CaloTower, 2) // Calo tower class |
73 |
|
}; |
74 |
|
} |
75 |
|
|
76 |
|
//-------------------------------------------------------------------------------------------------- |
77 |
< |
inline const mithep::FourVectorM mithep::CaloTower::Mom() const |
77 |
> |
inline void mithep::CaloTower::GetMom() const |
78 |
|
{ |
79 |
< |
// Compute and return four momentum |
80 |
< |
|
81 |
< |
if ( E() > 0 ) |
82 |
< |
return mithep::FourVectorM(Et(),Eta(),Phi(),0.0); |
79 |
> |
// Compute four momentum. |
80 |
> |
Double_t energy = E(); |
81 |
> |
if (energy > 0) { |
82 |
> |
Double_t pt = TMath::Sin(Theta())*TMath::Sqrt(energy*energy + fMass*fMass); |
83 |
> |
fCachedMom.SetCoordinates(pt,Eta(),Phi(),Mass()); |
84 |
> |
} |
85 |
|
else |
86 |
< |
return mithep::FourVectorM(); |
86 |
> |
fCachedMom = mithep::FourVectorM(); |
87 |
> |
} |
88 |
> |
|
89 |
> |
//-------------------------------------------------------------------------------------------------- |
90 |
> |
inline void mithep::CaloTower::GetPos() const |
91 |
> |
{ |
92 |
> |
// Compute position. |
93 |
> |
|
94 |
> |
fCachedPos.SetCoordinates(fPosition.Rho(), fPosition.Eta(), fPosition.Phi()); |
95 |
> |
} |
96 |
> |
|
97 |
> |
//-------------------------------------------------------------------------------------------------- |
98 |
> |
inline const mithep::FourVectorM &mithep::CaloTower::Mom() const |
99 |
> |
{ |
100 |
> |
// Return cached momentum value. |
101 |
> |
|
102 |
> |
if (!fCacheMomFlag.IsValid()) { |
103 |
> |
GetMom(); |
104 |
> |
fCacheMomFlag.SetValid(); |
105 |
> |
} |
106 |
> |
return fCachedMom; |
107 |
> |
} |
108 |
> |
|
109 |
> |
//-------------------------------------------------------------------------------------------------- |
110 |
> |
inline const mithep::ThreeVectorC &mithep::CaloTower::Position() const |
111 |
> |
{ |
112 |
> |
// Return cached momentum value. |
113 |
> |
|
114 |
> |
if (!fCachePosFlag.IsValid()) { |
115 |
> |
GetPos(); |
116 |
> |
fCachePosFlag.SetValid(); |
117 |
> |
} |
118 |
> |
return fCachedPos; |
119 |
|
} |
120 |
|
#endif |