CMS 3D CMS Logo

HLTJetHbbFilter.cc
Go to the documentation of this file.
1 
9 #include <vector>
10 #include <string>
11 
25 
26 using namespace std;
27 using namespace reco;
28 using namespace trigger;
29 //
30 // constructors and destructor//
31 //
32 template<typename T>
34  ,inputJets_ (iConfig.getParameter<edm::InputTag>("inputJets" ))
35  ,inputJetTags_(iConfig.getParameter<edm::InputTag>("inputJetTags"))
36  ,minmbb_ (iConfig.getParameter<double> ("minMbb" ))
37  ,maxmbb_ (iConfig.getParameter<double> ("maxMbb" ))
38  ,minptb1_ (iConfig.getParameter<double> ("minPtb1" ))
39  ,minptb2_ (iConfig.getParameter<double> ("minPtb2" ))
40  ,maxetab_ (iConfig.getParameter<double> ("maxEtab" ))
41  ,minptbb_ (iConfig.getParameter<double> ("minPtbb" ))
42  ,maxptbb_ (iConfig.getParameter<double> ("maxPtbb" ))
43  ,mintag1_ (iConfig.getParameter<double> ("minTag1" ))
44  ,mintag2_ (iConfig.getParameter<double> ("minTag2" ))
45  ,maxtag_ (iConfig.getParameter<double> ("maxTag" ))
46  ,triggerType_ (iConfig.getParameter<int> ("triggerType" ))
47 {
48  m_theJetsToken = consumes<std::vector<T>>(inputJets_);
49  m_theJetTagsToken = consumes<reco::JetTagCollection>(inputJetTags_);
50 
51  //put a dummy METCollection into the event, holding values for csv tag 1 and tag 2 values
52  produces<reco::METCollection>();
53 }
54 
55 
56 template<typename T>
58 { }
59 
60 template<typename T>
61 void
65  desc.add<edm::InputTag>("inputJets",edm::InputTag("hltJetCollection"));
66  desc.add<edm::InputTag>("inputJetTags",edm::InputTag(""));
67  desc.add<double>("minMbb",70);
68  desc.add<double>("maxMbb",200);
69  desc.add<double>("minPtb1",-1);
70  desc.add<double>("minPtb2",-1);
71  desc.add<double>("maxEtab",99999.0);
72  desc.add<double>("minPtbb",-1);
73  desc.add<double>("maxPtbb",-1);
74  desc.add<double>("minTag1",0.5);
75  desc.add<double>("minTag2",0.2);
76  desc.add<double>("maxTag",99999.0);
77  desc.add<int>("triggerType",trigger::TriggerJet);
78  descriptions.add(defaultModuleLabel<HLTJetHbbFilter<T>>(), desc);
79 }
80 
81 template<typename T> float HLTJetHbbFilter<T>::findCSV(const typename std::vector<T>::const_iterator & jet, const reco::JetTagCollection & jetTags){
82  float minDr = 0.1; //matching jet tag with jet
83  float tmpCSV = -20 ;
84  for (auto jetb = jetTags.begin(); (jetb!=jetTags.end()); ++jetb) {
85  float tmpDr = reco::deltaR(*jet,*(jetb->first));
86  if (tmpDr < minDr) {
87  minDr = tmpDr ;
88  tmpCSV= jetb->second;
89  }
90  }
91  return tmpCSV;
92 }
93 //
94 // member functions
95 //
96 
97 // ------------ method called to produce the data ------------
98 template<typename T>
99 bool
101 {
102 
103  using namespace std;
104  using namespace edm;
105  using namespace reco;
106  using namespace trigger;
107 
108  typedef vector<T> TCollection;
109  typedef Ref<TCollection> TRef;
110 
111  bool accept(false);
112  //const unsigned int nMax(15);
113 
115  event.getByToken(m_theJetsToken,jets);
116  Handle<JetTagCollection> jetTags;
117 
118  unsigned int nJet=0;
119 
120  event.getByToken(m_theJetTagsToken,jetTags);
121 
122  double tag1 = -99.;
123  double tag2 = -99.;
124 
125  if (jetTags->size()<2) return false;
126 
127  double ejet1 = -99.;
128  double pxjet1 = -99.;
129  double pyjet1 = -99.;
130  double pzjet1 = -99.;
131  double ptjet1 = -99.;
132  double etajet1 = -99.;
133 
134  double ejet2 = -99.;
135  double pxjet2 = -99.;
136  double pyjet2 = -99.;
137  double pzjet2 = -99.;
138  double ptjet2 = -99.;
139  double etajet2 = -99.;
140 
141  //looping through sets of jets
142  for (auto jet1=jets->begin(); (jet1!=jets->end()); ++jet1) {
143  tag1 = findCSV(jet1, *jetTags);
144  ++nJet;
145  for (auto jet2=(jet1+1); (jet2!=jets->end()); ++jet2) {
146  tag2 = findCSV(jet2, *jetTags);
147 
148  ejet1 = jet1->energy();
149  pxjet1 = jet1->px();
150  pyjet1 = jet1->py();
151  pzjet1 = jet1->pz();
152  ptjet1 = jet1->pt();
153  etajet1 = jet1->eta();
154 
155  ejet2 = jet2->energy();
156  pxjet2 = jet2->px();
157  pyjet2 = jet2->py();
158  pzjet2 = jet2->pz();
159  ptjet2 = jet2->pt();
160  etajet2 = jet2->eta();
161 
162 
163  if ( ( (mintag1_ <= tag1) and (tag1 <= maxtag_) ) && ( (mintag2_ <= tag2) and (tag2 <= maxtag_) ) ) {// if they're both b's
164  if ( fabs(etajet1) <= maxetab_ && fabs(etajet2) <= maxetab_ ) { // if they satisfy the eta requirement
165  if ( ( ptjet1 >= minptb1_ && ptjet2 >= minptb2_ ) || ( ptjet2 >= minptb1_ && ptjet1 >= minptb2_ ) ) { // if they satisfy the pt requirement
166 
167  double ptbb = sqrt( (pxjet1 + pxjet2) * (pxjet1 + pxjet2) +
168  (pyjet1 + pyjet2) * (pyjet1 + pyjet2) ); // pt of the two jets
169 
170  if ( ptbb >= minptbb_ && ( maxptbb_ < 0 || ptbb <= maxptbb_ ) ) { //if they satisfy the vector pt requirement
171 
172  double mbb = sqrt( (ejet1 + ejet2) * (ejet1 + ejet2) -
173  (pxjet1 + pxjet2) * (pxjet1 + pxjet2) -
174  (pyjet1 + pyjet2) * (pyjet1 + pyjet2) -
175  (pzjet1 + pzjet2) * (pzjet1 + pzjet2) );// mass of two jets
176 
177  if ( (minmbb_ <= mbb) and (mbb <= maxmbb_ ) ) { // if they fit the mass requirement
178  accept = true;
179 
180  TRef ref1 = TRef(jets, distance(jets->begin(),jet1));
181  TRef ref2 = TRef(jets, distance(jets->begin(),jet2));
182 
183  if (saveTags()) filterproduct.addCollectionTag(inputJets_);
184  filterproduct.addObject(triggerType_,ref1);
185  filterproduct.addObject(triggerType_,ref2);
186 
187  //create METCollection for storing csv tag1 and tag2 results
188  std::unique_ptr<reco::METCollection> csvObject(new reco::METCollection());
189  reco::MET::LorentzVector csvP4(tag1,tag2,0,0);
190  reco::MET::Point vtx(0,0,0);
191  reco::MET csvTags(csvP4, vtx);
192  csvObject->push_back(csvTags);
193  edm::RefProd<reco::METCollection > ref_before_put = event.getRefBeforePut<reco::METCollection >();
194  //put the METCollection into the event (necessary because of how addCollectionTag works...)
195  event.put(std::move(csvObject));
196  edm::Ref<reco::METCollection> csvRef(ref_before_put, 0);
197  if (saveTags()) filterproduct.addCollectionTag(edm::InputTag( *moduleLabel()));
198  filterproduct.addObject(trigger::TriggerMET, csvRef); //give it the ID of a MET object
199  return accept;
200  }
201  }
202  }
203  }
204  }
205  }
206  }
207  return accept;
208 }
211 
const_iterator end() const
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
~HLTJetHbbFilter() override
std::string defaultModuleLabel()
static float findCSV(const typename std::vector< T >::const_iterator &jet, const reco::JetTagCollection &jetTags)
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
std::vector< reco::MET > METCollection
collection of MET objects
Definition: METCollection.h:23
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
Definition: MET.h:42
T sqrt(T t)
Definition: SSEVec.h:18
vector< PseudoJet > jets
edm::InputTag inputJets_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const std::string * moduleLabel() const
Definition: HLTFilter.cc:66
HLTJetHbbFilter(const edm::ParameterSet &)
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
Definition: HLTFilter.cc:29
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:37
edm::EDGetTokenT< std::vector< T > > m_theJetsToken
fixed size matrix
bool saveTags() const
Definition: HLTFilter.h:45
HLT enums.
edm::EDGetTokenT< reco::JetTagCollection > m_theJetTagsToken
HLTJetHbbFilter< PFJet > HLTPFJetHbbFilter
math::XYZPoint Point
point in the space
Definition: Candidate.h:41
const_iterator begin() const
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
size_type size() const
edm::InputTag inputJetTags_
HLTJetHbbFilter< CaloJet > HLTCaloJetHbbFilter
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override