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" ))
61 makeHLTFilterDescription(desc);
64 desc.
add<
double>(
"Mqq",200);
65 desc.
add<
double>(
"Detaqq",2.5);
66 desc.
add<
double>(
"Detabb",10.);
67 desc.
add<
double>(
"Dphibb",10.);
68 desc.
add<
double>(
"Ptsumqq",0.);
69 desc.
add<
double>(
"Ptsumbb",0.);
70 desc.
add<
double>(
"Etaq1Etaq2",40.);
73 desc.
add<
int>(
"njets",4);
103 using namespace reco;
104 using namespace trigger;
106 typedef vector<T> TCollection;
112 event.getByToken(m_theJetsToken,
jets);
116 if (
jets->size()<4)
return false;
118 const unsigned int nMax(njets_<jets->
size()?njets_:
jets->size());
119 vector<Jpair> sorted(nMax);
120 vector<TRef> jetRefs(nMax);
121 unsigned int nJetRefs=0;
127 if (inputJetTags_.encode()==
"") {
128 for (
typename TCollection::const_iterator
jet=
jets->begin(); (
jet!=
jets->end()&& nJet<nMax); ++
jet) {
131 }
else if (value_==
"Eta") {
133 }
else if (value_==
"Phi") {
138 sorted[nJet] = make_pair(value,nJet);
141 sort(sorted.begin(),sorted.end(),comparator);
142 for (
unsigned int i=0;
i<nMax; ++
i) {
146 q1 = jetRefs[3]->p4();
147 b1 = jetRefs[2]->p4();
148 b2 = jetRefs[1]->p4();
149 q2 = jetRefs[0]->p4();
150 }
else if(value_==
"1BTagAndEta"){
151 event.getByToken(m_theJetTagsToken,jetTags);
152 vector<Jpair> sorted;
153 unsigned int b1_idx=-1;
155 for (
typename TCollection::const_iterator
jet=
jets->begin(); (
jet!=
jets->end()&& nJet<nMax); ++
jet) {
156 value = findCSV(
jet, *jetTags);
161 sorted.push_back(make_pair(
jet->eta(),nJet));
165 if(b1_idx>=sorted.size() || b1_idx<0)
edm::LogError(
"OutOfRange")<<
"b1 index out of range.";
166 sorted.erase(sorted.begin()+b1_idx);
167 sort(sorted.begin(),sorted.end(),comparator);
169 unsigned int q1_idx=sorted.front().second;
170 unsigned int q2_idx=sorted.back().second;
173 while( (i==q1_idx) || (i==q2_idx) || (i==b1_idx) ) i++;
174 unsigned int b2_idx=
i;
181 jetRefs[0]= TRef(
jets,b1_idx);
182 jetRefs[1]= TRef(
jets,b2_idx);
183 jetRefs[2]= TRef(
jets,q1_idx);
184 jetRefs[3]= TRef(
jets,q2_idx);
188 }
else if(value_==
"2BTagAndPt"){
189 event.getByToken(m_theJetTagsToken,jetTags);
190 vector<Jpair> sorted;
192 unsigned int b1_idx=-1;
193 unsigned int b2_idx=-1;
196 for (
typename TCollection::const_iterator
jet=
jets->begin(); (
jet!=
jets->end()&& nJet<nMax); ++
jet) {
197 value = findCSV(
jet, *jetTags);
208 sorted.push_back(make_pair(
jet->eta(),nJet));
212 sorted.erase(sorted.begin()+b1_idx);
213 sorted.erase(sorted.begin()+(b1_idx>b2_idx?b2_idx:b2_idx-1));
215 unsigned int q1_idx=sorted.at(0).second;
216 unsigned int q2_idx=sorted.at(1).second;
223 jetRefs[0]= TRef(
jets,b1_idx);
224 jetRefs[1]= TRef(
jets,b2_idx);
225 jetRefs[2]= TRef(
jets,q1_idx);
226 jetRefs[3]= TRef(
jets,q2_idx);
232 event.getByToken(m_theJetTagsToken,jetTags);
233 for (
typename TCollection::const_iterator
jet=
jets->begin(); (
jet!=
jets->end()&& nJet<nMax); ++
jet) {
235 if (value_==
"second") {
236 value = findCSV(
jet, *jetTags);
240 sorted[nJet] = make_pair(value,nJet);
243 sort(sorted.begin(),sorted.end(),comparator);
244 for (
unsigned int i=0;
i<nMax; ++
i) {
248 b1 = jetRefs[3]->p4();
249 b2 = jetRefs[2]->p4();
250 q1 = jetRefs[1]->p4();
251 q2 = jetRefs[0]->p4();
254 double mqq_bs = (
q1+
q2).M();
256 double deltaetabb =
std::abs(b1.Eta()-b2.Eta());
258 double ptsqq_bs = (
q1+
q2).
Pt();
259 double ptsbb_bs = (b1+b2).
Pt();
260 double signeta =
q1.Eta()*
q2.Eta();
264 (deltaetaqq > detaqq_ ) &&
265 (deltaetabb < detabb_ ) &&
266 (deltaphibb < dphibb_ ) &&
267 (ptsqq_bs > ptsqq_ ) &&
268 (ptsbb_bs > ptsbb_ ) &&
272 for (
unsigned int i=0;
i<nJetRefs; ++
i) {
273 filterproduct.
addObject(triggerType_,jetRefs[
i]);
edm::EDGetTokenT< reco::JetTagCollection > m_theJetTagsToken
std::string defaultModuleLabel()
edm::EDGetTokenT< std::vector< T > > m_theJetsToken
transient_vector_type::const_iterator const_iterator
const_iterator end() const
double deltaR(const T1 &t1, const T2 &t2)
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
static float findCSV(const typename std::vector< T >::const_iterator &jet, const reco::JetTagCollection &jetTags)
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)
Abs< T >::type abs(const T &t)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double deltaPhi(double phi1, double phi2)
edm::InputTag inputJetTags_
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
void add(std::string const &label, ParameterSetDescription const &psetDescription)
HLTJetSortedVBFFilter(const edm::ParameterSet &)
const_iterator begin() const
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
math::PtEtaPhiELorentzVectorF LorentzVector
virtual bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override