CMS 3D CMS Logo

TtSemiLepJetCombWMassMaxSumPt.cc
Go to the documentation of this file.
4 
7 
9 public:
11 
12 private:
13  void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup& setup) const override;
14 
15  bool isValid(const int& idx, const std::vector<pat::Jet>& jets) const {
16  return (0 <= idx && idx < (int)jets.size());
17  };
18 
21  int maxNJets_;
22  double wMass_;
27 };
28 
30  : jetsToken_(consumes<std::vector<pat::Jet>>(cfg.getParameter<edm::InputTag>("jets"))),
31  lepsToken_(consumes<edm::View<reco::RecoCandidate>>(cfg.getParameter<edm::InputTag>("leps"))),
32  maxNJets_(cfg.getParameter<int>("maxNJets")),
33  wMass_(cfg.getParameter<double>("wMass")),
34  useBTagging_(cfg.getParameter<bool>("useBTagging")),
35  bTagAlgorithm_(cfg.getParameter<std::string>("bTagAlgorithm")),
36  minBDiscBJets_(cfg.getParameter<double>("minBDiscBJets")),
37  maxBDiscLightJets_(cfg.getParameter<double>("maxBDiscLightJets")) {
38  if (maxNJets_ < 4 && maxNJets_ != -1)
39  throw cms::Exception("WrongConfig") << "Parameter maxNJets can not be set to " << maxNJets_ << ". \n"
40  << "It has to be larger than 4 or can be set to -1 to take all jets.";
41 
42  produces<std::vector<std::vector<int>>>();
43  produces<int>("NumberOfConsideredJets");
44 }
45 
47  auto pOut = std::make_unique<std::vector<std::vector<int>>>();
48  auto pJetsConsidered = std::make_unique<int>(0);
49 
50  std::vector<int> match;
51  for (unsigned int i = 0; i < 4; ++i)
52  match.push_back(-1);
53 
54  // get jets
55  const auto& jets = evt.get(jetsToken_);
56 
57  // get leptons
58  const auto& leps = evt.get(lepsToken_);
59 
60  // skip events without lepton candidate or less than 4 jets or no MET
61  if (leps.empty() || jets.size() < 4) {
62  pOut->push_back(match);
63  evt.put(std::move(pOut));
64  *pJetsConsidered = jets.size();
65  evt.put(std::move(pJetsConsidered), "NumberOfConsideredJets");
66  return;
67  }
68 
69  unsigned maxNJets = maxNJets_;
70  if (maxNJets_ == -1 || (int)jets.size() < maxNJets_)
71  maxNJets = jets.size();
72  *pJetsConsidered = maxNJets;
73  evt.put(std::move(pJetsConsidered), "NumberOfConsideredJets");
74 
75  std::vector<bool> isBJet;
76  std::vector<bool> isLJet;
77  int cntBJets = 0;
78  if (useBTagging_) {
79  for (unsigned int idx = 0; idx < maxNJets; ++idx) {
80  isBJet.push_back((jets[idx].bDiscriminator(bTagAlgorithm_) > minBDiscBJets_));
81  isLJet.push_back((jets[idx].bDiscriminator(bTagAlgorithm_) < maxBDiscLightJets_));
82  if (jets[idx].bDiscriminator(bTagAlgorithm_) > minBDiscBJets_)
83  cntBJets++;
84  }
85  }
86 
87  // -----------------------------------------------------
88  // associate those jets that get closest to the W mass
89  // with their invariant mass to the hadronic W boson
90  // -----------------------------------------------------
91  double wDist = -1.;
92  std::vector<int> closestToWMassIndices;
93  closestToWMassIndices.push_back(-1);
94  closestToWMassIndices.push_back(-1);
95  for (unsigned idx = 0; idx < maxNJets; ++idx) {
96  if (useBTagging_ && (!isLJet[idx] || (cntBJets <= 2 && isBJet[idx])))
97  continue;
98  for (unsigned jdx = (idx + 1); jdx < maxNJets; ++jdx) {
99  if (useBTagging_ &&
100  (!isLJet[jdx] || (cntBJets <= 2 && isBJet[jdx]) || (cntBJets == 3 && isBJet[idx] && isBJet[jdx])))
101  continue;
102  reco::Particle::LorentzVector sum = jets[idx].p4() + jets[jdx].p4();
103  if (wDist < 0. || wDist > fabs(sum.mass() - wMass_)) {
104  wDist = fabs(sum.mass() - wMass_);
105  closestToWMassIndices.clear();
106  closestToWMassIndices.push_back(idx);
107  closestToWMassIndices.push_back(jdx);
108  }
109  }
110  }
111 
112  // -----------------------------------------------------
113  // associate those jets with maximum pt of the vectorial
114  // sum to the hadronic decay chain
115  // -----------------------------------------------------
116  double maxPt = -1.;
117  int hadB = -1;
118  if (isValid(closestToWMassIndices[0], jets) && isValid(closestToWMassIndices[1], jets)) {
119  for (unsigned idx = 0; idx < maxNJets; ++idx) {
120  if (useBTagging_ && !isBJet[idx])
121  continue;
122  // make sure it's not used up already from the hadronic W
123  if ((int)idx != closestToWMassIndices[0] && (int)idx != closestToWMassIndices[1]) {
125  jets[closestToWMassIndices[0]].p4() + jets[closestToWMassIndices[1]].p4() + jets[idx].p4();
126  if (maxPt < 0. || maxPt < sum.pt()) {
127  maxPt = sum.pt();
128  hadB = idx;
129  }
130  }
131  }
132  }
133 
134  // -----------------------------------------------------
135  // associate the remaining jet with maximum pt of the
136  // vectorial sum with the leading lepton with the
137  // leptonic b quark
138  // -----------------------------------------------------
139  maxPt = -1.;
140  int lepB = -1;
141  for (unsigned idx = 0; idx < maxNJets; ++idx) {
142  if (useBTagging_ && !isBJet[idx])
143  continue;
144  // make sure it's not used up already from the hadronic decay chain
145  if ((int)idx != closestToWMassIndices[0] && (int)idx != closestToWMassIndices[1] && (int)idx != hadB) {
146  reco::Particle::LorentzVector sum = jets[idx].p4() + leps[0].p4();
147  if (maxPt < 0. || maxPt < sum.pt()) {
148  maxPt = sum.pt();
149  lepB = idx;
150  }
151  }
152  }
153 
154  match[TtSemiLepEvtPartons::LightQ] = closestToWMassIndices[0];
155  match[TtSemiLepEvtPartons::LightQBar] = closestToWMassIndices[1];
158 
159  pOut->push_back(match);
160  evt.put(std::move(pOut));
161 }
162 
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
TtSemiLepJetCombWMassMaxSumPt(const edm::ParameterSet &)
bool get(ProductID const &oid, Handle< PROD > &result) const
Definition: Event.h:346
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Definition: HeavyIon.h:7
Definition: Jet.py:1
edm::EDGetTokenT< std::vector< pat::Jet > > jetsToken_
fixed size matrix
HLT enums.
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
edm::EDGetTokenT< edm::View< reco::RecoCandidate > > lepsToken_
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Particle.h:21
void produce(edm::StreamID, edm::Event &evt, const edm::EventSetup &setup) const override
def move(src, dest)
Definition: eostools.py:511
bool isValid(const int &idx, const std::vector< pat::Jet > &jets) const