Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ __init__.py
.#*
#*#
*~
*/NanoNizer
42 changes: 22 additions & 20 deletions NtupleProducer/plugins/BuildFile.xml
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
<use name="CommonTools/UtilAlgos"/>
<use name="CommonTools/Utils"/>
<use name="DataFormats/Candidate"/>
<use name="DataFormats/PatCandidates"/>
<use name="DataFormats/HepMCCandidate"/>
<use name="DataFormats/JetReco"/>
<use name="DataFormats/L1TrackTrigger"/>
<use name="DataFormats/METReco"/>
<use name="DataFormats/Math"/>
<use name="DataFormats/NanoAOD"/>
<use name="DataFormats/L1TParticleFlow"/>
<use name="FWCore/Framework"/>
<use name="FWCore/ParameterSet"/>
<use name="FWCore/ServiceRegistry"/>
<use name="L1Trigger/Phase2L1ParticleFlow"/>
<use name="MagneticField/Engine"/>
<use name="MagneticField/Records"/>
<use name="PhysicsTools/NanoAOD"/>
<use name="L1Trigger/L1THGCal"/>

<use name="CommonTools/UtilAlgos" />
<use name="CommonTools/Utils" />
<use name="DataFormats/Candidate" />
<use name="DataFormats/PatCandidates" />
<use name="DataFormats/HepMCCandidate" />
<use name="DataFormats/JetReco" />
<use name="DataFormats/L1TrackTrigger" />
<use name="DataFormats/METReco" />
<use name="DataFormats/Math" />
<use name="DataFormats/NanoAOD" />
<use name="DataFormats/L1TParticleFlow" />
<use name="FWCore/Framework" />
<use name="FWCore/ParameterSet" />
<use name="FWCore/ServiceRegistry" />
<use name="L1Trigger/Phase2L1ParticleFlow" />
<use name="MagneticField/Engine" />
<use name="MagneticField/Records" />
<use name="PhysicsTools/NanoAOD" />
<use name="L1Trigger/L1THGCal" />
<use name="SimTracker/TrackTriggerAssociation" />
<use name="heppdt" />
<use name="hepmc" />
<!-- <use name="Utilities/General"/> -->
<flags EDM_PLUGIN="1"/>
102 changes: 102 additions & 0 deletions NtupleProducer/plugins/L1DecTkTruthTableProducer.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
// user include files
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/global/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"

#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/Common/interface/View.h"
#include "DataFormats/Common/interface/RefToPtr.h"

#include "DataFormats/L1TParticleFlow/interface/PFTrack.h"
#include "DataFormats/Math/interface/deltaR.h"

#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Utilities/interface/InputTag.h"

#include "DataFormats/NanoAOD/interface/FlatTable.h"

#include "CommonTools/Utils/interface/StringCutObjectSelector.h"
#include "CommonTools/Utils/interface/StringObjectFunction.h"

#include "L1Trigger/Phase2L1ParticleFlow/interface/L1TPFUtils.h"

#include "SimTracker/TrackTriggerAssociation/interface/TTTrackAssociationMap.h"

#include <algorithm>

class L1DecTkTruthTableProducer : public edm::global::EDProducer<> {
public:
explicit L1DecTkTruthTableProducer(const edm::ParameterSet&);
~L1DecTkTruthTableProducer();

private:
virtual void produce(edm::StreamID id, edm::Event& iEvent, const edm::EventSetup& iSetup) const override;
//std::vector<l1t::PFTrack>

std::string name_;
edm::EDGetTokenT<std::vector<l1t::PFTrack>> decTks_;
edm::EDGetTokenT<TTTrackAssociationMap<Ref_Phase2TrackerDigi_>> ttTrackMCTruthToken_;
};

L1DecTkTruthTableProducer::L1DecTkTruthTableProducer(const edm::ParameterSet& iConfig)
: name_(iConfig.getParameter<std::string>("name")),
decTks_(consumes<std::vector<l1t::PFTrack>>(iConfig.getParameter<edm::InputTag>("src"))),
ttTrackMCTruthToken_(consumes<TTTrackAssociationMap<Ref_Phase2TrackerDigi_>>(
iConfig.getParameter<edm::InputTag>("MCTruthTrackInputTag")))
{
produces<nanoaod::FlatTable>();
}

