Skip to content

Commit

Permalink
Merge pull request cms-sw#79 from tstreble/nanoAOD_L1
Browse files Browse the repository at this point in the history
Updated L1 information using dedicated MINIAOD collections
  • Loading branch information
arizzi committed Nov 23, 2017
2 parents a613ede + daf8525 commit 36b7312
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 19 deletions.
154 changes: 144 additions & 10 deletions PhysicsTools/NanoAOD/plugins/TriggerObjectTableProducer.cc
Expand Up @@ -13,6 +13,12 @@
#include "FWCore/Utilities/interface/StreamID.h"

#include "DataFormats/PatCandidates/interface/TriggerObjectStandAlone.h"
#include "DataFormats/L1Trigger/interface/EGamma.h"
#include "DataFormats/L1Trigger/interface/Tau.h"
#include "DataFormats/L1Trigger/interface/Jet.h"
#include "DataFormats/L1Trigger/interface/Muon.h"
#include "DataFormats/L1Trigger/interface/EtSum.h"
#include "DataFormats/HLTReco/interface/TriggerTypeDefs.h"
#include "CommonTools/Utils/interface/StringCutObjectSelector.h"
#include "CommonTools/Utils/interface/StringObjectFunction.h"
#include "DataFormats/Math/interface/deltaR.h"
Expand All @@ -22,7 +28,12 @@ class TriggerObjectTableProducer : public edm::stream::EDProducer<> {
public:
explicit TriggerObjectTableProducer(const edm::ParameterSet &iConfig) :
name_(iConfig.getParameter<std::string>("name")),
src_(consumes<std::vector<pat::TriggerObjectStandAlone>>(iConfig.getParameter<edm::InputTag>("src")))
src_(consumes<std::vector<pat::TriggerObjectStandAlone>>(iConfig.getParameter<edm::InputTag>("src"))),
l1EG_(consumes<l1t::EGammaBxCollection>(iConfig.getParameter<edm::InputTag>("l1EG"))),
l1Sum_(consumes<l1t::EtSumBxCollection>(iConfig.getParameter<edm::InputTag>("l1Sum"))),
l1Jet_(consumes<l1t::JetBxCollection>(iConfig.getParameter<edm::InputTag>("l1Jet"))),
l1Muon_(consumes<l1t::MuonBxCollection>(iConfig.getParameter<edm::InputTag>("l1Muon"))),
l1Tau_(consumes<l1t::TauBxCollection>(iConfig.getParameter<edm::InputTag>("l1Tau")))
{
std::vector<edm::ParameterSet> selPSets = iConfig.getParameter<std::vector<edm::ParameterSet>>("selections");
sels_.reserve(selPSets.size());
Expand Down Expand Up @@ -51,28 +62,38 @@ class TriggerObjectTableProducer : public edm::stream::EDProducer<> {
edm::EDGetTokenT<std::vector<pat::TriggerObjectStandAlone>> src_;
std::string idDoc_, bitsDoc_;

edm::EDGetTokenT<l1t::EGammaBxCollection> l1EG_;
edm::EDGetTokenT<l1t::EtSumBxCollection> l1Sum_;
edm::EDGetTokenT<l1t::JetBxCollection> l1Jet_;
edm::EDGetTokenT<l1t::MuonBxCollection> l1Muon_;
edm::EDGetTokenT<l1t::TauBxCollection> l1Tau_;

struct SelectedObject {
std::string name;
int id;
StringCutObjectSelector<pat::TriggerObjectStandAlone> cut;
StringCutObjectSelector<pat::TriggerObjectStandAlone> l1cut, l2cut;
float l1DR2, l2DR2;
StringCutObjectSelector<pat::TriggerObjectStandAlone> l1cut, l1cut_2, l2cut;
float l1DR2, l1DR2_2, l2DR2;
StringObjectFunction<pat::TriggerObjectStandAlone> qualityBits;
std::string qualityBitsDoc;

SelectedObject(const edm::ParameterSet & pset) :
name(pset.getParameter<std::string>("name")),
id(pset.getParameter<int>("id")),
cut(pset.getParameter<std::string>("sel")),
l1cut(""), l2cut(""),
l1DR2(-1), l2DR2(-1),
l1cut(""), l1cut_2(""), l2cut(""),
l1DR2(-1), l1DR2_2(-1), l2DR2(-1),
qualityBits(pset.getParameter<std::string>("qualityBits")),
qualityBitsDoc(pset.getParameter<std::string>("qualityBitsDoc"))
{
if (pset.existsAs<std::string>("l1seed")) {
l1cut = StringCutObjectSelector<pat::TriggerObjectStandAlone>(pset.getParameter<std::string>("l1seed"));
l1DR2 = std::pow(pset.getParameter<double>("l1deltaR"), 2);
}
if (pset.existsAs<std::string>("l1seed_2")) {
l1cut_2 = StringCutObjectSelector<pat::TriggerObjectStandAlone>(pset.getParameter<std::string>("l1seed_2"));
l1DR2_2 = std::pow(pset.getParameter<double>("l1deltaR_2"), 2);
}
if (pset.existsAs<std::string>("l2seed")) {
l2cut = StringCutObjectSelector<pat::TriggerObjectStandAlone>(pset.getParameter<std::string>("l2seed"));
l2DR2 = std::pow(pset.getParameter<double>("l2deltaR"), 2);
Expand Down Expand Up @@ -105,9 +126,106 @@ TriggerObjectTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& i
}
}


edm::Handle<l1t::EGammaBxCollection> l1EG;
edm::Handle<l1t::EtSumBxCollection> l1Sum;
edm::Handle<l1t::JetBxCollection> l1Jet;
edm::Handle<l1t::MuonBxCollection> l1Muon;
edm::Handle<l1t::TauBxCollection> l1Tau;
iEvent.getByToken(l1EG_, l1EG);
iEvent.getByToken(l1Sum_, l1Sum);
iEvent.getByToken(l1Jet_, l1Jet);
iEvent.getByToken(l1Muon_, l1Muon);
iEvent.getByToken(l1Tau_, l1Tau);

std::vector<pair<pat::TriggerObjectStandAlone,int>> l1Objects;

for(l1t::EGammaBxCollection::const_iterator it=l1EG->begin(0); it!=l1EG->end(0); it++){
pat::TriggerObjectStandAlone l1obj(it->p4());
l1obj.setCollection("L1EG");
l1obj.addTriggerObjectType(trigger::TriggerL1EG);
l1Objects.emplace_back(l1obj,it->hwIso());
}

for(l1t::EtSumBxCollection::const_iterator it=l1Sum->begin(0); it!=l1Sum->end(0); it++){
pat::TriggerObjectStandAlone l1obj(it->p4());

switch(it->getType()){

case l1t::EtSum::EtSumType::kMissingEt:
l1obj.addTriggerObjectType(trigger::TriggerL1ETM);
l1obj.setCollection("L1ETM");
break;

case l1t::EtSum::EtSumType::kMissingEtHF:
l1obj.addTriggerObjectType(trigger::TriggerL1ETM);
l1obj.setCollection("L1ETMHF");
break;

case l1t::EtSum::EtSumType::kTotalEt:
l1obj.addTriggerObjectType(trigger::TriggerL1ETT);
l1obj.setCollection("L1ETT");
break;

case l1t::EtSum::EtSumType::kTotalEtEm:
l1obj.addTriggerObjectType(trigger::TriggerL1ETT);
l1obj.setCollection("L1ETEm");
break;

case l1t::EtSum::EtSumType::kTotalHt:
l1obj.addTriggerObjectType(trigger::TriggerL1HTT);
l1obj.setCollection("L1HTT");
break;

case l1t::EtSum::EtSumType::kTotalHtHF:
l1obj.addTriggerObjectType(trigger::TriggerL1HTT);
l1obj.setCollection("L1HTTHF");
break;

case l1t::EtSum::EtSumType::kMissingHt:
l1obj.addTriggerObjectType(trigger::TriggerL1HTM);
l1obj.setCollection("L1HTM");
break;

case l1t::EtSum::EtSumType::kMissingHtHF:
l1obj.addTriggerObjectType(trigger::TriggerL1HTM);
l1obj.setCollection("L1HTMHF");
break;

default:
continue;
}

l1Objects.emplace_back(l1obj,it->hwIso());

}

for(l1t::JetBxCollection::const_iterator it=l1Jet->begin(0); it!=l1Jet->end(0); it++){
pat::TriggerObjectStandAlone l1obj(it->p4());
l1obj.setCollection("L1Jet");
l1obj.addTriggerObjectType(trigger::TriggerL1Jet);
l1Objects.emplace_back(l1obj,it->hwIso());
}

for(l1t::MuonBxCollection::const_iterator it=l1Muon->begin(0); it!=l1Muon->end(0); it++){
pat::TriggerObjectStandAlone l1obj(it->p4());
l1obj.setCollection("L1Mu");
l1obj.addTriggerObjectType(trigger::TriggerL1Mu);
l1obj.setCharge(it->charge());
l1Objects.emplace_back(l1obj,it->hwIso());
}

for(l1t::TauBxCollection::const_iterator it=l1Tau->begin(0); it!=l1Tau->end(0); it++){
pat::TriggerObjectStandAlone l1obj(it->p4());
l1obj.setCollection("L1Tau");
l1obj.addTriggerObjectType(trigger::TriggerL1Tau);
l1Objects.emplace_back(l1obj,it->hwIso());
}


unsigned int nobj = selected.size();
std::vector<float> pt(nobj,0), eta(nobj,0), phi(nobj,0), l1pt(nobj, 0), l2pt(nobj, 0);
std::vector<int> id(nobj,0), bits(nobj, 0);
std::vector<float> pt(nobj,0), eta(nobj,0), phi(nobj,0), l1pt(nobj, 0), l1pt_2(nobj, 0), l2pt(nobj, 0);
std::vector<int> id(nobj,0), bits(nobj, 0), l1iso(nobj, 0), l1charge(nobj,0);
for (unsigned int i = 0; i < nobj; ++i) {
const auto & obj = *selected[i].first;
const auto & sel = *selected[i].second;
Expand All @@ -118,10 +236,23 @@ TriggerObjectTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& i
bits[i] = sel.qualityBits(obj);
if (sel.l1DR2 > 0) {
float best = sel.l1DR2;
for (const auto & seed : *src) {
for (const auto & l1obj : l1Objects) {
const auto & seed = l1obj.first;
float dr2 = deltaR2(seed, obj);
if (dr2 < best && sel.l1cut(seed)) {
l1pt[i] = seed.pt();
l1iso[i] = l1obj.second;
l1charge[i] = seed.charge();
}
}
}
if (sel.l1DR2_2 > 0) {
float best = sel.l1DR2_2;
for (const auto & l1obj : l1Objects) {
const auto & seed = l1obj.first;
float dr2 = deltaR2(seed, obj);
if (dr2 < best && sel.l1cut_2(seed)) {
l1pt_2[i] = seed.pt();
}
}
}
Expand All @@ -141,9 +272,12 @@ TriggerObjectTableProducer::produce(edm::Event& iEvent, const edm::EventSetup& i
tab->addColumn<float>("pt", pt, "pt", nanoaod::FlatTable::FloatColumn, 12);
tab->addColumn<float>("eta", eta, "eta", nanoaod::FlatTable::FloatColumn, 12);
tab->addColumn<float>("phi", phi, "phi", nanoaod::FlatTable::FloatColumn, 12);
tab->addColumn<float>("l1pt", l1pt, "pt of associated L1 seed", nanoaod::FlatTable::FloatColumn, 10);
tab->addColumn<float>("l1pt", l1pt, "pt of associated L1 seed", nanoaod::FlatTable::FloatColumn, 8);
tab->addColumn<int>("l1iso", l1iso, "iso of associated L1 seed", nanoaod::FlatTable::IntColumn);
tab->addColumn<int>("l1charge", l1charge, "charge of associated L1 seed", nanoaod::FlatTable::IntColumn);
tab->addColumn<float>("l1pt_2", l1pt_2, "pt of associated secondary L1 seed", nanoaod::FlatTable::FloatColumn, 8);
tab->addColumn<float>("l2pt", l2pt, "pt of associated 'L2' seed (i.e. HLT before tracking/PF)", nanoaod::FlatTable::FloatColumn, 10);
tab->addColumn<float>("filterBits", bits, "extra bits of associated information: "+bitsDoc_, nanoaod::FlatTable::FloatColumn, 10);
tab->addColumn<int>("filterBits", bits, "extra bits of associated information: "+bitsDoc_, nanoaod::FlatTable::IntColumn);
iEvent.put(std::move(tab));
}

Expand Down
5 changes: 4 additions & 1 deletion PhysicsTools/NanoAOD/python/nanoDQM_cfi.py
Expand Up @@ -479,9 +479,12 @@
plots = cms.VPSet(
Count1D('_size', 28, -0.5, 27.5),
Plot1D('eta', 'eta', 20, -5, 5, 'eta'),
Plot1D('filterBits', 'filterBits', 16, -0.5, 15.5, 'extra bits of associated information: 1 = CaloIdL_TrackIdL_IsoVL, 2 = WPLoose, 4 = WPTight for Electron (PixelMatched e/gamma); 1 = TrkIsoVVL, 2 = Iso for Muon; '),
Plot1D('filterBits', 'filterBits', 512, -0.5, 511.5, 'extra bits of associated information: 1 = CaloIdL_TrackIdL_IsoVL, 2 = WPLoose, 4 = WPTight, 8 = OverlapFilter PFTau for Electron (PixelMatched e/gamma); 1 = TrkIsoVVL, 2 = Iso, 4 = OverlapFilter PFTau for Muon; 1 = LooseChargedIso, 2 = MediumChargedIso, 4 = TightChargedIso, 8 = TightID OOSC photons, 16 = L2p5 pixel iso, 32 = OverlapFilter IsoMu, 64 = OverlapFilter IsoEle, 128 = L1-HLT matched, 256 = Dz for Tau; 1 = VBF cross-cleaned from loose iso PFTau for Jet'),
Plot1D('id', 'id', 20, 0, 30, 'ID of the object: 11 = Electron (PixelMatched e/gamma), 22 = Photon (PixelMatch-vetoed e/gamma), 13 = Muon, 14 = Tau, 1 = Jet, 2 = MET, 3 = HT, 4 = MHT'),
Plot1D('l1charge', 'l1charge', 3, -1.5, 1.5, 'charge of associated L1 seed'),
Plot1D('l1iso', 'l1iso', 4, -0.5, 3.5, 'iso of associated L1 seed'),
Plot1D('l1pt', 'l1pt', 20, 0, 200, 'pt of associated L1 seed'),
Plot1D('l1pt_2', 'l1pt_2', 20, 0, 200, 'pt of associated secondary L1 seed'),
Plot1D('l2pt', 'l2pt', 20, 0, 200, "pt of associated 'L2' seed (i.e. HLT before tracking/PF)"),
Plot1D('phi', 'phi', 20, -3.14159, 3.14159, 'phi'),
Plot1D('pt', 'pt', 40, 0, 400, 'pt'),
Expand Down
24 changes: 16 additions & 8 deletions PhysicsTools/NanoAOD/python/triggerObjects_cff.py
Expand Up @@ -16,12 +16,17 @@
triggerObjectTable = cms.EDProducer("TriggerObjectTableProducer",
name= cms.string("TrigObj"),
src = cms.InputTag("unpackedPatTrigger"),
l1EG = cms.InputTag("caloStage2Digis","EGamma"),
l1Sum = cms.InputTag("caloStage2Digis","EtSum"),
l1Jet = cms.InputTag("caloStage2Digis","Jet"),
l1Muon = cms.InputTag("gmtStage2Digis","Muon"),
l1Tau = cms.InputTag("caloStage2Digis","Tau"),
selections = cms.VPSet(
cms.PSet(
name = cms.string("Electron (PixelMatched e/gamma)"), # this selects also photons for the moment!
id = cms.int32(11),
sel = cms.string("type(92) && pt > 7 && coll('hltEgammaCandidates') && filter('*PixelMatchFilter')"),
l1seed = cms.string("type(-98) && coll('hltGtStage2Digis:EGamma')"), l1deltaR = cms.double(0.3),
l1seed = cms.string("type(-98)"), l1deltaR = cms.double(0.3),
#l2seed = cms.string("type(92) && coll('')"), l2deltaR = cms.double(0.5),
qualityBits = cms.string("filter('*CaloIdLTrackIdLIsoVL*TrackIso*Filter') + 2*filter('hltEle*WPTight*TrackIsoFilter*') + 4*filter('hltEle*WPLoose*TrackIsoFilter') + 8*filter('*OverlapFilterIsoEle*PFTau*')"),
qualityBitsDoc = cms.string("1 = CaloIdL_TrackIdL_IsoVL, 2 = WPLoose, 4 = WPTight, 8 = OverlapFilter PFTau"),
Expand All @@ -30,55 +35,58 @@
name = cms.string("Photon (PixelMatch-vetoed e/gamma)"),
id = cms.int32(22),
sel = cms.string("type(92) && pt > 20 && coll('hltEgammaCandidates') && !filter('*PixelMatchFilter')"),
l1seed = cms.string("type(-98) && coll('hltGtStage2Digis:EGamma')"), l1deltaR = cms.double(0.3),
l1seed = cms.string("type(-98)"), l1deltaR = cms.double(0.3),
#l2seed = cms.string("type(92) && coll('')"), l2deltaR = cms.double(0.5),
qualityBits = cms.string("0"), qualityBitsDoc = cms.string(""),
),
cms.PSet(
name = cms.string("Muon"),
id = cms.int32(13),
sel = cms.string("type(83) && pt > 5 && coll('hltIterL3MuonCandidates')"),
l1seed = cms.string("type(-81) && coll('hltGtStage2Digis:Muon')"), l1deltaR = cms.double(0.5),
l1seed = cms.string("type(-81)"), l1deltaR = cms.double(0.5),
l2seed = cms.string("type(83) && coll('hltL2MuonCandidates')"), l2deltaR = cms.double(0.3),
qualityBits = cms.string("filter('*RelTrkIsoVVLFiltered0p4') + 2*filter('hltL3crIso*Filtered0p07') + 4*filter('*OverlapFilterIsoMu*PFTau*')"), qualityBitsDoc = cms.string("1 = TrkIsoVVL, 2 = Iso, 4 = OverlapFilter PFTau"),
),
cms.PSet(
name = cms.string("Tau"),
id = cms.int32(15),
sel = cms.string("type(84) && pt > 5 && coll('*Tau*') && ( filter('*LooseChargedIso*') || filter('*MediumChargedIso*') || filter('*TightChargedIso*') || filter('*TightOOSCPhotons*') || filter('hltL2TauIsoFilter') || filter('*OverlapFilterIsoMu*') || filter('*OverlapFilterIsoEle*') || filter('*L1HLTMatched*') || filter('*Dz02*') )"), #All trigger objects from a Tau collection + passing at least one filter
l1seed = cms.string("type(-100) && coll('hltGtStage2Digis:Tau')"), l1deltaR = cms.double(0.3),
l1seed = cms.string("type(-100)"), l1deltaR = cms.double(0.3),
l2seed = cms.string("type(84) && coll('hltL2TauJetsL1IsoTauSeeded')"), l2deltaR = cms.double(0.3),
qualityBits = cms.string("filter('*LooseChargedIso*')+2*filter('*MediumChargedIso*')+4*filter('*TightChargedIso*')+8*filter('*TightOOSCPhotons*')+16*filter('hltL2TauIsoFilter')+32*filter('*OverlapFilterIsoMu*')+64*filter('*OverlapFilterIsoEle*')+128*filter('*L1HLTMatched*')+256*filter('*Dz02*')"), qualityBitsDoc = cms.string("1 = LooseChargedIso, 2 = MediumChargedIso, 4 = TightChargedIso, 8 = TightID OOSC photons, 16 = L2p5 pixel iso, 32 = OverlapFilter IsoMu, 64 = OverlapFilter IsoEle, 128 = L1-HLT matched, 256 = Dz"),
),
cms.PSet(
name = cms.string("Jet"),
id = cms.int32(1),
sel = cms.string("type(85) && pt > 30 && (coll('hltAK4PFJetsCorrected') || coll('hltMatchedVBF*PFJets*PFTau*OverlapRemoval'))"),
l1seed = cms.string("type(-99) && coll('hltGtStage2Digis:Jet')"), l1deltaR = cms.double(0.3),
l1seed = cms.string("type(-99)"), l1deltaR = cms.double(0.3),
l2seed = cms.string("type(85) && coll('hltAK4CaloJetsCorrectedIDPassed')"), l2deltaR = cms.double(0.3),
qualityBits = cms.string("filter('*CrossCleaned*LooseChargedIsoPFTau*')"), qualityBitsDoc = cms.string("1 = VBF cross-cleaned from loose iso PFTau"),
),
cms.PSet(
name = cms.string("MET"),
id = cms.int32(2),
sel = cms.string("type(87) && pt > 30 && coll('hltPFMETProducer')"),
l1seed = cms.string("type(-87) && coll('hltGtStage2Digis:EtSum')"), l1deltaR = cms.double(9999),
l1seed = cms.string("type(-87) && coll('L1ETM')"), l1deltaR = cms.double(9999),
l1seed_2 = cms.string("type(-87) && coll('L1ETMHF')"), l1deltaR_2 = cms.double(9999),
l2seed = cms.string("type( 87) && coll('hltMetClean')"), l2deltaR = cms.double(9999),
qualityBits = cms.string("0"), qualityBitsDoc = cms.string(""),
),
cms.PSet(
name = cms.string("HT"),
id = cms.int32(3),
sel = cms.string("type(89) && pt > 100 && coll('hltPFHTJet30')"),
l1seed = cms.string("type(-89) && coll('hltGtStage2Digis:EtSum')"), l1deltaR = cms.double(9999),
l1seed = cms.string("type(-89) && coll('L1HTT')"), l1deltaR = cms.double(9999),
l1seed_2 = cms.string("type(-89) && coll('L1HTTHF')"), l1deltaR_2 = cms.double(9999),
#l2seed = cms.string("type(89) && coll('hltHtMhtJet30')"), l2deltaR = cms.double(9999),
qualityBits = cms.string("0"), qualityBitsDoc = cms.string(""),
),
cms.PSet(
name = cms.string("MHT"),
id = cms.int32(4),
sel = cms.string("type(90) && pt > 30 && coll('hltPFMHTTightID')"),
l1seed = cms.string("type(-90) && coll('hltGtStage2Digis:EtSum')"), l1deltaR = cms.double(9999),
l1seed = cms.string("type(-90) && coll('L1HTM')"), l1deltaR = cms.double(9999),
l1seed_2 = cms.string("type(-90) && coll('L1HTMHF')"), l1deltaR_2 = cms.double(9999),
#l2seed = cms.string("type(90) && coll('hltHtMhtJet30')"), l2deltaR = cms.double(9999),
qualityBits = cms.string("0"), qualityBitsDoc = cms.string(""),
),
Expand Down

0 comments on commit 36b7312

Please sign in to comment.