File indexing completed on 2024-04-06 12:03:47
0001 #ifndef DataFormats_BTauReco_TemplatedSoftLeptonTagInfo_h
0002 #define DataFormats_BTauReco_TemplatedSoftLeptonTagInfo_h
0003
0004 #include <vector>
0005 #include <limits>
0006
0007 #include "DataFormats/Common/interface/CMS_CLASS_VERSION.h"
0008 #include "DataFormats/BTauReco/interface/RefMacros.h"
0009 #include "DataFormats/BTauReco/interface/JetTagInfo.h"
0010 #include "DataFormats/BTauReco/interface/IPTagInfo.h"
0011 #include "DataFormats/BTauReco/interface/TaggingVariable.h"
0012
0013 namespace reco {
0014
0015 class SoftLeptonProperties {
0016 public:
0017 SoftLeptonProperties()
0018 : sip2dsig(std::numeric_limits<float>::quiet_NaN()),
0019 sip3dsig(std::numeric_limits<float>::quiet_NaN()),
0020 sip2d(std::numeric_limits<float>::quiet_NaN()),
0021 sip3d(std::numeric_limits<float>::quiet_NaN()),
0022 ptRel(std::numeric_limits<float>::quiet_NaN()),
0023 p0Par(std::numeric_limits<float>::quiet_NaN()),
0024 etaRel(std::numeric_limits<float>::quiet_NaN()),
0025 deltaR(std::numeric_limits<float>::quiet_NaN()),
0026 ratio(std::numeric_limits<float>::quiet_NaN()),
0027 ratioRel(std::numeric_limits<float>::quiet_NaN()),
0028 elec_mva(std::numeric_limits<float>::quiet_NaN()),
0029 charge(-10) {}
0030
0031 float sip2dsig;
0032 float sip3dsig;
0033 float sip2d;
0034 float sip3d;
0035 float ptRel;
0036 float p0Par;
0037
0038 float etaRel;
0039 float deltaR;
0040 float ratio;
0041 float ratioRel;
0042
0043 float elec_mva;
0044
0045 int charge;
0046
0047 struct Quality {
0048 static const float undef;
0049
0050
0051
0052
0053 enum Generic { leptonId = 0, btagLeptonCands };
0054
0055 enum Electron { pfElectronId = 0, btagElectronCands, egammaElectronId };
0056
0057 enum Muon { muonId = 0, btagMuonCands };
0058
0059 template <typename T>
0060 static inline T byName(const char *name) {
0061 return static_cast<T>(internalByName(name));
0062 }
0063
0064 private:
0065 static unsigned int internalByName(const char *name);
0066 };
0067
0068
0069
0070 inline float hasQuality() const { return quality() != Quality::undef; }
0071 inline float hasQuality(Quality::Generic qual) const {
0072 return quality((unsigned int)qual, false) != Quality::undef;
0073 }
0074 inline float hasQuality(Quality::Muon qual) const { return quality((unsigned int)qual, false) != Quality::undef; }
0075 inline float hasQuality(Quality::Electron qual) const {
0076 return quality((unsigned int)qual, false) != Quality::undef;
0077 }
0078
0079
0080
0081 inline float quality(Quality::Generic qual, bool throwIfUndefined = true) const {
0082 return quality((unsigned int)qual, throwIfUndefined);
0083 }
0084 inline float quality(Quality::Muon qual, bool throwIfUndefined = true) const {
0085 return quality((unsigned int)qual, throwIfUndefined);
0086 }
0087 inline float quality(Quality::Electron qual, bool throwIfUndefined = true) const {
0088 return quality((unsigned int)qual, throwIfUndefined);
0089 }
0090
0091
0092 inline float quality() const { return quality(0, false); }
0093
0094
0095
0096 inline void setQuality(Quality::Generic qual, float value) { setQuality((unsigned int)qual, value); }
0097 inline void setQuality(Quality::Muon qual, float value) { setQuality((unsigned int)qual, value); }
0098 inline void setQuality(Quality::Electron qual, float value) { setQuality((unsigned int)qual, value); }
0099
0100 private:
0101 float quality(unsigned int index, bool throwIfUndefined) const;
0102 void setQuality(unsigned int index, float value);
0103
0104 std::vector<float> qualities_;
0105 };
0106
0107 template <class REF>
0108 class TemplatedSoftLeptonTagInfo : public JetTagInfo {
0109 public:
0110 typedef std::vector<std::pair<REF, SoftLeptonProperties> > LeptonMap;
0111
0112 TemplatedSoftLeptonTagInfo(void) : m_leptons() {}
0113
0114 ~TemplatedSoftLeptonTagInfo(void) override {}
0115
0116 TemplatedSoftLeptonTagInfo *clone(void) const override { return new TemplatedSoftLeptonTagInfo(*this); }
0117
0118 unsigned int leptons(void) const { return m_leptons.size(); }
0119
0120 const REF &lepton(size_t i) const { return m_leptons[i].first; }
0121
0122 const SoftLeptonProperties &properties(size_t i) const { return m_leptons[i].second; }
0123
0124 void insert(const REF &lepton, const SoftLeptonProperties &properties) {
0125 m_leptons.push_back(std::pair<REF, SoftLeptonProperties>(lepton, properties));
0126 }
0127
0128
0129 TaggingVariableList taggingVariables(void) const override;
0130
0131
0132 CMS_CLASS_VERSION(2)
0133
0134 private:
0135 LeptonMap m_leptons;
0136 };
0137
0138 template <class REF>
0139 TaggingVariableList TemplatedSoftLeptonTagInfo<REF>::taggingVariables(void) const {
0140 TaggingVariableList list;
0141
0142 const Jet &jet = *(this->jet());
0143 list.insert(TaggingVariable(btau::jetEnergy, jet.energy()), true);
0144 list.insert(TaggingVariable(btau::jetPt, jet.et()), true);
0145 list.insert(TaggingVariable(btau::jetEta, jet.eta()), true);
0146 list.insert(TaggingVariable(btau::jetPhi, jet.phi()), true);
0147
0148 for (unsigned int i = 0; i < m_leptons.size(); ++i) {
0149 const REF &trackRef = m_leptons[i].first;
0150 list.insert(TaggingVariable(btau::trackMomentum, reco::btag::toTrack(trackRef)->p()), true);
0151 list.insert(TaggingVariable(btau::trackEta, reco::btag::toTrack(trackRef)->eta()), true);
0152 list.insert(TaggingVariable(btau::trackPhi, reco::btag::toTrack(trackRef)->phi()), true);
0153 list.insert(TaggingVariable(btau::trackChi2, reco::btag::toTrack(trackRef)->normalizedChi2()), true);
0154 const SoftLeptonProperties &data = m_leptons[i].second;
0155 list.insert(TaggingVariable(btau::leptonQuality, data.quality(SoftLeptonProperties::Quality::leptonId, false)),
0156 true);
0157 list.insert(
0158 TaggingVariable(btau::leptonQuality2, data.quality(SoftLeptonProperties::Quality::btagLeptonCands, false)),
0159 true);
0160 list.insert(TaggingVariable(btau::trackSip2dVal, data.sip2d), true);
0161 list.insert(TaggingVariable(btau::trackSip3dVal, data.sip3d), true);
0162 list.insert(TaggingVariable(btau::trackSip2dSig, data.sip2dsig), true);
0163 list.insert(TaggingVariable(btau::trackSip3dSig, data.sip3dsig), true);
0164 list.insert(TaggingVariable(btau::trackPtRel, data.ptRel), true);
0165 list.insert(TaggingVariable(btau::trackP0Par, data.p0Par), true);
0166 list.insert(TaggingVariable(btau::trackEtaRel, data.etaRel), true);
0167 list.insert(TaggingVariable(btau::trackDeltaR, data.deltaR), true);
0168 list.insert(TaggingVariable(btau::trackPParRatio, data.ratioRel), true);
0169 list.insert(TaggingVariable(btau::electronMVA, data.elec_mva), true);
0170 list.insert(TaggingVariable(btau::trackCharge, data.charge), true);
0171 }
0172
0173 list.finalize();
0174 return list;
0175 }
0176
0177 }
0178
0179 #endif