Skip to content

Commit

Permalink
Merge pull request #26125 from rappoccio/pfGenJetSpecifics
Browse files Browse the repository at this point in the history
Pf gen jet specifics
  • Loading branch information
cmsbuild committed Mar 27, 2019
2 parents 5cf7aa1 + cfbdc8b commit 63ed7a2
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 42 deletions.
9 changes: 9 additions & 0 deletions DataFormats/HepMCCandidate/interface/GenParticleFwd.h
Expand Up @@ -2,6 +2,9 @@
#define HepMCCandidate_GenParticleFwd_h
#include <vector>
#include "DataFormats/Common/interface/Ref.h"
#include "DataFormats/Common/interface/Ptr.h"
#include "DataFormats/Common/interface/FwdRef.h"
#include "DataFormats/Common/interface/FwdPtr.h"
#include "DataFormats/Common/interface/RefProd.h"
#include "DataFormats/Common/interface/RefVector.h"
#include "DataFormats/Common/interface/Association.h"
Expand All @@ -12,12 +15,18 @@ namespace reco {
typedef std::vector<GenParticle> GenParticleCollection;
/// persistent reference to a GenParticle
typedef edm::Ref<GenParticleCollection> GenParticleRef;
/// persistent reference to a GenParticle
typedef edm::Ptr<GenParticle> GenParticlePtr;
/// forward persistent reference to a GenParticle
typedef edm::FwdPtr<GenParticle> GenParticleFwdPtr;
/// persistent reference to a GenParticle collection
typedef edm::RefProd<GenParticleCollection> GenParticleRefProd;
/// vector of reference to GenParticle in the same collection
typedef edm::RefVector<GenParticleCollection> GenParticleRefVector;
/// vector of reference to GenParticle in the same collection
typedef edm::Association<GenParticleCollection> GenParticleMatch;
// vector of forward persistent reference to a GenParticle
typedef std::vector<GenParticleFwdPtr> GenParticleFwdPtrVector;
}

#endif
55 changes: 50 additions & 5 deletions DataFormats/JetReco/interface/GenJet.h
Expand Up @@ -11,7 +11,8 @@
*
* \author Fedor Ratnikov, UMd
*
* \version Original March 31, 2006 by F.R.
* \version Original March 31, 2006 by F.R.
* Added GenJet specifics, 2019 by Salvatore Rappoccio
************************************************************/


