HypoClassKey

HypoClassKeyStringToEnum

TtEvent

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 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
#ifndef TopObjects_TtEvent_h
#define TopObjects_TtEvent_h

#include <vector>
#include <string>

#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/Common/interface/RefProd.h"
#include "DataFormats/Candidate/interface/CompositeCandidate.h"
#include "AnalysisDataFormats/TopObjects/interface/TtGenEvent.h"

/**
   \class   TtEvent TtEvent.h "AnalysisDataFormats/TopObjects/interface/TtEvent.h"

   \brief   Base class to hold information for ttbar event interpretation

   The structure holds information for ttbar event interpretation.
   All event hypotheses of different classes (user defined during
   production) and a reference to the TtGenEvent (if available). It 
   provides access and administration.
*/

class TtEvent {
public:
  /// supported classes of event hypotheses
  enum HypoClassKey {
    kGeom,
    kWMassMaxSumPt,
    kMaxSumPtWMass,
    kGenMatch,
    kMVADisc,
    kKinFit,
    kKinSolution,
    kWMassDeltaTopMass,
    kHitFit
  };
  /// pair of hypothesis and lepton jet combinatorics for a given hypothesis
  typedef std::pair<reco::CompositeCandidate, std::vector<int> > HypoCombPair;
  /// a lightweight map for selection type string label and enum value
  struct HypoClassKeyStringToEnum {
    const char* label;
    HypoClassKey value;
  };

protected:
  /// return the corresponding enum value from a string
  HypoClassKey hypoClassKeyFromString(const std::string& label) const;

public:
  /// empty constructor
  TtEvent() {}
  /// default destructor
  virtual ~TtEvent() {}

  /// get leptonic decay channels
  std::pair<WDecay::LeptonType, WDecay::LeptonType> lepDecays() const { return lepDecays_; }
  /// get event hypothesis; there can be more hypotheses of a certain
  /// class (sorted by quality); per default the best hypothesis is returned
  const reco::CompositeCandidate& eventHypo(const HypoClassKey& key, const unsigned& cmb = 0) const {
    return (evtHyp_.find(key)->second)[cmb].first;
  };
  /// get TtGenEvent
  const edm::RefProd<TtGenEvent>& genEvent() const { return genEvt_; };

