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" ))
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.);
72 desc.
add<
int>(
"njets",4);
79 for (
auto jetb = jetTags.
begin(); (jetb!=jetTags.
end()); ++jetb) {
102 using namespace reco;
105 typedef vector<T> TCollection;
115 if (jets->size()<4)
return false;
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;
127 for (
typename TCollection::const_iterator
jet=jets->begin(); (
jet!=jets->end()&& nJet<nMax); ++
jet) {
130 }
else if (
value_==
"Eta") {
132 }
else if (
value_==
"Phi") {
137 sorted[nJet] = make_pair(value,nJet);
141 for (
unsigned int i=0;
i<nMax; ++
i) {
142 jetRefs[
i]=TRef(jets,sorted[
i].
second);
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"){
151 vector<Jpair> sorted;
152 unsigned int b1_idx=-1;
154 for (
typename TCollection::const_iterator
jet=jets->begin(); (
jet!=jets->end()&& nJet<nMax); ++
jet) {
160 sorted.push_back(make_pair(
jet->eta(),nJet));
164 if(b1_idx>=sorted.size() || b1_idx<0)
edm::LogError(
"OutOfRange")<<
"b1 index out of range.";
165 sorted.erase(sorted.begin()+b1_idx);
168 unsigned int q1_idx=sorted.front().second;
169 unsigned int q2_idx=sorted.back().second;
172 while( (i==q1_idx) || (i==q2_idx) || (i==b1_idx) ) i++;
173 unsigned int b2_idx=
i;
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");
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);
187 }
else if(
value_==
"2BTagAndPt"){
189 vector<Jpair> sorted;
191 unsigned int b1_idx=-1;
192 unsigned int b2_idx=-1;
195 for (
typename TCollection::const_iterator
jet=jets->begin(); (
jet!=jets->end()&& nJet<nMax); ++
jet) {
207 sorted.push_back(make_pair(
jet->eta(),nJet));
211 sorted.erase(sorted.begin()+b1_idx);
212 sorted.erase(sorted.begin()+(b1_idx>b2_idx?b2_idx:b2_idx-1));
214 unsigned int q1_idx=sorted.at(0).second;
215 unsigned int q2_idx=sorted.at(1).second;
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");
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);
232 for (
typename TCollection::const_iterator
jet=jets->begin(); (
jet!=jets->end()&& nJet<nMax); ++
jet) {
239 sorted[nJet] = make_pair(value,nJet);
243 for (
unsigned int i=0;
i<nMax; ++
i) {
244 jetRefs[
i]= TRef(jets,sorted[
i].
second);
247 b1 = jetRefs[3]->p4();
248 b2 = jetRefs[2]->p4();
249 q1 = jetRefs[1]->p4();
250 q2 = jetRefs[0]->p4();
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());
257 double ptsqq_bs = (q1+
q2).
Pt();
258 double ptsbb_bs = (b1+b2).
Pt();
259 double signeta = q1.Eta()*q2.Eta();
271 for (
unsigned int i=0;
i<nJetRefs; ++
i) {
constexpr double deltaPhi(double phi1, double phi2)
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)
std::string defaultModuleLabel()
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)
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
Abs< T >::type abs(const T &t)
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())
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
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
~HLTJetSortedVBFFilter() override
math::PtEtaPhiELorentzVectorF LorentzVector