forked from cms-sw/cmssw
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request cms-sw#149 from gpetruc/pr143_withVectors
Merging. You can port in the hemisphere code in a separate PR.
- Loading branch information
Showing
7 changed files
with
175 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#ifndef ReclusterJets_h | ||
#define ReclusterJets_h | ||
|
||
#include <vector> | ||
#include <iostream> | ||
#include <cmath> | ||
#include <TLorentzVector.h> | ||
#include <TMath.h> | ||
#include "DataFormats/Math/interface/LorentzVector.h" | ||
|
||
#include <boost/shared_ptr.hpp> | ||
#include <fastjet/internal/base.hh> | ||
#include "fastjet/PseudoJet.hh" | ||
#include "fastjet/JetDefinition.hh" | ||
#include "fastjet/ClusterSequence.hh" | ||
#include "fastjet/Selector.hh" | ||
#include "fastjet/PseudoJet.hh" | ||
|
||
|
||
class ReclusterJets { | ||
|
||
public: | ||
typedef math::XYZTLorentzVector LorentzVector; | ||
|
||
ReclusterJets(const std::vector<LorentzVector> & objects, double ktpower, double rparam); | ||
|
||
/// get grouping (inclusive jets) | ||
std::vector<LorentzVector> getGrouping(double ptMin = 0.0); | ||
|
||
/// get grouping (exclusive jets, until n are left) | ||
std::vector<LorentzVector> getGroupingExclusive(int njets); | ||
/// get grouping (exclusive jets, up to cut dcut) | ||
std::vector<LorentzVector> getGroupingExclusive(double dcut); | ||
|
||
private: | ||
// pack the returns in a fwlite-friendly way | ||
std::vector<LorentzVector> makeP4s(const std::vector<fastjet::PseudoJet> &jets) ; | ||
|
||
// used to handle the inputs | ||
std::vector<fastjet::PseudoJet> fjInputs_; // fastjet inputs | ||
|
||
double ktpower_; | ||
double rparam_; | ||
|
||
/// fastjet outputs | ||
typedef boost::shared_ptr<fastjet::ClusterSequence> ClusterSequencePtr; | ||
ClusterSequencePtr fjClusterSeq_; | ||
std::vector<fastjet::PseudoJet> inclusiveJets_; | ||
std::vector<fastjet::PseudoJet> exclusiveJets_; | ||
}; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
#include "CMGTools/RootTools/interface/ReclusterJets.h" | ||
#include "FWCore/Utilities/interface/Exception.h" | ||
|
||
using namespace std; | ||
|
||
//using namespace std; | ||
using namespace fastjet; | ||
|
||
|
||
ReclusterJets::ReclusterJets(const std::vector<LorentzVector> & objects, double ktpower, double rparam) : | ||
ktpower_(ktpower), rparam_(rparam) | ||
{ | ||
// define jet inputs | ||
fjInputs_.clear(); | ||
int index=0; | ||
for (const LorentzVector &o : objects) { | ||
fastjet::PseudoJet j(o.Px(),o.Py(),o.Pz(),o.E()); | ||
j.set_user_index(index); index++; // in case we want to know which piece ended where | ||
fjInputs_.push_back(j); | ||
} | ||
|
||
// choose a jet definition | ||
fastjet::JetDefinition jet_def; | ||
|
||
// prepare jet def | ||
if (ktpower_ == 1.0) { | ||
jet_def = JetDefinition(kt_algorithm, rparam_); | ||
} else if (ktpower_ == 0.0) { | ||
jet_def = JetDefinition(cambridge_algorithm, rparam_); | ||
} else if (ktpower_ == -1.0) { | ||
jet_def = JetDefinition(antikt_algorithm, rparam_); | ||
} else { | ||
throw cms::Exception("InvalidArgument", "Unsupported ktpower value"); | ||
} | ||
|
||
// print out some infos | ||
// cout << "Clustering with " << jet_def.description() << endl; | ||
/// | ||
// define jet clustering sequence | ||
fjClusterSeq_ = ClusterSequencePtr( new fastjet::ClusterSequence( fjInputs_, jet_def)); | ||
} | ||
|
||
std::vector<math::XYZTLorentzVector> ReclusterJets::makeP4s(const std::vector<fastjet::PseudoJet> &jets) { | ||
std::vector<math::XYZTLorentzVector> JetObjectsAll; | ||
for (const fastjet::PseudoJet & pj : jets) { | ||
JetObjectsAll.push_back( LorentzVector( pj.px(), pj.py(), pj.pz(), pj.e() ) ); | ||
} | ||
return JetObjectsAll; | ||
} | ||
std::vector<math::XYZTLorentzVector> ReclusterJets::getGrouping(double ptMin) { | ||
// recluster jet | ||
inclusiveJets_ = fastjet::sorted_by_pt(fjClusterSeq_->inclusive_jets(ptMin)); | ||
// return | ||
return makeP4s(inclusiveJets_); | ||
} | ||
|
||
std::vector<math::XYZTLorentzVector> ReclusterJets::getGroupingExclusive(double dcut) { | ||
// recluster jet | ||
exclusiveJets_ = fastjet::sorted_by_pt(fjClusterSeq_->exclusive_jets(dcut)); | ||
// return | ||
return makeP4s(exclusiveJets_); | ||
} | ||
|
||
std::vector<math::XYZTLorentzVector> ReclusterJets::getGroupingExclusive(int njets) { | ||
// recluster jet | ||
exclusiveJets_ = fastjet::sorted_by_pt(fjClusterSeq_->exclusive_jets(njets)); | ||
// return | ||
return makeP4s(exclusiveJets_); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
CMGTools/TTHAnalysis/python/analyzers/ttHReclusterJetsAnalyzer.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
from CMGTools.RootTools.fwlite.Analyzer import Analyzer | ||
from CMGTools.RootTools.fwlite.AutoHandle import AutoHandle | ||
|
||
import ROOT | ||
|
||
class ttHReclusterJetsAnalyzer( Analyzer ): | ||
def __init__(self, cfg_ana, cfg_comp, looperName ): | ||
super(ttHReclusterJetsAnalyzer,self).__init__(cfg_ana,cfg_comp,looperName) | ||
|
||
def declareHandles(self): | ||
super(ttHReclusterJetsAnalyzer, self).declareHandles() | ||
#genJets | ||
self.handles['genJets'] = AutoHandle( 'slimmedGenJets','std::vector<reco::GenJet>') | ||
|
||
def beginLoop(self): | ||
super(ttHReclusterJetsAnalyzer,self).beginLoop() | ||
self.counters.addCounter('pairs') | ||
count = self.counters.counter('pairs') | ||
count.register('all events') | ||
|
||
def makeFatJets(self, event): | ||
objects40jc = [ j for j in event.cleanJets if j.pt() > 40.0 and abs(j.eta())<2.4 ] | ||
|
||
if len(objects40jc)>=1: | ||
|
||
objects = ROOT.std.vector(ROOT.reco.Particle.LorentzVector)() | ||
for jet in objects40jc: | ||
objects.push_back(jet.p4()) | ||
|
||
reclusterJets = ROOT.ReclusterJets(objects, 1.,1.2) | ||
inclusiveJets = reclusterJets.getGrouping() | ||
|
||
# maybe should dress them as Jet objects in the future | ||
# for the moment, we just make LorentzVector | ||
event.reclusteredFatJets = [ ROOT.reco.Particle.LorentzVector(p4) for p4 in inclusiveJets ] | ||
# note 1: just taking inclusiveJets is not ok, since it's not a python list but a std::vector | ||
# note 2: [p4 for p4 in inclusiveJets] is also bad, since these are references to values inside a temporary std::vector | ||
|
||
def process(self, iEvent, event): | ||
self.readCollections( iEvent ) | ||
|
||
event.reclusteredFatJets = [] | ||
self.makeFatJets(event) | ||
|
||
return True |