Skip to content

Commit dde7bb6

Browse files
committed
fix emulation of L1T ZDC EtSums
1 parent e6ece82 commit dde7bb6

File tree

7 files changed

+191
-216
lines changed

7 files changed

+191
-216
lines changed

DQM/Integration/python/clients/hcal_dqm_sourceclient-live_cfg.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,9 @@
125125

126126
process.emulTPDigisForZDC = process.emulTPDigis.clone(inputUpgradeLabel = cms.VInputTag("hcalDigis", "hcalDigis:ZDC"))
127127

128-
#inserting zdc emulator after tp digis
129-
process.etSumZdcProducer = cms.EDProducer('L1TZDCProducer',
130-
hcalTPDigis = cms.InputTag("emulTPDigisForZDC"),
131-
bxFirst = cms.int32(-2),
132-
bxLast = cms.int32(3)
133-
)
128+
# Emulation of L1T ZDC EtSums based on HCAL trigger primitives
129+
from L1Trigger.L1TZDC.l1tZDCEtSums_cfi import l1tZDCEtSums as _l1tZDCEtSums
130+
process.etSumZdcProducer = _l1tZDCEtSums.clone(hcalTPDigis = "emulTPDigisForZDC")
134131

135132
process.hcalDigis.InputLabel = rawTag
136133
process.emulTPDigisNoTDCCut = process.emulTPDigis.clone(

L1Trigger/L1TZDC/plugins/BuildFile.xml

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
<use name="FWCore/Framework"/>
2-
<use name="FWCore/ParameterSet"/>
3-
<use name="FWCore/Utilities"/>
4-
<use name="FWCore/ServiceRegistry"/>
51
<use name="CommonTools/UtilAlgos"/>
62
<use name="DataFormats/HcalDigi"/>
73
<use name="DataFormats/L1Trigger"/>
8-
<use name="DataFormats/L1TCalorimeter"/>
9-
<use name="CondFormats/L1TObjects"/>
10-
<use name="CondFormats/DataRecord"/>
4+
<use name="FWCore/Framework"/>
5+
<use name="FWCore/MessageLogger"/>
6+
<use name="FWCore/ParameterSet"/>
7+
<use name="FWCore/ServiceRegistry"/>
8+
<use name="FWCore/Utilities"/>
119
<use name="L1Trigger/L1TCalorimeter"/>
1210
<library file="*.cc" name="L1TriggerL1TZDCPlugins">
1311
<flags EDM_PLUGIN="1"/>

L1Trigger/L1TZDC/plugins/L1TZDCAnalyzer.cc renamed to L1Trigger/L1TZDC/plugins/L1TZDCEtSumsAnalyzer.cc

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,16 @@
22
//Modified by Chris McGinn to instead work for just ZDC etSums
33
//Contact at [email protected] or cfmcginn @ github for bugs
44

5-
#include "FWCore/Framework/interface/Event.h"
6-
#include "FWCore/Framework/interface/MakerMacros.h"
7-
#include "FWCore/Framework/interface/one/EDAnalyzer.h"
8-
9-
#include "FWCore/ParameterSet/interface/ParameterSet.h"
10-
11-
#include "FWCore/ServiceRegistry/interface/Service.h"
125
#include "CommonTools/UtilAlgos/interface/TFileService.h"
136

14-
#include "CondFormats/L1TObjects/interface/CaloParams.h"
15-
#include "CondFormats/DataRecord/interface/L1TCaloParamsRcd.h"
16-
17-
#include "DataFormats/L1TCalorimeter/interface/CaloTower.h"
18-
#include "DataFormats/L1TCalorimeter/interface/CaloCluster.h"
19-
#include "DataFormats/L1Trigger/interface/EGamma.h"
20-
#include "DataFormats/L1Trigger/interface/Tau.h"
21-
#include "DataFormats/L1Trigger/interface/Jet.h"
227
#include "DataFormats/L1Trigger/interface/EtSum.h"
238

9+
#include "FWCore/Framework/interface/Event.h"
10+
#include "FWCore/Framework/interface/one/EDAnalyzer.h"
11+
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
12+
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
13+
#include "FWCore/ServiceRegistry/interface/Service.h"
14+
2415
//For the output
2516
#include "TTree.h"
2617
//string for some branch handling
@@ -32,10 +23,10 @@
3223

3324
namespace l1t {
3425

35-
class L1TZDCAnalyzer : public edm::one::EDAnalyzer<edm::one::SharedResources> {
26+
class L1TZDCEtSumsAnalyzer : public edm::one::EDAnalyzer<edm::one::SharedResources> {
3627
public:
37-
explicit L1TZDCAnalyzer(const edm::ParameterSet&);
38-
~L1TZDCAnalyzer() override = default;
28+
explicit L1TZDCEtSumsAnalyzer(const edm::ParameterSet&);
29+
~L1TZDCEtSumsAnalyzer() override = default;
3930

4031
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
4132

@@ -73,7 +64,7 @@ namespace l1t {
7364
//
7465
// constructors and destructor
7566
//
76-
L1TZDCAnalyzer::L1TZDCAnalyzer(const edm::ParameterSet& iConfig)
67+
L1TZDCEtSumsAnalyzer::L1TZDCEtSumsAnalyzer(const edm::ParameterSet& iConfig)
7768
: doHistos_(iConfig.getUntrackedParameter<bool>("doHistos", true)) {
7869
usesResource(TFileService::kSharedResource);
7970
//now do what ever initialization is needed
@@ -84,15 +75,15 @@ namespace l1t {
8475
edm::InputTag sumTag = iConfig.getParameter<edm::InputTag>("etSumTag");
8576
sumToken_ = consumes<l1t::EtSumBxCollection>(sumTag);
8677

87-
edm::LogInfo("L1TZDCAnalyzer") << "Processing " << sumTag.label() << std::endl;
78+
edm::LogInfo("L1TZDCEtSumsAnalyzer") << "Processing " << sumTag.label() << std::endl;
8879
}
8980

9081
//
9182
// member functions
9283
//
9384

9485
// ------------ method called for each event ------------
95-
void L1TZDCAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
86+
void L1TZDCEtSumsAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
9687
using namespace edm;
9788

9889
// Handle<EtSumBxCollection> sums;
@@ -114,26 +105,25 @@ namespace l1t {
114105
}
115106

116107
// ------------ method called once each job just before starting event loop ------------
117-
void L1TZDCAnalyzer::beginJob() {
108+
void L1TZDCEtSumsAnalyzer::beginJob() {
118109
etSumZdcTree_ = fs_->make<TTree>("etSumZdcTree", "");
119110
etSumZdcTree_->Branch("etSumZdcP", etSumZdcP_, ("etSumZdcP[" + std::to_string(maxBPX_) + "]/F").c_str());
120111
etSumZdcTree_->Branch("etSumZdcM", etSumZdcM_, ("etSumZdcM[" + std::to_string(maxBPX_) + "]/F").c_str());
121112
}
122113

123114
// ------------ method called once each job just after ending the event loop ------------
124-
void L1TZDCAnalyzer::endJob() {}
115+
void L1TZDCEtSumsAnalyzer::endJob() {}
125116

126117
// ------------ method fills 'descriptions' with the allowed parameters for the module ------------
127-
void L1TZDCAnalyzer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
118+
void L1TZDCEtSumsAnalyzer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
128119
edm::ParameterSetDescription desc;
129-
130120
desc.add<edm::InputTag>("etSumTag", edm::InputTag("l1tZDCEtSums", ""));
131-
descriptions.add("l1tZDCAnalyzer", desc);
121+
descriptions.add("l1tZDCEtSumsAnalyzer", desc);
132122
}
133123

134124
} // namespace l1t
135125

136126
using namespace l1t;
137127

138-
//define this as a plug-in
139-
DEFINE_FWK_MODULE(L1TZDCAnalyzer);
128+
#include "FWCore/Framework/interface/MakerMacros.h"
129+
DEFINE_FWK_MODULE(L1TZDCEtSumsAnalyzer);
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
//
2+
// L1TZDCEtSumsProducer
3+
// EDProducer to compute the ZDC l1t::EtSums from HCAL trigger primitives
4+
//
5+
// Original author: Chris McGinn
6+
// Contact: [email protected] or
7+
// cfmcginn on github for bugs/issues
8+
//
9+
#include <algorithm>
10+
#include <array>
11+
#include <memory>
12+
#include <vector>
13+
14+
#include "DataFormats/L1Trigger/interface/EtSum.h"
15+
#include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
16+
17+
#include "FWCore/Framework/interface/EventSetup.h"
18+
#include "FWCore/Framework/interface/global/EDProducer.h"
19+
#include "FWCore/Framework/interface/Event.h"
20+
#include "FWCore/MessageLogger/interface/MessageLogger.h"
21+
#include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
22+
#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
23+
#include "FWCore/Utilities/interface/EDGetToken.h"
24+
#include "FWCore/Utilities/interface/InputTag.h"
25+
26+
#include "L1Trigger/L1TCalorimeter/interface/CaloTools.h"
27+
28+
class L1TZDCEtSumsProducer : public edm::global::EDProducer<> {
29+
public:
30+
explicit L1TZDCEtSumsProducer(edm::ParameterSet const&);
31+
32+
static void fillDescriptions(edm::ConfigurationDescriptions&);
33+
34+
private:
35+
void produce(edm::StreamID, edm::Event&, edm::EventSetup const&) const override;
36+
37+
edm::EDGetTokenT<HcalTrigPrimDigiCollection> const hcalTPDigisToken_;
38+
39+
int const bxFirst_;
40+
int const bxLast_;
41+
42+
static constexpr int kZDCAbsIEta = 42;
43+
static constexpr int kZDCiEtSumsIPhi = 99;
44+
static constexpr int kZDCiEtSumMaxValue = 1023;
45+
};
46+
47+
L1TZDCEtSumsProducer::L1TZDCEtSumsProducer(edm::ParameterSet const& ps)
48+
: hcalTPDigisToken_{consumes(ps.getParameter<edm::InputTag>("hcalTPDigis"))},
49+
bxFirst_{ps.getParameter<int>("bxFirst")},
50+
bxLast_{ps.getParameter<int>("bxLast")} {
51+
produces<l1t::EtSumBxCollection>();
52+
}
53+
54+
void L1TZDCEtSumsProducer::produce(edm::StreamID, edm::Event& iEvent, edm::EventSetup const&) const {
55+
auto outZDCEtSums = std::make_unique<l1t::EtSumBxCollection>(0, bxFirst_, bxLast_);
56+
57+
auto const hcalTPs = iEvent.getHandle(hcalTPDigisToken_);
58+
59+
if (not hcalTPs.isValid()) {
60+
edm::LogWarning("L1TZDCEtSumsProducer") << "Invalid handle to HcalTrigPrimDigiCollection collection"
61+
<< ": returning empty l1t::EtSumBxCollection for ZDC EtSums !";
62+
} else if (bxFirst_ > bxLast_) {
63+
edm::LogWarning("L1TZDCEtSumsProducer")
64+
<< "Invalid configuration parameters (bxFirst [" << bxFirst_ << "] > bxLast [" << bxLast_
65+
<< "]): returning empty l1t::EtSumBxCollection for ZDC EtSums !";
66+
} else {
67+
// number of bunch crossings
68+
unsigned int const nBXs = (bxLast_ - bxFirst_) + 1;
69+
70+
// iEtSums as taken directly from the ZDC iEtSum TPs (iphi == 99)
71+
std::vector<std::array<int, 2>> iEtSumsFromEtSumTPs{nBXs, {{0, 0}}};
72+
73+
// iEtSums recomputed from the ZDC non-iEtSums TPs (iphi != 99)
74+
std::vector<std::array<int, 2>> iEtSumsFromOtherTPs{nBXs, {{0, 0}}};
75+
76+
// unsigned integers indicating which iEtSums are available for a given BX
77+
// - Bit #1 (0b01): iEtSums as taken directly from the ZDC iEtSum TPs
78+
// - Bit #2 (0b10): iEtSums recomputed from the ZDC non-iEtSums TPs
79+
std::vector<std::array<unsigned int, 2>> iEtSumsFillFlags{nBXs, {{0, 0}}};
80+
81+
for (auto const& hcalTp : *hcalTPs) {
82+
// absIEta position 42 is used for the ZDC (-42 for ZDCM, +42 for ZDCP)
83+
auto const ieta = hcalTp.id().ieta();
84+
auto const absIEta = std::abs(ieta);
85+
86+
if (absIEta != kZDCAbsIEta) {
87+
continue;
88+
}
89+
90+
// ZDC "index": 0 for ZDCM, 1 for ZDCP
91+
auto const zdcIndex = (ieta < 0) ? 0 : 1;
92+
93+
// For ZDC, iphi position 99 is used for iEtSum TPs
94+
auto const iphi = hcalTp.id().iphi();
95+
auto const isZDCiEtSum = (iphi == kZDCiEtSumsIPhi);
96+
97+
// Number of samples, and number of presamples (nPresamples is BX=0)
98+
int const nSamples = hcalTp.size();
99+
int const nPresamples = hcalTp.presamples();
100+
101+
for (auto iSample = 0; iSample < nSamples; ++iSample) {
102+
auto const ibx = iSample - nPresamples;
103+
if (ibx >= bxFirst_ and ibx <= bxLast_) {
104+
auto const& hcalTpSample = hcalTp.sample(iSample);
105+
auto const ietIn = hcalTpSample.raw() & kZDCiEtSumMaxValue;
106+
auto const bxIndex = ibx - bxFirst_;
107+
if (isZDCiEtSum) {
108+
iEtSumsFromEtSumTPs[bxIndex][zdcIndex] = ietIn;
109+
iEtSumsFillFlags[bxIndex][zdcIndex] |= 0b01;
110+
} else {
111+
iEtSumsFromOtherTPs[bxIndex][zdcIndex] += ietIn;
112+
iEtSumsFillFlags[bxIndex][zdcIndex] |= 0b10;
113+
}
114+
}
115+
}
116+
}
117+
118+
for (unsigned int bxIndex = 0; bxIndex < nBXs; ++bxIndex) {
119+
int const bx = bxIndex + bxFirst_;
120+
for (unsigned int zdcIndex = 0; zdcIndex < 2; ++zdcIndex) {
121+
int zdc_hwPt{0};
122+
// Option #1: take iEtSum from the ZDC iEtSum TP
123+
if (iEtSumsFillFlags[bxIndex][zdcIndex] & 0b01) {
124+
zdc_hwPt = iEtSumsFromEtSumTPs[bxIndex][zdcIndex];
125+
}
126+
// Option #2: take iEtSum recomputed from the ZDC non-iEtSums TPs
127+
else if (iEtSumsFillFlags[bxIndex][zdcIndex] & 0b10) {
128+
// recomputed sum cannot be higher than kZDCiEtSumMaxValue
129+
zdc_hwPt = std::min(iEtSumsFromOtherTPs[bxIndex][zdcIndex], kZDCiEtSumMaxValue);
130+
}
131+
// Skip if no iEtSum value is available for this BX
132+
else {
133+
continue;
134+
}
135+
136+
int const zdc_hwEta = (zdcIndex == 0) ? -1 : 1;
137+
138+
auto const zdc_type = (zdcIndex == 0) ? l1t::EtSum::EtSumType::kZDCM : l1t::EtSum::EtSumType::kZDCP;
139+
140+
l1t::EtSum zdc_etSum{};
141+
zdc_etSum.setHwPt(zdc_hwPt);
142+
zdc_etSum.setHwEta(zdc_hwEta);
143+
zdc_etSum.setHwPhi(0);
144+
zdc_etSum.setType(zdc_type);
145+
146+
outZDCEtSums->push_back(bx, l1t::CaloTools::etSumP4Demux(zdc_etSum));
147+
}
148+
}
149+
}
150+
151+
iEvent.put(std::move(outZDCEtSums));
152+
}
153+
154+
void L1TZDCEtSumsProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
155+
edm::ParameterSetDescription desc;
156+
desc.add<edm::InputTag>("hcalTPDigis", edm::InputTag("simHcalTriggerPrimitiveDigis"));
157+
desc.add<int>("bxFirst", -2);
158+
desc.add<int>("bxLast", 2);
159+
descriptions.add("l1tZDCEtSumsProducer", desc);
160+
}
161+
162+
#include "FWCore/Framework/interface/MakerMacros.h"
163+
DEFINE_FWK_MODULE(L1TZDCEtSumsProducer);

0 commit comments

Comments
 (0)