CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Member Functions | Private Attributes
PFJetIDSelectionFunctor Class Reference

PF Jet selector for pat::Jets. More...

#include "PhysicsTools/SelectorUtils/interface/PFJetIDSelectionFunctor.h"

Inheritance diagram for PFJetIDSelectionFunctor:
Selector< pat::Jet >

Public Types

enum  Quality_t { LOOSE, TIGHT, TIGHTLEPVETO, N_QUALITY }
 
enum  Version_t {
  FIRSTDATA, RUNIISTARTUP, WINTER16, WINTER17,
  WINTER17PUPPI, SUMMER18, SUMMER18PUPPI, RUN2ULCHS,
  RUN2ULPUPPI, N_VERSIONS
}
 
- Public Types inherited from Selector< pat::Jet >
typedef std::pair< index_type, size_t > cut_flow_item
 
typedef std::vector< cut_flow_itemcut_flow_map
 
typedef pat::Jet data_type
 
typedef std::map< index_type, double > double_map
 
typedef pat::strbitset::index_type index_type
 
typedef std::map< index_type, int > int_map
 

Public Member Functions

bool firstDataCuts (reco::Jet const &jet, pat::strbitset &ret, Version_t version_)
 
bool operator() (const pat::Jet &jet, pat::strbitset &ret) override
 This provides the interface for base classes to select objects. More...
 
bool operator() (const reco::PFJet &jet)
 
bool operator() (const reco::PFJet &jet, pat::strbitset &ret)
 
 PFJetIDSelectionFunctor ()
 
 PFJetIDSelectionFunctor (edm::ParameterSet const &params)
 
 PFJetIDSelectionFunctor (edm::ParameterSet const &params, edm::ConsumesCollector &iC)
 
 PFJetIDSelectionFunctor (Version_t version, Quality_t quality)
 
- Public Member Functions inherited from Selector< pat::Jet >
void clear (index_type const &i)
 
void clear (std::string const &s)
 Turn off a given selection cut. More...
 
bool considerCut (index_type const &i) const
 
bool considerCut (std::string const &s) const
 consider the cut at index "s" More...
 
double cut (index_type const &i, double val) const
 Access the double cut values at index "s". More...
 
int cut (index_type const &i, int val) const
 Access the int cut values at index "s". More...
 
double cut (std::string s, double val) const
 Access the double cut values at index "s". More...
 
int cut (std::string s, int val) const
 Access the int cut values at index "s". More...
 
pat::strbitset getBitTemplate () const
 Get an empty bitset with the proper names. More...
 
double getPasses (index_type const &i) const
 
double getPasses (std::string const &s) const
 Return the number of passing cases. More...
 
bool ignoreCut (index_type const &i) const
 
bool ignoreCut (std::string const &s) const
 ignore the cut at index "s" More...
 
virtual bool operator() (pat::Jet const &t)
 This provides an alternative signature without the second ret. More...
 
virtual bool operator() (pat::Jet const &t, edm::EventBase const &e)
 This provides an alternative signature that includes extra information. More...
 
virtual bool operator() (pat::Jet const &t, edm::EventBase const &e, pat::strbitset &ret)
 This provides an alternative signature that includes extra information. More...
 
bool operator[] (index_type const &i) const
 
bool operator[] (std::string const &s) const
 
void passCut (pat::strbitset &ret, index_type const &i)
 
void passCut (pat::strbitset &ret, std::string const &s)
 Passing cuts. More...
 
void print (std::ostream &out) const
 Print the cut flow. More...
 
void printActiveCuts (std::ostream &out) const
 Print the cuts being considered. More...
 
virtual void push_back (std::string const &s)
 This is the registration of an individual cut string. More...
 
virtual void push_back (std::string const &s, double cut)
 This is the registration of an individual cut string, with a double cut value. More...
 
virtual void push_back (std::string const &s, int cut)
 This is the registration of an individual cut string, with an int cut value. More...
 
 Selector ()
 Constructor clears the bits. More...
 
void set (index_type const &i, bool val=true)
 
void set (index_type const &i, double cut, bool val=true)
 
void set (index_type const &i, int cut, bool val=true)
 
void set (std::string const &s, bool val=true)
 Set a given selection cut, on or off. More...
 
void set (std::string const &s, double cut, bool val=true)
 Set a given selection cut, on or off, and reset int cut value. More...
 
void set (std::string const &s, int cut, bool val=true)
 Set a given selection cut, on or off, and reset int cut value. More...
 
void setIgnored (pat::strbitset &ret)
 set ignored bits More...
 
void setIgnoredCuts (std::vector< std::string > const &bitsToIgnore)
 set the bits to ignore from a vector More...
 
virtual ~Selector ()
 

Private Member Functions

void initCuts ()
 
void initIndex ()
 

Private Attributes

index_type indexCEF_
 
index_type indexCEF_TR_
 
index_type indexCHF_
 
index_type indexMUF_
 
index_type indexMUF_TR_
 
index_type indexNCH_
 
index_type indexNCH_TR_
 
index_type indexNConstituents_
 
index_type indexNEF_
 
index_type indexNEF_EC_
 
index_type indexNEF_EC_L_
 
index_type indexNEF_EC_U_
 
index_type indexNEF_FW_
 
index_type indexNEF_TR_
 
index_type indexNHF_
 
index_type indexNHF_EC_
 
index_type indexNHF_FW_
 
index_type indexNHF_TR_
 
index_type indexNNeutrals_EC_
 
index_type indexNNeutrals_FW_
 
index_type indexNNeutrals_FW_L_
 
index_type indexNNeutrals_FW_U_
 
Quality_t quality_
 
Version_t version_
 

Additional Inherited Members

- Protected Attributes inherited from Selector< pat::Jet >
pat::strbitset bits_
 the bitset indexed by strings More...
 
cut_flow_map cutFlow_
 map of cut flows in "human" order More...
 
double_map doubleCuts_
 the double-value cut map More...
 
int_map intCuts_
 the int-value cut map More...
 
pat::strbitset retInternal_
 internal ret if users don't care about return bits More...
 

Detailed Description

PF Jet selector for pat::Jets.

Selector functor for pat::Jets that implements quality cuts based on studies of noise patterns.

Please see https://twiki.cern.ch/twiki/bin/view/CMS/SWGuidePATSelectors for a general overview of the selectors.

Definition at line 25 of file PFJetIDSelectionFunctor.h.

Member Enumeration Documentation

◆ Quality_t

Enumerator
LOOSE 
TIGHT 
TIGHTLEPVETO 
N_QUALITY 

Definition at line 39 of file PFJetIDSelectionFunctor.h.

◆ Version_t

Enumerator
FIRSTDATA 
RUNIISTARTUP 
WINTER16 
WINTER17 
WINTER17PUPPI 
SUMMER18 
SUMMER18PUPPI 
RUN2ULCHS 
RUN2ULPUPPI 
N_VERSIONS 

Definition at line 27 of file PFJetIDSelectionFunctor.h.

27  {
28  FIRSTDATA,
30  WINTER16,
31  WINTER17,
33  SUMMER18,
35  RUN2ULCHS,
38  };

Constructor & Destructor Documentation

◆ PFJetIDSelectionFunctor() [1/4]

PFJetIDSelectionFunctor::PFJetIDSelectionFunctor ( )
inline

Definition at line 41 of file PFJetIDSelectionFunctor.h.

41 {}

◆ PFJetIDSelectionFunctor() [2/4]

PFJetIDSelectionFunctor::PFJetIDSelectionFunctor ( edm::ParameterSet const &  params,
edm::ConsumesCollector iC 
)
inline

Definition at line 44 of file PFJetIDSelectionFunctor.h.

◆ PFJetIDSelectionFunctor() [3/4]

PFJetIDSelectionFunctor::PFJetIDSelectionFunctor ( edm::ParameterSet const &  params)
inline

Definition at line 48 of file PFJetIDSelectionFunctor.h.

