CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes
L1TMicroGMTInputProducerFromGen Class Reference

#include <L1Trigger/L1TGlobalMuon/plugins/L1TMicroGMTInputProducerFromGen.cc>

Inheritance diagram for L1TMicroGMTInputProducerFromGen:
edm::stream::EDProducer<>

Public Member Functions

 L1TMicroGMTInputProducerFromGen (const edm::ParameterSet &)
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 

Private Member Functions

void produce (edm::Event &, const edm::EventSetup &) override
 

Static Private Member Functions

static bool compareMuons (const RegionalMuonCand &, const RegionalMuonCand &)
 

Private Attributes

edm::EDGetTokenT< reco::GenParticleCollectiongenParticlesToken
 
int m_currEvt
 
TRandom3 m_rnd
 

Static Private Attributes

static const int m_maxMuons = 108
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
using CacheTypes = CacheContexts< T... >
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T... >
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 

Detailed Description

Description: takes generated muons and fills them in the expected collections for the MicroGMT

Implementation: [Notes on implementation]

Definition at line 50 of file L1TMicroGMTInputProducerFromGen.cc.

Constructor & Destructor Documentation

◆ L1TMicroGMTInputProducerFromGen()

L1TMicroGMTInputProducerFromGen::L1TMicroGMTInputProducerFromGen ( const edm::ParameterSet iConfig)
explicit

Definition at line 79 of file L1TMicroGMTInputProducerFromGen.cc.

References genParticlesToken, and AlCaHLTBitMon_QueryRunRegistry::string.

80  : m_currEvt(0), m_rnd(0) {
81  //register your inputs:
82  genParticlesToken = consumes<reco::GenParticleCollection>(std::string("genParticles"));
83  //register your products
84  produces<RegionalMuonCandBxCollection>("BarrelTFMuons");
85  produces<RegionalMuonCandBxCollection>("OverlapTFMuons");
86  produces<RegionalMuonCandBxCollection>("ForwardTFMuons");
87  produces<MuonCaloSumBxCollection>("TriggerTowerSums");
88 }
edm::EDGetTokenT< reco::GenParticleCollection > genParticlesToken

Member Function Documentation

◆ compareMuons()

bool L1TMicroGMTInputProducerFromGen::compareMuons ( const RegionalMuonCand mu1,
const RegionalMuonCand mu2 
)
staticprivate

Definition at line 94 of file L1TMicroGMTInputProducerFromGen.cc.

References l1t::RegionalMuonCand::processor().

Referenced by produce().

94  {
95  return mu1.processor() < mu2.processor();
96 }
const int processor() const
Get processor ID on which the candidate was found (0..5 for OMTF/EMTF; 0..11 for BMTF) ...

◆ fillDescriptions()

void L1TMicroGMTInputProducerFromGen::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 235 of file L1TMicroGMTInputProducerFromGen.cc.

References edm::ConfigurationDescriptions::addDefault(), and submitPVResolutionJobs::desc.

235  {
236  //The following says we do not know what parameters are allowed so do no validation
237  // Please change this to state exactly what you do use, even if it is no parameters
239  desc.setUnknown();
240  descriptions.addDefault(desc);
241 }
void addDefault(ParameterSetDescription const &psetDescription)

◆ produce()

void L1TMicroGMTInputProducerFromGen::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivate

Definition at line 99 of file L1TMicroGMTInputProducerFromGen.cc.

References funct::abs(), l1t::bmtf, reco::Candidate::charge(), compareMuons(), l1t::emtf_neg, l1t::emtf_pos, hcalRecHitTable_cff::energy, PVValHelper::eta, reco::Candidate::eta(), AJJGenJetFilter_cfi::genParticles, genParticlesToken, l1trig_cff::hwCharge, l1trig_cff::hwChargeValid, l1trig_cff::hwEta, l1trig_cff::hwPhi, l1trig_cff::hwPt, l1trig_cff::hwQual, mps_fire::i, iEvent, createfilelist::int, ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder::it, LogTrace, m_currEvt, m_maxMuons, m_rnd, PV_cfg::maxPt, eostools::move(), amptDefaultParameters_cff::mu, l1t::omtf_neg, l1t::omtf_pos, reco::Candidate::pdgId(), phi, reco::Candidate::phi(), Pi, reco::Candidate::pt(), jetUpdater_cfi::sort, reco::Candidate::status(), and Geom::twoPi().

