GenJet

Specific

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
#ifndef JetReco_GenJet_h
#define JetReco_GenJet_h

/** \class reco::GenJet
 *
 * \short Jets made from MC generator particles
 *
 * GenJet represents Jets made from MC candidates
 * Provide energy contributions from different particle types
 * in addition to generic Jet parameters
 *
 * \author Fedor Ratnikov, UMd
 *
 * \version   Original March 31, 2006 by F.R. 
 *            Added GenJet specifics, 2019 by Salvatore Rappoccio
 ************************************************************/

#include "DataFormats/JetReco/interface/Jet.h"

namespace reco {
  class GenParticle;

  class GenJet : public Jet {
  public:
    struct Specific {
      Specific()
          : m_EmEnergy(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
      float m_HadEnergy;
      /// Invisible energy (mu, nu, ...)
      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*/
    GenJet() {}

    /** Constructor from values*/
    GenJet(const LorentzVector& fP4,
           const Point& fVertex,
           const Specific& fSpecific,
           const Jet::Constituents& fConstituents);
    GenJet(const LorentzVector& fP4, const Point& fVertex, const Specific& fSpecific);

    /** backward compatible, vertex=(0,0,0) */
    GenJet(const LorentzVector& fP4, const Specific& fSpecific, const Jet::Constituents& fConstituents);

    ~GenJet() override {}
    /** Returns energy of electromagnetic particles*/
    float emEnergy() const { return m_specific.m_EmEnergy; };
    /** Returns energy of hadronic particles*/
    float hadEnergy() const { return m_specific.m_HadEnergy; };
    /** Returns invisible energy*/
    float invisibleEnergy() const { return m_specific.m_InvisibleEnergy; };
    /** 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;

    /// convert generic constituent to specific type
    static const GenParticle* genParticle(const reco::Candidate* fConstituent);
    /// get specific constituent
    virtual const GenParticle* getGenConstituent(unsigned fIndex) const;
    /// get all constituents
    virtual std::vector<const GenParticle*> getGenConstituents() const;

    // block accessors

    const Specific& getSpecific() const { return m_specific; }

    /// set the specific (note: responsibility of keeping it consistent with the jet daughers belongs to the caller)
    void setSpecific(const Specific& spec) { m_specific = spec; }

    /// Polymorphic clone
    GenJet* clone() const override;

    /// Print object
    std::string print() const override;

  private:
    /// Polymorphic overlap
    bool overlap(const Candidate&) const override;

    // Data members
    //Variables specific to to the GenJet class
    Specific m_specific;
  };
}  // namespace reco
// temporary fix before include_checcker runs globally
#include "DataFormats/JetReco/interface/GenJetCollection.h"  //INCLUDECHECKER:SKIP
#endif