11 #include "TMatrixDSym.h"
12 #include "TMatrixDSymEigen.h"
31 const std::vector<edm::ParameterSet>& trainings = ps.
getParameter<std::vector <edm::ParameterSet> >(
"trainings");
35 jEtaMin_.push_back( trainings.at(
v).getParameter<
double>(
"jEtaMin") );
36 jEtaMax_.push_back( trainings.at(
v).getParameter<
double>(
"jEtaMax") );
39 tmvaEtaVariables_.push_back( trainings.at(
v).getParameter<std::vector<std::string> >(
"tmvaVariables") );
52 for(
int i0 = 0; i0 < 3; i0++) {
58 for(
int i1 = 0; i1 < nCut; i1++) {
60 if(
cutBased_ && i1 == 0) lFullCutType =
"BetaStar"+ lCutType;
61 if(
cutBased_ && i1 == 1) lFullCutType =
"RMS" + lCutType;
62 std::vector<double> pt010 = jetConfig.
getParameter<std::vector<double> >((
"Pt010_" +lFullCutType).c_str());
63 std::vector<double> pt1020 = jetConfig.
getParameter<std::vector<double> >((
"Pt1020_"+lFullCutType).c_str());
64 std::vector<double> pt2030 = jetConfig.
getParameter<std::vector<double> >((
"Pt2030_"+lFullCutType).c_str());
65 std::vector<double> pt3050 = jetConfig.
getParameter<std::vector<double> >((
"Pt3050_"+lFullCutType).c_str());
67 for(
int i2 = 0; i2 < 4; i2++)
mvacut_[i0][0][i2] = pt010 [i2];
68 for(
int i2 = 0; i2 < 4; i2++)
mvacut_[i0][1][i2] = pt1020[i2];
69 for(
int i2 = 0; i2 < 4; i2++)
mvacut_[i0][2][i2] = pt2030[i2];
70 for(
int i2 = 0; i2 < 4; i2++)
mvacut_[i0][3][i2] = pt3050[i2];
73 for(
int i2 = 0; i2 < 4; i2++)
betaStarCut_[i0][0][i2] = pt010 [i2];
74 for(
int i2 = 0; i2 < 4; i2++)
betaStarCut_[i0][1][i2] = pt1020[i2];
75 for(
int i2 = 0; i2 < 4; i2++)
betaStarCut_[i0][2][i2] = pt2030[i2];
76 for(
int i2 = 0; i2 < 4; i2++)
betaStarCut_[i0][3][i2] = pt3050[i2];
79 for(
int i2 = 0; i2 < 4; i2++)
rmsCut_[i0][0][i2] = pt010 [i2];
80 for(
int i2 = 0; i2 < 4; i2++)
rmsCut_[i0][1][i2] = pt1020[i2];
81 for(
int i2 = 0; i2 < 4; i2++)
rmsCut_[i0][2][i2] = pt2030[i2];
82 for(
int i2 = 0; i2 < 4; i2++)
rmsCut_[i0][3][i2] = pt3050[i2];
93 Float_t impactParTkThreshod,
126 void assign(
const std::vector<float> & vec,
float &
a,
float &
b,
float &
c,
float &
d )
128 size_t sz = vec.size();
129 a = ( sz > 0 ? vec[0] : 0. );
130 b = ( sz > 1 ? vec[1] : 0. );
131 c = ( sz > 2 ? vec[2] : 0. );
132 d = ( sz > 3 ? vec[3] : 0. );
147 std::unique_ptr<TMVA::Reader> etaReader = std::unique_ptr<TMVA::Reader>(
new TMVA::Reader(
"!Color:Silent"));
151 reader_ = std::unique_ptr<TMVA::Reader>(
new TMVA::Reader(
"!Color:Silent"));
229 if(jetPt >= 10 && jetPt < 20) ptId = 1;
230 if(jetPt >= 20 && jetPt < 30) ptId = 2;
231 if(jetPt >= 30 ) ptId = 3;
238 return std::pair<int,int>(ptId,etaId);
243 std::pair<int,int> jetIdKey =
getJetIdKey(jetPt,jetEta);
244 float betaStarModified = betaStarClassic/
log(nvtx-0.64);
262 std::pair<int,int> jetIdKey =
getJetIdKey(jetPt,jetEta);
289 static std::atomic<int> printWarning{10};
297 assert( patjet !=
nullptr || pfjet !=
nullptr );
298 if( patjet !=
nullptr && jec == 0. ) {
305 const reco::Candidate* lLead =
nullptr, *lSecond =
nullptr, *lLeadNeut =
nullptr, *lLeadEm =
nullptr, *lLeadCh =
nullptr, *lTrail =
nullptr;
306 std::vector<float>
frac, fracCh, fracEm, fracNeut;
307 float cones[] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7 };
308 size_t ncones =
sizeof(cones)/
sizeof(
float);
317 TMatrixDSym covMatrix(2); covMatrix = 0.;
319 float sumPt = 0., sumPt2 = 0., sumTkPt = 0.,sumPtCh=0,sumPtNe = 0;
333 bool isPacked =
true;
334 if (lPack ==
nullptr){
338 float candPt = icand->
pt();
339 float candPtFrac = candPt/
jetPt;
341 float candDeta = icand->
eta() - jet->
eta();
343 float candPtDr = candPt * candDr;
344 size_t icone = std::lower_bound(&cones[0],&cones[ncones],candDr) - &cones[0];
346 if(candDr < dRmin) dRmin = candDr;
349 if( lLead ==
nullptr || candPt > lLead->
pt() ) {
352 }
else if( (lSecond ==
nullptr || candPt > lSecond->pt()) && (candPt < lLead->
pt()) ) {
359 covMatrix(0,0) += candPt*candPt*candDeta*candDeta;
360 covMatrix(0,1) += candPt*candPt*candDeta*candDphi;
361 covMatrix(1,1) += candPt*candPt*candDphi*candDphi;
364 sumPt2 += candPt*candPt;
367 frac.push_back(candPtFrac);
369 if( icone < ncones ) { *coneFracs[icone] += candPt; }
373 if (lLeadNeut ==
nullptr || candPt > lLeadNeut->pt()) { lLeadNeut = icand; }
375 fracNeut.push_back(candPtFrac);
376 if( icone < ncones ) { *coneNeutFracs[icone] += candPt; }
381 if( icand->
pdgId() == 22 ) {
382 if(lLeadEm ==
nullptr || candPt > lLeadEm->pt()) { lLeadEm = icand; }
384 fracEm.push_back(candPtFrac);
385 if( icone < ncones ) { *coneEmFracs[icone] += candPt; }
390 if( icand->
charge() != 0 ) {
391 if (lLeadCh ==
nullptr || candPt > lLeadCh->pt()) {
395 if (lPF &&
std::abs(icand->
pdgId()) == 13 && pfTrk ==
nullptr){
400 edm::LogWarning(
"BadMuon")<<
"Found a PFCandidate muon without a trackRef: falling back to Muon::bestTrack ";
419 fracCh.push_back(candPtFrac);
420 if( icone < ncones ) { *coneChFracs[icone] += candPt; }
424 if( icand->
charge() != 0 ) {
432 bool inAnyOther =
false;
436 for(reco::VertexCollection::const_iterator vi=allvtx.begin(); vi!=allvtx.end(); ++vi ) {
438 if( iv.
isFake() || iv.
ndof() < 4 ) {
continue; }
443 if( ! isVtx0 && ! inAnyOther ) {
450 if( inVtx0 && ! inAnyOther ) {
452 }
else if( ! inVtx0 && inAnyOther ) {
458 }
else if( dZ < 0.2 ) {
467 bool inVtxOther =
false;
469 double dZ_tmp = 9999.;
470 for (
unsigned vtx_i = 0 ; vtx_i < allvtx.size() ; vtx_i++ ) {
471 auto iv = allvtx[vtx_i];
477 bool isVtx0 = (iv.position() - vtx->
position()).
r() < 0.02;
481 if (lPack->
fromPV(vtx_i) == 0) inVtxOther =
true;
482 dZ0 = lPack->
dz(vtx_i);
485 if (fabs(lPack->
dz(iv.position())) < fabs(dZ_tmp)) {
486 dZ_tmp = lPack->
dz(iv.position());
491 }
else if (inVtxOther){
494 if (fabs(dZ0) < 0.2){
496 }
else if (fabs(dZ_tmp) < 0.2){
502 if( lTrail ==
nullptr || candPt < lTrail->
pt() ) {
509 assert( !(lLead ==
nullptr) );
511 if ( lSecond ==
nullptr ) { lSecond = lTrail; }
512 if ( lLeadNeut ==
nullptr ) { lLeadNeut = lTrail; }
513 if ( lLeadEm ==
nullptr ) { lLeadEm = lTrail; }
514 if ( lLeadCh ==
nullptr ) { lLeadCh = lTrail; }
516 if( patjet !=
nullptr ) {
535 float sum_deta(0.0),sum_dphi(0.0);
536 float ave_deta(0.0), ave_dphi(0.0);
539 if (!(
part.isAvailable() &&
part.isNonnull()) ){
544 float weight2 = weight *
weight;
546 float deta =
part->eta() - jet->
eta();
548 sum_deta += deta*weight2;
549 sum_dphi += dphi*weight2;
551 ave_deta = sum_deta/sumW2;
552 ave_dphi = sum_dphi/sumW2;
556 float ddetaR_sum(0.0), ddphiR_sum(0.0), pull_tmp(0.0);
559 if (!(
part.isAvailable() &&
part.isNonnull()) ){
563 float deta =
part->eta() - jet->
eta();
565 float ddeta, ddphi, ddR;
566 ddeta = deta - ave_deta ;
567 ddphi = dphi-ave_dphi;
568 ddR =
sqrt(ddeta*ddeta + ddphi*ddphi);
569 ddetaR_sum += ddR*ddeta*
weight;
570 ddphiR_sum += ddR*ddphi*
weight;
573 float ddetaR_ave = ddetaR_sum/sumW2;
574 float ddphiR_ave = ddphiR_sum/sumW2;
575 pull_tmp =
sqrt(ddetaR_ave*ddetaR_ave+ddphiR_ave*ddphiR_ave);
587 std::sort(frac.begin(),frac.end(),std::greater<float>());
588 std::sort(fracCh.begin(),fracCh.end(),std::greater<float>());
589 std::sort(fracEm.begin(),fracEm.end(),std::greater<float>());
590 std::sort(fracNeut.begin(),fracNeut.end(),std::greater<float>());
596 covMatrix(0,0) /= sumPt2;
597 covMatrix(0,1) /= sumPt2;
598 covMatrix(1,1) /= sumPt2;
599 covMatrix(1,0) = covMatrix(0,1);
603 TVectorD eigVals(2); eigVals = TMatrixDSymEigen(covMatrix).GetEigenValues();
616 for(
size_t ic=0; ic<ncones; ++ic){
617 *coneFracs[ic] /=
jetPt;
618 *coneEmFracs[ic] /=
jetPt;
619 *coneNeutFracs[ic] /=
jetPt;
620 *coneChFracs[ic] /=
jetPt;
625 for(
unsigned int i0 = 0; i0 < frac.size(); i0++) {ptRMS+=(frac[i0]-ptMean)*(frac[i0]-ptMean);}
643 if( sumTkPt != 0. ) {
664 std::stringstream
out;
665 for(variables_list_t::const_iterator it=
variables_.begin();
667 out << std::setw(15) << it->first << std::setw(3) <<
"="
668 << std::setw(5) << *it->second.first
669 <<
" (" << std::setw(5) << it->second.second <<
")" << std::endl;
678 for(variables_list_t::iterator it=
variables_.begin();
680 *it->second.first = it->second.second;
685 #define INIT_VARIABLE(NAME,TMVANAME,VAL) \
686 internalId_.NAME ## _ = VAL; \
687 variables_[ # NAME ] = std::make_pair(& internalId_.NAME ## _, VAL);
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
T getParameter(std::string const &) const
void set(const PileupJetIdentifier &)
std::vector< std::string > tmvaEtaWeights_
std::vector< std::string > tmvaVariables_
bool isNonnull() const
Checks for non-null.
#define INIT_VARIABLE(NAME, TMVANAME, VAL)
float chargedHadronEnergy() const
chargedHadronEnergy
float chargedEmEnergy() const
chargedEmEnergy
float neutralEmEnergy() const
neutralEmEnergy
virtual double energy() const final
energy
CandidatePtr daughterPtr(size_type i) const
reference to daughter at given position
virtual const Track * bestTrack() const
virtual double pt() const =0
transverse momentum
T const * get() const
Returns C++ pointer to the item.
Base class for all types of Jets.
float neutralHadronEnergy() const
neutralHadronEnergy
std::pair< int, int > getJetIdKey(float jetPt, float jetEta)
std::map< std::string, std::string > tmvaNames_
std::vector< double > jEtaMin_
std::vector< Vertex > VertexCollection
collection of Vertex objects
int neutralMultiplicity() const
neutralMultiplicity
float impactParTkThreshod_
int computeCutIDflag(float betaStarClassic, float dR2Mean, float nvtx, float jetPt, float jetEta)
int chargedMultiplicity() const
chargedMultiplicity
const Point & position() const
position
Jets made from PFObjects.
float neutralEmEnergy() const
neutralEmEnergy
float chargedEmEnergy() const
chargedEmEnergy
reco::TrackRef trackRef() const
virtual const Track * bestTrack() const
best track pointer
virtual size_t numberOfDaughters() const
number of daughters
virtual CandidatePtr sourceCandidatePtr(size_type i) const
float betaStarCut_[3][4][4]
PileupJetIdentifier internalId_
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
const PVAssoc fromPV(size_t ipv=0) const
std::string dumpVariables() const
std::vector< std::vector< std::string > > tmvaEtaVariables_
Abs< T >::type abs(const T &t)
virtual const reco::Track & pseudoTrack() const
Return reference to a pseudo track made with candidate kinematics, parameterized error for eta...
auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
void assign(const std::vector< float > &vec, float &a, float &b, float &c, float &d)
float trackWeight(const TREF &r) const
returns the weight with which a Track has contributed to the vertex-fit.
virtual int charge() const =0
electric charge
virtual size_type numberOfSourceCandidatePtrs() const
T const * get() const
Returns C++ pointer to the item.
PileupJetIdAlgo(int version=PHILv0, const std::string &tmvaWeight="", const std::string &tmvaMethod="", Float_t impactParTkThreshod_=1., const std::vector< std::string > &tmvaVariables=std::vector< std::string >(), bool runMvas=true)
virtual double mass() const final
mass
int computeIDflag(float mva, float jetPt, float jetEta)
int neutralMultiplicity() const
neutralMultiplicity
reco::MuonRef muonRef() const
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...
virtual int pdgId() const =0
PDG identifier.
void setPtEtaPhi(const reco::Candidate &p, float &pt, float &eta, float &phi)
double deltaPhi(double phi1, double phi2)
PileupJetIdentifier computeIdVariables(const reco::Jet *jet, float jec, const reco::Vertex *, const reco::VertexCollection &, double rho)
unsigned int nCharged(const GenJet &jet)
PileupJetIdentifier computeMva()
Analysis-level calorimeter jet class.
std::vector< std::string > tmvaSpectators_
TMVA::IMethod * loadTMVAWeights(TMVA::Reader *reader, const std::string &method, const std::string &weightFile, bool verbose=false)
Geom::Phi< T > phi() const
Particle reconstructed by the particle flow algorithm.
std::unique_ptr< TMVA::Reader > reader_
virtual int nConstituents() const
of constituents
std::vector< double > jEtaMax_
reco::GsfTrackRef gsfTrackRef() const
variables_list_t variables_
float neutralHadronEnergy() const
neutralHadronEnergy
virtual double eta() const final
momentum pseudorapidity
std::string fullPath() const
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Jet correctedJet(const std::string &level, const std::string &flavor="none", const std::string &set="") const
int chargedMultiplicity() const
chargedMultiplicity
float chargedHadronEnergy() const
chargedHadronEnergy
std::vector< std::unique_ptr< TMVA::Reader > > etaReader_
virtual double phi() const =0
momentum azimuthal angle
virtual double eta() const =0
momentum pseudorapidity
virtual double pt() const final
transverse momentum