Expand All @@ -26,10 +27,22 @@ class GenJet : public Jet {
struct Specific {
Specific () :
m_EmEnergy (0),
m_HadEnergy (0),
m_InvisibleEnergy (0),
m_AuxiliaryEnergy (0) {}

m_HadEnergy (0),
m_InvisibleEnergy (0),
m_AuxiliaryEnergy (0),
m_ChargedHadronEnergy(0),
m_NeutralHadronEnergy(0),
m_ChargedEmEnergy(0),
m_NeutralEmEnergy(0),
m_MuonEnergy(0),
m_ChargedHadronMultiplicity(0),
m_NeutralHadronMultiplicity(0),
m_ChargedEmMultiplicity(0),
m_NeutralEmMultiplicity(0),
m_MuonMultiplicity(0)
{}

/// Calo-like definitions:
/// Energy of EM particles
float m_EmEnergy;
/// Energy of Hadrons
Expand All @@ -38,6 +51,25 @@ class GenJet : public Jet {
float m_InvisibleEnergy;
/// Anything else (undecayed Sigmas etc.)
float m_AuxiliaryEnergy;

/// PF-like definitions:
/// pi+, K+, etc
float m_ChargedHadronEnergy;
/// K0, etc
float m_NeutralHadronEnergy;
/// Electrons
float m_ChargedEmEnergy;
/// Photons
float m_NeutralEmEnergy;
/// Muons
float m_MuonEnergy;
/// Corresponding multiplicities:
int m_ChargedHadronMultiplicity;
int m_NeutralHadronMultiplicity;
int m_ChargedEmMultiplicity;
int m_NeutralEmMultiplicity;
int m_MuonMultiplicity;

};

/** Default constructor*/
Expand All @@ -62,6 +94,19 @@ class GenJet : public Jet {
/** Returns other energy (undecayed Sigmas etc.)*/
float auxiliaryEnergy() const {return m_specific.m_AuxiliaryEnergy;};


// PF-like definitions
float chargedHadronEnergy() const { return m_specific.m_ChargedHadronEnergy;}
float neutralHadronEnergy() const { return m_specific.m_NeutralHadronEnergy;}
float chargedEmEnergy () const { return m_specific.m_ChargedEmEnergy ;}
float neutralEmEnergy () const { return m_specific.m_NeutralEmEnergy ;}
float muonEnergy () const { return m_specific.m_MuonEnergy ;}
int chargedHadronMultiplicity() const { return m_specific.m_ChargedHadronMultiplicity;}
int neutralHadronMultiplicity() const { return m_specific.m_NeutralHadronMultiplicity;}
int chargedEmMultiplicity () const { return m_specific.m_ChargedEmMultiplicity ;}
int neutralEmMultiplicity () const { return m_specific.m_NeutralEmMultiplicity ;}
int muonMultiplicity () const { return m_specific.m_MuonMultiplicity ;}

/// Detector Eta (use reference Z and jet kinematics only)
float detectorEta (float fZVertex) const;

Expand Down
3 changes: 2 additions & 1 deletion DataFormats/JetReco/src/classes_def_1.xml
Expand Up @@ -93,7 +93,8 @@
<version ClassVersion="11" checksum="2159688147"/>
<version ClassVersion="10" checksum="1136403928"/>
</class>
<class name="reco::GenJet::Specific" ClassVersion="10">
<class name="reco::GenJet::Specific" ClassVersion="11">
<version ClassVersion="11" checksum="1280150924"/>
<version ClassVersion="10" checksum="3126154868"/>
</class>
<class name="std::vector<reco::GenJet>"/>
Expand Down
108 changes: 72 additions & 36 deletions RecoJets/JetProducers/src/JetSpecific.cc
Expand Up @@ -26,9 +26,6 @@
#include <cmath>


using namespace std;


////////////////////////////////////////////////////////////////////////////////
// implementation of global functions
////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -132,7 +129,7 @@ void reco::writeSpecific(reco::PFClusterJet & jet,


//______________________________________________________________________________
bool reco::makeSpecific(vector<reco::CandidatePtr> const & towers,
bool reco::makeSpecific(std::vector<reco::CandidatePtr> const & towers,
const CaloSubdetectorGeometry* towerGeometry,
CaloJet::Specific* caloJetSpecific,
const HcalTopology &topology)
Expand All @@ -142,8 +139,8 @@ bool reco::makeSpecific(vector<reco::CandidatePtr> const & towers,
// 1.- Loop over the tower Ids,
// 2.- Get the corresponding CaloTower
// 3.- Calculate the different CaloJet specific quantities
vector<double> eECal_i;
vector<double> eHCal_i;
std::vector<double> eECal_i;
std::vector<double> eHCal_i;
double eInHad = 0.;
double eInEm = 0.;
double eInHO = 0.;
Expand All @@ -155,7 +152,7 @@ bool reco::makeSpecific(vector<reco::CandidatePtr> const & towers,
double eInEE = 0.;
double jetArea = 0.;

vector<reco::CandidatePtr>::const_iterator itTower;
std::vector<reco::CandidatePtr>::const_iterator itTower;
for (itTower=towers.begin();itTower!=towers.end();++itTower) {
if ( itTower->isNull() || !itTower->isAvailable() ) {
edm::LogWarning("DataNotFound") << " JetSpecific: Tower is invalid\n";
Expand Down Expand Up @@ -225,8 +222,8 @@ bool reco::makeSpecific(vector<reco::CandidatePtr> const & towers,
caloJetSpecific->mMaxEInHadTowers = 0;

//Sort the arrays
sort(eECal_i.begin(), eECal_i.end(), greater<double>());
sort(eHCal_i.begin(), eHCal_i.end(), greater<double>());
sort(eECal_i.begin(), eECal_i.end(), std::greater<double>());
sort(eHCal_i.begin(), eHCal_i.end(), std::greater<double>());

if (!towers.empty()) {
//Highest value in the array is the first element of the array
Expand All @@ -239,7 +236,7 @@ bool reco::makeSpecific(vector<reco::CandidatePtr> const & towers,


//______________________________________________________________________________
bool reco::makeSpecific(vector<reco::CandidatePtr> const & particles,
bool reco::makeSpecific(std::vector<reco::CandidatePtr> const & particles,
PFJet::Specific* pfJetSpecific)
{
if (nullptr==pfJetSpecific) return false;
Expand Down Expand Up @@ -271,7 +268,7 @@ bool reco::makeSpecific(vector<reco::CandidatePtr> const & particles,

float HOEnergy=0.;

vector<reco::CandidatePtr>::const_iterator itParticle;
std::vector<reco::CandidatePtr>::const_iterator itParticle;
for (itParticle=particles.begin();itParticle!=particles.end();++itParticle){
if ( itParticle->isNull() || !itParticle->isAvailable() ) {
edm::LogWarning("DataNotFound") << " JetSpecific: PF Particle is invalid\n";
Expand Down Expand Up @@ -374,50 +371,89 @@ bool reco::makeSpecific(vector<reco::CandidatePtr> const & particles,


//______________________________________________________________________________
bool reco::makeSpecific(vector<reco::CandidatePtr> const & mcparticles,
bool reco::makeSpecific(std::vector<reco::CandidatePtr> const & mcparticles,
GenJet::Specific* genJetSpecific)
{
if (nullptr==genJetSpecific) return false;

vector<reco::CandidatePtr>::const_iterator itMcParticle=mcparticles.begin();
std::vector<reco::CandidatePtr>::const_iterator itMcParticle=mcparticles.begin();
for (;itMcParticle!=mcparticles.end();++itMcParticle) {
if ( itMcParticle->isNull() || !itMcParticle->isAvailable() ) {
edm::LogWarning("DataNotFound") << " JetSpecific: MC Particle is invalid\n";
continue;
}


const Candidate* candidate = itMcParticle->get();
if (candidate->hasMasterClone()) candidate = candidate->masterClone().get();
//const GenParticle* genParticle = GenJet::genParticle(candidate);


if (candidate) {
double e = candidate->energy();
switch (abs (candidate->pdgId ())) {
case 22: // photon
case 11: // e
genJetSpecific->m_EmEnergy += e;
break;
case 211: // pi
case 321: // K
case 130: // KL
case 2212: // p
case 2112: // n
genJetSpecific->m_HadEnergy += e;
break;
case 13: // muon
case 12: // nu_e
case 14: // nu_mu
case 16: // nu_tau

genJetSpecific->m_InvisibleEnergy += e;
break;
default:
genJetSpecific->m_AuxiliaryEnergy += e;

// Legacy calo-like definitions
switch (std::abs (candidate->pdgId ())) {
case 22: // photon
case 11: // e
genJetSpecific->m_EmEnergy += e;
break;
case 211: // pi
case 321: // K
case 130: // KL
case 2212: // p
case 2112: // n
genJetSpecific->m_HadEnergy += e;
break;
case 13: // muon
case 12: // nu_e
case 14: // nu_mu
case 16: // nu_tau
genJetSpecific->m_InvisibleEnergy += e;
break;
default:
genJetSpecific->m_AuxiliaryEnergy += e;
}
}

// PF-like definitions
switch (std::abs (candidate->pdgId ())) {
case 11: //electron
genJetSpecific->m_ChargedEmEnergy += e;
++(genJetSpecific->m_ChargedEmMultiplicity);
break;
case 13: // muon
genJetSpecific->m_MuonEnergy += e;
++(genJetSpecific->m_MuonMultiplicity);
case 211: //pi+-
case 321: //K
case 2212: //p
case 3222: //Sigma+
case 3112: //Sigma-
case 3312: //Xi-
case 3334: //Omega-
genJetSpecific->m_ChargedHadronEnergy += e;
++(genJetSpecific->m_ChargedHadronMultiplicity);
break;
case 310: //KS0
case 130: //KL0
case 3122: //Lambda0
case 3212: //Sigma0
case 3322: //Xi0
case 2112: //n0
genJetSpecific->m_NeutralHadronEnergy += e;
++(genJetSpecific->m_NeutralHadronMultiplicity);
break;
case 22: //photon
genJetSpecific->m_NeutralEmEnergy += e;
++(genJetSpecific->m_NeutralEmMultiplicity);
break;
}
} // end if found a candidate
else {
edm::LogWarning("DataNotFound") <<"reco::makeGenJetSpecific: Referred GenParticleCandidate "
<<"is not available in the event\n";
}
}
}// end for loop over MC particles

return true;
}
Expand Down

0 comments on commit 63ed7a2

Please sign in to comment.