L1DecTkTruthTableProducer::~L1DecTkTruthTableProducer() {}

// ------------ method called for each event ------------
void L1DecTkTruthTableProducer::produce(edm::StreamID id, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
edm::Handle<std::vector<l1t::PFTrack>> decTks;
edm::Handle<TTTrackAssociationMap<Ref_Phase2TrackerDigi_>> MCTruthTTTrackHandle;
iEvent.getByToken(decTks_, decTks);
iEvent.getByToken(ttTrackMCTruthToken_, MCTruthTTTrackHandle);

// create the table
unsigned int ncands = decTks->size();
auto out = std::make_unique<nanoaod::FlatTable>(ncands, name_, false, true);

std::vector<int> isGenuine(ncands), isLooselyGenuine(ncands), isUnknown(ncands), isCombinatoric(ncands), isReal(ncands);
std::vector<unsigned int> tpmatch(ncands);

for (unsigned int i = 0; i < ncands; ++i) {
const auto tkPtr = edm::refToPtr((*decTks)[i].track());
isGenuine[i] = MCTruthTTTrackHandle->isGenuine(tkPtr);
isLooselyGenuine[i] = MCTruthTTTrackHandle->isLooselyGenuine(tkPtr);
isUnknown[i] = MCTruthTTTrackHandle->isUnknown(tkPtr);
isCombinatoric[i] = MCTruthTTTrackHandle->isCombinatoric(tkPtr);
tpmatch[i] = (isCombinatoric[i]) + (isUnknown[i] << 1) + (isLooselyGenuine[i] << 2) + (isGenuine[i] << 3);

edm::Ptr<TrackingParticle> my_tp = MCTruthTTTrackHandle->findTrackingParticlePtr(tkPtr);
int tmp_isReal;
if (my_tp.isNull()) {
tmp_isReal = 0;
} else {
int tmp = (my_tp->eventId().event());
if (tmp > 0) {
tmp_isReal = 2;
} else {
tmp_isReal = 1;
}
}
isReal[i] = tmp_isReal;
}

out->addColumn<float>("isGenuine", isGenuine, "");
out->addColumn<float>("isLooselyGenuine", isLooselyGenuine, "");
out->addColumn<float>("isUnknown", isUnknown, "");
out->addColumn<float>("isCombinatoric", isCombinatoric, "");
out->addColumn<float>("isReal", isReal, "");

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know if "isReal" is an appropriate name. This variable is 0 if the track is combinatoric, 1 if the track was generated by a tracking particle produced in the hard scattering, 2 if the track is due to pileup

out->addColumn<float>("tpmatch", tpmatch, "");

// save to the event branches
iEvent.put(std::move(out));
}

//define this as a plug-in
#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(L1DecTkTruthTableProducer);
59 changes: 40 additions & 19 deletions NtupleProducer/python/runPerformanceNTuple.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import warnings

import FWCore.ParameterSet.Config as cms
from Configuration.StandardSequences.Eras import eras
from PhysicsTools.NanoAOD.common_cff import Var, ExtVar
from PhysicsTools.NanoAOD.common_cff import Var, ExtVar

process = cms.Process("RESP", eras.Phase2C17I13M9)

Expand All @@ -13,11 +15,14 @@

process.source = cms.Source("PoolSource",
fileNames = cms.untracked.vstring('file:inputs125X.root'),
inputCommands = cms.untracked.vstring("keep *",
inputCommands = cms.untracked.vstring("keep *",
"drop l1tPFClusters_*_*_*",
"drop l1tPFTracks_*_*_*",
"drop l1tPFCandidates_*_*_*",
"drop l1tTkPrimaryVertexs_*_*_*")
"drop l1tTkPrimaryVertexs_*_*_*",
"drop l1tTrackerMuons_*_*_*",
"drop *_hlt*_*_HLT",
"drop triggerTriggerFilterObjectWithRefs_*_*_HLT",)
)