99  {
100  using namespace edm;
101 
102  std::unique_ptr<RegionalMuonCandBxCollection> barrelMuons(new RegionalMuonCandBxCollection());
103  std::unique_ptr<RegionalMuonCandBxCollection> overlapMuons(new RegionalMuonCandBxCollection());
104  std::unique_ptr<RegionalMuonCandBxCollection> endcapMuons(new RegionalMuonCandBxCollection());
105  std::unique_ptr<MuonCaloSumBxCollection> towerSums(new MuonCaloSumBxCollection());
106 
107  std::vector<RegionalMuonCand> bmMuons;
108  std::vector<RegionalMuonCand> omMuons;
109  std::vector<RegionalMuonCand> emMuons;
110 
111  std::vector<int> muIndices;
113  // Make sure that you can get genParticles
114  if (iEvent.getByToken(genParticlesToken, genParticles)) {
115  int cntr = 0;
116  for (auto it = genParticles->cbegin(); it != genParticles->cend(); ++it) {
117  const reco::Candidate& mcParticle = *it;
118  if (abs(mcParticle.pdgId()) == 13 && mcParticle.status() == 1)
119  muIndices.push_back(cntr);
120  cntr++;
121  }
122  } else {
123  LogTrace("GlobalMuon") << " GenParticleCollection not found." << std::endl;
124  }
125 
127  MuonCaloSum tSum;
128  // alternative scale (using full phi bit-width): 163.4521265553765f;
129  const float phiToInt = 91.67324722093171f;
130  // alternative scale: 100.0f;
131  const float etaToInt = 90.9090909090f;
132  const int maxPt = (1 << 9) - 1;
133  int muCntr = 0;
134 
135  double twoPi = TMath::Pi() * 2.;
136 
137  for (auto it = muIndices.begin(); it != muIndices.end(); ++it) {
138  // don't really care which muons are taken...
139  // guess there ain't 108 generated anyways
140  if (muCntr == m_maxMuons)
141  break;
142  int gen_idx = *it;
143  const reco::Candidate& mcMuon = genParticles->at(gen_idx);
144  double eta = mcMuon.eta();
145  if (fabs(eta) > 2.45)
146  continue; // out of acceptance
147  int hwPt = int(mcMuon.pt() * 2);
148  hwPt = (hwPt < maxPt ? hwPt : maxPt);
149  int hwEta = int(eta * etaToInt);
150  double phi = mcMuon.phi();
151  if (phi < 0)
152  phi += twoPi; // add 2*pi
153  int hwPhi = (int(phi * phiToInt)) % 576;
154  int hwQual = 8;
155  int hwCharge = (mcMuon.charge() > 0) ? 0 : 1;
156  int hwChargeValid = 1;
157 
158  mu.setHwPt(hwPt);
159 
160  tftype tf(tftype::bmtf);
161  int globalWedgePhi = (hwPhi + 24) % 576; // this sets CMS phi = 0 to -15 deg
162  int localPhi = globalWedgePhi % 48;
163  int processor = globalWedgePhi / 48 + 1;
164  int globalSectorPhi = (hwPhi - 24); // this sets CMS phi = 0 to +15 deg
165  if (globalSectorPhi < 0) {
166  globalSectorPhi += 576;
167  }
168 
169  if (fabs(eta) > 0.8) {
170  if (fabs(eta) < 1.2) {
171  tf = (eta > 0 ? tftype::omtf_pos : tftype::omtf_neg);
172  processor = globalSectorPhi / 96 + 1;
173  localPhi = globalSectorPhi % 96;
174  } else {
175  tf = (eta > 0 ? tftype::emtf_pos : tftype::emtf_neg);
176  processor = globalSectorPhi / 96 + 1;
177  localPhi = globalSectorPhi % 96;
178  }
179  }
180  mu.setHwPhi(localPhi);
181  mu.setTFIdentifiers(processor, tf);
182 
183  mu.setHwEta(hwEta);
184  mu.setHwSign(hwCharge);
185  mu.setHwSignValid(hwChargeValid);
186  mu.setHwQual(hwQual);
187 
188  if (fabs(eta) < 0.8 && bmMuons.size() < 36) {
189  bmMuons.push_back(mu);
190  muCntr++;
191  } else if (fabs(eta) < 1.2 && omMuons.size() < 36) {
192  omMuons.push_back(mu);
193  muCntr++;
194  } else if (emMuons.size() < 36) {
195  emMuons.push_back(mu);
196  muCntr++;
197  }
198  }
199 
200  std::sort(bmMuons.begin(), bmMuons.end(), L1TMicroGMTInputProducerFromGen::compareMuons);
201  std::sort(omMuons.begin(), omMuons.end(), L1TMicroGMTInputProducerFromGen::compareMuons);
202  std::sort(emMuons.begin(), emMuons.end(), L1TMicroGMTInputProducerFromGen::compareMuons);
203 
204  for (const auto& mu : bmMuons) {
205  barrelMuons->push_back(0, mu);
206  }
207 
208  for (const auto& mu : omMuons) {
209  overlapMuons->push_back(0, mu);
210  }
211 
212  for (const auto& mu : emMuons) {
213  endcapMuons->push_back(0, mu);
214  }
215 
216  for (int i = 0; i < 1008; ++i) {
217  // from where could I take the tower energies?
218  int energy = int(m_rnd.Gaus(12, 6));
219  if (energy < 0)
220  energy = 0;
221  if (energy > 31)
222  energy = 31;
223  MuonCaloSum sum(energy, i / 28, i % 28, i);
224  towerSums->push_back(0, sum);
225  }
226 
227  iEvent.put(std::move(barrelMuons), "BarrelTFMuons");
228  iEvent.put(std::move(overlapMuons), "OverlapTFMuons");
229  iEvent.put(std::move(endcapMuons), "ForwardTFMuons");
230  iEvent.put(std::move(towerSums), "TriggerTowerSums");
231  m_currEvt++;
232 }
const double Pi
BXVector< RegionalMuonCand > RegionalMuonCandBxCollection
virtual double pt() const =0
transverse momentum
BXVector< MuonCaloSum > MuonCaloSumBxCollection
Definition: MuonCaloSumFwd.h:7
virtual int status() const =0
status word
#define LogTrace(id)
int iEvent
Definition: GenABIO.cc:224
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
edm::EDGetTokenT< reco::GenParticleCollection > genParticlesToken
virtual int charge() const =0
electric charge
static bool compareMuons(const RegionalMuonCand &, const RegionalMuonCand &)
virtual int pdgId() const =0
PDG identifier.
maxPt
Definition: PV_cfg.py:224
HLT enums.
constexpr double twoPi()
Definition: Pi.h:32
def move(src, dest)
Definition: eostools.py:511
virtual double phi() const =0
momentum azimuthal angle
virtual double eta() const =0
momentum pseudorapidity

Member Data Documentation

◆ genParticlesToken

edm::EDGetTokenT<reco::GenParticleCollection> L1TMicroGMTInputProducerFromGen::genParticlesToken
private

Definition at line 62 of file L1TMicroGMTInputProducerFromGen.cc.

Referenced by L1TMicroGMTInputProducerFromGen(), and produce().

◆ m_currEvt

int L1TMicroGMTInputProducerFromGen::m_currEvt
private

Definition at line 63 of file L1TMicroGMTInputProducerFromGen.cc.

Referenced by produce().

◆ m_maxMuons

const int L1TMicroGMTInputProducerFromGen::m_maxMuons = 108
staticprivate

Definition at line 64 of file L1TMicroGMTInputProducerFromGen.cc.

Referenced by produce().

◆ m_rnd

TRandom3 L1TMicroGMTInputProducerFromGen::m_rnd
private

Definition at line 65 of file L1TMicroGMTInputProducerFromGen.cc.

Referenced by produce().