  /// check if hypothesis class 'key' was added to the event structure
  bool isHypoClassAvailable(const std::string& key) const { return isHypoClassAvailable(hypoClassKeyFromString(key)); };
  /// check if hypothesis class 'key' was added to the event structure
  bool isHypoClassAvailable(const HypoClassKey& key) const { return (evtHyp_.find(key) != evtHyp_.end()); };
  // check if hypothesis 'cmb' is available within the hypothesis class
  bool isHypoAvailable(const std::string& key, const unsigned& cmb = 0) const {
    return isHypoAvailable(hypoClassKeyFromString(key), cmb);
  };
  /// check if hypothesis 'cmb' is available within the hypothesis class
  bool isHypoAvailable(const HypoClassKey& key, const unsigned& cmb = 0) const {
    return isHypoClassAvailable(key) ? (cmb < evtHyp_.find(key)->second.size()) : false;
  };
  /// check if hypothesis 'cmb' within the hypothesis class was valid; if not it lead to an empty CompositeCandidate
  bool isHypoValid(const std::string& key, const unsigned& cmb = 0) const {
    return isHypoValid(hypoClassKeyFromString(key), cmb);
  };
  /// check if hypothesis 'cmb' within the hypothesis class was valid; if not it lead to an empty CompositeCandidate
  bool isHypoValid(const HypoClassKey& key, const unsigned& cmb = 0) const {
    return isHypoAvailable(key, cmb) ? !eventHypo(key, cmb).roles().empty() : false;
  };
  /// return number of available hypothesis classes
  unsigned int numberOfAvailableHypoClasses() const { return evtHyp_.size(); };
  /// return number of available hypotheses within a given hypothesis class
  unsigned int numberOfAvailableHypos(const std::string& key) const {
    return numberOfAvailableHypos(hypoClassKeyFromString(key));
  };
  /// return number of available hypotheses within a given hypothesis class
  unsigned int numberOfAvailableHypos(const HypoClassKey& key) const {
    return isHypoAvailable(key) ? evtHyp_.find(key)->second.size() : 0;
  };
  /// return number of jets that were considered when building a given hypothesis
  int numberOfConsideredJets(const std::string& key) const {
    return numberOfConsideredJets(hypoClassKeyFromString(key));
  };
  /// return number of jets that were considered when building a given hypothesis
  int numberOfConsideredJets(const HypoClassKey& key) const {
    return (isHypoAvailable(key) ? nJetsConsidered_.find(key)->second : -1);
  };
  /// return the vector of jet lepton combinatorics for a given hypothesis and class
  std::vector<int> jetLeptonCombination(const std::string& key, const unsigned& cmb = 0) const {
    return jetLeptonCombination(hypoClassKeyFromString(key), cmb);
  };
  /// return the vector of jet lepton combinatorics for a given hypothesis and class
  std::vector<int> jetLeptonCombination(const HypoClassKey& key, const unsigned& cmb = 0) const {
    return (evtHyp_.find(key)->second)[cmb].second;
  };
  /// return the sum pt of the generator match if available; -1 else
  double genMatchSumPt(const unsigned& cmb = 0) const {
    return (cmb < genMatchSumPt_.size() ? genMatchSumPt_[cmb] : -1.);
  };
  /// return the sum dr of the generator match if available; -1 else
  double genMatchSumDR(const unsigned& cmb = 0) const {
    return (cmb < genMatchSumDR_.size() ? genMatchSumDR_[cmb] : -1.);
  };
  /// return the label of the mva method in use for the jet parton association (if kMVADisc is not available the string is empty)
  std::string mvaMethod() const { return mvaMethod_; }
  /// return the mva discriminant value of hypothesis 'cmb' if available; -1 else
  double mvaDisc(const unsigned& cmb = 0) const { return (cmb < mvaDisc_.size() ? mvaDisc_[cmb] : -1.); }
  /// return the chi2 of the kinematic fit of hypothesis 'cmb' if available; -1 else
  double fitChi2(const unsigned& cmb = 0) const { return (cmb < fitChi2_.size() ? fitChi2_[cmb] : -1.); }
  /// return the hitfit chi2 of hypothesis 'cmb' if available; -1 else
  double hitFitChi2(const unsigned& cmb = 0) const { return (cmb < hitFitChi2_.size() ? hitFitChi2_[cmb] : -1.); }
  /// return the fit probability of hypothesis 'cmb' if available; -1 else
  double fitProb(const unsigned& cmb = 0) const { return (cmb < fitProb_.size() ? fitProb_[cmb] : -1.); }
  /// return the hitfit probability of hypothesis 'cmb' if available; -1 else
  double hitFitProb(const unsigned& cmb = 0) const { return (cmb < hitFitProb_.size() ? hitFitProb_[cmb] : -1.); }
  /// return the hitfit top mass of hypothesis 'cmb' if available; -1 else
  double hitFitMT(const unsigned& cmb = 0) const { return (cmb < hitFitMT_.size() ? hitFitMT_[cmb] : -1.); }
  /// return the hitfit top mass uncertainty of hypothesis 'cmb' if available; -1 else
  double hitFitSigMT(const unsigned& cmb = 0) const { return (cmb < hitFitSigMT_.size() ? hitFitSigMT_[cmb] : -1.); }
  /// return the hypothesis in hypothesis class 'key2', which corresponds to hypothesis 'hyp1' in hypothesis class 'key1'
  int correspondingHypo(const std::string& key1, const unsigned& hyp1, const std::string& key2) const {
    return correspondingHypo(hypoClassKeyFromString(key1), hyp1, hypoClassKeyFromString(key2));
  };
  /// return the hypothesis in hypothesis class 'key2', which corresponds to hypothesis 'hyp1' in hypothesis class 'key1'
  int correspondingHypo(const HypoClassKey& key1, const unsigned& hyp1, const HypoClassKey& key2) const;