process.load('Configuration.Geometry.GeometryExtended2026D95Reco_cff')
Expand Down Expand Up @@ -106,7 +111,7 @@ def _add(name, what):
for O in ["", "Charged", "Neutral", "Electron", "Muon", "ChargedHadron", "NeutralHadron", "Photon"]:
for X in ("tot","max"):
process.ntuple.copyUInts.append( "%s:%sN%s%s" % (D,X,P,O))
process.ntuple.copyVecUInts.append( "%s:vecN%s%s" % (D,P,O))
process.ntuple.copyVecUInts.append( "%s:vecN%s%s" % (D,P,O))

process.ntuple = cms.EDAnalyzer("ResponseNTuplizer",
genJets = cms.InputTag("ak4GenJetsNoNu"),
Expand Down Expand Up @@ -141,7 +146,7 @@ def _add(name, what):
)

process.l1pfmetTable = cms.EDProducer("L1PFMetTableProducer",
genMet = cms.InputTag("genMetTrue"),
genMet = cms.InputTag("genMetTrue"),
flavour = cms.string(""),
mets = cms.PSet(
),
Expand All @@ -157,7 +162,7 @@ def _add(name, what):
#process.content = cms.EDAnalyzer("EventContentAnalyzer")
process.p = cms.Path(
process.ntuple + #process.content +
process.l1pfjetTable +
process.l1pfjetTable +
process.l1pfmetTable + process.l1pfmetCentralTable
)
process.p.associate(process.extraPFStuff)
Expand Down Expand Up @@ -229,8 +234,8 @@ def addCalib():
process.l1tPFClustersFromHGC3DClustersRaw = process.l1tPFClustersFromHGC3DClusters.clone(corrector = "")
process.l1tPFClustersFromHGC3DClustersEMRaw = process.l1tPFClustersFromHGC3DClustersEM.clone(corrector = "")
process.extraPFStuff.add(
process.l1tPFClustersFromL1EGClustersRaw,
process.l1tPFClustersFromHGC3DClustersRaw,
process.l1tPFClustersFromL1EGClustersRaw,
process.l1tPFClustersFromHGC3DClustersRaw,
process.l1tPFClustersFromHGC3DClustersEM,
process.l1tPFClustersFromHGC3DClustersEMRaw)
process.ntuple.objects.L1RawBarrelEcal = cms.VInputTag('l1tPFClustersFromL1EGClustersRaw' )
Expand Down Expand Up @@ -304,7 +309,7 @@ def addTkPtCut(ptCut):
process.l1tLayer1HGCalTkPt3 = process.l1tLayer1HGCal.clone(trkPtCut = ptCut)
process.l1tLayer1TkPt3 = cms.EDProducer("L1TPFCandMultiMerger",
pfProducers = cms.VInputTag(
cms.InputTag("l1tLayer1BarrelTkPt3"),
cms.InputTag("l1tLayer1BarrelTkPt3"),
cms.InputTag("l1tLayer1HGCalTkPt3"),
cms.InputTag("l1tLayer1HGCalNoTK"),
cms.InputTag("l1tLayer1HF")
Expand Down Expand Up @@ -501,7 +506,7 @@ def addPFLep(pdgs=[11,13,22],opts=["PF","Puppi"], postfix=""):
setattr(process, w+"Ph"+postfix+"Table", phTable)
process.extraPFStuff.add(phTable)

def addStaEG(postfix=""):
def addStaEG(postfix=""):
def getStaEgTables(slice, postfix, inputtag):
staEgTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
name = cms.string("EGSta"+slice+postfix),
Expand All @@ -528,7 +533,7 @@ def getStaEgTables(slice, postfix, inputtag):
process.extraPFStuff.add(staEgEEEmuTable)


def addTkEG(doL1=False, doL2=True, postfix=""):
def addTkEG(doL1=False, doL2=True, postfix=""):
def getTkEgTables(slice, postfix, tkem_inputtag, tkele_inputtag):
tkEmTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
name = cms.string("TkEm"+slice+postfix),
Expand Down Expand Up @@ -562,22 +567,22 @@ def getTkEgTables(slice, postfix, tkem_inputtag, tkele_inputtag):
tkEleTable.variables.caloEta = Var("egCaloPtr.eta", float,precision=8)
tkEleTable.variables.caloPhi = Var("egCaloPtr.phi", float,precision=8)
return tkEmTable, tkEleTable
if doL1:

if doL1:
for w in "EB","EE":
tkEmTable, tkEleTable = getTkEgTables(w, postfix, f"l1tLayer1EG{postfix}:L1TkEm{w}", f'l1tLayer1EG{postfix}:L1TkEle{w}')
setattr(process, "TkEm%s%sTable" % (w,postfix), tkEmTable)
setattr(process, "TkEle%s%sTable" % (w,postfix), tkEleTable)
process.extraPFStuff.add(tkEmTable,tkEleTable)

if doL2:
if doL2:
tkEmTable, tkEleTable = getTkEgTables('L2', postfix, f"l1tLayer2EG:L1CtTkEm", f'l1tLayer2EG:L1CtTkElectron')
setattr(process, "TkEmL2%sTable" % (postfix), tkEmTable)
setattr(process, "TkEleL2%sTable" % (postfix), tkEleTable)
process.extraPFStuff.add(tkEmTable,tkEleTable)


def addDecodedTk(regs=['HGCal','Barrel']):
def addDecodedTk(regs=['HGCal','Barrel'], truth=False):
for reg in regs:
decTkTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
name = cms.string("DecTk"+reg),
Expand All @@ -604,6 +609,22 @@ def addDecodedTk(regs=['HGCal','Barrel']):
setattr(process, f"decTk{reg}Table", decTkTable)
process.extraPFStuff.add(decTkTable)

if truth:
warnings.warn(
"To make it work you have to change the digiSimLinks input tag of TTClusterAssociatorFromPixelDigis in SimTracker/TrackTriggerAssociation/python/TTClusterAssociation_cfi.py. \nIt must be ('simSiPixelDigis','Tracker'), not ('mix','Tracker')"
)
warnings.warn('Truth track must be runned on RAW dataset')
decTkTableExt = cms.EDProducer(
'L1DecTkTruthTableProducer',
name=cms.string('DecTk' + reg),
src=cms.InputTag('l1tLayer1' + reg, 'DecodedTK'),
MCTruthTrackInputTag=cms.InputTag(
'TTTrackAssociatorFromPixelDigis', 'Level1TTTracks'
),
)
setattr(process, f'decTk{reg}ExtTable', decTkTableExt)
process.extraPFStuff.add(decTkTableExt)



def addEGCrystalClusters() -> None:
Expand Down Expand Up @@ -637,7 +658,7 @@ def getCrystalClustersTable(nameSrcDict : dict[str, str]) -> cms.EDProducer:
)
)
return CrystalClustersTable

nameSrcDictList=[
{"name":"CaloEGammaCrystalClustersRCT", "src":"l1tPhase2L1CaloEGammaEmulator:RCTClusters"},
{"name":"CaloEGammaCrystalClustersGCT", "src":"l1tPhase2L1CaloEGammaEmulator:GCTClusters"},
Expand All @@ -658,7 +679,7 @@ def addAllLeps():
def goGun(calib=1):
process.ntuple.isParticleGun = True
respOnly()
if calib:
if calib:
addCalib()
def goMT(nthreads=2):
process.options.numberOfThreads = cms.untracked.uint32(nthreads)
Expand Down Expand Up @@ -701,7 +722,7 @@ def addEDMOutput():

if False:
#process.source.fileNames = [ '/store/cmst3/group/l1tr/gpetrucc/11_1_0/NewInputs110X/110121.done/TTbar_PU200/inputs110X_%d.root' % i for i in (1,)] #3,7,8,9) ]
process.source.fileNames = [ '/store/cmst3/group/l1tr/gpetrucc/12_3_X/NewInputs110X/220322/TTbar_PU200/inputs110X_%d.root' % i for i in (1,)]
process.source.fileNames = [ '/store/cmst3/group/l1tr/gpetrucc/12_3_X/NewInputs110X/220322/TTbar_PU200/inputs110X_%d.root' % i for i in (1,)]
#process.source.fileNames = [ '/store/cmst3/group/l1tr/gpetrucc/11_1_0/NewInputs110X/110121.done/DYToLL_PU200/inputs110X_%d.root' % i for i in (1,)] #3,7,8,9) ]
#goMT(4)
#oldInputs_11_1_6()
Expand Down Expand Up @@ -745,4 +766,4 @@ def saveGenCands():
charge = cms.string("charge")
),
)
process.p += process.gencandTable
process.p += process.gencandTable