Skip to content

Commit aa39901

Browse files
authored
Merge pull request #48394 from rovere/HLTUpgradeNano_OneToMany
Extend NanoAOD for NGT Phase 2 Scouting and Association Handling
2 parents 97e772d + a98c376 commit aa39901

File tree

10 files changed

+488
-11
lines changed

10 files changed

+488
-11
lines changed

HLTrigger/NGTScouting/plugins/BuildFile.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
<use name="FWCore/Common"/>
12
<use name="FWCore/Framework"/>
23
<use name="FWCore/ParameterSet"/>
34
<use name="FWCore/Utilities"/>
@@ -7,7 +8,11 @@
78
<use name="DataFormats/NanoAOD"/>
89
<use name="RecoVertex/VertexTools"/>
910
<use name="DataFormats/Common"/>
11+
<use name="DataFormats/HGCalReco"/>
1012
<use name="DataFormats/PatCandidates"/>
1113
<use name="DataFormats/ParticleFlowCandidate"/>
14+
<use name="DataFormats/StdDictionaries"/>
1215
<use name="PhysicsTools/NanoAOD"/>
1316
<use name="DataFormats/Scouting"/>
17+
<use name="boost"/>
18+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "PhysicsTools/NanoAOD/interface/AssociationMapFlatTableProducer.h"
2+
3+
#include "DataFormats/HGCalReco/interface/Trackster.h"
4+
#include "SimDataFormats/CaloAnalysis/interface/SimCluster.h"
5+
#include "SimDataFormats/CaloAnalysis/interface/CaloParticle.h"
6+
7+
typedef AssociationOneToOneFlatTableProducer<AssociationMapOneToOneFraction<SimCluster, CaloParticle>>
8+
SimClusterCaloParticleFractionFlatTableProducer;
9+
10+
typedef AssociationOneToManyFlatTableProducer<AssociationMapOneToManySharedEnergyScore<ticl::Trackster, ticl::Trackster>>
11+
TracksterTracksterEnergyScoreFlatTableProducer;
12+
13+
#include "FWCore/Framework/interface/MakerMacros.h"
14+
DEFINE_FWK_MODULE(SimClusterCaloParticleFractionFlatTableProducer);
15+
DEFINE_FWK_MODULE(TracksterTracksterEnergyScoreFlatTableProducer);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "PhysicsTools/NanoAOD/interface/SimpleFlatTableProducer.h"
2+
3+
#include "DataFormats/HGCalReco/interface/Trackster.h"
4+
typedef SimpleCollectionFlatTableProducer<ticl::Trackster> TracksterCollectionTableProducer;
5+
6+
#include "FWCore/Framework/interface/MakerMacros.h"
7+
DEFINE_FWK_MODULE(TracksterCollectionTableProducer);

HLTrigger/NGTScouting/python/HLTNanoProducer_cff.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from HLTrigger.NGTScouting.hltTracks_cfi import *
1313
from HLTrigger.NGTScouting.hltJets_cfi import *
1414
from HLTrigger.NGTScouting.hltTaus_cfi import *
15+
from HLTrigger.NGTScouting.hltTracksters_cfi import *
1516
from HLTrigger.NGTScouting.hltTriggerAcceptFilter_cfi import hltTriggerAcceptFilter,dstTriggerAcceptFilter
1617

1718
hltNanoProducer = cms.Sequence(
@@ -29,6 +30,7 @@
2930
+ hltMuonTable
3031
+ hltPFCandidateTable
3132
+ hltJetTable
33+
+ hltTrackstersTable
3234
)
3335

3436
dstNanoProducer = cms.Sequence(
@@ -47,6 +49,7 @@
4749
+ hltPFCandidateTable
4850
+ hltJetTable
4951
+ hltTauTable
52+
+ hltTrackstersTable
5053
)
5154

5255
def hltNanoCustomize(process):
@@ -64,3 +67,9 @@ def hltNanoCustomize(process):
6467
)
6568

6669
return process
70+
71+
def hltNanoValCustomize(process):
72+
if hasattr(process, "dstNanoProducer"):
73+
process.dstNanoProducer += (process.hltTrackstersAssociationOneToManyTable + process.hltSimCl2CPOneToOneFlatTable)
74+
75+
return process

