CMS 3D CMS Logo

HLTJetSortedVBFFilter.cc
Go to the documentation of this file.
1 
12 #include <vector>
13 #include <string>
14 
24 
25 using namespace std;
26 //
27 // constructors and destructor//
28 //
29 template<typename T>
31 ,inputJets_ (iConfig.getParameter<edm::InputTag>("inputJets" ))
32 ,inputJetTags_(iConfig.getParameter<edm::InputTag>("inputJetTags"))
33 ,mqq_ (iConfig.getParameter<double> ("Mqq" ))
34 ,detaqq_ (iConfig.getParameter<double> ("Detaqq" ))
35 ,detabb_ (iConfig.getParameter<double> ("Detabb" ))
36 ,dphibb_ (iConfig.getParameter<double> ("Dphibb" ))
37 ,ptsqq_ (iConfig.getParameter<double> ("Ptsumqq" ))
38 ,ptsbb_ (iConfig.getParameter<double> ("Ptsumbb" ))
39 ,seta_ (iConfig.getParameter<double> ("Etaq1Etaq2" ))
40 ,njets_ (iConfig.getParameter<int> ("njets" ))
41 ,value_ (iConfig.getParameter<std::string> ("value" ))
42 ,triggerType_ (iConfig.getParameter<int> ("triggerType" ))
43 {
44  m_theJetsToken = consumes<std::vector<T>>(inputJets_);
45  m_theJetTagsToken = consumes<reco::JetTagCollection>(inputJetTags_);
46  if(njets_<4) {
47  edm::LogWarning("LowNJets")<< "njets="<<njets_<<" it must be >=4. Forced njets=4.";
48  njets_=4;
49  }
50 }
51 
52 
53  template<typename T>
55 
56 template<typename T>
57 void
61  desc.add<edm::InputTag>("inputJets",edm::InputTag("hltJetCollection"));
62  desc.add<edm::InputTag>("inputJetTags",edm::InputTag(""));
63  desc.add<double>("Mqq",200);
64  desc.add<double>("Detaqq",2.5);
65  desc.add<double>("Detabb",10.);
66  desc.add<double>("Dphibb",10.);
67  desc.add<double>("Ptsumqq",0.);
68  desc.add<double>("Ptsumbb",0.);
69  desc.add<double>("Etaq1Etaq2",40.);
70  desc.add<std::string>("value","second");
71  desc.add<int>("triggerType",trigger::TriggerJet);
72  desc.add<int>("njets",4);
73  descriptions.add(defaultModuleLabel<HLTJetSortedVBFFilter<T>>(), desc);
74 }
75 
76 template<typename T> float HLTJetSortedVBFFilter<T>::findCSV(const typename std::vector<T>::const_iterator & jet, const reco::JetTagCollection & jetTags){
77  float minDr = 0.1;
78  float tmpCSV = -20 ;
79  for (auto jetb = jetTags.begin(); (jetb!=jetTags.end()); ++jetb) {
80  float tmpDr = reco::deltaR(*jet,*(jetb->first));
81 
82  if (tmpDr < minDr) {
83  minDr = tmpDr ;
84  tmpCSV= jetb->second;
85  }
86 
87  }
88  return tmpCSV;
89 
90 }
91 //
92 // member functions
93 //
94 
95 // ------------ method called to produce the data ------------
96 template<typename T>
97 bool
99 {
100  using namespace std;
101  using namespace edm;
102  using namespace reco;
103  using namespace trigger;
104 
105  typedef vector<T> TCollection;
106  typedef Ref<TCollection> TRef;
107 
108  bool accept(false);
109 
111  event.getByToken(m_theJetsToken,jets);
112  Handle<JetTagCollection> jetTags;
113 
114  if (saveTags()) filterproduct.addCollectionTag(inputJets_);
115  if (jets->size()<4) return false;
116 
117  const unsigned int nMax(njets_<jets->size()?njets_:jets->size());
118  vector<Jpair> sorted(nMax);
119  vector<TRef> jetRefs(nMax);
120  unsigned int nJetRefs=0;
121 
122  unsigned int nJet=0;
123  double value(0.0);
124 
126  if (inputJetTags_.encode()=="") {
127  for (typename TCollection::const_iterator jet=jets->begin(); (jet!=jets->end()&& nJet<nMax); ++jet) {
128  if (value_=="Pt") {
129  value=jet->pt();
130  } else if (value_=="Eta") {
131  value=jet->eta();
132  } else if (value_=="Phi") {
133  value=jet->phi();
134  } else {
135  value = 0.0;
136  }
137  sorted[nJet] = make_pair(value,nJet);
138  ++nJet;
139  }
140  sort(sorted.begin(),sorted.end(),comparator);
141  for (unsigned int i=0; i<nMax; ++i) {
142  jetRefs[i]=TRef(jets,sorted[i].second);
143  }
144  nJetRefs=nMax;
145  q1 = jetRefs[3]->p4();
146  b1 = jetRefs[2]->p4();
147  b2 = jetRefs[1]->p4();
148  q2 = jetRefs[0]->p4();
149  } else if(value_=="1BTagAndEta"){
150  event.getByToken(m_theJetTagsToken,jetTags);
151  vector<Jpair> sorted;
152  unsigned int b1_idx=-1;
153  float csv_max=-999;
154  for (typename TCollection::const_iterator jet=jets->begin(); (jet!=jets->end()&& nJet<nMax); ++jet) { //fill "sorted" and get the most b-tagged jet with higher CSV (b1)
155  value = findCSV(jet, *jetTags);
156  if(value>csv_max) {
157  csv_max=value;
158  b1_idx=nJet;
159  }
160  sorted.push_back(make_pair(jet->eta(),nJet));
161  nJet++;
162  // cout << "jetPt=" << jet->pt() << "\tjetEta=" << jet->eta() << "\tjetCSV=" << value << endl;
163  }
164  if(b1_idx>=sorted.size() || b1_idx<0) edm::LogError("OutOfRange")<< "b1 index out of range.";
165  sorted.erase(sorted.begin()+b1_idx); //remove the most b-tagged jet from "sorted"
166  sort(sorted.begin(),sorted.end(),comparator); //sort "sorted" by eta
167 
168  unsigned int q1_idx=sorted.front().second; //take the backward jet (q1)
169  unsigned int q2_idx=sorted.back().second; //take the forward jet (q2)
170 
171  unsigned int i=0;
172  while( (i==q1_idx) || (i==q2_idx) || (i==b1_idx) ) i++; //take jet with highest pT but q1,q2,b1 (q2)
173  unsigned int b2_idx=i;
174 
175  if(q1_idx<jets->size()) q1 = jets->at(q1_idx).p4(); else edm::LogWarning("Something wrong with q1");
176  if(q2_idx<jets->size()) q2 = jets->at(q2_idx).p4(); else edm::LogWarning("Something wrong with q2");
177  if(b1_idx<jets->size()) b1 = jets->at(b1_idx).p4(); else edm::LogWarning("Something wrong with b1");
178  if(b2_idx<jets->size()) b2 = jets->at(b2_idx).p4(); else edm::LogWarning("Something wrong with b2");
179 
180  jetRefs[0]= TRef(jets,b1_idx);
181  jetRefs[1]= TRef(jets,b2_idx);
182  jetRefs[2]= TRef(jets,q1_idx);
183  jetRefs[3]= TRef(jets,q2_idx);
184  nJetRefs=4;
185 
186  // cout<<"\tPathB: b1="<<b1.pt()<<" b2="<<b2.pt()<<" q1="<<q1.pt()<<" q2="<<q2.pt()<<endl;
187  } else if(value_=="2BTagAndPt"){
188  event.getByToken(m_theJetTagsToken,jetTags);
189  vector<Jpair> sorted;
190 
191  unsigned int b1_idx=-1;
192  unsigned int b2_idx=-1;
193  float csv1=-999;
194  float csv2=-999;
195  for (typename TCollection::const_iterator jet=jets->begin(); (jet!=jets->end()&& nJet<nMax); ++jet) { //fill "sorted" and get the two most b-tagged jets (b1,b2)
196  value = findCSV(jet, *jetTags);
197  if(value>csv1) {
198  csv2=csv1;
199  b2_idx=b1_idx;
200  csv1=value;
201  b1_idx=nJet;
202  }
203  else if(value>csv2){
204  csv2=value;
205  b2_idx=nJet;
206  }
207  sorted.push_back(make_pair(jet->eta(),nJet));
208  nJet++;
209  // cout << "jetPt=" << jet->pt() << "\tjetEta=" << jet->eta() << "\tjetCSV=" << value << endl;
210  }
211  sorted.erase(sorted.begin()+b1_idx); //remove b1 and b2 from sorted
212  sorted.erase(sorted.begin()+(b1_idx>b2_idx?b2_idx:b2_idx-1));
213 
214  unsigned int q1_idx=sorted.at(0).second; //get q1 and q2 as the jets with highest pT, but b1 and b2.
215  unsigned int q2_idx=sorted.at(1).second;
216 
217  if(q1_idx<jets->size()) q1 = jets->at(q1_idx).p4(); else edm::LogWarning("Something wrong with q1");
218  if(q2_idx<jets->size()) q2 = jets->at(q2_idx).p4(); else edm::LogWarning("Something wrong with q2");
219  if(b1_idx<jets->size()) b1 = jets->at(b1_idx).p4(); else edm::LogWarning("Something wrong with b1");
220  if(b2_idx<jets->size()) b2 = jets->at(b2_idx).p4(); else edm::LogWarning("Something wrong with b2");
221 
222  jetRefs[0]= TRef(jets,b1_idx);
223  jetRefs[1]= TRef(jets,b2_idx);
224  jetRefs[2]= TRef(jets,q1_idx);
225  jetRefs[3]= TRef(jets,q2_idx);
226  nJetRefs=4;
227 
228  // cout<<"\tPathA: b1="<<b1.pt()<<" b2="<<b2.pt()<<" q1="<<q1.pt()<<" q2="<<q2.pt()<<endl;
229  }
230  else {
231  event.getByToken(m_theJetTagsToken,jetTags);
232  for (typename TCollection::const_iterator jet=jets->begin(); (jet!=jets->end()&& nJet<nMax); ++jet) {
233 
234  if (value_=="second") {
235  value = findCSV(jet, *jetTags);
236  } else {
237  value = 0.0;
238  }
239  sorted[nJet] = make_pair(value,nJet);
240  ++nJet;
241  }
242  sort(sorted.begin(),sorted.end(),comparator);
243  for (unsigned int i=0; i<nMax; ++i) {
244  jetRefs[i]= TRef(jets,sorted[i].second);
245  }
246  nJetRefs=nMax;
247  b1 = jetRefs[3]->p4();
248  b2 = jetRefs[2]->p4();
249  q1 = jetRefs[1]->p4();
250  q2 = jetRefs[0]->p4();
251  }
252 
253  double mqq_bs = (q1+q2).M();
254  double deltaetaqq = std::abs(q1.Eta()-q2.Eta());
255  double deltaetabb = std::abs(b1.Eta()-b2.Eta());
256  double deltaphibb = std::abs(reco::deltaPhi(b1.Phi(),b2.Phi()));
257  double ptsqq_bs = (q1+q2).Pt();
258  double ptsbb_bs = (b1+b2).Pt();
259  double signeta = q1.Eta()*q2.Eta();
260 
261  if (
262  (mqq_bs > mqq_ ) &&
263  (deltaetaqq > detaqq_ ) &&
264  (deltaetabb < detabb_ ) &&
265  (deltaphibb < dphibb_ ) &&
266  (ptsqq_bs > ptsqq_ ) &&
267  (ptsbb_bs > ptsbb_ ) &&
268  (signeta < seta_ )
269  ) {
270  accept=true;
271  for (unsigned int i=0; i<nJetRefs; ++i) {
272  filterproduct.addObject(triggerType_,jetRefs[i]);
273  }
274  }
275 
276  return accept;
277 }
278 
size
Write out results.
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
edm::EDGetTokenT< reco::JetTagCollection > m_theJetTagsToken
edm::EDGetTokenT< std::vector< T > > m_theJetsToken
const_iterator end() const
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:2
std::string defaultModuleLabel()
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
static float findCSV(const typename std::vector< T >::const_iterator &jet, const reco::JetTagCollection &jetTags)
std::string encode() const
Definition: InputTag.cc:159
double q2[4]
Definition: TauolaWrapper.h:88
static bool comparator(const Jpair &l, const Jpair &r)
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
U second(std::pair< T, U > const &p)
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
vector< PseudoJet > jets
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ParameterDescriptionBase * add(U const &iLabel, T const &value)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
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
double q1[4]
Definition: TauolaWrapper.h:87
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
fixed size matrix
bool saveTags() const
Definition: HLTFilter.h:45
HLT enums.
HLTJetSortedVBFFilter(const edm::ParameterSet &)
const_iterator begin() const
~HLTJetSortedVBFFilter() override
Definition: event.py:1
math::PtEtaPhiELorentzVectorF LorentzVector