12 #include "TMatrixDSym.h" 13 #include "TMatrixDSymEigen.h" 23 : cutBased_(ps.getParameter<
bool>(
"cutBased")),
24 etaBinnedWeights_(
false),
27 label_(ps.getParameter<
std::
string>(
"label")),
31 std::vector<edm::FileInPath> tmvaEtaWeights;
36 etaBinnedWeights_ = ps.getParameter<
bool>(
"etaBinnedWeights");
37 if (etaBinnedWeights_) {
38 const std::vector<edm::ParameterSet>&
trainings = ps.getParameter<std::vector<edm::ParameterSet> >(
"trainings");
39 nEtaBins_ = ps.getParameter<
int>(
"nEtaBins");
40 for (
int v = 0;
v < nEtaBins_;
v++) {
42 jEtaMin_.push_back(
trainings.at(
v).getParameter<
double>(
"jEtaMin"));
43 jEtaMax_.push_back(
trainings.at(
v).getParameter<
double>(
"jEtaMax"));
45 for (
int v = 0;
v < nEtaBins_;
v++) {
46 tmvaEtaVariables_.push_back(
trainings.at(
v).getParameter<std::vector<std::string> >(
"tmvaVariables"));
49 tmvaVariables_ = ps.getParameter<std::vector<std::string> >(
"tmvaVariables");
51 tmvaMethod_ = ps.getParameter<
std::string>(
"tmvaMethod");
52 tmvaSpectators = ps.getParameter<std::vector<std::string> >(
"tmvaSpectators");
53 version = ps.getParameter<
int>(
"version");
59 for (
int i0 = 0; i0 < 3; i0++) {
68 for (
int i1 = 0;
i1 < nCut;
i1++) {
70 if (cutBased_ &&
i1 == 0)
71 lFullCutType =
"BetaStar" + lCutType;
72 if (cutBased_ &&
i1 == 1)
73 lFullCutType =
"RMS" + lCutType;
74 std::vector<double> pt010 = jetConfig.
getParameter<std::vector<double> >((
"Pt010_" + lFullCutType).c_str());
75 std::vector<double> pt1020 = jetConfig.
getParameter<std::vector<double> >((
"Pt1020_" + lFullCutType).c_str());
76 std::vector<double> pt2030 = jetConfig.
getParameter<std::vector<double> >((
"Pt2030_" + lFullCutType).c_str());
77 std::vector<double> pt3040 = jetConfig.
getParameter<std::vector<double> >((
"Pt3040_" + lFullCutType).c_str());
78 std::vector<double> pt4050 = jetConfig.
getParameter<std::vector<double> >((
"Pt4050_" + lFullCutType).c_str());
80 for (
int i2 = 0;
i2 < 4;
i2++)
81 mvacut_[i0][0][
i2] = pt010[
i2];
82 for (
int i2 = 0;
i2 < 4;
i2++)
83 mvacut_[i0][1][
i2] = pt1020[
i2];
84 for (
int i2 = 0;
i2 < 4;
i2++)
85 mvacut_[i0][2][
i2] = pt2030[
i2];
86 for (
int i2 = 0;
i2 < 4;
i2++)
87 mvacut_[i0][3][
i2] = pt3040[
i2];
88 for (
int i2 = 0;
i2 < 4;
i2++)
89 mvacut_[i0][4][
i2] = pt4050[
i2];
91 if (cutBased_ &&
i1 == 0) {
92 for (
int i2 = 0;
i2 < 4;
i2++)
93 betaStarCut_[i0][0][
i2] = pt010[
i2];
94 for (
int i2 = 0;
i2 < 4;
i2++)
95 betaStarCut_[i0][1][
i2] = pt1020[
i2];
96 for (
int i2 = 0;
i2 < 4;
i2++)
97 betaStarCut_[i0][2][
i2] = pt2030[
i2];
98 for (
int i2 = 0;
i2 < 4;
i2++)
99 betaStarCut_[i0][3][
i2] = pt3040[
i2];
100 for (
int i2 = 0;
i2 < 4;
i2++)
101 betaStarCut_[i0][4][
i2] = pt4050[
i2];
103 if (cutBased_ &&
i1 == 1) {
104 for (
int i2 = 0;
i2 < 4;
i2++)
105 rmsCut_[i0][0][
i2] = pt010[
i2];
106 for (
int i2 = 0;
i2 < 4;
i2++)
107 rmsCut_[i0][1][
i2] = pt1020[
i2];
108 for (
int i2 = 0;
i2 < 4;
i2++)
109 rmsCut_[i0][2][
i2] = pt2030[
i2];
110 for (
int i2 = 0;
i2 < 4;
i2++)
111 rmsCut_[i0][3][
i2] = pt3040[
i2];
112 for (
int i2 = 0;
i2 < 4;
i2++)
113 rmsCut_[i0][4][
i2] = pt4050[
i2];
119 assert(tmvaMethod_.empty() || ((!tmvaVariables_.empty() || (!tmvaEtaVariables_.empty())) &&
version ==
USER));
122 if ((!cutBased_) && (runMvas_)) {
123 if (etaBinnedWeights_) {
124 for (
int v = 0;
v < nEtaBins_;
v++) {
139 void assign(
const std::vector<float>& vec,
float&
a,
float&
b,
float&
c,
float&
d) {
140 size_t sz = vec.size();
141 a = (sz > 0 ? vec[0] : 0.);
142 b = (sz > 1 ? vec[1] : 0.);
143 c = (sz > 2 ? vec[2] : 0.);
144 d = (sz > 3 ? vec[3] : 0.);
159 const std::unique_ptr<const GBRForest>&
reader) {
160 std::vector<float>
vars;
161 for (std::vector<std::string>::const_iterator
it = varList.begin();
it != varList.end(); ++
it) {
216 return std::pair<int, int>(ptId, etaId);
221 float betaStarModified = betaStarClassic /
log(nvtx - 0.64);
267 bool applyConstituentWeight) {
274 assert(patjet !=
nullptr || pfjet !=
nullptr);
275 if (patjet !=
nullptr &&
jec == 0.) {
282 const reco::Candidate *lLead =
nullptr, *lSecond =
nullptr, *lLeadNeut =
nullptr, *lLeadEm =
nullptr,
283 *lLeadCh =
nullptr, *lTrail =
nullptr;
285 std::vector<float>
frac, fracCh, fracEm, fracNeut;
286 float cones[] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7};
287 size_t ncones =
sizeof(cones) /
sizeof(
float);
316 TMatrixDSym covMatrix(2);
319 float sumPt = 0., sumPt2 = 0., sumTkPt = 0., sumPtCh = 0, sumPtNe = 0;
320 float multNeut = 0.0;
322 float sum_deta(0.0), sum_dphi(0.0);
323 float ave_deta(0.0), ave_dphi(0.0);
331 float LeadcandWeight = 1.0;
332 float SecondcandWeight = 1.0;
333 float LeadNeutcandWeight = 1.0;
334 float LeadEmcandWeight = 1.0;
335 float LeadChcandWeight = 1.0;
336 float TrailcandWeight = 1.0;
338 for (
unsigned i = 0;
i <
jet->numberOfSourceCandidatePtrs(); ++
i) {
344 bool isPacked =
true;
345 if (lPack ==
nullptr) {
349 float candWeight = 1.0;
350 if (applyConstituentWeight) {
351 candWeight = constituentWeights[
jet->sourceCandidatePtr(
i)];
353 float candPt = (icand->
pt()) * candWeight;
354 float candPtFrac = candPt /
jetPt;
356 float candDeta = icand->
eta() -
jet->eta();
358 float candPtDr = candPt * candDr;
359 size_t icone =
std::lower_bound(&cones[0], &cones[ncones], candDr) - &cones[0];
365 if (lLead ==
nullptr || candPt > (lLead->
pt()) * LeadcandWeight) {
367 SecondcandWeight = LeadcandWeight;
369 if (applyConstituentWeight) {
370 LeadcandWeight = constituentWeights[
jet->sourceCandidatePtr(
i)];
372 }
else if ((lSecond ==
nullptr || candPt > (lSecond->pt()) * SecondcandWeight) &&
373 (candPt < (lLead->
pt()) * LeadcandWeight)) {
375 if (applyConstituentWeight) {
376 SecondcandWeight = constituentWeights[
jet->sourceCandidatePtr(
i)];
383 covMatrix(0, 0) += candPt * candPt * candDeta * candDeta;
384 covMatrix(0, 1) += candPt * candPt * candDeta * candDphi;
385 covMatrix(1, 1) += candPt * candPt * candDphi * candDphi;
388 sumPt2 += candPt * candPt;
391 frac.push_back(candPtFrac);
393 if (icone < ncones) {
394 *coneFracs[icone] += candPt;
399 if (lLeadNeut ==
nullptr || candPt > (lLeadNeut->pt()) * LeadNeutcandWeight) {
401 if (applyConstituentWeight) {
402 LeadNeutcandWeight = constituentWeights[
jet->sourceCandidatePtr(
i)];
407 fracNeut.push_back(candPtFrac);
408 if (icone < ncones) {
409 *coneNeutFracs[icone] += candPt;
413 multNeut += candWeight;
417 if (icand->
pdgId() == 22) {
418 if (lLeadEm ==
nullptr || candPt > (lLeadEm->pt()) * LeadEmcandWeight) {
420 if (applyConstituentWeight) {
421 LeadEmcandWeight = constituentWeights[
jet->sourceCandidatePtr(
i)];
425 fracEm.push_back(candPtFrac);
426 if (icone < ncones) {
427 *coneEmFracs[icone] += candPt;
431 multNeut += candWeight;
435 multNeut += candWeight;
438 if (icand->
charge() != 0) {
439 if (lLeadCh ==
nullptr || candPt > (lLeadCh->pt()) * LeadChcandWeight) {
441 if (applyConstituentWeight) {
442 LeadChcandWeight = constituentWeights[
jet->sourceCandidatePtr(
i)];
445 if (lPF &&
std::abs(icand->
pdgId()) == 13 && pfTrk ==
nullptr) {
451 <<
"Found a PFCandidate muon without a trackRef: falling back to Muon::bestTrack ";
454 if (pfTrk ==
nullptr) {
459 }
else if (lPF !=
nullptr) {
471 fracCh.push_back(candPtFrac);
472 if (icone < ncones) {
473 *coneChFracs[icone] += candPt;
478 if (icand->
charge() != 0) {
484 bool inVtx0 =
vtx->trackWeight(lPF->
trackRef()) > 0;
486 bool inAnyOther =
false;
490 for (reco::VertexCollection::const_iterator vi = allvtx.begin(); vi != allvtx.end(); ++vi) {
492 if (
iv.isFake() ||
iv.ndof() < 4) {
496 bool isVtx0 = (
iv.position() -
vtx->position()).
r() < 0.02;
499 if (!isVtx0 && !inAnyOther) {
500 inAnyOther =
vtx->trackWeight(lPF->
trackRef()) <= 0;
506 if (inVtx0 && !inAnyOther) {
508 }
else if (!inVtx0 && inAnyOther) {
514 }
else if (
dZ < 0.2) {
522 bool inVtxOther =
false;
524 double dZ_tmp = 9999.;
525 for (
unsigned vtx_i = 0; vtx_i < allvtx.size(); vtx_i++) {
526 const auto&
iv = allvtx[vtx_i];
532 bool isVtx0 = (
iv.position() -
vtx->position()).
r() < 0.02;
537 if (lPack->
fromPV(vtx_i) == 0)
539 dZ0 = lPack->
dz(
iv.position());
542 if (fabs(lPack->
dz(
iv.position())) < fabs(dZ_tmp)) {
543 dZ_tmp = lPack->
dz(
iv.position());
548 }
else if (inVtxOther) {
551 if (fabs(dZ0) < 0.2) {
553 }
else if (fabs(dZ_tmp) < 0.2) {
560 if (lTrail ==
nullptr || candPt < (lTrail->pt()) * TrailcandWeight) {
562 if (applyConstituentWeight) {
563 TrailcandWeight = constituentWeights[
jet->sourceCandidatePtr(
i)];
569 float weight2 = candPt * candPt;
571 float deta = icand->
eta() -
jet->eta();
573 sum_deta += deta * weight2;
574 sum_dphi += dphi * weight2;
577 ave_deta = sum_deta / sumW2;
578 ave_dphi = sum_dphi / sumW2;
584 assert(!(lLead ==
nullptr));
589 if (lSecond !=
nullptr) {
599 if (lLeadNeut !=
nullptr) {
609 if (lLeadEm !=
nullptr) {
619 if (lLeadCh !=
nullptr) {
629 if (patjet !=
nullptr) {
636 if (applyConstituentWeight)
645 if (applyConstituentWeight)
651 float ddetaR_sum(0.0), ddphiR_sum(0.0), pull_tmp(0.0);
652 for (
unsigned k = 0;
k <
jet->numberOfSourceCandidatePtrs();
k++) {
657 float candWeight = 1.0;
659 if (applyConstituentWeight)
660 candWeight = constituentWeights[
jet->sourceCandidatePtr(
k)];
662 float weight = candWeight * (
part->pt()) * candWeight * (
part->pt());
663 float deta =
part->eta() -
jet->eta();
665 float ddeta, ddphi, ddR;
666 ddeta = deta - ave_deta;
667 ddphi = dphi - ave_dphi;
668 ddR =
sqrt(ddeta * ddeta + ddphi * ddphi);
669 ddetaR_sum += ddR * ddeta *
weight;
670 ddphiR_sum += ddR * ddphi *
weight;
673 float ddetaR_ave = ddetaR_sum / sumW2;
674 float ddphiR_ave = ddphiR_sum / sumW2;
675 pull_tmp =
sqrt(ddetaR_ave * ddetaR_ave + ddphiR_ave * ddphiR_ave);
681 std::sort(fracCh.begin(), fracCh.end(), std::greater<float>());
682 std::sort(fracEm.begin(), fracEm.end(), std::greater<float>());
683 std::sort(fracNeut.begin(), fracNeut.end(), std::greater<float>());
695 covMatrix(0, 0) /= sumPt2;
696 covMatrix(0, 1) /= sumPt2;
697 covMatrix(1, 1) /= sumPt2;
698 covMatrix(1, 0) = covMatrix(0, 1);
703 eigVals = TMatrixDSymEigen(covMatrix).GetEigenValues();
711 if (lSecond !=
nullptr) {
720 for (
size_t ic = 0; ic < ncones; ++ic) {
721 *coneFracs[ic] /=
jetPt;
722 *coneEmFracs[ic] /=
jetPt;
723 *coneNeutFracs[ic] /=
jetPt;
724 *coneChFracs[ic] /=
jetPt;
729 for (
unsigned int i0 = 0; i0 <
frac.size(); i0++) {
730 ptRMS += (
frac[i0] - ptMean) * (
frac[i0] - ptMean);
746 if (lLeadCh !=
nullptr) {
773 std::stringstream
out;
775 out << std::setw(15) <<
it->first << std::setw(3) <<
"=" << std::setw(5) << *
it->second.first <<
" (" 776 << std::setw(5) <<
it->second.second <<
")" << std::endl;
785 *
it->second.first =
it->second.second;
790 #define INIT_VARIABLE(NAME, TMVANAME, VAL) \ 791 internalId_.NAME##_ = VAL; \ 792 variables_[#NAME] = std::make_pair(&internalId_.NAME##_, VAL);
constexpr double deltaPhi(double phi1, double phi2)
void set(const PileupJetIdentifier &)
reco::GsfTrackRef gsfTrackRef() const
T getParameter(std::string const &) const
std::vector< double > const & jEtaMin() const
AlgoGBRForestsAndConstants const * cache_
#define INIT_VARIABLE(NAME, TMVANAME, VAL)
AlgoGBRForestsAndConstants(edm::ParameterSet const &, bool runMvas)
float neutralHadronEnergy() const
neutralHadronEnergy
double pt() const final
transverse momentum
int chargedMultiplicity() const
chargedMultiplicity
int chargedMultiplicity() const
chargedMultiplicity
float chargedEmEnergy() const
chargedEmEnergy
float neutralEmEnergy() const
neutralEmEnergy
virtual double pt() const =0
transverse momentum
Base class for all types of Jets.
std::string dumpVariables() const
std::pair< int, int > getJetIdKey(float jetPt, float jetEta)
bool isNonnull() const
Checks for non-null.
std::vector< Vertex > VertexCollection
collection of Vertex objects
const PVAssoc fromPV(size_t ipv=0) const
int neutralMultiplicity() const
neutralMultiplicity
bool etaBinnedWeights() const
int computeCutIDflag(float betaStarClassic, float dR2Mean, float nvtx, float jetPt, float jetEta)
const Track * bestTrack() const override
int neutralMultiplicity() const
neutralMultiplicity
Jets made from PFObjects.
void swap(Association< C > &lhs, Association< C > &rhs)
std::vector< std::vector< std::string > > const & tmvaEtaVariables() const
float chargedHadronEnergy() const
chargedHadronEnergy
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
PileupJetIdentifier internalId_
PileupJetIdentifier computeIdVariables(const reco::Jet *jet, float jec, const reco::Vertex *, const reco::VertexCollection &, double rho, edm::ValueMap< float > &constituentWeights, bool applyConstituentWeight)
array_t const & mvacut() const
Abs< T >::type abs(const T &t)
std::vector< std::string > const & tmvaVariables() const
void assign(const std::vector< float > &vec, float &a, float &b, float &c, float &d)
virtual int charge() const =0
electric charge
Jet correctedJet(const std::string &level, const std::string &flavor="none", const std::string &set="") const
float chargedEmEnergy() const
chargedEmEnergy
reco::MuonRef muonRef() const
int computeIDflag(float mva, float jetPt, float jetEta)
T const * get() const
Returns C++ pointer to the item.
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
virtual int pdgId() const =0
PDG identifier.
float neutralHadronEnergy() const
neutralHadronEnergy
void setPtEtaPhi(const reco::Candidate &p, float &pt, float &eta, float &phi)
static constexpr float d0
std::vector< std::unique_ptr< const GBRForest > > const & etaReader() const
PileupJetIdentifier computeMva()
Analysis-level calorimeter jet class.
std::unique_ptr< const GBRForest > const & reader() const
float neutralEmEnergy() const
neutralEmEnergy
Particle reconstructed by the particle flow algorithm.
float chargedHadronEnergy() const
chargedHadronEnergy
virtual const Track * bestTrack() const
T const * get() const
Returns C++ pointer to the item.
variables_list_t variables_
reco::TrackRef trackRef() const
virtual float dxy() const
dxy with respect to the PV ref
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
Log< level::Warning, false > LogWarning
std::vector< double > const & jEtaMax() const
float getMVAval(const std::vector< std::string > &, const std::unique_ptr< const GBRForest > &)
PileupJetIdAlgo(AlgoGBRForestsAndConstants const *cache)
virtual double phi() const =0
momentum azimuthal angle
virtual double eta() const =0
momentum pseudorapidity
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...