  /// get combined 4-vector of top and topBar of the given hypothesis
  const reco::Candidate* topPair(const std::string& key, const unsigned& cmb = 0) const {
    return topPair(hypoClassKeyFromString(key), cmb);
  };
  /// get combined 4-vector of top and topBar of the given hypothesis
  const reco::Candidate* topPair(const HypoClassKey& key, const unsigned& cmb = 0) const {
    return !isHypoValid(key, cmb) ? nullptr : (reco::Candidate*)&eventHypo(key, cmb);
  };
  /// get combined 4-vector of top and topBar from the TtGenEvent
  const math::XYZTLorentzVector* topPair() const { return (!genEvt_ ? nullptr : this->genEvent()->topPair()); };

  /// set leptonic decay channels
  void setLepDecays(const WDecay::LeptonType& lepDecTop1, const WDecay::LeptonType& lepDecTop2) {
    lepDecays_ = std::make_pair(lepDecTop1, lepDecTop2);
  };
  /// set TtGenEvent
  void setGenEvent(const edm::Handle<TtGenEvent>& evt) { genEvt_ = edm::RefProd<TtGenEvent>(evt); };
  /// add new hypotheses
  void addEventHypo(const HypoClassKey& key, const HypoCombPair& hyp) { evtHyp_[key].push_back(hyp); };
  /// set number of jets considered when building a given hypothesis
  void setNumberOfConsideredJets(const HypoClassKey& key, const unsigned int nJets) { nJetsConsidered_[key] = nJets; };
  /// set sum pt of kGenMatch hypothesis
  void setGenMatchSumPt(const std::vector<double>& val) { genMatchSumPt_ = val; };
  /// set sum dr of kGenMatch hypothesis
  void setGenMatchSumDR(const std::vector<double>& val) { genMatchSumDR_ = val; };
  /// set label of mva method for kMVADisc hypothesis
  void setMvaMethod(const std::string& name) { mvaMethod_ = name; };
  /// set mva discriminant values of kMVADisc hypothesis
  void setMvaDiscriminators(const std::vector<double>& val) { mvaDisc_ = val; };
  /// set chi2 of kKinFit hypothesis
  void setFitChi2(const std::vector<double>& val) { fitChi2_ = val; };
  /// set chi2 of kHitFit hypothesis
  void setHitFitChi2(const std::vector<double>& val) { hitFitChi2_ = val; };
  /// set fit probability of kKinFit hypothesis
  void setFitProb(const std::vector<double>& val) { fitProb_ = val; };
  /// set fit probability of kHitFit hypothesis
  void setHitFitProb(const std::vector<double>& val) { hitFitProb_ = val; };
  /// set fitted top mass of kHitFit hypothesis
  void setHitFitMT(const std::vector<double>& val) { hitFitMT_ = val; };
  /// set fitted top mass uncertainty of kHitFit hypothesis
  void setHitFitSigMT(const std::vector<double>& val) { hitFitSigMT_ = val; };

protected:
  /// leptonic decay channels
  std::pair<WDecay::LeptonType, WDecay::LeptonType> lepDecays_;
  /// reference to TtGenEvent (has to be kept in the event!)
  edm::RefProd<TtGenEvent> genEvt_;
  /// map of hypotheses; for each HypoClassKey a vector of
  /// hypothesis and their lepton jet combinatorics are kept
  std::map<HypoClassKey, std::vector<HypoCombPair> > evtHyp_;
  /// number of jets considered when building the hypotheses
  std::map<HypoClassKey, int> nJetsConsidered_;

  /// result of kinematic fit
  std::vector<double> fitChi2_;
  std::vector<double> hitFitChi2_;
  /// result of kinematic fit
  std::vector<double> fitProb_;
  std::vector<double> hitFitProb_;
  /// result of hitfit
  std::vector<double> hitFitMT_;
  std::vector<double> hitFitSigMT_;
  /// result of gen match
  std::vector<double> genMatchSumPt_;
  /// result of gen match
  std::vector<double> genMatchSumDR_;
  /// label of the MVA method
  std::string mvaMethod_;
  /// MVA discriminants
  std::vector<double> mvaDisc_;
};

#endif