48  {
49  std::string versionStr = params.getParameter<std::string>("version");
50  std::string qualityStr = params.getParameter<std::string>("quality");
51 
52  if (versionStr == "FIRSTDATA")
54  else if (versionStr == "RUNIISTARTUP")
56  else if (versionStr == "WINTER16")
58  else if (versionStr == "WINTER17")
60  else if (versionStr == "WINTER17PUPPI")
62  else if (versionStr == "SUMMER18")
64  else if (versionStr == "SUMMER18PUPPI")
66  else if (versionStr == "RUN2ULCHS")
68  else if (versionStr == "RUN2ULPUPPI")
70  else
71  version_ = RUN2ULCHS; //set RUN2ULCHS as default
72 
73  if (qualityStr == "LOOSE")
74  quality_ = LOOSE;
75  else if (qualityStr == "TIGHT")
76  quality_ = TIGHT;
77  else if (qualityStr == "TIGHTLEPVETO")
79  else
80  quality_ = TIGHT;
81 
82  initCuts();
83 
84  // Now check the configuration to see if the user changed anything
85  if (params.exists("CHF"))
86  set("CHF", params.getParameter<double>("CHF"));
87  if (params.exists("NHF"))
88  set("NHF", params.getParameter<double>("NHF"));
91  quality_ != TIGHT) {
92  if (params.exists("CEF"))
93  set("CEF", params.getParameter<double>("CEF"));
94  }
95  if (params.exists("NEF"))
96  set("NEF", params.getParameter<double>("NEF"));
97  if (params.exists("NCH"))
98  set("NCH", params.getParameter<int>("NCH"));
99  if (params.exists("nConstituents"))
100  set("nConstituents", params.getParameter<int>("nConstituents"));
101  if (version_ == RUNIISTARTUP) {
102  if (params.exists("NEF_FW"))
103  set("NEF_FW", params.getParameter<double>("NEF_FW"));
104  if (params.exists("nNeutrals_FW"))
105  set("nNeutrals_FW", params.getParameter<int>("nNeutrals_FW"));
106  }
107  if (version_ == WINTER16) {
108  if (params.exists("NHF_EC"))
109  set("NHF_EC", params.getParameter<double>("NHF_EC"));
110  if (params.exists("NEF_EC"))
111  set("NEF_EC", params.getParameter<double>("NEF_EC"));
112  if (params.exists("nNeutrals_EC"))
113  set("nNeutrals_EC", params.getParameter<int>("nNeutrals_EC"));
114  if (params.exists("NEF_FW"))
115  set("NEF_FW", params.getParameter<double>("NEF_FW"));
116  if (params.exists("nNeutrals_FW"))
117  set("nNeutrals_FW", params.getParameter<int>("nNeutrals_FW"));
118  if (quality_ == TIGHTLEPVETO) {
119  if (params.exists("MUF"))
120  set("MUF", params.getParameter<double>("MUF"));
121  }
122  }
123  if (version_ == WINTER17) {
124  if (params.exists("NEF_EC_L"))
125  set("NEF_EC_L", params.getParameter<double>("NEF_EC_L"));
126  if (params.exists("NEF_EC_U"))
127  set("NEF_EC_U", params.getParameter<double>("NEF_EC_U"));
128  if (params.exists("nNeutrals_EC"))
129  set("nNeutrals_EC", params.getParameter<int>("nNeutrals_EC"));
130  if (params.exists("NHF_FW"))
131  set("NHF_FW", params.getParameter<double>("NHF_FW"));
132  if (params.exists("NEF_FW"))
133  set("NEF_FW", params.getParameter<double>("NEF_FW"));
134  if (params.exists("nNeutrals_FW"))
135  set("nNeutrals_FW", params.getParameter<int>("nNeutrals_FW"));
136  if (quality_ == TIGHTLEPVETO) {
137  if (params.exists("MUF"))
138  set("MUF", params.getParameter<double>("MUF"));
139  }
140  }
141  if (version_ == WINTER17PUPPI) {
142  if (params.exists("NHF_EC"))
143  set("NHF_EC", params.getParameter<double>("NHF_EC"));
144  if (params.exists("NHF_FW"))
145  set("NHF_FW", params.getParameter<double>("NHF_FW"));
146  if (params.exists("NEF_FW"))
147  set("NEF_FW", params.getParameter<double>("NEF_FW"));
148  if (params.exists("nNeutrals_FW_L"))
149  set("nNeutrals_FW_L", params.getParameter<int>("nNeutrals_FW_L"));
150  if (params.exists("nNeutrals_FW_U"))
151  set("nNeutrals_FW_U", params.getParameter<int>("nNeutrals_FW_U"));
152  if (quality_ == TIGHTLEPVETO) {
153  if (params.exists("MUF"))
154  set("MUF", params.getParameter<double>("MUF"));
155  }
156  }
157  if ((version_ == SUMMER18) || (version_ == RUN2ULCHS)) {
158  if (params.exists("NHF_TR"))
159  set("NHF_TR", params.getParameter<double>("NHF_TR"));
160  if (params.exists("NEF_TR"))
161  set("NEF_TR", params.getParameter<double>("NEF_TR"));
162  if (params.exists("NCH_TR"))
163  set("NCH_TR", params.getParameter<int>("NCH_TR"));
164  if (params.exists("NEF_EC_L"))
165  set("NEF_EC_L", params.getParameter<double>("NEF_EC_L"));
166  if (params.exists("NEF_EC_U"))
167  set("NEF_EC_U", params.getParameter<double>("NEF_EC_U"));
168  if (params.exists("nNeutrals_EC"))
169  set("nNeutrals_EC", params.getParameter<int>("nNeutrals_EC"));
170  if (params.exists("NHF_FW"))
171  set("NHF_FW", params.getParameter<double>("NHF_FW"));
172  if (params.exists("NEF_FW"))
173  set("NEF_FW", params.getParameter<double>("NEF_FW"));
174  if (params.exists("nNeutrals_FW"))
175  set("nNeutrals_FW", params.getParameter<int>("nNeutrals_FW"));
176  if (quality_ == TIGHTLEPVETO) {
177  if (params.exists("MUF"))
178  set("MUF", params.getParameter<double>("MUF"));
179  if (params.exists("MUF_TR"))
180  set("MUF_TR", params.getParameter<double>("MUF_TR"));
181  if (params.exists("CEF_TR"))
182  set("CEF_TR", params.getParameter<double>("CEF_TR"));
183  }
184  }
185  if ((version_ == SUMMER18PUPPI) || (version_ == RUN2ULPUPPI)) {
186  if (params.exists("NHF_TR"))
187  set("NHF_TR", params.getParameter<double>("NHF_TR"));
188  if (params.exists("NEF_TR"))
189  set("NEF_TR", params.getParameter<double>("NEF_TR"));
190  if (params.exists("NHF_EC"))
191  set("NHF_EC", params.getParameter<double>("NHF_EC"));
192  if (params.exists("NHF_FW"))
193  set("NHF_FW", params.getParameter<double>("NHF_FW"));
194  if (params.exists("NEF_FW"))
195  set("NEF_FW", params.getParameter<double>("NEF_FW"));
196  if (params.exists("nNeutrals_FW_L"))
197  set("nNeutrals_FW_L", params.getParameter<int>("nNeutrals_FW_L"));
198  if (params.exists("nNeutrals_FW_U"))
199  set("nNeutrals_FW_U", params.getParameter<int>("nNeutrals_FW_U"));
200  if (quality_ == TIGHTLEPVETO) {
201  if (params.exists("MUF"))
202  set("MUF", params.getParameter<double>("MUF"));
203  if (params.exists("MUF_TR"))
204  set("MUF_TR", params.getParameter<double>("MUF_TR"));
205  if (params.exists("CEF_TR"))
206  set("CEF_TR", params.getParameter<double>("CEF_TR"));
207  }
208  }
209 
210  if (params.exists("cutsToIgnore"))
211  setIgnoredCuts(params.getParameter<std::vector<std::string> >("cutsToIgnore"));
212 
213  initIndex();
214  }

References FIRSTDATA, initCuts(), initIndex(), LOOSE, CalibrationSummaryClient_cfi::params, quality_, RUN2ULCHS, RUN2ULPUPPI, RUNIISTARTUP, Selector< pat::Jet >::set(), Selector< pat::Jet >::setIgnoredCuts(), AlCaHLTBitMon_QueryRunRegistry::string, SUMMER18, SUMMER18PUPPI, TIGHT, TIGHTLEPVETO, version_, WINTER16, WINTER17, and WINTER17PUPPI.

◆ PFJetIDSelectionFunctor() [4/4]

PFJetIDSelectionFunctor::PFJetIDSelectionFunctor ( Version_t  version,
Quality_t  quality 
)
inline

Definition at line 216 of file PFJetIDSelectionFunctor.h.

217  initCuts();
218  initIndex();
219  }

References initCuts(), and initIndex().

Member Function Documentation

◆ firstDataCuts()

bool PFJetIDSelectionFunctor::firstDataCuts ( reco::Jet const &  jet,
pat::strbitset ret,
Version_t  version_ 
)
inline

Definition at line 262 of file PFJetIDSelectionFunctor.h.