HLTrigger/NGTScouting/python/hltMuons_cfi.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
11
import FWCore.ParameterSet.Config as cms
2+
from Validation.RecoMuon.track_selectors_cff import hltPhase2L3MuonIdTracks
23
from PhysicsTools.NanoAOD.common_cff import *
34

4-
hltPhase2L3MuonIdTracks = cms.EDProducer("MuonTrackProducer",
5-
muonsTag = cms.InputTag("hltPhase2L3Muons"),
6-
inputDTRecSegment4DCollection = cms.InputTag("hltDt4DSegments"),
7-
inputCSCSegmentCollection = cms.InputTag("hltCscSegments"),
8-
selectionTags = cms.vstring('All'),
9-
trackType = cms.string('recomuonTrack'),
10-
ignoreMissingMuonCollection = cms.untracked.bool(False)
11-
)
12-
135
hltMuonTable = cms.EDProducer(
146
"SimpleTriggerTrackFlatTableProducer",
157
src = cms.InputTag("hltPhase2L3MuonIdTracks"),
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import FWCore.ParameterSet.Config as cms
2+
from PhysicsTools.NanoAOD.common_cff import *
3+
from PhysicsTools.NanoAOD.nano_cff import nanoMetadata
4+
5+
hltUpgradeNanoTask = cms.Task(nanoMetadata)
6+
7+
8+
### Tracksters
9+
hltTrackstersTable = cms.EDProducer(
10+
"TracksterCollectionTableProducer",
11+
src=cms.InputTag("hltTiclTrackstersMerge"),
12+
cut=cms.string(""),
13+
name=cms.string("tracksters"),
14+
doc=cms.string("HLT Merged Tracksters"),
15+
singleton=cms.bool(False), # the number of entries is variable
16+
variables=cms.PSet(
17+
raw_energy=Var("raw_energy", "float", doc="Raw Energy of the trackster"),
18+
),
19+
collectionVariables=cms.PSet(
20+
tracksterVertices=cms.PSet(
21+
name=cms.string("vertices"),
22+
doc=cms.string("Vertex properties"),
23+
useCount=cms.bool(True),
24+
useOffset=cms.bool(True),
25+
variables=cms.PSet(
26+
vertices=Var("vertices", "uint", doc="Layer clusters indices."),
27+
vertex_mult=Var(
28+
"vertex_multiplicity",
29+
"float",
30+
doc="Fraction of Layer cluster energy used by the Trackster.",
31+
),
32+
),
33+
)
34+
),
35+
)
36+
37+
### Tracksters Associators
38+
hltTrackstersAssociationOneToManyTable = cms.EDProducer(
39+
"TracksterTracksterEnergyScoreFlatTableProducer",
40+
src=cms.InputTag(
41+
"hltAllTrackstersToSimTrackstersAssociationsByHits:hltTiclSimTrackstersTohltTiclTrackstersMerge"
42+
),
43+
name=cms.string("SimTS2TSMergeByHits"),
44+
doc=cms.string("Association between SimTracksters and tracksterMerge, by hits."),
45+
collectionVariables=cms.PSet(
46+
links=cms.PSet(
47+
name=cms.string("SimTS2TSMergeByHitsLinks"),
48+
doc=cms.string("Association links."),
49+
useCount=cms.bool(True),
50+
useOffset=cms.bool(False),
51+
variables=cms.PSet(
52+
index=Var("index", "uint", doc="Index of the associated Trackster."),
53+
sharedEnergy=Var(
54+
"sharedEnergy",
55+
"float",
56+
doc="Shared energy with associated Trackster.",
57+
),
58+
score=Var("score", "float", doc="Association score."),
59+
),
60+
)
61+
),
62+
)
63+
64+
### Tracksters Associators
65+
hltSimCl2CPOneToOneFlatTable = cms.EDProducer(
66+
"SimClusterCaloParticleFractionFlatTableProducer",
67+
src=cms.InputTag("SimClusterToCaloParticleAssociation:simClusterToCaloParticleMap"),
68+
name=cms.string("SimCl2CPWithFraction"),
69+
doc=cms.string("Association between SimClusters and CaloParticles."),
70+
variables=cms.PSet(
71+
index=Var("index", "int", doc="Index of linked CaloParticle."),
72+
fraction=Var("fraction", "float", doc="Fraction of linked CaloParticle."),
73+
),
74+
)
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import uproot
2+
import awkward as ak
3+
import numpy as np
4+
import argparse
5+
import sys
6+
7+
def main():
8+
# Argument parsing
9+
parser = argparse.ArgumentParser(description="Process a NanoAOD ROOT file.")
10+
parser.add_argument("filename", help="Path to the NanoAOD ROOT file")
11+
args = parser.parse_args()
12+
13+
file_path = args.filename
14+
tree_name = "Events"
15+
16+
# Open the ROOT file and load the TTree
17+
try:
18+
with uproot.open(file_path) as file:
19+
tree = file[tree_name]
20+
print(tree.keys())
21+
22+
events = tree.arrays(library="ak")
23+
print("Fields:", "\n\t".join(events[0].fields))
24+
except Exception as e:
25+
print(f"Error opening file or reading tree: {e}")
26+
sys.exit(1)
27+
28+
# Event loop
29+
for i, event in enumerate(events):
30+
print(f"Processing event {i}")
31+
print("Found {} tracksters".format(event.ntracksters))
32+
for t_idx in range(event.ntracksters):
33+
offset = event.tracksters_overtices[t_idx]
34+
count = event.tracksters_nvertices[t_idx]
35+
vertices = event.vertices_vertices[offset : offset + count]
36+
vertex_multiplicity = event.vertices_vertex_mult[offset : offset + count]
37+
print(
38+
t_idx,
39+
list(zip(vertices, vertex_multiplicity)),
40+
event.tracksters_raw_energy[t_idx],
41+
)
42+
43+
print("Exploring connections, scores, and sharedEnergy")
44+
print("Connections for {} objects".format(event.nSimTS2TSMergeByHits))
45+
46+
try: # Offset pattern
47+
offset = 0
48+
for obj_idx in range(event.nSimTS2TSMergeByHits - 1):
49+
next_offset = event.SimTS2TSMergeByHits_oSimTS2TSMergeByHitsLinks[
50+
obj_idx + 1
51+
]
52+
elements = event.SimTS2TSMergeByHitsLinks_index[offset:next_offset]
53+
scores = event.SimTS2TSMergeByHitsLinks_score[offset:next_offset]
54+
sharedEnergy = event.SimTS2TSMergeByHitsLinks_shardEnergy[
55+
offset:next_offset
56+
]
57+
if len(elements) > 0:
58+
print("Offset ", obj_idx, elements, scores, sharedEnergy)
59+
offset = next_offset
60+
except AttributeError as e:
61+
print(f"An AttributeError occurred (Offset): {e}")
62+
63+
try: # Count pattern
64+
offset = 0
65+
for obj_idx in range(event.nSimTS2TSMergeByHits):
66+
count = event.SimTS2TSMergeByHits_nSimTS2TSMergeByHitsLinks[obj_idx]
67+
elements = event.SimTS2TSMergeByHitsLinks_index[offset : offset + count]
68+
scores = event.SimTS2TSMergeByHitsLinks_score[offset : offset + count]
69+
sharedEnergy = event.SimTS2TSMergeByHitsLinks_sharedEnergy[
70+
offset : offset + count
71+
]
72+
if len(elements) > 0:
73+
print("Count ", obj_idx, elements, scores, sharedEnergy)
74+
offset += count
75+
except AttributeError as e:
76+
print(f"An AttributeError occurred (Count): {e}")
77+
78+
try:
79+
for i in range(event.nSimCl2CPWithFraction):
80+
print(
81+
"SimCl {} is linked to CP {} with fraction {}".format(
82+
i,
83+
event.SimCl2CPWithFraction_index[i],
84+
event.SimCl2CPWithFraction_fraction[i],
85+
)
86+
)
87+
except AttributeError as e:
88+
print(f"An AttributeError occurred (SimCl2CPWithFraction): {e}")
89+
90+
if __name__ == "__main__":
91+
main()

0 commit comments

Comments
 (0)