CMS 3D CMS Logo

PileupJetIdAlgo.cc
Go to the documentation of this file.
2 
10 
11 #include "TMatrixDSym.h"
12 #include "TMatrixDSymEigen.h"
13 #include "TMVA/MethodBDT.h"
14 
15 // ------------------------------------------------------------------------------------------
17 
18 // ------------------------------------------------------------------------------------------
20 {
22  cutBased_ = false;
23  etaBinnedWeights_ = false;
25  //std::string label = ps.getParameter<std::string>("label");
26  cutBased_ = ps.getParameter<bool>("cutBased");
27  if(!cutBased_)
28  {
29  etaBinnedWeights_ = ps.getParameter<bool>("etaBinnedWeights");
31 
32  const std::vector<edm::ParameterSet>& trainings = ps.getParameter<std::vector <edm::ParameterSet> >("trainings");
33  nEtaBins_ = ps.getParameter<int>("nEtaBins");
34  for(int v=0; v<nEtaBins_;v++){
35  tmvaEtaWeights_.push_back( edm::FileInPath(trainings.at(v).getParameter<std::string>("tmvaWeights")).fullPath() );
36  jEtaMin_.push_back( trainings.at(v).getParameter<double>("jEtaMin") );
37  jEtaMax_.push_back( trainings.at(v).getParameter<double>("jEtaMax") );
38  }
39  for(int v=0; v<nEtaBins_;v++){
40  tmvaEtaVariables_.push_back( trainings.at(v).getParameter<std::vector<std::string> >("tmvaVariables") );
41  }
42  }
43  else{
45  tmvaVariables_ = ps.getParameter<std::vector<std::string> >("tmvaVariables");
46  }
47  tmvaMethod_ = ps.getParameter<std::string>("tmvaMethod");
48  tmvaSpectators_ = ps.getParameter<std::vector<std::string> >("tmvaSpectators");
49  version_ = ps.getParameter<int>("version");
50  }
51  else version_ = USER;
52  edm::ParameterSet jetConfig = ps.getParameter<edm::ParameterSet>("JetIdParams");
53  for(int i0 = 0; i0 < 3; i0++) {
54  std::string lCutType = "Tight";
55  if(i0 == PileupJetIdentifier::kMedium) lCutType = "Medium";
56  if(i0 == PileupJetIdentifier::kLoose) lCutType = "Loose";
57  int nCut = 1;
58  if(cutBased_) nCut++;
59  for(int i1 = 0; i1 < nCut; i1++) {
60  std::string lFullCutType = lCutType;
61  if(cutBased_ && i1 == 0) lFullCutType = "BetaStar"+ lCutType;
62  if(cutBased_ && i1 == 1) lFullCutType = "RMS" + lCutType;
63  std::vector<double> pt010 = jetConfig.getParameter<std::vector<double> >(("Pt010_" +lFullCutType).c_str());
64  std::vector<double> pt1020 = jetConfig.getParameter<std::vector<double> >(("Pt1020_"+lFullCutType).c_str());
65  std::vector<double> pt2030 = jetConfig.getParameter<std::vector<double> >(("Pt2030_"+lFullCutType).c_str());
66  std::vector<double> pt3050 = jetConfig.getParameter<std::vector<double> >(("Pt3050_"+lFullCutType).c_str());
67  if(!cutBased_) {
68  for(int i2 = 0; i2 < 4; i2++) mvacut_[i0][0][i2] = pt010 [i2];
69  for(int i2 = 0; i2 < 4; i2++) mvacut_[i0][1][i2] = pt1020[i2];
70  for(int i2 = 0; i2 < 4; i2++) mvacut_[i0][2][i2] = pt2030[i2];
71  for(int i2 = 0; i2 < 4; i2++) mvacut_[i0][3][i2] = pt3050[i2];
72  }
73  if(cutBased_ && i1 == 0) {
74  for(int i2 = 0; i2 < 4; i2++) betaStarCut_[i0][0][i2] = pt010 [i2];
75  for(int i2 = 0; i2 < 4; i2++) betaStarCut_[i0][1][i2] = pt1020[i2];
76  for(int i2 = 0; i2 < 4; i2++) betaStarCut_[i0][2][i2] = pt2030[i2];
77  for(int i2 = 0; i2 < 4; i2++) betaStarCut_[i0][3][i2] = pt3050[i2];
78  }
79  if(cutBased_ && i1 == 1) {
80  for(int i2 = 0; i2 < 4; i2++) rmsCut_[i0][0][i2] = pt010 [i2];
81  for(int i2 = 0; i2 < 4; i2++) rmsCut_[i0][1][i2] = pt1020[i2];
82  for(int i2 = 0; i2 < 4; i2++) rmsCut_[i0][2][i2] = pt2030[i2];
83  for(int i2 = 0; i2 < 4; i2++) rmsCut_[i0][3][i2] = pt3050[i2];
84  }
85  }
86  }
87  setup();
88 }
89 
90 // ------------------------------------------------------------------------------------------
92  const std::string & tmvaWeights,
93  const std::string & tmvaMethod,
94  Float_t impactParTkThreshod,
95  const std::vector<std::string> & tmvaVariables,
96  bool runMvas
97  )
98 {
99  impactParTkThreshod_ = impactParTkThreshod;
103  version_ = version;
104 
106 
107  setup();
108 }
109 
110 // ------------------------------------------------------------------------------------------
112 {
113  initVariables();
114 
115  if( ! cutBased_ ){
116  assert( tmvaMethod_.empty() || ((! tmvaVariables_.empty() || ( !tmvaEtaVariables_.empty() )) && version_ == USER) );
117  }
118  if(( ! cutBased_ ) && (runMvas_)) { bookReader();}
119 }
120 
121 // ------------------------------------------------------------------------------------------
123 {
124 }
125 
126 // ------------------------------------------------------------------------------------------
127 void assign(const std::vector<float> & vec, float & a, float & b, float & c, float & d )
128 {
129  size_t sz = vec.size();
130  a = ( sz > 0 ? vec[0] : 0. );
131  b = ( sz > 1 ? vec[1] : 0. );
132  c = ( sz > 2 ? vec[2] : 0. );
133  d = ( sz > 3 ? vec[3] : 0. );
134 }
135 // ------------------------------------------------------------------------------------------
136 void setPtEtaPhi(const reco::Candidate & p, float & pt, float & eta, float &phi )
137 {
138  pt = p.pt();
139  eta = p.eta();
140  phi = p.phi();
141 }
142 
143 std::unique_ptr<const GBRForest> PileupJetIdAlgo::getMVA(const std::vector<std::string> &varList, const std::string &tmvaWeights)
144 {
145  TMVA::Reader tmpTMVAReader( "!Color:Silent:!Error" );
146  for(std::vector<std::string>::const_iterator it=varList.begin(); it!=varList.end(); ++it) {
147  if( tmvaNames_[*it].empty() ) tmvaNames_[*it] = *it;
148  tmpTMVAReader.AddVariable( *it, variables_[ tmvaNames_[*it] ].first );
149  }
150  for(std::vector<std::string>::iterator it=tmvaSpectators_.begin(); it!=tmvaSpectators_.end(); ++it) {
151  if( tmvaNames_[*it].empty() ) tmvaNames_[*it] = *it;
152  tmpTMVAReader.AddSpectator( *it, variables_[ tmvaNames_[*it] ].first );
153  }
154  reco::details::loadTMVAWeights(&tmpTMVAReader, tmvaMethod_, tmvaWeights);
155  return( std::make_unique<const GBRForest> ( dynamic_cast<TMVA::MethodBDT*>( tmpTMVAReader.FindMVA(tmvaMethod_.c_str()) ) ) );
156 }
157 
159 {
160  if(etaBinnedWeights_){
161  for(int v=0; v<nEtaBins_;v++) etaReader_.push_back(getMVA(tmvaEtaVariables_.at(v), tmvaEtaWeights_.at(v)));
162  } else {
164  }
165 }
166 
167 // ------------------------------------------------------------------------------------------
169 {
170  internalId_ = id;
171 }
172 
173 // ------------------------------------------------------------------------------------------
174 
175 float PileupJetIdAlgo::getMVAval(const std::vector<std::string> &varList, const std::unique_ptr<const GBRForest> &reader)
176 {
177  float mvaval = -2;
178  std::vector<float> vars;
179  for(std::vector<std::string>::const_iterator it=varList.begin(); it!=varList.end(); ++it) {
180  std::pair<float *,float> var = variables_.at(*it);
181  vars.push_back( *var.first );
182  }
183  mvaval = reader->GetClassifier(vars.data());
184  return mvaval;
185 }
186 
188 {
189  if( cutBased_ ) {
190  internalId_.idFlag_ = computeCutIDflag(internalId_.betaStarClassic_,internalId_.dR2Mean_,internalId_.nvtx_,internalId_.jetPt_,internalId_.jetEta_);
191  } else {
192  if(std::abs(internalId_.jetEta_) >= 5.0) {
193  internalId_.mva_ = -2.;
194  } else {
195  if(etaBinnedWeights_){
196  if(std::abs(internalId_.jetEta_) > jEtaMax_.at(nEtaBins_-1)) {
197  internalId_.mva_ = -2.;
198  } else {
199  for(int v=0; v<nEtaBins_; v++){
200  if(std::abs(internalId_.jetEta_)>=jEtaMin_.at(v) && std::abs(internalId_.jetEta_)<jEtaMax_.at(v)) {
202  break;
203  }
204  }
205  }
206  } else {
208  }
209  }
211  }
212 }
213 
214 // ------------------------------------------------------------------------------------------
215 std::pair<int,int> PileupJetIdAlgo::getJetIdKey(float jetPt, float jetEta)
216 {
217  int ptId = 0;
218  if(jetPt >= 10 && jetPt < 20) ptId = 1;
219  if(jetPt >= 20 && jetPt < 30) ptId = 2;
220  if(jetPt >= 30 ) ptId = 3;
221 
222  int etaId = 0;
223  if(std::abs(jetEta) >= 2.5 && std::abs(jetEta) < 2.75) etaId = 1;
224  if(std::abs(jetEta) >= 2.75 && std::abs(jetEta) < 3.0 ) etaId = 2;
225  if(std::abs(jetEta) >= 3.0 && std::abs(jetEta) < 5.0 ) etaId = 3;
226 
227  return std::pair<int,int>(ptId,etaId);
228 }
229 // ------------------------------------------------------------------------------------------
230 int PileupJetIdAlgo::computeCutIDflag(float betaStarClassic,float dR2Mean,float nvtx, float jetPt, float jetEta)
231 {
232  std::pair<int,int> jetIdKey = getJetIdKey(jetPt,jetEta);
233  float betaStarModified = betaStarClassic/log(nvtx-0.64);
234  int idFlag(0);
235  if(betaStarModified < betaStarCut_[PileupJetIdentifier::kTight ][jetIdKey.first][jetIdKey.second] &&
236  dR2Mean < rmsCut_ [PileupJetIdentifier::kTight ][jetIdKey.first][jetIdKey.second]
237  ) idFlag += 1 << PileupJetIdentifier::kTight;
238 
239  if(betaStarModified < betaStarCut_[PileupJetIdentifier::kMedium ][jetIdKey.first][jetIdKey.second] &&
240  dR2Mean < rmsCut_ [PileupJetIdentifier::kMedium ][jetIdKey.first][jetIdKey.second]
241  ) idFlag += 1 << PileupJetIdentifier::kMedium;
242 
243  if(betaStarModified < betaStarCut_[PileupJetIdentifier::kLoose ][jetIdKey.first][jetIdKey.second] &&
244  dR2Mean < rmsCut_ [PileupJetIdentifier::kLoose ][jetIdKey.first][jetIdKey.second]
245  ) idFlag += 1 << PileupJetIdentifier::kLoose;
246  return idFlag;
247 }
248 // ------------------------------------------------------------------------------------------
250 {
251  std::pair<int,int> jetIdKey = getJetIdKey(jetPt,jetEta);
252  return computeIDflag(mva,jetIdKey.first,jetIdKey.second);
253 }
254 
255 // ------------------------------------------------------------------------------------------
256 int PileupJetIdAlgo::computeIDflag(float mva,int ptId,int etaId)
257 {
258  int idFlag(0);
259  if(mva > mvacut_[PileupJetIdentifier::kTight ][ptId][etaId]) idFlag += 1 << PileupJetIdentifier::kTight;
260  if(mva > mvacut_[PileupJetIdentifier::kMedium][ptId][etaId]) idFlag += 1 << PileupJetIdentifier::kMedium;
261  if(mva > mvacut_[PileupJetIdentifier::kLoose ][ptId][etaId]) idFlag += 1 << PileupJetIdentifier::kLoose;
262  return idFlag;
263 }
264 
265 
266 // ------------------------------------------------------------------------------------------
268 {
269  runMva();
271 }
272 
273 // ------------------------------------------------------------------------------------------
275  const reco::VertexCollection & allvtx, double rho)
276 {
277 
278  static std::atomic<int> printWarning{10};
279 
280  // initialize all variables to 0
281  resetVariables();
282 
283  // loop over constituents, accumulate sums and find leading candidates
284  const pat::Jet * patjet = dynamic_cast<const pat::Jet *>(jet);
285  const reco::PFJet * pfjet = dynamic_cast<const reco::PFJet *>(jet);
286  assert( patjet != nullptr || pfjet != nullptr );
287  if( patjet != nullptr && jec == 0. ) { // if this is a pat jet and no jec has been passed take the jec from the object
288  jec = patjet->pt()/patjet->correctedJet(0).pt();
289  }
290  if( jec <= 0. ) {
291  jec = 1.;
292  }
293 
294  const reco::Candidate* lLead = nullptr, *lSecond = nullptr, *lLeadNeut = nullptr, *lLeadEm = nullptr, *lLeadCh = nullptr, *lTrail = nullptr;
295  std::vector<float> frac, fracCh, fracEm, fracNeut;
296  float cones[] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7 };
297  size_t ncones = sizeof(cones)/sizeof(float);
298  float * coneFracs[] = { &internalId_.frac01_, &internalId_.frac02_, &internalId_.frac03_, &internalId_.frac04_,
299  &internalId_.frac05_, &internalId_.frac06_, &internalId_.frac07_ };
306  TMatrixDSym covMatrix(2); covMatrix = 0.;
307  float jetPt = jet->pt() / jec; // use uncorrected pt for shape variables
308  float sumPt = 0., sumPt2 = 0., sumTkPt = 0.,sumPtCh=0,sumPtNe = 0;
309  setPtEtaPhi(*jet,internalId_.jetPt_,internalId_.jetEta_,internalId_.jetPhi_); // use corrected pt for jet kinematics
310  internalId_.jetM_ = jet->mass();
311  internalId_.nvtx_ = allvtx.size();
312  internalId_.rho_ = rho;
313 
314  float dRmin(1000);
315 
316  for ( unsigned i = 0; i < jet->numberOfSourceCandidatePtrs(); ++i ) {
317  reco::CandidatePtr pfJetConstituent = jet->sourceCandidatePtr(i);
318 
319  const reco::Candidate* icand = pfJetConstituent.get();
320  const pat::PackedCandidate* lPack = dynamic_cast<const pat::PackedCandidate *>( icand );
321  const reco::PFCandidate *lPF=dynamic_cast<const reco::PFCandidate*>( icand );
322  bool isPacked = true;
323  if (lPack == nullptr){
324  isPacked = false;
325  }
326 
327  float candPt = icand->pt();
328  float candPtFrac = candPt/jetPt;
329  float candDr = reco::deltaR(*icand,*jet);
330  float candDeta = icand->eta() - jet->eta();
331  float candDphi = reco::deltaPhi(*icand,*jet);
332  float candPtDr = candPt * candDr;
333  size_t icone = std::lower_bound(&cones[0],&cones[ncones],candDr) - &cones[0];
334 
335  if(candDr < dRmin) dRmin = candDr;
336 
337  // // all particles
338  if( lLead == nullptr || candPt > lLead->pt() ) {
339  lSecond = lLead;
340  lLead = icand;
341  } else if( (lSecond == nullptr || candPt > lSecond->pt()) && (candPt < lLead->pt()) ) {
342  lSecond = icand;
343  }
344 
345  // // average shapes
346  internalId_.dRMean_ += candPtDr;
347  internalId_.dR2Mean_ += candPtDr*candPtDr;
348  covMatrix(0,0) += candPt*candPt*candDeta*candDeta;
349  covMatrix(0,1) += candPt*candPt*candDeta*candDphi;
350  covMatrix(1,1) += candPt*candPt*candDphi*candDphi;
351  internalId_.ptD_ += candPt*candPt;
352  sumPt += candPt;
353  sumPt2 += candPt*candPt;
354 
355  // single most energetic candiates and jet shape profiles
356  frac.push_back(candPtFrac);
357 
358  if( icone < ncones ) { *coneFracs[icone] += candPt; }
359 
360  // neutrals
361  if( abs(icand->pdgId()) == 130) {
362  if (lLeadNeut == nullptr || candPt > lLeadNeut->pt()) { lLeadNeut = icand; }
363  internalId_.dRMeanNeut_ += candPtDr;
364  fracNeut.push_back(candPtFrac);
365  if( icone < ncones ) { *coneNeutFracs[icone] += candPt; }
366  internalId_.ptDNe_ += candPt*candPt;
367  sumPtNe += candPt;
368  }
369  // EM candidated
370  if( icand->pdgId() == 22 ) {
371  if(lLeadEm == nullptr || candPt > lLeadEm->pt()) { lLeadEm = icand; }
372  internalId_.dRMeanEm_ += candPtDr;
373  fracEm.push_back(candPtFrac);
374  if( icone < ncones ) { *coneEmFracs[icone] += candPt; }
375  internalId_.ptDNe_ += candPt*candPt;
376  sumPtNe += candPt;
377  }
378  // Charged particles
379  if( icand->charge() != 0 ) {
380  if (lLeadCh == nullptr || candPt > lLeadCh->pt()) {
381  lLeadCh = icand;
382 
383  const reco::Track* pfTrk = icand->bestTrack();
384  if (lPF && std::abs(icand->pdgId()) == 13 && pfTrk == nullptr){
385  reco::MuonRef lmuRef = lPF->muonRef();
386  if (lmuRef.isNonnull()){
387  const reco::Muon& lmu = *lmuRef.get();
388  pfTrk = lmu.bestTrack();
389  edm::LogWarning("BadMuon")<<"Found a PFCandidate muon without a trackRef: falling back to Muon::bestTrack ";
390  }
391  }
392  if(pfTrk==nullptr) { //protection against empty pointers for the miniAOD case
393  //To handle the electron case
394  if(isPacked) {
395  internalId_.d0_ = std::abs(lPack->dxy(vtx->position()));
396  internalId_.dZ_ = std::abs(lPack->dz(vtx->position()));
397  }
398  else if(lPF!=nullptr) {
399  pfTrk=(lPF->trackRef().get()==nullptr)?lPF->gsfTrackRef().get():lPF->trackRef().get();
400  internalId_.d0_ = std::abs(pfTrk->dxy(vtx->position()));
401  internalId_.dZ_ = std::abs(pfTrk->dz(vtx->position()));
402  }
403  }
404  else {
405  internalId_.d0_ = std::abs(pfTrk->dxy(vtx->position()));
406  internalId_.dZ_ = std::abs(pfTrk->dz(vtx->position()));
407  }
408  }
409  internalId_.dRMeanCh_ += candPtDr;
410  internalId_.ptDCh_ += candPt*candPt;
411  fracCh.push_back(candPtFrac);
412  if( icone < ncones ) { *coneChFracs[icone] += candPt; }
413  sumPtCh += candPt;
414  }
415  // // beta and betastar
416  if( icand->charge() != 0 ) {
417  if (!isPacked){
418  if(lPF->trackRef().isNonnull() ) {
419  float tkpt = candPt;
420  sumTkPt += tkpt;
421  // 'classic' beta definition based on track-vertex association
422  bool inVtx0 = vtx->trackWeight ( lPF->trackRef()) > 0 ;
423 
424  bool inAnyOther = false;
425  // alternative beta definition based on track-vertex distance of closest approach
426  double dZ0 = std::abs(lPF->trackRef()->dz(vtx->position()));
427  double dZ = dZ0;
428  for(reco::VertexCollection::const_iterator vi=allvtx.begin(); vi!=allvtx.end(); ++vi ) {
429  const reco::Vertex & iv = *vi;
430  if( iv.isFake() || iv.ndof() < 4 ) { continue; }
431  // the primary vertex may have been copied by the user: check identity by position
432  bool isVtx0 = (iv.position() - vtx->position()).r() < 0.02;
433  // 'classic' beta definition: check if the track is associated with
434  // any vertex other than the primary one
435  if( ! isVtx0 && ! inAnyOther ) {
436  inAnyOther = vtx->trackWeight ( lPF->trackRef()) <= 0 ;
437  }
438  // alternative beta: find closest vertex to the track
439  dZ = std::min(dZ,std::abs(lPF->trackRef()->dz(iv.position())));
440  }
441  // classic beta/betaStar
442  if( inVtx0 && ! inAnyOther ) {
443  internalId_.betaClassic_ += tkpt;
444  } else if( ! inVtx0 && inAnyOther ) {
445  internalId_.betaStarClassic_ += tkpt;
446  }
447  // alternative beta/betaStar
448  if( dZ0 < 0.2 ) {
449  internalId_.beta_ += tkpt;
450  } else if( dZ < 0.2 ) {
451  internalId_.betaStar_ += tkpt;
452  }
453  }
454  }
455  else{
456  float tkpt = candPt;
457  sumTkPt += tkpt;
458  bool inVtx0 = false;
459  bool inVtxOther = false;
460  double dZ0=9999.;
461  double dZ_tmp = 9999.;
462  for (unsigned vtx_i = 0 ; vtx_i < allvtx.size() ; vtx_i++ ) {
463  auto iv = allvtx[vtx_i];
464 
465  if (iv.isFake())
466  continue;
467 
468  // Match to vertex in case of copy as above
469  bool isVtx0 = (iv.position() - vtx->position()).r() < 0.02;
470 
471  if (isVtx0) {
472  if (lPack->fromPV(vtx_i) == pat::PackedCandidate::PVUsedInFit) inVtx0 = true;
473  if (lPack->fromPV(vtx_i) == 0) inVtxOther = true;
474  dZ0 = lPack->dz(iv.position());
475  }
476 
477  if (fabs(lPack->dz(iv.position())) < fabs(dZ_tmp)) {
478  dZ_tmp = lPack->dz(iv.position());
479  }
480  }
481  if (inVtx0){
482  internalId_.betaClassic_ += tkpt;
483  } else if (inVtxOther){
484  internalId_.betaStarClassic_ += tkpt;
485  }
486  if (fabs(dZ0) < 0.2){
487  internalId_.beta_ += tkpt;
488  } else if (fabs(dZ_tmp) < 0.2){
489  internalId_.betaStar_ += tkpt;
490  }
491  }
492  }
493  // trailing candidate
494  if( lTrail == nullptr || candPt < lTrail->pt() ) {
495  lTrail = icand;
496  }
497 
498  }
499 
500  // // Finalize all variables
501  assert( !(lLead == nullptr) );
502 
503  if ( lSecond == nullptr ) { lSecond = lTrail; }
504  if ( lLeadNeut == nullptr ) { lLeadNeut = lTrail; }
505  if ( lLeadEm == nullptr ) { lLeadEm = lTrail; }
506  if ( lLeadCh == nullptr ) { lLeadCh = lTrail; }
507 
508  if( patjet != nullptr ) { // to enable running on MiniAOD slimmedJets
509  internalId_.nCharged_ = patjet->chargedMultiplicity();
510  internalId_.nNeutrals_ = patjet->neutralMultiplicity();
511  internalId_.chgEMfrac_ = patjet->chargedEmEnergy() /jet->energy();
512  internalId_.neuEMfrac_ = patjet->neutralEmEnergy() /jet->energy();
515  } else {
516  internalId_.nCharged_ = pfjet->chargedMultiplicity();
517  internalId_.nNeutrals_ = pfjet->neutralMultiplicity();
518  internalId_.chgEMfrac_ = pfjet->chargedEmEnergy() /jet->energy();
519  internalId_.neuEMfrac_ = pfjet->neutralEmEnergy() /jet->energy();
522  }
523  internalId_.nParticles_ = jet->nConstituents();
524 
526  float sumW2(0.0);
527  float sum_deta(0.0),sum_dphi(0.0);
528  float ave_deta(0.0), ave_dphi(0.0);
529  for (size_t j = 0; j < jet->numberOfDaughters(); j++) {
530  const auto& part = jet->daughterPtr(j);
531  if (!(part.isAvailable() && part.isNonnull()) ){
532  continue;
533  }
534 
535  float weight = part->pt();
536  float weight2 = weight * weight;
537  sumW2 += weight2;
538  float deta = part->eta() - jet->eta();
539  float dphi = reco::deltaPhi(*part, *jet);
540  sum_deta += deta*weight2;
541  sum_dphi += dphi*weight2;
542  if (sumW2 > 0) {
543  ave_deta = sum_deta/sumW2;
544  ave_dphi = sum_dphi/sumW2;
545  }
546  }
547 
548  float ddetaR_sum(0.0), ddphiR_sum(0.0), pull_tmp(0.0);
549  for (size_t i = 0; i < jet->numberOfDaughters(); i++) {
550  const auto& part = jet->daughterPtr(i);
551  if (!(part.isAvailable() && part.isNonnull()) ){
552  continue;
553  }
554  float weight =part->pt()*part->pt();
555  float deta = part->eta() - jet->eta();
556  float dphi = reco::deltaPhi(*part, *jet);
557  float ddeta, ddphi, ddR;
558  ddeta = deta - ave_deta ;
559  ddphi = dphi-ave_dphi;
560  ddR = sqrt(ddeta*ddeta + ddphi*ddphi);
561  ddetaR_sum += ddR*ddeta*weight;
562  ddphiR_sum += ddR*ddphi*weight;
563  }
564  if (sumW2 > 0) {
565  float ddetaR_ave = ddetaR_sum/sumW2;
566  float ddphiR_ave = ddphiR_sum/sumW2;
567  pull_tmp = sqrt(ddetaR_ave*ddetaR_ave+ddphiR_ave*ddphiR_ave);
568  }
569  internalId_.pull_ = pull_tmp;
571 
572 
578 
579  std::sort(frac.begin(),frac.end(),std::greater<float>());
580  std::sort(fracCh.begin(),fracCh.end(),std::greater<float>());
581  std::sort(fracEm.begin(),fracEm.end(),std::greater<float>());
582  std::sort(fracNeut.begin(),fracNeut.end(),std::greater<float>());
587 
588  covMatrix(0,0) /= sumPt2;
589  covMatrix(0,1) /= sumPt2;
590  covMatrix(1,1) /= sumPt2;
591  covMatrix(1,0) = covMatrix(0,1);
592  internalId_.etaW_ = sqrt(covMatrix(0,0));
593  internalId_.phiW_ = sqrt(covMatrix(1,1));
595  TVectorD eigVals(2); eigVals = TMatrixDSymEigen(covMatrix).GetEigenValues();
596  internalId_.majW_ = sqrt(std::abs(eigVals(0)));
597  internalId_.minW_ = sqrt(std::abs(eigVals(1)));
598  if( internalId_.majW_ < internalId_.minW_ ) { std::swap(internalId_.majW_,internalId_.minW_); }
599 
600  internalId_.dRLeadCent_ = reco::deltaR(*jet,*lLead);
601  if( lSecond == nullptr ) { internalId_.dRLead2nd_ = reco::deltaR(*jet,*lSecond); }
602  internalId_.dRMean_ /= jetPt;
606  internalId_.dR2Mean_ /= sumPt2;
607 
608  for(size_t ic=0; ic<ncones; ++ic){
609  *coneFracs[ic] /= jetPt;
610  *coneEmFracs[ic] /= jetPt;
611  *coneNeutFracs[ic] /= jetPt;
612  *coneChFracs[ic] /= jetPt;
613  }
614  //http://jets.physics.harvard.edu/qvg/
615  double ptMean = sumPt/internalId_.nParticles_;
616  double ptRMS = 0;
617  for(unsigned int i0 = 0; i0 < frac.size(); i0++) {ptRMS+=(frac[i0]-ptMean)*(frac[i0]-ptMean);}
618  ptRMS/=internalId_.nParticles_;
619  ptRMS=sqrt(ptRMS);
620 
621  internalId_.ptMean_ = ptMean;
622  internalId_.ptRMS_ = ptRMS/jetPt;
623  internalId_.pt2A_ = sqrt( internalId_.ptD_ /internalId_.nParticles_)/jetPt;
624  internalId_.ptD_ = sqrt( internalId_.ptD_) / sumPt;
625  internalId_.ptDCh_ = sqrt( internalId_.ptDCh_) / sumPtCh;
626  internalId_.ptDNe_ = sqrt( internalId_.ptDNe_) / sumPtNe;
628  internalId_.sumChPt_ = sumPtCh;
629  internalId_.sumNePt_ = sumPtNe;
630 
631  internalId_.jetR_ = lLead->pt()/sumPt;
632  internalId_.jetRchg_ = lLeadCh->pt()/sumPt;
633  internalId_.dRMatch_ = dRmin;
634 
635  if( sumTkPt != 0. ) {
636  internalId_.beta_ /= sumTkPt;
637  internalId_.betaStar_ /= sumTkPt;
638  internalId_.betaClassic_ /= sumTkPt;
639  internalId_.betaStarClassic_ /= sumTkPt;
640  } else {
641  assert( internalId_.beta_ == 0. && internalId_.betaStar_ == 0.&& internalId_.betaClassic_ == 0. && internalId_.betaStarClassic_ == 0. );
642  }
643 
644  if( runMvas_ ) {
645  runMva();
646  }
647 
649 }
650 
651 
652 
653 // ------------------------------------------------------------------------------------------
655 {
656  std::stringstream out;
657  for(variables_list_t::const_iterator it=variables_.begin();
658  it!=variables_.end(); ++it ) {
659  out << std::setw(15) << it->first << std::setw(3) << "="
660  << std::setw(5) << *it->second.first
661  << " (" << std::setw(5) << it->second.second << ")" << std::endl;
662  }
663  return out.str();
664 }
665 
666 // ------------------------------------------------------------------------------------------
668 {
669  internalId_.idFlag_ = 0;
670  for(variables_list_t::iterator it=variables_.begin();
671  it!=variables_.end(); ++it ) {
672  *it->second.first = it->second.second;
673  }
674 }
675 
676 // ------------------------------------------------------------------------------------------
677 #define INIT_VARIABLE(NAME,TMVANAME,VAL) \
678  internalId_.NAME ## _ = VAL; \
679  variables_[ # NAME ] = std::make_pair(& internalId_.NAME ## _, VAL);
680 
681 // ------------------------------------------------------------------------------------------
683 {
684  internalId_.idFlag_ = 0;
685  INIT_VARIABLE(mva , "", -100.);
686  //INIT_VARIABLE(jetPt , "jspt_1", 0.);
687  //INIT_VARIABLE(jetEta , "jseta_1", large_val);
688  INIT_VARIABLE(jetPt , "", 0.);
690  INIT_VARIABLE(jetPhi , "jsphi_1", large_val);
691  INIT_VARIABLE(jetM , "jm_1", 0.);
692 
693  INIT_VARIABLE(nCharged , "", 0.);
694  INIT_VARIABLE(nNeutrals , "", 0.);
695 
696  INIT_VARIABLE(chgEMfrac , "", 0.);
697  INIT_VARIABLE(neuEMfrac , "", 0.);
698  INIT_VARIABLE(chgHadrfrac, "", 0.);
699  INIT_VARIABLE(neuHadrfrac, "", 0.);
700 
701  INIT_VARIABLE(d0 , "jd0_1" , -1000.);
702  INIT_VARIABLE(dZ , "jdZ_1" , -1000.);
703  //INIT_VARIABLE(nParticles , "npart_1" , 0.);
704  INIT_VARIABLE(nParticles , "" , 0.);
705 
706  INIT_VARIABLE(leadPt , "lpt_1" , 0.);
707  INIT_VARIABLE(leadEta , "leta_1" , large_val);
708  INIT_VARIABLE(leadPhi , "lphi_1" , large_val);
709  INIT_VARIABLE(secondPt , "spt_1" , 0.);
710  INIT_VARIABLE(secondEta , "seta_1" , large_val);
711  INIT_VARIABLE(secondPhi , "sphi_1" , large_val);
712  INIT_VARIABLE(leadNeutPt , "lnept_1" , 0.);
713  INIT_VARIABLE(leadNeutEta, "lneeta_1" , large_val);
714  INIT_VARIABLE(leadNeutPhi, "lnephi_1" , large_val);
715  INIT_VARIABLE(leadEmPt , "lempt_1" , 0.);
716  INIT_VARIABLE(leadEmEta , "lemeta_1" , large_val);
717  INIT_VARIABLE(leadEmPhi , "lemphi_1" , large_val);
718  INIT_VARIABLE(leadChPt , "lchpt_1" , 0.);
719  INIT_VARIABLE(leadChEta , "lcheta_1" , large_val);
720  INIT_VARIABLE(leadChPhi , "lchphi_1" , large_val);
721  INIT_VARIABLE(leadFrac , "lLfr_1" , 0.);
722 
723  INIT_VARIABLE(dRLeadCent , "drlc_1" , 0.);
724  INIT_VARIABLE(dRLead2nd , "drls_1" , 0.);
725  INIT_VARIABLE(dRMean , "drm_1" , 0.);
726  INIT_VARIABLE(dRMean , "" , 0.);
727  INIT_VARIABLE(pull , "" , 0.);
728  INIT_VARIABLE(dRMeanNeut , "drmne_1" , 0.);
729  INIT_VARIABLE(dRMeanEm , "drem_1" , 0.);
730  INIT_VARIABLE(dRMeanCh , "drch_1" , 0.);
731  INIT_VARIABLE(dR2Mean , "" , 0.);
732 
733  INIT_VARIABLE(ptD , "", 0.);
734  INIT_VARIABLE(ptMean , "", 0.);
735  INIT_VARIABLE(ptRMS , "", 0.);
736  INIT_VARIABLE(pt2A , "", 0.);
737  INIT_VARIABLE(ptDCh , "", 0.);
738  INIT_VARIABLE(ptDNe , "", 0.);
739  INIT_VARIABLE(sumPt , "", 0.);
740  INIT_VARIABLE(sumChPt , "", 0.);
741  INIT_VARIABLE(sumNePt , "", 0.);
742 
743  INIT_VARIABLE(secondFrac ,"" ,0.);
744  INIT_VARIABLE(thirdFrac ,"" ,0.);
745  INIT_VARIABLE(fourthFrac ,"" ,0.);
746 
747  INIT_VARIABLE(leadChFrac ,"" ,0.);
748  INIT_VARIABLE(secondChFrac ,"" ,0.);
749  INIT_VARIABLE(thirdChFrac ,"" ,0.);
750  INIT_VARIABLE(fourthChFrac ,"" ,0.);
751 
752  INIT_VARIABLE(leadNeutFrac ,"" ,0.);
753  INIT_VARIABLE(secondNeutFrac ,"" ,0.);
754  INIT_VARIABLE(thirdNeutFrac ,"" ,0.);
755  INIT_VARIABLE(fourthNeutFrac ,"" ,0.);
756 
757  INIT_VARIABLE(leadEmFrac ,"" ,0.);
758  INIT_VARIABLE(secondEmFrac ,"" ,0.);
759  INIT_VARIABLE(thirdEmFrac ,"" ,0.);
760  INIT_VARIABLE(fourthEmFrac ,"" ,0.);
761 
762  INIT_VARIABLE(jetW ,"" ,1.);
763  INIT_VARIABLE(etaW ,"" ,1.);
764  INIT_VARIABLE(phiW ,"" ,1.);
765 
766  INIT_VARIABLE(majW ,"" ,1.);
767  INIT_VARIABLE(minW ,"" ,1.);
768 
769  INIT_VARIABLE(frac01 ,"" ,0.);
770  INIT_VARIABLE(frac02 ,"" ,0.);
771  INIT_VARIABLE(frac03 ,"" ,0.);
772  INIT_VARIABLE(frac04 ,"" ,0.);
773  INIT_VARIABLE(frac05 ,"" ,0.);
774  INIT_VARIABLE(frac06 ,"" ,0.);
775  INIT_VARIABLE(frac07 ,"" ,0.);
776 
777  INIT_VARIABLE(chFrac01 ,"" ,0.);
778  INIT_VARIABLE(chFrac02 ,"" ,0.);
779  INIT_VARIABLE(chFrac03 ,"" ,0.);
780  INIT_VARIABLE(chFrac04 ,"" ,0.);
781  INIT_VARIABLE(chFrac05 ,"" ,0.);
782  INIT_VARIABLE(chFrac06 ,"" ,0.);
783  INIT_VARIABLE(chFrac07 ,"" ,0.);
784 
785  INIT_VARIABLE(neutFrac01 ,"" ,0.);
786  INIT_VARIABLE(neutFrac02 ,"" ,0.);
787  INIT_VARIABLE(neutFrac03 ,"" ,0.);
788  INIT_VARIABLE(neutFrac04 ,"" ,0.);
789  INIT_VARIABLE(neutFrac05 ,"" ,0.);
790  INIT_VARIABLE(neutFrac06 ,"" ,0.);
791  INIT_VARIABLE(neutFrac07 ,"" ,0.);
792 
793  INIT_VARIABLE(emFrac01 ,"" ,0.);
794  INIT_VARIABLE(emFrac02 ,"" ,0.);
795  INIT_VARIABLE(emFrac03 ,"" ,0.);
796  INIT_VARIABLE(emFrac04 ,"" ,0.);
797  INIT_VARIABLE(emFrac05 ,"" ,0.);
798  INIT_VARIABLE(emFrac06 ,"" ,0.);
799  INIT_VARIABLE(emFrac07 ,"" ,0.);
800 
801  INIT_VARIABLE(beta ,"" ,0.);
802  INIT_VARIABLE(betaStar ,"" ,0.);
803  INIT_VARIABLE(betaClassic ,"" ,0.);
804  INIT_VARIABLE(betaStarClassic ,"" ,0.);
805 
806  INIT_VARIABLE(nvtx ,"" ,0.);
807  INIT_VARIABLE(rho ,"" ,0.);
808  INIT_VARIABLE(nTrueInt ,"" ,0.);
809 
810  INIT_VARIABLE(jetR , "", 0.);
811  INIT_VARIABLE(jetRchg , "", 0.);
812  INIT_VARIABLE(dRMatch , "", 0.);
813 
814 }
815 
816 #undef INIT_VARIABLE
const float large_val
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
const double beta
T getParameter(std::string const &) const
void set(const PileupJetIdentifier &)
float mvacut_[3][4][4]
std::vector< std::string > tmvaEtaWeights_
std::vector< std::string > tmvaVariables_
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:253
double eta() const final
momentum pseudorapidity
#define INIT_VARIABLE(NAME, TMVANAME, VAL)
float chargedHadronEnergy() const
chargedHadronEnergy
Definition: Jet.h:626
float chargedEmEnergy() const
chargedEmEnergy
Definition: PFJet.h:142
float neutralEmEnergy() const
neutralEmEnergy
Definition: Jet.h:647
CandidatePtr daughterPtr(size_type i) const
reference to daughter at given position
virtual const Track * bestTrack() const
Definition: Candidate.h:247
float rmsCut_[3][4][4]
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:159
Base class for all types of Jets.
Definition: Jet.h:20
std::unique_ptr< const GBRForest > getMVA(const std::vector< std::string > &, const std::string &)
float neutralHadronEnergy() const
neutralHadronEnergy
Definition: Jet.h:633
std::pair< int, int > getJetIdKey(float jetPt, float jetEta)
std::map< std::string, std::string > tmvaNames_
std::string tmvaMethod_
std::vector< double > jEtaMin_
size_type numberOfSourceCandidatePtrs() const override
double pt() const final
transverse momentum
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
Definition: weight.py:1
int neutralMultiplicity() const
neutralMultiplicity
Definition: Jet.h:420
float impactParTkThreshod_
int computeCutIDflag(float betaStarClassic, float dR2Mean, float nvtx, float jetPt, float jetEta)
int chargedMultiplicity() const
chargedMultiplicity
Definition: PFJet.h:155
const Track * bestTrack() const override
Definition: Muon.h:61
const Point & position() const
position
Definition: Vertex.h:109
Jets made from PFObjects.
Definition: PFJet.h:21
float neutralEmEnergy() const
neutralEmEnergy
Definition: PFJet.h:150
std::vector< std::unique_ptr< const GBRForest > > etaReader_
float chargedEmEnergy() const
chargedEmEnergy
Definition: Jet.h:640
size_t numberOfDaughters() const override
number of daughters
reco::TrackRef trackRef() const
Definition: PFCandidate.cc:442
float betaStarCut_[3][4][4]
PileupJetIdentifier internalId_
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
virtual int pdgId() const =0
PDG identifier.
const PVAssoc fromPV(size_t ipv=0) const
T sqrt(T t)
Definition: SSEVec.h:18
std::string dumpVariables() const
std::vector< std::vector< std::string > > tmvaEtaVariables_
double energy() const final
energy
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
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.
Definition: Vertex.h:81
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:245
T min(T a, T b)
Definition: MathUtil.h:58
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)
std::unique_ptr< const GBRForest > reader_
int computeIDflag(float mva, float jetPt, float jetEta)
double ndof() const
Definition: Vertex.h:105
int neutralMultiplicity() const
neutralMultiplicity
Definition: PFJet.h:157
reco::MuonRef muonRef() const
Definition: PFCandidate.cc:459
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...
Definition: TrackBase.h:609
void setPtEtaPhi(const reco::Candidate &p, float &pt, float &eta, float &phi)
double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
virtual double eta() const =0
momentum pseudorapidity
bool isFake() const
Definition: Vertex.h:72
PileupJetIdentifier computeIdVariables(const reco::Jet *jet, float jec, const reco::Vertex *, const reco::VertexCollection &, double rho)
virtual double pt() const =0
transverse momentum
part
Definition: HCALResponse.h:20
PileupJetIdentifier computeMva()
double b
Definition: hdecay.h:120
Analysis-level calorimeter jet class.
Definition: Jet.h:78
std::vector< std::string > tmvaSpectators_
TMVA::IMethod * loadTMVAWeights(TMVA::Reader *reader, const std::string &method, const std::string &weightFile, bool verbose=false)
virtual int charge() const =0
electric charge
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:40
std::string tmvaWeights_
virtual int nConstituents() const
of constituents
Definition: Jet.h:65
double a
Definition: hdecay.h:121
std::vector< double > jEtaMax_
reco::GsfTrackRef gsfTrackRef() const
Definition: PFCandidate.cc:480
CandidatePtr sourceCandidatePtr(size_type i) const override
variables_list_t variables_
std::string fullPath() const
Definition: FileInPath.cc:184
float neutralHadronEnergy() const
neutralHadronEnergy
Definition: PFJet.h:102
virtual float dxy() const
dxy with respect to the PV ref
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Definition: TrackBase.h:591
Jet correctedJet(const std::string &level, const std::string &flavor="none", const std::string &set="") const
float getMVAval(const std::vector< std::string > &, const std::unique_ptr< const GBRForest > &)
virtual double phi() const =0
momentum azimuthal angle
int chargedMultiplicity() const
chargedMultiplicity
Definition: Jet.h:661
float chargedHadronEnergy() const
chargedHadronEnergy
Definition: PFJet.h:98
double mass() const final
mass