CMS 3D CMS Logo

HLTDoublet.cc
Go to the documentation of this file.
1 
9 #include <cmath>
10 
21 #include "HLTDoublet.h"
22 
23 template <typename T1, typename T2>
25  : HLTFilter(iConfig),
26  originTag1_(iConfig.template getParameter<std::vector<edm::InputTag>>("originTag1")),
27  originTag2_(iConfig.template getParameter<std::vector<edm::InputTag>>("originTag2")),
28  inputTag1_(iConfig.template getParameter<edm::InputTag>("inputTag1")),
29  inputTag2_(iConfig.template getParameter<edm::InputTag>("inputTag2")),
30  inputToken1_(consumes<trigger::TriggerFilterObjectWithRefs>(inputTag1_)),
31  inputToken2_(consumes<trigger::TriggerFilterObjectWithRefs>(inputTag2_)),
32  triggerType1_(iConfig.template getParameter<int>("triggerType1")),
33  triggerType2_(iConfig.template getParameter<int>("triggerType2")),
34  min_Deta_(iConfig.template getParameter<double>("MinDeta")),
35  max_Deta_(iConfig.template getParameter<double>("MaxDeta")),
36  min_Dphi_(iConfig.template getParameter<double>("MinDphi")),
37  max_Dphi_(iConfig.template getParameter<double>("MaxDphi")),
38  // min Delta-R^2 threshold with sign
39  min_DelR2_(iConfig.template getParameter<double>("MinDelR") *
40  std::abs(iConfig.template getParameter<double>("MinDelR"))),
41  // max Delta-R^2 threshold with sign
42  max_DelR2_(iConfig.template getParameter<double>("MaxDelR") *
43  std::abs(iConfig.template getParameter<double>("MaxDelR"))),
44  min_Pt_(iConfig.template getParameter<double>("MinPt")),
45  max_Pt_(iConfig.template getParameter<double>("MaxPt")),
46  min_Minv_(iConfig.template getParameter<double>("MinMinv")),
47  max_Minv_(iConfig.template getParameter<double>("MaxMinv")),
48  min_N_(iConfig.template getParameter<int>("MinN")),
49  same_(inputTag1_.encode() == inputTag2_.encode()), // same collections to be compared?
50  cutdeta_(min_Deta_ <= max_Deta_), // cut active?
51  cutdphi_(min_Dphi_ <= max_Dphi_), // cut active?
52  cutdelr2_(min_DelR2_ <= max_DelR2_), // cut active?
53  cutpt_(min_Pt_ <= max_Pt_), // cut active?
54  cutminv_(min_Minv_ <= max_Minv_) // cut active?
55 {
56  LogDebug("HLTDoublet") << "InputTags and cuts:\n inputTag1=" << inputTag1_.encode()
57  << " inputTag2=" << inputTag2_.encode() << " triggerType1=" << triggerType1_
58  << " triggerType2=" << triggerType2_ << "\n Deta [" << min_Deta_ << ", " << max_Deta_ << "]"
59  << " Dphi [" << min_Dphi_ << ", " << max_Dphi_ << "]"
60  << " DelR2 [" << min_DelR2_ << ", " << max_DelR2_ << "]"
61  << " Pt [" << min_Pt_ << ", " << max_Pt_ << "]"
62  << " Minv [" << min_Minv_ << ", " << max_Minv_ << "]"
63  << " MinN=" << min_N_ << "\n same=" << same_ << " cut_deta=" << cutdeta_
64  << " cutdphi=" << cutdphi_ << " cut_delr2=" << cutdelr2_ << " cut_pt=" << cutpt_
65  << " cut_minv=" << cutminv_;
66 }
67 
68 template <typename T1, typename T2>
71  makeHLTFilterDescription(desc);
72  std::vector<edm::InputTag> originTag1(1, edm::InputTag("hltOriginal1"));
73  std::vector<edm::InputTag> originTag2(1, edm::InputTag("hltOriginal2"));
74  desc.add<std::vector<edm::InputTag>>("originTag1", originTag1);
75  desc.add<std::vector<edm::InputTag>>("originTag2", originTag2);
76  desc.add<edm::InputTag>("inputTag1", edm::InputTag("hltFiltered1"));
77  desc.add<edm::InputTag>("inputTag2", edm::InputTag("hltFiltered22"));
78  desc.add<int>("triggerType1", 0);
79  desc.add<int>("triggerType2", 0);
80  desc.add<double>("MinDeta", +1.0);
81  desc.add<double>("MaxDeta", -1.0);
82  desc.add<double>("MinDphi", +1.0);
83  desc.add<double>("MaxDphi", -1.0);
84  desc.add<double>("MinDelR", +1.0);
85  desc.add<double>("MaxDelR", -1.0);
86  desc.add<double>("MinPt", +1.0);
87  desc.add<double>("MaxPt", -1.0);
88  desc.add<double>("MinMinv", +1.0);
89  desc.add<double>("MaxMinv", -1.0);
90  desc.add<int>("MinN", 1);
92 }
93 
94 //
95 // member functions
96 //
97 
98 // ------------ method called to produce the data ------------
99 template <typename T1, typename T2>
101  const edm::EventSetup& iSetup,
102  trigger::TriggerFilterObjectWithRefs& filterproduct) const {
103  using namespace std;
104  using namespace edm;
105  using namespace reco;
106  using namespace trigger;
107 
108  // All HLT filters must create and fill an HLT filter object,
109  // recording any reconstructed physics objects satisfying (or not)
110  // this HLT filter, and place it in the Event.
111 
112  bool accept(false);
113 
114  LogVerbatim("HLTDoublet") << " XXX " << moduleLabel() << " 0 ";
115 
116  std::vector<T1Ref> coll1;
117  std::vector<T2Ref> coll2;
118 
119  // get hold of pre-filtered object collections
120  Handle<TriggerFilterObjectWithRefs> handle1, handle2;
121  if (iEvent.getByToken(inputToken1_, handle1) && iEvent.getByToken(inputToken2_, handle2)) {
122  handle1->getObjects(triggerType1_, coll1);
123  handle2->getObjects(triggerType2_, coll2);
124  const size_type n1(coll1.size());
125  const size_type n2(coll2.size());
126 
127  if (saveTags()) {
128  InputTag tagOld;
129  for (unsigned int i = 0; i < originTag1_.size(); ++i) {
130  filterproduct.addCollectionTag(originTag1_[i]);
131  LogVerbatim("HLTDoublet") << " XXX " << moduleLabel() << " 1a/" << i << " " << originTag1_[i].encode();
132  }
133  tagOld = InputTag();
134  for (size_type i1 = 0; i1 != n1; ++i1) {
135  const ProductID pid(coll1[i1].id());
136  const auto& prov = iEvent.getStableProvenance(pid);
137  const string& label(prov.moduleLabel());
138  const string& instance(prov.productInstanceName());
139  const string& process(prov.processName());
141  if (tagOld.encode() != tagNew.encode()) {
142  filterproduct.addCollectionTag(tagNew);
143  tagOld = tagNew;
144  LogVerbatim("HLTDoublet") << " XXX " << moduleLabel() << " 1b " << tagNew.encode();
145  }
146  }
147  for (unsigned int i = 0; i < originTag2_.size(); ++i) {
148  filterproduct.addCollectionTag(originTag2_[i]);
149  LogVerbatim("HLTDoublet") << " XXX " << moduleLabel() << " 2a/" << i << " " << originTag2_[i].encode();
150  }
151  tagOld = InputTag();
152  for (size_type i2 = 0; i2 != n2; ++i2) {
153  const ProductID pid(coll2[i2].id());
154  const auto& prov = iEvent.getStableProvenance(pid);
155  const string& label(prov.moduleLabel());
156  const string& instance(prov.productInstanceName());
157  const string& process(prov.processName());
159  if (tagOld.encode() != tagNew.encode()) {
160  filterproduct.addCollectionTag(tagNew);
161  tagOld = tagNew;
162  LogVerbatim("HLTDoublet") << " XXX " << moduleLabel() << " 2b " << tagNew.encode();
163  }
164  }
165  }
166 
167  int n(0);
168  T1Ref r1;
169  T2Ref r2;
171  for (unsigned int i1 = 0; i1 != n1; i1++) {
172  r1 = coll1[i1];
173  p1 = r1->p4();
174  unsigned int I(0);
175  if (same_) {
176  I = i1 + 1;
177  }
178  for (unsigned int i2 = I; i2 != n2; i2++) {
179  r2 = coll2[i2];
180  p2 = r2->p4();
181 
182  if (cutdeta_ or cutdphi_ or cutdelr2_) {
183  double const Deta = std::abs(p1.eta() - p2.eta());
184  if (cutdeta_ and (min_Deta_ > Deta or Deta > max_Deta_))
185  continue;
186 
187  double const Dphi = std::abs(reco::deltaPhi(p1.phi(), p2.phi()));
188  if (cutdphi_ and (min_Dphi_ > Dphi or Dphi > max_Dphi_))
189  continue;
190 
191  double const DelR2 = Deta * Deta + Dphi * Dphi;
192  if (cutdelr2_ and (min_DelR2_ > DelR2 or DelR2 > max_DelR2_))
193  continue;
194  }
195 
196  p = p1 + p2;
197 
198  double const Pt = p.pt();
199  if (cutpt_ and (min_Pt_ > Pt or Pt > max_Pt_))
200  continue;
201 
202  double const Minv = std::abs(p.mass());
203  if (cutminv_ and (min_Minv_ > Minv or Minv > max_Minv_))
204  continue;
205 
206  n++;
207  filterproduct.addObject(triggerType1_, r1);
208  filterproduct.addObject(triggerType2_, r2);
209  }
210  }
211 
212  // filter decision
213  accept = (n >= min_N_);
214  }
215 
216  return accept;
217 }
const edm::InputTag inputTag2_
Definition: HLTDoublet.h:55
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
Log< level::Info, true > LogVerbatim
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
const double min_Pt_
Definition: HLTDoublet.h:63
const double min_Deta_
Definition: HLTDoublet.h:60
HLTDoublet(const edm::ParameterSet &)
Definition: HLTDoublet.cc:24
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HLTDoublet.cc:69
const bool same_
Definition: HLTDoublet.h:69
const bool cutpt_
Definition: HLTDoublet.h:71
static PFTauRenderPlugin instance
std::string encode() const
Definition: InputTag.cc:159
const double min_Dphi_
Definition: HLTDoublet.h:61
const edm::InputTag inputTag1_
Definition: HLTDoublet.h:54
const double min_DelR2_
Definition: HLTDoublet.h:62
const double min_Minv_
Definition: HLTDoublet.h:64
const double max_DelR2_
Definition: HLTDoublet.h:62
std::string defaultModuleLabel()
const double max_Deta_
Definition: HLTDoublet.h:60
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:31
uint16_t size_type
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
char const * label
int iEvent
Definition: GenABIO.cc:224
const int triggerType2_
Definition: HLTDoublet.h:59
const bool cutdphi_
Definition: HLTDoublet.h:71
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const std::complex< double > I
Definition: I.h:8
const int min_N_
Definition: HLTDoublet.h:65
def template(fileName, svg, replaceme="REPLACEME")
Definition: svgfig.py:521
const double max_Minv_
Definition: HLTDoublet.h:64
const double max_Pt_
Definition: HLTDoublet.h:63
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
def encode(args, files)
const bool cutdelr2_
Definition: HLTDoublet.h:71
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
Definition: HLTDoublet.cc:100
fixed size matrix
HLT enums.
const int triggerType1_
Definition: HLTDoublet.h:58
const bool cutminv_
Definition: HLTDoublet.h:71
const double max_Dphi_
Definition: HLTDoublet.h:61
const bool cutdeta_
Definition: HLTDoublet.h:71
math::PtEtaPhiELorentzVectorF LorentzVector
#define LogDebug(id)