262  {
263  ret.set(false);
264 
265  // cache some variables
266  double chf = 0.0;
267  double nhf = 0.0;
268  double cef = 0.0;
269  double nef = 0.0;
270  double muf = 0.0;
271 
272  int nch = 0;
273  int nconstituents = 0;
274  int nneutrals = 0;
275 
276  // Have to do this because pat::Jet inherits from reco::Jet but not reco::PFJet
277  reco::PFJet const *pfJet = dynamic_cast<reco::PFJet const *>(&jet);
278  pat::Jet const *patJet = dynamic_cast<pat::Jet const *>(&jet);
279  reco::BasicJet const *basicJet = dynamic_cast<reco::BasicJet const *>(&jet);
280 
281  if (patJet != nullptr) {
282  if (patJet->isPFJet()) {
283  chf = patJet->chargedHadronEnergyFraction();
284  nhf = patJet->neutralHadronEnergyFraction();
285  cef = patJet->chargedEmEnergyFraction();
286  nef = patJet->neutralEmEnergyFraction();
287  nch = patJet->chargedMultiplicity();
288  muf = patJet->muonEnergyFraction();
289  nconstituents = patJet->neutralMultiplicity() + patJet->chargedMultiplicity();
290  nneutrals = patJet->neutralMultiplicity();
291  }
292  // Handle the special case where this is a composed jet for
293  // subjet analyses
294  else if (patJet->isBasicJet()) {
295  double e_chf = 0.0;
296  double e_nhf = 0.0;
297  double e_cef = 0.0;
298  double e_nef = 0.0;
299  double e_muf = 0.0;
300  nch = 0;
301  nconstituents = 0;
302  nneutrals = 0;
303 
304  for (reco::Jet::const_iterator ibegin = patJet->begin(), iend = patJet->end(), isub = ibegin; isub != iend;
305  ++isub) {
306  reco::PFJet const *pfsub = dynamic_cast<reco::PFJet const *>(&*isub);
307  pat::Jet const *patsub = dynamic_cast<pat::Jet const *>(&*isub);
308  if (patsub) {
309  e_chf += patsub->chargedHadronEnergy();
310  e_nhf += patsub->neutralHadronEnergy();
311  e_cef += patsub->chargedEmEnergy();
312  e_nef += patsub->neutralEmEnergy();
313  e_muf += patsub->muonEnergy();
314  nch += patsub->chargedMultiplicity();
315  nconstituents += patsub->neutralMultiplicity() + patsub->chargedMultiplicity();
316  nneutrals += patsub->neutralMultiplicity();
317  } else if (pfsub) {
318  e_chf += pfsub->chargedHadronEnergy();
319  e_nhf += pfsub->neutralHadronEnergy();
320  e_cef += pfsub->chargedEmEnergy();
321  e_nef += pfsub->neutralEmEnergy();
322  e_muf += pfsub->muonEnergy();
323  nch += pfsub->chargedMultiplicity();
324  nconstituents += pfsub->neutralMultiplicity() + pfsub->chargedMultiplicity();
325  nneutrals += pfsub->neutralMultiplicity();
326  } else
327  assert(0);
328  }
329  double e = patJet->energy();
330  if (e > 0.000001) {
331  chf = e_chf / e;
332  nhf = e_nhf / e;
333  cef = e_cef / e;
334  nef = e_nef / e;
335  muf = e_muf / e;
336  } else {
337  chf = nhf = cef = nef = muf = 0.0;
338  }
339  }
340  } // end if pat jet
341  else if (pfJet != nullptr) {
342  // CV: need to compute energy fractions in a way that works for corrected as well as for uncorrected PFJets
343  double jetEnergyUncorrected = pfJet->chargedHadronEnergy() + pfJet->neutralHadronEnergy() +
344  pfJet->photonEnergy() + pfJet->electronEnergy() + pfJet->muonEnergy() +
345  pfJet->HFEMEnergy();
346  if (jetEnergyUncorrected > 0.) {
347  chf = pfJet->chargedHadronEnergy() / jetEnergyUncorrected;
348  nhf = pfJet->neutralHadronEnergy() / jetEnergyUncorrected;
349  cef = pfJet->chargedEmEnergy() / jetEnergyUncorrected;
350  nef = pfJet->neutralEmEnergy() / jetEnergyUncorrected;
351  muf = pfJet->muonEnergy() / jetEnergyUncorrected;
352  }
353  nch = pfJet->chargedMultiplicity();
354  nconstituents = pfJet->neutralMultiplicity() + pfJet->chargedMultiplicity();
355  nneutrals = pfJet->neutralMultiplicity();
356  } // end if PF jet
357  // Handle the special case where this is a composed jet for
358  // subjet analyses
359  else if (basicJet != nullptr) {
360  double e_chf = 0.0;
361  double e_nhf = 0.0;
362  double e_cef = 0.0;
363  double e_nef = 0.0;
364  double e_muf = 0.0;
365  nch = 0;
366  nconstituents = 0;
367  for (reco::Jet::const_iterator ibegin = basicJet->begin(), iend = patJet->end(), isub = ibegin; isub != iend;
368  ++isub) {
369  reco::PFJet const *pfsub = dynamic_cast<reco::PFJet const *>(&*isub);
370  e_chf += pfsub->chargedHadronEnergy();
371  e_nhf += pfsub->neutralHadronEnergy();
372  e_cef += pfsub->chargedEmEnergy();
373  e_nef += pfsub->neutralEmEnergy();
374  e_muf += pfsub->muonEnergy();
375  nch += pfsub->chargedMultiplicity();
376  nconstituents += pfsub->neutralMultiplicity() + pfsub->chargedMultiplicity();
377  nneutrals += pfsub->neutralMultiplicity();
378  }
379  double e = basicJet->energy();
380  if (e > 0.000001) {
381  chf = e_chf / e;
382  nhf = e_nhf / e;
383  cef = e_cef / e;
384  nef = e_nef / e;
385  muf = e_muf / e;
386  }
387  } // end if basic jet
388 
389  float etaB = 2.4;
390  // Cuts for |eta| < 2.6 for Summer18
392  etaB = 2.6;
395  quality_ != TIGHT) {
396  if (ignoreCut(indexCEF_) || (cef < cut(indexCEF_, double()) || std::abs(jet.eta()) > etaB))
398  }
399  if (ignoreCut(indexCHF_) || (chf > cut(indexCHF_, double()) || std::abs(jet.eta()) > etaB))
401  if (ignoreCut(indexNCH_) || (nch > cut(indexNCH_, int()) || std::abs(jet.eta()) > etaB))
403  if (version_ == FIRSTDATA) { // Cuts for all eta for FIRSTDATA
404  if (ignoreCut(indexNConstituents_) || (nconstituents > cut(indexNConstituents_, int())))
406  if (ignoreCut(indexNEF_) || (nef < cut(indexNEF_, double())))
408  if (ignoreCut(indexNHF_) || (nhf < cut(indexNHF_, double())))
410  } else if (version_ == RUNIISTARTUP) {
411  // Cuts for |eta| <= 3.0 for RUNIISTARTUP scenario
413  (nconstituents > cut(indexNConstituents_, int()) || std::abs(jet.eta()) > 3.0))
415  if (ignoreCut(indexNEF_) || (nef < cut(indexNEF_, double()) || std::abs(jet.eta()) > 3.0))
417  if (ignoreCut(indexNHF_) || (nhf < cut(indexNHF_, double()) || std::abs(jet.eta()) > 3.0))
419  // Cuts for |eta| > 3.0 for RUNIISTARTUP scenario
420  if (ignoreCut(indexNEF_FW_) || (nef < cut(indexNEF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
422  if (ignoreCut(indexNNeutrals_FW_) || (nneutrals > cut(indexNNeutrals_FW_, int()) || std::abs(jet.eta()) <= 3.0))
424  } else if (version_ == WINTER16) {
425  // Cuts for |eta| <= 2.7 for WINTER16 scenario
427  (nconstituents > cut(indexNConstituents_, int()) || std::abs(jet.eta()) > 2.7))
429  if (ignoreCut(indexNEF_) || (nef < cut(indexNEF_, double()) || std::abs(jet.eta()) > 2.7))
431  if (ignoreCut(indexNHF_) || (nhf < cut(indexNHF_, double()) || std::abs(jet.eta()) > 2.7))
433  if (quality_ == TIGHTLEPVETO) {
434  if (ignoreCut(indexMUF_) || (muf < cut(indexMUF_, double()) || std::abs(jet.eta()) > 2.7))
436  }
437 
438  // Cuts for 2.7 < |eta| <= 3.0 for WINTER16 scenario
439  if (ignoreCut(indexNHF_EC_) ||
440  (nhf < cut(indexNHF_EC_, double()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
442  if (ignoreCut(indexNEF_EC_) ||
443  (nef > cut(indexNEF_EC_, double()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
446  (nneutrals > cut(indexNNeutrals_EC_, int()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
448 
449  // Cuts for |eta| > 3.0 for WINTER16 scenario
450  if (ignoreCut(indexNEF_FW_) || (nef < cut(indexNEF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
452  if (ignoreCut(indexNNeutrals_FW_) || (nneutrals > cut(indexNNeutrals_FW_, int()) || std::abs(jet.eta()) <= 3.0))
454  } else if (version_ == WINTER17) {
455  // Cuts for |eta| <= 2.7 for WINTER17 scenario
457  (nconstituents > cut(indexNConstituents_, int()) || std::abs(jet.eta()) > 2.7))
459  if (ignoreCut(indexNEF_) || (nef < cut(indexNEF_, double()) || std::abs(jet.eta()) > 2.7))
461  if (ignoreCut(indexNHF_) || (nhf < cut(indexNHF_, double()) || std::abs(jet.eta()) > 2.7))
463  if (quality_ == TIGHTLEPVETO) {
464  if (ignoreCut(indexMUF_) || (muf < cut(indexMUF_, double()) || std::abs(jet.eta()) > 2.7))
466  }
467 
468  // Cuts for 2.7 < |eta| <= 3.0 for WINTER17 scenario
469 
470  if (ignoreCut(indexNEF_EC_L_) ||
471  (nef > cut(indexNEF_EC_L_, double()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
473  if (ignoreCut(indexNEF_EC_U_) ||
474  (nef < cut(indexNEF_EC_U_, double()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
477  (nneutrals > cut(indexNNeutrals_EC_, int()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
479 
480  // Cuts for |eta| > 3.0 for WINTER17 scenario
481  if (ignoreCut(indexNHF_FW_) || (nhf > cut(indexNHF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
483  if (ignoreCut(indexNEF_FW_) || (nef < cut(indexNEF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
485  if (ignoreCut(indexNNeutrals_FW_) || (nneutrals > cut(indexNNeutrals_FW_, int()) || std::abs(jet.eta()) <= 3.0))
487 
488  } else if (version_ == WINTER17PUPPI) {
489  // Cuts for |eta| <= 2.7 for WINTER17 scenario
491  (nconstituents > cut(indexNConstituents_, int()) || std::abs(jet.eta()) > 2.7))
493  if (ignoreCut(indexNEF_) || (nef < cut(indexNEF_, double()) || std::abs(jet.eta()) > 2.7))
495  if (ignoreCut(indexNHF_) || (nhf < cut(indexNHF_, double()) || std::abs(jet.eta()) > 2.7))
497  if (quality_ == TIGHTLEPVETO) {
498  if (ignoreCut(indexMUF_) || (muf < cut(indexMUF_, double()) || std::abs(jet.eta()) > 2.7))
500  }
501 
502  // Cuts for 2.7 < |eta| <= 3.0 for WINTER17 scenario
503 
504  if (ignoreCut(indexNHF_EC_) ||
505  (nhf < cut(indexNHF_EC_, double()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
507 
508  // Cuts for |eta| > 3.0 for WINTER17 scenario
509  if (ignoreCut(indexNHF_FW_) || (nhf > cut(indexNHF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
511  if (ignoreCut(indexNEF_FW_) || (nef < cut(indexNEF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
514  (nneutrals > cut(indexNNeutrals_FW_L_, int()) || std::abs(jet.eta()) <= 3.0))
517  (nneutrals < cut(indexNNeutrals_FW_U_, int()) || std::abs(jet.eta()) <= 3.0))
519  } else if ((version_ == SUMMER18) || (version_ == RUN2ULCHS)) {
520  // Cuts for |eta| <= 2.6 for SUMMER18 scenario
522  (nconstituents > cut(indexNConstituents_, int()) || std::abs(jet.eta()) > 2.6))
524  if (ignoreCut(indexNEF_) || (nef < cut(indexNEF_, double()) || std::abs(jet.eta()) > 2.6))
526  if (ignoreCut(indexNHF_) || (nhf < cut(indexNHF_, double()) || std::abs(jet.eta()) > 2.6))
528  if (quality_ == TIGHTLEPVETO) {
529  if (ignoreCut(indexMUF_) || (muf < cut(indexMUF_, double()) || std::abs(jet.eta()) > 2.6))
531  }
532 
533  // Cuts for 2.6 <= |eta| <= 2.7 for SUMMER18 scenario
534  if (ignoreCut(indexNHF_TR_) ||
535  (nhf < cut(indexNHF_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
537  if (ignoreCut(indexNEF_TR_) ||
538  (nef < cut(indexNEF_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
540  if (ignoreCut(indexNCH_TR_) ||
541  (nch > cut(indexNCH_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
543  if (quality_ == TIGHTLEPVETO) {
544  if (ignoreCut(indexMUF_TR_) ||
545  (muf < cut(indexMUF_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
547  if (ignoreCut(indexCEF_TR_) ||
548  (cef < cut(indexCEF_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
550  }
551 
552  // Cuts for 2.7 < |eta| <= 3.0 for SUMMER18 scenario
553  if (ignoreCut(indexNEF_EC_L_) ||
554  (nef > cut(indexNEF_EC_L_, double()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
556  if (ignoreCut(indexNEF_EC_U_) ||
557  (nef < cut(indexNEF_EC_U_, double()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
560  (nneutrals > cut(indexNNeutrals_EC_, int()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
562 
563  // Cuts for |eta| > 3.0 for SUMMER18 scenario
564  if (ignoreCut(indexNHF_FW_) || (nhf > cut(indexNHF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
566  if (ignoreCut(indexNEF_FW_) || (nef < cut(indexNEF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
568  if (ignoreCut(indexNNeutrals_FW_) || (nneutrals > cut(indexNNeutrals_FW_, int()) || std::abs(jet.eta()) <= 3.0))
570  }
571 
572  else if ((version_ == SUMMER18PUPPI) || (version_ == RUN2ULPUPPI)) {
573  // Cuts for |eta| <= 2.6 for SUMMER18PUPPI scenario
575  (nconstituents > cut(indexNConstituents_, int()) || std::abs(jet.eta()) > 2.6))
577  if (ignoreCut(indexNEF_) || (nef < cut(indexNEF_, double()) || std::abs(jet.eta()) > 2.6))
579  if (ignoreCut(indexNHF_) || (nhf < cut(indexNHF_, double()) || std::abs(jet.eta()) > 2.6))
581  if (quality_ == TIGHTLEPVETO) {
582  if (ignoreCut(indexMUF_) || (muf < cut(indexMUF_, double()) || std::abs(jet.eta()) > 2.6))
584  }
585 
586  // Cuts for 2.6 <= |eta| <= 2.7 for SUMMER18PUPPI scenario
587  if (ignoreCut(indexNHF_TR_) ||
588  (nhf < cut(indexNHF_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
590  if (ignoreCut(indexNEF_TR_) ||
591  (nef < cut(indexNEF_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
593  if (quality_ == TIGHTLEPVETO) {
594  if (ignoreCut(indexMUF_TR_) ||
595  (muf < cut(indexMUF_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
597  if (ignoreCut(indexCEF_TR_) ||
598  (cef < cut(indexCEF_TR_, double()) || std::abs(jet.eta()) <= 2.6 || std::abs(jet.eta()) > 2.7))
600  }
601 
602  // Cuts for 2.7 < |eta| <= 3.0 for SUMMER18PUPPI scenario
603  if (ignoreCut(indexNHF_EC_) ||
604  (nhf < cut(indexNHF_EC_, double()) || std::abs(jet.eta()) <= 2.7 || std::abs(jet.eta()) > 3.0))
606 
607  // Cuts for |eta| > 3.0 for SUMMER18PUPPI scenario
608  if (ignoreCut(indexNHF_FW_) || (nhf > cut(indexNHF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
610  if (ignoreCut(indexNEF_FW_) || (nef < cut(indexNEF_FW_, double()) || std::abs(jet.eta()) <= 3.0))
613  (nneutrals > cut(indexNNeutrals_FW_L_, int()) || std::abs(jet.eta()) <= 3.0))
616  (nneutrals < cut(indexNNeutrals_FW_U_, int()) || std::abs(jet.eta()) <= 3.0))
618  }
619 
620  //std::cout << "<PFJetIDSelectionFunctor::firstDataCuts>:" << std::endl;
621  //std::cout << " jet: Pt = " << jet.pt() << ", eta = " << jet.eta() << ", phi = " << jet.phi() << std::endl;
622  //ret.print(std::cout);
623  setIgnored(ret);
624  return (bool)ret;
625  }

References funct::abs(), cms::cuda::assert(), reco::Candidate::begin(), reco::PFJet::chargedEmEnergy(), pat::Jet::chargedEmEnergy(), pat::Jet::chargedEmEnergyFraction(), reco::PFJet::chargedHadronEnergy(), pat::Jet::chargedHadronEnergy(), pat::Jet::chargedHadronEnergyFraction(), reco::PFJet::chargedMultiplicity(), pat::Jet::chargedMultiplicity(), Selector< pat::Jet >::cut(), MillePedeFileConverter_cfg::e, reco::PFJet::electronEnergy(), reco::Candidate::end(), reco::LeafCandidate::energy(), FIRSTDATA, reco::PFJet::HFEMEnergy(), Selector< pat::Jet >::ignoreCut(), indexCEF_, indexCEF_TR_, indexCHF_, indexMUF_, indexMUF_TR_, indexNCH_, indexNCH_TR_, indexNConstituents_, indexNEF_, indexNEF_EC_, indexNEF_EC_L_, indexNEF_EC_U_, indexNEF_FW_, indexNEF_TR_, indexNHF_, indexNHF_EC_, indexNHF_FW_, indexNHF_TR_, indexNNeutrals_EC_, indexNNeutrals_FW_, indexNNeutrals_FW_L_, indexNNeutrals_FW_U_, pat::Jet::isBasicJet(), pat::Jet::isPFJet(), metsig::jet, reco::PFJet::muonEnergy(), pat::Jet::muonEnergy(), pat::Jet::muonEnergyFraction(), reco::PFJet::neutralEmEnergy(), pat::Jet::neutralEmEnergy(), pat::Jet::neutralEmEnergyFraction(), reco::PFJet::neutralHadronEnergy(), pat::Jet::neutralHadronEnergy(), pat::Jet::neutralHadronEnergyFraction(), reco::PFJet::neutralMultiplicity(), pat::Jet::neutralMultiplicity(), Selector< pat::Jet >::passCut(), reco::PFJet::photonEnergy(), quality_, runTheMatrix::ret, RUN2ULCHS, RUN2ULPUPPI, RUNIISTARTUP, Selector< pat::Jet >::setIgnored(), SUMMER18, SUMMER18PUPPI, TIGHT, TIGHTLEPVETO, version_, WINTER16, WINTER17, and WINTER17PUPPI.

Referenced by operator()().

◆ initCuts()

void PFJetIDSelectionFunctor::initCuts ( )
inlineprivate

Definition at line 628 of file PFJetIDSelectionFunctor.h.

628  {
629  push_back("CHF");
630  push_back("NHF");
633  quality_ != TIGHT)
634  push_back("CEF");
635  push_back("NEF");
636  push_back("NCH");
637  push_back("nConstituents");
638  if (version_ == RUNIISTARTUP) {
639  push_back("NEF_FW");
640  push_back("nNeutrals_FW");
641  }
642  if (version_ == WINTER16) {
643  push_back("NHF_EC");
644  push_back("NEF_EC");
645  push_back("nNeutrals_EC");
646  push_back("NEF_FW");
647  push_back("nNeutrals_FW");
648  if (quality_ == TIGHTLEPVETO)
649  push_back("MUF");
650  }
651  if (version_ == WINTER17) {
652  push_back("NEF_EC_L");
653  push_back("NEF_EC_U");
654  push_back("nNeutrals_EC");
655  push_back("NEF_FW");
656  push_back("NHF_FW");
657  push_back("nNeutrals_FW");
658  if (quality_ == TIGHTLEPVETO)
659  push_back("MUF");
660  }
661  if (version_ == WINTER17PUPPI) {
662  push_back("NHF_EC");
663  push_back("NEF_FW");
664  push_back("NHF_FW");
665  push_back("nNeutrals_FW_L");
666  push_back("nNeutrals_FW_U");
667  if (quality_ == TIGHTLEPVETO)
668  push_back("MUF");
669  }
670  if ((version_ == SUMMER18) || (version_ == RUN2ULCHS)) {
671  push_back("NHF_TR");
672  push_back("NEF_TR");
673  push_back("NCH_TR");
674  push_back("NEF_EC_L");
675  push_back("NEF_EC_U");
676  push_back("nNeutrals_EC");
677  push_back("NEF_FW");
678  push_back("NHF_FW");
679  push_back("nNeutrals_FW");
680 
681  if (quality_ == TIGHTLEPVETO) {
682  push_back("MUF");
683  push_back("MUF_TR");
684  push_back("CEF_TR");
685  }
686  }
687  if ((version_ == SUMMER18PUPPI) || (version_ == RUN2ULPUPPI)) {
688  push_back("NHF_TR");
689  push_back("NEF_TR");
690  push_back("NHF_EC");
691  push_back("NEF_FW");
692  push_back("NHF_FW");
693  push_back("nNeutrals_FW_L");
694  push_back("nNeutrals_FW_U");
695 
696  if (quality_ == TIGHTLEPVETO) {
697  push_back("MUF");
698  push_back("MUF_TR");
699  push_back("CEF_TR");
700  }
701  }
702 
705  quality_ == LOOSE) {
706  edm::LogWarning("BadJetIDVersion")
707  << "The LOOSE operating point is only supported for the WINTER16 JetID version -- defaulting to TIGHT";
708  quality_ = TIGHT;
709  }
710 
711  // Set some default cuts for LOOSE, TIGHT
712  if (quality_ == LOOSE) {
713  set("CHF", 0.0);
714  set("NHF", 0.99);
715  set("CEF", 0.99);
716  set("NEF", 0.99);
717  set("NCH", 0);
718  set("nConstituents", 1);
719  if (version_ == RUNIISTARTUP) {
720  set("NEF_FW", 0.90);
721  set("nNeutrals_FW", 10);
722  } else if (version_ == WINTER16) {
723  set("NHF_EC", 0.98);
724  set("NEF_EC", 0.01);
725  set("nNeutrals_EC", 2);
726  set("NEF_FW", 0.90);
727  set("nNeutrals_FW", 10);
728  }
729  } else if (quality_ == TIGHT) {
730  set("CHF", 0.0);
731  set("NHF", 0.9);
734  set("CEF", 0.99);
735  set("NEF", 0.9);
736  set("NCH", 0);
737  set("nConstituents", 1);
738  if (version_ == RUNIISTARTUP) {
739  set("NEF_FW", 0.90);
740  set("nNeutrals_FW", 10);
741  } else if (version_ == WINTER16) {
742  set("NHF_EC", 0.98);
743  set("NEF_EC", 0.01);
744  set("nNeutrals_EC", 2);
745  set("NEF_FW", 0.90);
746  set("nNeutrals_FW", 10);
747  } else if (version_ == WINTER17) {
748  set("NEF_EC_L", 0.02);
749  set("NEF_EC_U", 0.99);
750  set("nNeutrals_EC", 2);
751  set("NHF_FW", 0.02);
752  set("NEF_FW", 0.90);
753  set("nNeutrals_FW", 10);
754  } else if (version_ == WINTER17PUPPI) {
755  set("NHF_EC", 0.99);
756  set("NHF_FW", 0.02);
757  set("NEF_FW", 0.90);
758  set("nNeutrals_FW_L", 2);
759  set("nNeutrals_FW_U", 15);
760  } else if (version_ == SUMMER18) {
761  set("NHF_TR", 0.9);
762  set("NEF_TR", 0.99);
763  set("NCH_TR", 0);
764  set("NEF_EC_L", 0.02);
765  set("NEF_EC_U", 0.99);
766  set("nNeutrals_EC", 2);
767  set("NHF_FW", 0.2);
768  set("NEF_FW", 0.90);
769  set("nNeutrals_FW", 10);
770  } else if (version_ == SUMMER18PUPPI) {
771  set("NHF_TR", 0.9);
772  set("NEF_TR", 0.99);
773  set("NHF_EC", 0.99);
774  set("NHF_FW", 0.02);
775  set("NEF_FW", 0.90);
776  set("nNeutrals_FW_L", 2);
777  set("nNeutrals_FW_U", 15);
778  } else if (version_ == RUN2ULCHS) {
779  set("NHF_TR", 0.9);
780  set("NEF_TR", 0.99);
781  set("NCH_TR", 0);
782  set("NEF_EC_L", 0.01);
783  set("NEF_EC_U", 0.99);
784  set("nNeutrals_EC", 2);
785  set("NHF_FW", 0.2);
786  set("NEF_FW", 0.90);
787  set("nNeutrals_FW", 10);
788  } else if (version_ == RUN2ULPUPPI) {
789  set("NHF_TR", 0.9);
790  set("NEF_TR", 0.99);
791  set("NHF_EC", 0.9999);
792  set("NHF_FW", -1.0);
793  set("NEF_FW", 0.90);
794  set("nNeutrals_FW_L", 2);
795  set("nNeutrals_FW_U", 999999);
796  }
797  } else if (quality_ == TIGHTLEPVETO) {
798  set("CHF", 0.0);
799  set("NHF", 0.9);
800  set("NEF", 0.9);
801  set("NCH", 0);
802  set("nConstituents", 1);
803  if (version_ == WINTER17) {
804  set("CEF", 0.8);
805  set("NEF_EC_L", 0.02);
806  set("NEF_EC_U", 0.99);
807  set("nNeutrals_EC", 2);
808  set("NHF_FW", 0.02);
809  set("NEF_FW", 0.90);
810  set("nNeutrals_FW", 10);
811  set("MUF", 0.8);
812  } else if (version_ == WINTER17PUPPI) {
813  set("CEF", 0.8);
814  set("NHF_EC", 0.99);
815  set("NHF_FW", 0.02);
816  set("NEF_FW", 0.90);
817  set("nNeutrals_FW_L", 2);
818  set("nNeutrals_FW_U", 15);
819  set("MUF", 0.8);
820  } else if (version_ == WINTER16) {
821  set("CEF", 0.9);
822  set("NEF_EC", 0.01);
823  set("NHF_EC", 0.98);
824  set("nNeutrals_EC", 2);
825  set("nNeutrals_FW", 10);
826  set("NEF_FW", 0.90);
827  set("MUF", 0.8);
828  } else if (version_ == WINTER17PUPPI) {
829  set("CEF", 0.8);
830  set("NHF_EC", 0.99);
831  set("NHF_FW", 0.02);
832  set("NEF_FW", 0.90);
833  set("nNeutrals_FW_L", 2);
834  set("nNeutrals_FW_U", 15);
835  set("MUF", 0.8);
836  } else if (version_ == WINTER16) {
837  set("CEF", 0.9);
838  set("NEF_EC", 0.01);
839  set("NHF_EC", 0.98);
840  set("nNeutrals_EC", 2);
841  set("nNeutrals_FW", 10);
842  set("NEF_FW", 0.90);
843  set("MUF", 0.8);
844  } else if (version_ == SUMMER18) {
845  set("CEF", 0.8);
846  set("MUF", 0.8);
847  set("NHF_TR", 0.9);
848  set("NEF_TR", 0.99);
849  set("MUF_TR", 0.8);
850  set("NCH_TR", 0);
851  set("CEF_TR", 0.8);
852  set("NEF_EC_L", 0.02);
853  set("NEF_EC_U", 0.99);
854  set("nNeutrals_EC", 2);
855  set("NHF_FW", 0.2);
856  set("NEF_FW", 0.90);
857  set("nNeutrals_FW", 10);
858  } else if (version_ == SUMMER18PUPPI) {
859  set("CEF", 0.8);
860  set("MUF", 0.8);
861  set("NHF_TR", 0.9);
862  set("NEF_TR", 0.99);
863  set("MUF_TR", 0.8);
864  set("CEF_TR", 0.8);
865  set("NHF_EC", 0.99);
866  set("NHF_FW", 0.02);
867  set("NEF_FW", 0.90);
868  set("nNeutrals_FW_L", 2);
869  set("nNeutrals_FW_U", 15);
870  } else if (version_ == RUN2ULCHS) {
871  set("CEF", 0.8);
872  set("MUF", 0.8);
873  set("NHF_TR", 0.9);
874  set("NEF_TR", 0.99);
875  set("MUF_TR", 0.8);
876  set("NCH_TR", 0);
877  set("CEF_TR", 0.8);
878  set("NEF_EC_L", 0.01);
879  set("NEF_EC_U", 0.99);
880  set("nNeutrals_EC", 2);
881  set("NHF_FW", 0.2);
882  set("NEF_FW", 0.90);
883  set("nNeutrals_FW", 10);
884  } else if (version_ == RUN2ULPUPPI) {
885  set("CEF", 0.8);
886  set("MUF", 0.8);
887  set("NHF_TR", 0.9);
888  set("NEF_TR", 0.99);
889  set("MUF_TR", 0.8);
890  set("CEF_TR", 0.8);
891  set("NHF_EC", 0.9999);
892  set("NHF_FW", -1.0);
893  set("NEF_FW", 0.90);
894  set("nNeutrals_FW_L", 2);
895  set("nNeutrals_FW_U", 999999);
896  }
897  }
898  }

References LOOSE, Selector< pat::Jet >::push_back(), quality_, RUN2ULCHS, RUN2ULPUPPI, RUNIISTARTUP, Selector< pat::Jet >::set(), SUMMER18, SUMMER18PUPPI, TIGHT, TIGHTLEPVETO, version_, WINTER16, WINTER17, and WINTER17PUPPI.

Referenced by PFJetIDSelectionFunctor().

◆ initIndex()

void PFJetIDSelectionFunctor::initIndex ( )
inlineprivate

Definition at line 900 of file PFJetIDSelectionFunctor.h.

900  {
901  indexNConstituents_ = index_type(&bits_, "nConstituents");
902  indexNEF_ = index_type(&bits_, "NEF");
903  indexNHF_ = index_type(&bits_, "NHF");
906  quality_ != TIGHT)
907  indexCEF_ = index_type(&bits_, "CEF");
908 
909  indexCHF_ = index_type(&bits_, "CHF");
910  indexNCH_ = index_type(&bits_, "NCH");
911  if (version_ == RUNIISTARTUP) {
912  indexNEF_FW_ = index_type(&bits_, "NEF_FW");
913  indexNNeutrals_FW_ = index_type(&bits_, "nNeutrals_FW");
914  }
915  if (version_ == WINTER16) {
916  indexNHF_EC_ = index_type(&bits_, "NHF_EC");
917  indexNEF_EC_ = index_type(&bits_, "NEF_EC");
918  indexNNeutrals_EC_ = index_type(&bits_, "nNeutrals_EC");
919  indexNEF_FW_ = index_type(&bits_, "NEF_FW");
920  indexNNeutrals_FW_ = index_type(&bits_, "nNeutrals_FW");
921  if (quality_ == TIGHTLEPVETO) {
922  indexMUF_ = index_type(&bits_, "MUF");
923  }
924  }
925  if (version_ == WINTER17) {
926  indexNEF_EC_L_ = index_type(&bits_, "NEF_EC_L");
927  indexNEF_EC_U_ = index_type(&bits_, "NEF_EC_U");
928  indexNNeutrals_EC_ = index_type(&bits_, "nNeutrals_EC");
929  indexNHF_FW_ = index_type(&bits_, "NHF_FW");
930  indexNEF_FW_ = index_type(&bits_, "NEF_FW");
931  indexNNeutrals_FW_ = index_type(&bits_, "nNeutrals_FW");
932  if (quality_ == TIGHTLEPVETO) {
933  indexMUF_ = index_type(&bits_, "MUF");
934  }
935  }
936  if (version_ == WINTER17PUPPI) {
937  indexNHF_EC_ = index_type(&bits_, "NHF_EC");
938  indexNHF_FW_ = index_type(&bits_, "NHF_FW");
939  indexNEF_FW_ = index_type(&bits_, "NEF_FW");
940  indexNNeutrals_FW_L_ = index_type(&bits_, "nNeutrals_FW_L");
941  indexNNeutrals_FW_U_ = index_type(&bits_, "nNeutrals_FW_U");
942  if (quality_ == TIGHTLEPVETO) {
943  indexMUF_ = index_type(&bits_, "MUF");
944  }
945  }
946  if ((version_ == SUMMER18) || (version_ == RUN2ULCHS)) {
947  indexNHF_TR_ = index_type(&bits_, "NHF_TR");
948  indexNEF_TR_ = index_type(&bits_, "NEF_TR");
949  indexNCH_TR_ = index_type(&bits_, "NCH_TR");
950  indexNEF_EC_L_ = index_type(&bits_, "NEF_EC_L");
951  indexNEF_EC_U_ = index_type(&bits_, "NEF_EC_U");
952  indexNNeutrals_EC_ = index_type(&bits_, "nNeutrals_EC");
953  indexNHF_FW_ = index_type(&bits_, "NHF_FW");
954  indexNEF_FW_ = index_type(&bits_, "NEF_FW");
955  indexNNeutrals_FW_ = index_type(&bits_, "nNeutrals_FW");
956  if (quality_ == TIGHTLEPVETO) {
957  indexMUF_ = index_type(&bits_, "MUF");
958  indexMUF_TR_ = index_type(&bits_, "MUF_TR");
959  indexCEF_TR_ = index_type(&bits_, "CEF_TR");
960  }
961  }
962  if ((version_ == SUMMER18PUPPI) || (version_ == RUN2ULPUPPI)) {
963  indexNHF_TR_ = index_type(&bits_, "NHF_TR");
964  indexNEF_TR_ = index_type(&bits_, "NEF_TR");
965  indexNHF_EC_ = index_type(&bits_, "NHF_EC");
966  indexNHF_FW_ = index_type(&bits_, "NHF_FW");
967  indexNEF_FW_ = index_type(&bits_, "NEF_FW");
968  indexNNeutrals_FW_L_ = index_type(&bits_, "nNeutrals_FW_L");
969  indexNNeutrals_FW_U_ = index_type(&bits_, "nNeutrals_FW_U");
970  if (quality_ == TIGHTLEPVETO) {
971  indexMUF_ = index_type(&bits_, "MUF");
972  indexMUF_TR_ = index_type(&bits_, "MUF_TR");
973  indexCEF_TR_ = index_type(&bits_, "CEF_TR");
974  }
975  }
977  }

References Selector< pat::Jet >::bits_, Selector< pat::Jet >::getBitTemplate(), indexCEF_, indexCEF_TR_, indexCHF_, indexMUF_, indexMUF_TR_, indexNCH_, indexNCH_TR_, indexNConstituents_, indexNEF_, indexNEF_EC_, indexNEF_EC_L_, indexNEF_EC_U_, indexNEF_FW_, indexNEF_TR_, indexNHF_, indexNHF_EC_, indexNHF_FW_, indexNHF_TR_, indexNNeutrals_EC_, indexNNeutrals_FW_, indexNNeutrals_FW_L_, indexNNeutrals_FW_U_, quality_, Selector< pat::Jet >::retInternal_, RUN2ULCHS, RUN2ULPUPPI, RUNIISTARTUP, SUMMER18, SUMMER18PUPPI, TIGHT, TIGHTLEPVETO, version_, WINTER16, WINTER17, and WINTER17PUPPI.

Referenced by PFJetIDSelectionFunctor().

◆ operator()() [1/3]

bool PFJetIDSelectionFunctor::operator() ( const pat::Jet t,
pat::strbitset ret 
)
inlineoverridevirtual

This provides the interface for base classes to select objects.

Implements Selector< pat::Jet >.

Definition at line 224 of file PFJetIDSelectionFunctor.h.

224  {
227  version_ == RUN2ULPUPPI) {
228  if (jet.currentJECLevel() == "Uncorrected" || !jet.jecSetsAvailable())
229  return firstDataCuts(jet, ret, version_);
230  else
231  return firstDataCuts(jet.correctedJet("Uncorrected"), ret, version_);
232  } else {
233  return false;
234  }
235  }

References FIRSTDATA, firstDataCuts(), metsig::jet, runTheMatrix::ret, RUN2ULCHS, RUN2ULPUPPI, RUNIISTARTUP, SUMMER18, SUMMER18PUPPI, version_, WINTER16, WINTER17, and WINTER17PUPPI.

Referenced by operator()().

◆ operator()() [2/3]

bool PFJetIDSelectionFunctor::operator() ( const reco::PFJet jet)
inline

◆ operator()() [3/3]

bool PFJetIDSelectionFunctor::operator() ( const reco::PFJet jet,
pat::strbitset ret 
)
inline

Definition at line 242 of file PFJetIDSelectionFunctor.h.

242  {
245  version_ == RUN2ULPUPPI) {
246  return firstDataCuts(jet, ret, version_);
247  } else {
248  return false;
249  }
250  }

References FIRSTDATA, firstDataCuts(), metsig::jet, runTheMatrix::ret, RUN2ULCHS, RUN2ULPUPPI, RUNIISTARTUP, SUMMER18, SUMMER18PUPPI, version_, WINTER16, WINTER17, and WINTER17PUPPI.

Member Data Documentation

◆ indexCEF_

index_type PFJetIDSelectionFunctor::indexCEF_
private

Definition at line 986 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexCEF_TR_

index_type PFJetIDSelectionFunctor::indexCEF_TR_
private

Definition at line 994 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexCHF_

index_type PFJetIDSelectionFunctor::indexCHF_
private

Definition at line 987 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexMUF_

index_type PFJetIDSelectionFunctor::indexMUF_
private

Definition at line 984 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexMUF_TR_

index_type PFJetIDSelectionFunctor::indexMUF_TR_
private

Definition at line 993 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNCH_

index_type PFJetIDSelectionFunctor::indexNCH_
private

Definition at line 988 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNCH_TR_

index_type PFJetIDSelectionFunctor::indexNCH_TR_
private

Definition at line 992 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNConstituents_

index_type PFJetIDSelectionFunctor::indexNConstituents_
private

Definition at line 982 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNEF_

index_type PFJetIDSelectionFunctor::indexNEF_
private

Definition at line 983 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNEF_EC_

index_type PFJetIDSelectionFunctor::indexNEF_EC_
private

Definition at line 1003 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNEF_EC_L_

index_type PFJetIDSelectionFunctor::indexNEF_EC_L_
private

Definition at line 1004 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNEF_EC_U_

index_type PFJetIDSelectionFunctor::indexNEF_EC_U_
private

Definition at line 1005 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNEF_FW_

index_type PFJetIDSelectionFunctor::indexNEF_FW_
private

Definition at line 997 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNEF_TR_

index_type PFJetIDSelectionFunctor::indexNEF_TR_
private

Definition at line 991 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNHF_

index_type PFJetIDSelectionFunctor::indexNHF_
private

Definition at line 985 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNHF_EC_

index_type PFJetIDSelectionFunctor::indexNHF_EC_
private

Definition at line 1002 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNHF_FW_

index_type PFJetIDSelectionFunctor::indexNHF_FW_
private

Definition at line 996 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNHF_TR_

index_type PFJetIDSelectionFunctor::indexNHF_TR_
private

Definition at line 990 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNNeutrals_EC_

index_type PFJetIDSelectionFunctor::indexNNeutrals_EC_
private

Definition at line 1006 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNNeutrals_FW_

index_type PFJetIDSelectionFunctor::indexNNeutrals_FW_
private

Definition at line 998 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNNeutrals_FW_L_

index_type PFJetIDSelectionFunctor::indexNNeutrals_FW_L_
private

Definition at line 999 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ indexNNeutrals_FW_U_

index_type PFJetIDSelectionFunctor::indexNNeutrals_FW_U_
private

Definition at line 1000 of file PFJetIDSelectionFunctor.h.

Referenced by firstDataCuts(), and initIndex().

◆ quality_

Quality_t PFJetIDSelectionFunctor::quality_
private

◆ version_

Version_t PFJetIDSelectionFunctor::version_
private
PFJetIDSelectionFunctor::RUN2ULPUPPI
Definition: PFJetIDSelectionFunctor.h:36
runTheMatrix.ret
ret
prodAgent to be discontinued
Definition: runTheMatrix.py:542
reco::PFJet::muonEnergy
float muonEnergy() const
muonEnergy
Definition: PFJet.h:111
PFJetIDSelectionFunctor::FIRSTDATA
Definition: PFJetIDSelectionFunctor.h:28
Selector< pat::Jet >::setIgnored
void setIgnored(pat::strbitset &ret)
set ignored bits
Definition: Selector.h:181
Selector< pat::Jet >::bits_
pat::strbitset bits_
the bitset indexed by strings
Definition: Selector.h:241
PFJetIDSelectionFunctor::indexNEF_EC_L_
index_type indexNEF_EC_L_
Definition: PFJetIDSelectionFunctor.h:1004
Selector< pat::Jet >::index_type
pat::strbitset::index_type index_type
Definition: Selector.h:25
PFJetIDSelectionFunctor::indexNNeutrals_EC_
index_type indexNNeutrals_EC_
Definition: PFJetIDSelectionFunctor.h:1006
PFJetIDSelectionFunctor::firstDataCuts
bool firstDataCuts(reco::Jet const &jet, pat::strbitset &ret, Version_t version_)
Definition: PFJetIDSelectionFunctor.h:262
CalibrationSummaryClient_cfi.params
params
Definition: CalibrationSummaryClient_cfi.py:14
PFJetIDSelectionFunctor::indexNEF_
index_type indexNEF_
Definition: PFJetIDSelectionFunctor.h:983
PFJetIDSelectionFunctor::N_QUALITY
Definition: PFJetIDSelectionFunctor.h:39
pat::strbitset::set
strbitset & set(bool val=true)
set method of all bits
Definition: strbitset.h:126
Selector< pat::Jet >::retInternal_
pat::strbitset retInternal_
internal ret if users don't care about return bits
Definition: Selector.h:242
Selector< pat::Jet >::ignoreCut
bool ignoreCut(std::string const &s) const
ignore the cut at index "s"
Definition: Selector.h:127
pat::Jet::neutralHadronEnergyFraction
float neutralHadronEnergyFraction() const
neutralHadronEnergyFraction (relative to uncorrected jet energy)
Definition: Jet.h:404
PFJetIDSelectionFunctor::indexNConstituents_
index_type indexNConstituents_
Definition: PFJetIDSelectionFunctor.h:982
reco::candidate::const_iterator
Definition: const_iterator.h:14
PFJetIDSelectionFunctor::initIndex
void initIndex()
Definition: PFJetIDSelectionFunctor.h:900
cms::cuda::assert
assert(be >=bs)
PFJetIDSelectionFunctor::indexNHF_FW_
index_type indexNHF_FW_
Definition: PFJetIDSelectionFunctor.h:996
PFJetIDSelectionFunctor::WINTER16
Definition: PFJetIDSelectionFunctor.h:30
PFJetIDSelectionFunctor::indexNCH_
index_type indexNCH_
Definition: PFJetIDSelectionFunctor.h:988
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
PFJetIDSelectionFunctor::initCuts
void initCuts()
Definition: PFJetIDSelectionFunctor.h:628
quality
const uint32_t *__restrict__ Quality * quality
Definition: CAHitNtupletGeneratorKernelsImpl.h:109
PFJetIDSelectionFunctor::RUNIISTARTUP
Definition: PFJetIDSelectionFunctor.h:29
reco::PFJet::chargedHadronEnergy
float chargedHadronEnergy() const
chargedHadronEnergy
Definition: PFJet.h:95
PFJetIDSelectionFunctor::indexNCH_TR_
index_type indexNCH_TR_
Definition: PFJetIDSelectionFunctor.h:992
reco::BasicJet
Jets made from CaloTowers.
Definition: BasicJet.h:19
pat::Jet
Analysis-level calorimeter jet class.
Definition: Jet.h:77
reco::PFJet::HFEMEnergy
float HFEMEnergy() const
HFEMEnergy.
Definition: PFJet.h:119
pat::Jet::chargedHadronEnergy
float chargedHadronEnergy() const
chargedHadronEnergy
Definition: Jet.h:696
PFJetIDSelectionFunctor::indexNHF_TR_
index_type indexNHF_TR_
Definition: PFJetIDSelectionFunctor.h:990
Selector< pat::Jet >::push_back
virtual void push_back(std::string const &s)
This is the registration of an individual cut string.
Definition: Selector.h:42
reco::PFJet::chargedMultiplicity
int chargedMultiplicity() const
chargedMultiplicity
Definition: PFJet.h:152
pat::Jet::neutralEmEnergy
float neutralEmEnergy() const
neutralEmEnergy
Definition: Jet.h:726
PFJetIDSelectionFunctor::WINTER17PUPPI
Definition: PFJetIDSelectionFunctor.h:32
PFJetIDSelectionFunctor::version_
Version_t version_
Definition: PFJetIDSelectionFunctor.h:979
reco::PFJet::chargedEmEnergy
float chargedEmEnergy() const
chargedEmEnergy
Definition: PFJet.h:139
PFJetIDSelectionFunctor::indexNHF_
index_type indexNHF_
Definition: PFJetIDSelectionFunctor.h:985
PFJetIDSelectionFunctor::SUMMER18PUPPI
Definition: PFJetIDSelectionFunctor.h:34
PFJetIDSelectionFunctor::indexMUF_TR_
index_type indexMUF_TR_
Definition: PFJetIDSelectionFunctor.h:993
PFJetIDSelectionFunctor::indexNNeutrals_FW_
index_type indexNNeutrals_FW_
Definition: PFJetIDSelectionFunctor.h:998
pat::Jet::chargedMultiplicity
int chargedMultiplicity() const
chargedMultiplicity
Definition: Jet.h:746
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
pat::Jet::neutralHadronEnergy
float neutralHadronEnergy() const
neutralHadronEnergy
Definition: Jet.h:706
PFJetIDSelectionFunctor::indexNEF_EC_
index_type indexNEF_EC_
Definition: PFJetIDSelectionFunctor.h:1003
reco::PFJet::photonEnergy
float photonEnergy() const
photonEnergy
Definition: PFJet.h:103
Selector< pat::Jet >::getBitTemplate
pat::strbitset getBitTemplate() const
Get an empty bitset with the proper names.
Definition: Selector.h:168
pat::Jet::chargedEmEnergy
float chargedEmEnergy() const
chargedEmEnergy
Definition: Jet.h:716
PFJetIDSelectionFunctor::N_VERSIONS
Definition: PFJetIDSelectionFunctor.h:37
reco::Candidate::end
const_iterator end() const
last daughter const_iterator
Definition: Candidate.h:145
pat::Jet::neutralEmEnergyFraction
float neutralEmEnergyFraction() const
neutralEmEnergyFraction (relative to uncorrected jet energy)
Definition: Jet.h:412
Selector< pat::Jet >::passCut
void passCut(pat::strbitset &ret, std::string const &s)
Passing cuts.
Definition: Selector.h:142
pat::Jet::isBasicJet
bool isBasicJet() const
check to see if the jet is no more than a reco::BasicJet
Definition: Jet.h:277
pat::Jet::neutralMultiplicity
int neutralMultiplicity() const
neutralMultiplicity
Definition: Jet.h:466
PFJetIDSelectionFunctor::indexNEF_EC_U_
index_type indexNEF_EC_U_
Definition: PFJetIDSelectionFunctor.h:1005
PFJetIDSelectionFunctor::operator()
bool operator()(const pat::Jet &jet, pat::strbitset &ret) override
This provides the interface for base classes to select objects.
Definition: PFJetIDSelectionFunctor.h:224
PFJetIDSelectionFunctor::indexNEF_TR_
index_type indexNEF_TR_
Definition: PFJetIDSelectionFunctor.h:991
PFJetIDSelectionFunctor::indexNNeutrals_FW_L_
index_type indexNNeutrals_FW_L_
Definition: PFJetIDSelectionFunctor.h:999
Selector< pat::Jet >::setIgnoredCuts
void setIgnoredCuts(std::vector< std::string > const &bitsToIgnore)
set the bits to ignore from a vector
Definition: Selector.h:131
PFJetIDSelectionFunctor::indexMUF_
index_type indexMUF_
Definition: PFJetIDSelectionFunctor.h:984
PFJetIDSelectionFunctor::indexCHF_
index_type indexCHF_
Definition: PFJetIDSelectionFunctor.h:987
pat::Jet::isPFJet
bool isPFJet() const
check to see if the jet is a reco::PFJet
Definition: Jet.h:275
pat::Jet::chargedEmEnergyFraction
float chargedEmEnergyFraction() const
chargedEmEnergyFraction (relative to uncorrected jet energy)
Definition: Jet.h:408
PFJetIDSelectionFunctor::indexNEF_FW_
index_type indexNEF_FW_
Definition: PFJetIDSelectionFunctor.h:997
PFJetIDSelectionFunctor::TIGHT
Definition: PFJetIDSelectionFunctor.h:39
pat::Jet::muonEnergy
float muonEnergy() const
muonEnergy
Definition: Jet.h:430
PFJetIDSelectionFunctor::indexCEF_TR_
index_type indexCEF_TR_
Definition: PFJetIDSelectionFunctor.h:994
pat::Jet::chargedHadronEnergyFraction
float chargedHadronEnergyFraction() const
chargedHadronEnergyFraction (relative to uncorrected jet energy)
Definition: Jet.h:400
Selector< pat::Jet >::cut
int cut(index_type const &i, int val) const
Access the int cut values at index "s".
Definition: Selector.h:158
reco::PFJet::neutralHadronEnergy
float neutralHadronEnergy() const
neutralHadronEnergy
Definition: PFJet.h:99
metsig::jet
Definition: SignAlgoResolutions.h:47
pat::Jet::muonEnergyFraction
float muonEnergyFraction() const
muonEnergyFraction (relative to corrected jet energy)
Definition: Jet.h:432
reco::PFJet::neutralMultiplicity
int neutralMultiplicity() const
neutralMultiplicity
Definition: PFJet.h:154
PFJetIDSelectionFunctor::PFJetIDSelectionFunctor
PFJetIDSelectionFunctor()
Definition: PFJetIDSelectionFunctor.h:41
reco::PFJet
Jets made from PFObjects.
Definition: PFJet.h:20
PFJetIDSelectionFunctor::TIGHTLEPVETO
Definition: PFJetIDSelectionFunctor.h:39
reco::PFJet::neutralEmEnergy
float neutralEmEnergy() const
neutralEmEnergy
Definition: PFJet.h:147
PFJetIDSelectionFunctor::WINTER17
Definition: PFJetIDSelectionFunctor.h:31
reco::LeafCandidate::energy
double energy() const final
energy
Definition: LeafCandidate.h:125
Selector< pat::Jet >::set
void set(std::string const &s, bool val=true)
Set a given selection cut, on or off.
Definition: Selector.h:93
PFJetIDSelectionFunctor::SUMMER18
Definition: PFJetIDSelectionFunctor.h:33
PFJetIDSelectionFunctor::indexNNeutrals_FW_U_
index_type indexNNeutrals_FW_U_
Definition: PFJetIDSelectionFunctor.h:1000
PFJetIDSelectionFunctor::quality_
Quality_t quality_
Definition: PFJetIDSelectionFunctor.h:980
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
BeamSplash_cfg.version
version
Definition: BeamSplash_cfg.py:45
PFJetIDSelectionFunctor::indexNHF_EC_
index_type indexNHF_EC_
Definition: PFJetIDSelectionFunctor.h:1002
reco::Candidate::begin
const_iterator begin() const
first daughter const_iterator
Definition: Candidate.h:143
reco::PFJet::electronEnergy
float electronEnergy() const
electronEnergy
Definition: PFJet.h:107
PFJetIDSelectionFunctor::indexCEF_
index_type indexCEF_
Definition: PFJetIDSelectionFunctor.h:986
PFJetIDSelectionFunctor::RUN2ULCHS
Definition: PFJetIDSelectionFunctor.h:35
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
PFJetIDSelectionFunctor::LOOSE
Definition: PFJetIDSelectionFunctor.h:39