CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
JetMaker.cc
Go to the documentation of this file.
1 
15 
17 
18 using namespace std;
19 using namespace reco;
20 
22  const CaloSubdetectorGeometry& fTowerGeometry,
23  CaloJet::Specific* fJetSpecific) {
24  if (!fJetSpecific) return false;
25 
26  // 1.- Loop over the tower Ids,
27  // 2.- Get the corresponding CaloTower
28  // 3.- Calculate the different CaloJet specific quantities
29  vector<double> eECal_i;
30  vector<double> eHCal_i;
31  double eInHad = 0.;
32  double eInEm = 0.;
33  double eInHO = 0.;
34  double eInHB = 0.;
35  double eInHE = 0.;
36  double eHadInHF = 0.;
37  double eEmInHF = 0.;
38  double eInEB = 0.;
39  double eInEE = 0.;
40  double jetArea = 0.;
41 
42  for (JetReco::InputCollection::const_iterator towerCand = fTowers.begin(); towerCand != fTowers.end(); ++towerCand) {
43  const Candidate* candidate = towerCand->get ();
44  if (candidate) {
45  const CaloTower* tower = dynamic_cast<const CaloTower*> (candidate);
46  if (tower) {
47  //Array of energy in EM Towers:
48  eECal_i.push_back(tower->emEnergy());
49  eInEm += tower->emEnergy();
50  //Array of energy in HCAL Towers:
51  eHCal_i.push_back(tower->hadEnergy());
52  eInHad += tower->hadEnergy();
53 
54  // figure out contributions
55  switch (JetMaker::hcalSubdetector (tower->id().ieta())) {
56  case HcalBarrel:
57  eInHB += tower->hadEnergy();
58  eInHO += tower->outerEnergy();
59  eInEB += tower->emEnergy();
60  break;
61  case HcalEndcap:
62  eInHE += tower->hadEnergy();
63  eInEE += tower->emEnergy();
64  break;
65  case HcalForward:
66  eHadInHF += tower->hadEnergy();
67  eEmInHF += tower->emEnergy();
68  break;
69  default:
70  break;
71  }
72  // get area of the tower (++ minus --)
73  if ( tower->energy() > 0 ) {
74  const CaloCellGeometry* geometry = fTowerGeometry.getGeometry(tower->id());
75  if (geometry) {
76  float dEta = fabs (geometry->getCorners() [0].eta() - geometry->getCorners() [2].eta());
77  float dPhi = fabs (geometry->getCorners() [0].phi() - geometry->getCorners() [2].phi());
78  jetArea += dEta * dPhi;
79  }
80  }
81  else {
82  std::cerr << "JetMaker::makeSpecific (CaloJet)-> Geometry for cell " << tower->id() << " can not be found. Ignoring cell" << std::endl;
83  }
84  }
85  else {
86  std::cerr << "JetMaker::makeSpecific (CaloJet)-> Constituent is not of CaloTower type" << std::endl;
87  }
88  }
89  else {
90  std::cerr << "JetMaker::makeSpecific (CaloJet)-> Referred constituent is not available in the event" << std::endl;
91  }
92  }
93  double towerEnergy = eInHad + eInEm;
94  fJetSpecific->mHadEnergyInHO = eInHO;
95  fJetSpecific->mHadEnergyInHB = eInHB;
96  fJetSpecific->mHadEnergyInHE = eInHE;
97  fJetSpecific->mHadEnergyInHF = eHadInHF;
98  fJetSpecific->mEmEnergyInHF = eEmInHF;
99  fJetSpecific->mEmEnergyInEB = eInEB;
100  fJetSpecific->mEmEnergyInEE = eInEE;
101  if (towerEnergy > 0) {
102  fJetSpecific->mEnergyFractionHadronic = eInHad / towerEnergy;
103  fJetSpecific->mEnergyFractionEm = eInEm / towerEnergy;
104  }
105  else { // HO only jet
106  fJetSpecific->mEnergyFractionHadronic = 1.;
107  fJetSpecific->mEnergyFractionEm = 0.;
108  }
109  fJetSpecific->mTowersArea = jetArea;
110  fJetSpecific->mMaxEInEmTowers = 0;
111  fJetSpecific->mMaxEInHadTowers = 0;
112 
113  //Sort the arrays
114  sort(eECal_i.begin(), eECal_i.end(), greater<double>());
115  sort(eHCal_i.begin(), eHCal_i.end(), greater<double>());
116 
117  if (!fTowers.empty ()) {
118  //Highest value in the array is the first element of the array
119  fJetSpecific->mMaxEInEmTowers = eECal_i.front();
120  fJetSpecific->mMaxEInHadTowers = eHCal_i.front();
121 
122  }
123  return true;
124 }
125 
128  PFJet::Specific* fJetSpecific) {
129  if (!fJetSpecific) return false;
130 
131  // 1.- Loop over PFCandidates,
132  // 2.- Get the corresponding PFCandidate
133  // 3.- Calculate the different PFJet specific quantities
134 
135  float chargedHadronEnergy=0.;
136  float neutralHadronEnergy=0.;
137  float chargedEmEnergy=0.;
138  float neutralEmEnergy=0.;
139  float chargedMuEnergy=0.;
140  int chargedMultiplicity=0;
141  int neutralMultiplicity=0;
142  int muonMultiplicity=0;
143 
144  JetReco::InputCollection::const_iterator constituent = fPFCandidates.begin();
145  for (; constituent != fPFCandidates.end(); ++constituent) {
146  const Candidate* candidate = constituent->get ();
147  if (candidate) {
148  const PFCandidate* pfCand = dynamic_cast<const PFCandidate*> (candidate);
149  if (pfCand) {
150  switch ( PFCandidate::ParticleType (pfCand->particleId())) {
151  case PFCandidate::h: // charged hadron
152  chargedHadronEnergy += pfCand->energy();
153  chargedMultiplicity++;
154  break;
155 
156  case PFCandidate::e: // electron
157  chargedEmEnergy += pfCand->energy();
158  chargedMultiplicity++;
159  break;
160 
161  case PFCandidate::mu: // muon
162  chargedMuEnergy += pfCand->energy();
163  chargedMultiplicity++;
164  muonMultiplicity++;
165  break;
166 
167  case PFCandidate::gamma: // photon
168  case PFCandidate::egamma_HF : // electromagnetic in HF
169  neutralEmEnergy += pfCand->energy();
170  neutralMultiplicity++;
171  break;
172 
173  case PFCandidate::h0 : // neutral hadron
174  case PFCandidate::h_HF : // hadron in HF
175  neutralHadronEnergy += pfCand->energy();
176  neutralMultiplicity++;
177  break;
178 
179  default:
180  std::cerr << "JetMaker::makeSpecific (PFJetJet)-> Unknown PFCandidate::ParticleType: " << pfCand->particleId() << " is ignored" << std::endl;
181  break;
182  }
183  }
184  else {
185  std::cerr << "JetMaker::makeSpecific (PFJetJet)-> Referred constituent is not PFCandidate" << std::endl;
186  }
187  }
188  else {
189  std::cerr << "JetMaker::makeSpecific (PFJetJet)-> Referred constituent is not available in the event" << std::endl;
190  }
191  }
192  fJetSpecific->mChargedHadronEnergy=chargedHadronEnergy;
193  fJetSpecific->mNeutralHadronEnergy= neutralHadronEnergy;
194  fJetSpecific->mChargedEmEnergy=chargedEmEnergy;
195  fJetSpecific->mChargedMuEnergy=chargedMuEnergy;
196  fJetSpecific->mNeutralEmEnergy=neutralEmEnergy;
197  fJetSpecific->mChargedMultiplicity=chargedMultiplicity;
198  fJetSpecific->mNeutralMultiplicity=neutralMultiplicity;
199  fJetSpecific->mMuonMultiplicity=muonMultiplicity;
200  return true;
201 }
202 
203 
205  GenJet::Specific* fJetSpecific) {
206  for (JetReco::InputCollection::const_iterator genCand = fMcParticles.begin(); genCand != fMcParticles.end(); ++genCand) {
207  const Candidate* candidate = genCand->get ();
208  if (candidate->hasMasterClone ()) candidate = candidate->masterClone().get ();
209  if (candidate) {
210  const GenParticle* genParticle = GenJet::genParticle (candidate);
211  if (genParticle) {
212  double e = genParticle->energy();
213  switch (std::abs (genParticle->pdgId ())) {
214  case 22: // photon
215  case 11: // e
216  fJetSpecific->m_EmEnergy += e;
217  break;
218  case 211: // pi
219  case 321: // K
220  case 130: // KL
221  case 2212: // p
222  case 2112: // n
223  fJetSpecific->m_HadEnergy += e;
224  break;
225  case 13: // muon
226  case 12: // nu_e
227  case 14: // nu_mu
228  case 16: // nu_tau
229 
230  fJetSpecific->m_InvisibleEnergy += e;
231  break;
232  default:
233  fJetSpecific->m_AuxiliaryEnergy += e;
234  }
235  }
236  else {
237  std::cerr << "JetMaker::makeSpecific (GenJet)-> Referred GenParticleCandidate is not available in the event" << std::endl;
238  }
239  }
240  else {
241  std::cerr << "JetMaker::makeSpecific (GenJet)-> Referred constituent is not available in the event" << std::endl;
242  }
243  }
244  return true;
245 }
246 
248  // FIXME for SLHC
249  static const HcalTopology topology(HcalTopologyMode::LHC, 2, 3);
250  int eta = std::abs (fEta);
251  if (eta <= topology.lastHBRing()) return HcalBarrel;
252  else if (eta <= topology.lastHERing()) return HcalEndcap;
253  else if (eta <= topology.lastHFRing()) return HcalForward;
254  return HcalEmpty;
255 }
256 
float mMaxEInEmTowers
Maximum energy in EM towers.
Definition: CaloJet.h:54
virtual double energy() const GCC11_FINAL
energy
ParticleType
particle types
Definition: PFCandidate.h:40
float mEmEnergyInHF
Em energy in HF.
Definition: CaloJet.h:70
float mEnergyFractionHadronic
Hadronic energy fraction.
Definition: CaloJet.h:72
int mChargedMultiplicity
Definition: PFJet.h:74
virtual int pdgId() const GCC11_FINAL
PDG identifier.
std::vector< InputItem > InputCollection
Definition: JetRecoTypes.h:62
float mEmEnergyInEB
Em energy in EB.
Definition: CaloJet.h:66
HcalSubdetector hcalSubdetector(int fEta)
converts eta to the corresponding HCAL subdetector.
Definition: JetMaker.cc:247
#define abs(x)
Definition: mlp_lapack.h:159
int lastHBRing() const
Definition: HcalTopology.h:79
float mNeutralHadronEnergy
Definition: PFJet.h:54
float mChargedMuEnergy
Definition: PFJet.h:72
float mHadEnergyInHB
Hadronic energy in HB.
Definition: CaloJet.h:60
T eta() const
float mChargedHadronEnergy
Definition: PFJet.h:53
virtual const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
float mChargedEmEnergy
Definition: PFJet.h:71
virtual bool hasMasterClone() const =0
double emEnergy() const
Definition: CaloTower.h:79
double dPhi(double phi1, double phi2)
Definition: JetUtil.h:30
float mNeutralEmEnergy
Definition: PFJet.h:73
int lastHFRing() const
Definition: HcalTopology.h:83
HcalSubdetector
Definition: HcalAssistant.h:32
float mEnergyFractionEm
Em energy fraction.
Definition: CaloJet.h:74
float mHadEnergyInHF
Hadronic energy in HF.
Definition: CaloJet.h:62
const int mu
Definition: Constants.h:23
float m_InvisibleEnergy
Invisible energy (mu, nu, ...)
Definition: GenJet.h:39
float mMaxEInHadTowers
Maximum energy in HCAL towers.
Definition: CaloJet.h:56
double hadEnergy() const
Definition: CaloTower.h:80
bool makeSpecific(const JetReco::InputCollection &fConstituents, const CaloSubdetectorGeometry &fTowerGeometry, reco::CaloJet::Specific *fJetSpecific)
Make CaloJet specifics. Assumes ProtoJet is made from CaloTowerCandidates.
Definition: JetMaker.cc:21
CaloTowerDetId id() const
Definition: CaloTower.h:72
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
int mNeutralMultiplicity
Definition: PFJet.h:75
float m_AuxiliaryEnergy
Anything else (undecayed Sigmas etc.)
Definition: GenJet.h:41
float mHadEnergyInHO
Hadronic nergy fraction in HO.
Definition: CaloJet.h:58
ESHandle< TrackerGeometry > geometry
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:35
float m_HadEnergy
Energy of Hadrons.
Definition: GenJet.h:37
T get() const
get a component
Definition: Candidate.h:219
float mTowersArea
Area of contributing CaloTowers.
Definition: CaloJet.h:76
int ieta() const
get the tower ieta
virtual ParticleType particleId() const
Definition: PFCandidate.h:347
float m_EmEnergy
Energy of EM particles.
Definition: GenJet.h:35
value_type const * get() const
Definition: RefToBase.h:212
float mEmEnergyInEE
Em energy in EE.
Definition: CaloJet.h:68
double outerEnergy() const
Definition: CaloTower.h:81
int lastHERing() const
Definition: HcalTopology.h:81
virtual const CornersVec & getCorners() const =0
Returns the corner points of this cell&#39;s volume.
float mHadEnergyInHE
Hadronic energy in HE.
Definition: CaloJet.h:64
virtual const CandidateBaseRef & masterClone() const =0