CMS 3D CMS Logo

L1GctEmulator.cc
Go to the documentation of this file.
2 
3 // system includes
4 #include <memory>
5 #include <vector>
6 
7 // EDM includes
15 
17 
18 // Trigger configuration includes
27 
28 // GCT include files
30 
31 // RCT data includes
33 
34 // GCT data includes
36 
37 using std::vector;
38 
40  m_jetEtCalibLuts(),
41  m_writeInternalData(ps.getParameter<bool>("writeInternalData")),
42  m_verbose(ps.getUntrackedParameter<bool>("verbose", false)),
43  m_conditionsLabel(ps.getParameter<std::string>("conditionsLabel"))
44  {
45 
46  // list of products
47  produces<L1GctEmCandCollection>("isoEm");
48  produces<L1GctEmCandCollection>("nonIsoEm");
49  produces<L1GctJetCandCollection>("cenJets");
50  produces<L1GctJetCandCollection>("forJets");
51  produces<L1GctJetCandCollection>("tauJets");
52  produces<L1GctInternJetDataCollection>();
53  produces<L1GctEtTotalCollection>();
54  produces<L1GctEtHadCollection>();
55  produces<L1GctEtMissCollection>();
56  produces<L1GctHtMissCollection>();
57  produces<L1GctInternEtSumCollection>();
58  produces<L1GctInternHtMissCollection>();
59  produces<L1GctHFBitCountsCollection>();
60  produces<L1GctHFRingEtSumsCollection>();
61 
62  // get the input label
64  m_inputLabel = inputTag.label();
65 
66  // Get the number of bunch crossings to be processed
67  int firstBx = -ps.getParameter<unsigned>("preSamples");
68  int lastBx = ps.getParameter<unsigned>("postSamples");
69 
70  // instantiate the GCT. Argument selects the type of jetFinder to be used.
72  std::string jfTypeStr = ps.getParameter<std::string>("jetFinderType");
73  if (jfTypeStr == "tdrJetFinder") { jfType = L1GctJetLeafCard::tdrJetFinder; }
74  else if (jfTypeStr != "hardwareJetFinder") {
75  edm::LogWarning ("L1GctEmulatorSetup") << "Unrecognised jetFinder option " << jfTypeStr
76  << "\nHardware jetFinder will be used";
77  }
78  bool hwTest = ps.getParameter<bool>("hardwareTest");
79  if (hwTest) {
80  unsigned mask = ps.getUntrackedParameter<unsigned>("jetLeafMask", 0);
81  m_gct = new L1GlobalCaloTrigger(jfType, mask);
82  edm::LogWarning ("L1GctEmulatorSetup") << "Emulator has been configured in hardware test mode with mask " << mask
83  << "\nThis mode should NOT be used for Physics studies!";
84  } else {
85  m_gct = new L1GlobalCaloTrigger(jfType);
86  }
87  m_gct->setBxRange(firstBx, lastBx);
88 
89  // Fill the jetEtCalibLuts vector
90  lutPtr nextLut( new L1GctJetEtCalibrationLut() );
91 
92  for (unsigned ieta=0; ieta<L1GctJetFinderParams::NUMBER_ETA_VALUES; ieta++) {
93  nextLut->setEtaBin(ieta);
94  m_jetEtCalibLuts.push_back(nextLut);
95  nextLut.reset ( new L1GctJetEtCalibrationLut() );
96  }
97 
98  // Setup the tau algorithm parameters
99  bool useImprovedTauAlgo = ps.getParameter<bool>("useImprovedTauAlgorithm");
100  bool ignoreTauVetoBitsForIsolation = ps.getParameter<bool>("ignoreRCTTauVetoBitsForIsolation");
101  m_gct->setupTauAlgo(useImprovedTauAlgo, ignoreTauVetoBitsForIsolation);
102 
103  // set verbosity (not implemented yet!)
104  // m_gct->setVerbose(m_verbose);
105 
106  // print debug info?
107  if (m_verbose) {
108  m_gct->print();
109  }
110  consumes<L1CaloEmCollection>(m_inputLabel);
111  consumes<L1CaloRegionCollection>(m_inputLabel);
112 }
113 
115  if (m_gct != nullptr) delete m_gct;
116 }
117 
118 
120 {
121 }
122 
124 {
125 }
126 
128 {
129  int success = 0;
130 
131  if (success == 0) {
132  // get data from EventSetup
134  c.get< L1GctJetFinderParamsRcd >().get( m_conditionsLabel, jfPars ) ; // which record?
136  c.get< L1GctChannelMaskRcd >().get( m_conditionsLabel, chanMask ) ; // which record?
138  c.get< L1JetEtScaleRcd >().get( m_conditionsLabel, etScale ) ; // which record?
139  edm::ESHandle< L1CaloEtScale > htMissScale ;
140  c.get< L1HtMissScaleRcd >().get( m_conditionsLabel, htMissScale ) ; // which record?
141  edm::ESHandle< L1CaloEtScale > hfRingEtScale ;
142  c.get< L1HfRingEtScaleRcd >().get( m_conditionsLabel, hfRingEtScale ) ; // which record?
143 
144 
145  if (jfPars.product() == nullptr) {
146  success = -1;
147  if (m_verbose) {
148  edm::LogWarning("L1GctConfigFailure")
149  << "Failed to find a L1GctJetFinderParamsRcd:L1GctJetFinderParams in EventSetup!" << std::endl;
150  }
151  }
152 
153  if (chanMask.product() == nullptr) {
154  success = -1;
155  if (m_verbose) {
156  edm::LogWarning("L1GctConfigFailure")
157  << "Failed to find a L1GctChannelMaskRcd:L1GctChannelMask in EventSetup!" << std::endl;
158  }
159  }
160 
161  if (hfRingEtScale.product() == nullptr) {
162  success = -1;
163  if (m_verbose) {
164  edm::LogWarning("L1GctConfigFailure")
165  << "Failed to find a L1HfRingEtScaleRcd:L1HfRingEtScaleRcd in EventSetup!" << std::endl;
166  }
167  }
168 
169 
170  if (success==0) {
171  // tell the jet Et Luts about the scales
172  for (unsigned ieta=0; ieta<m_jetEtCalibLuts.size(); ieta++) {
173  m_jetEtCalibLuts.at(ieta)->setFunction(jfPars.product());
174  m_jetEtCalibLuts.at(ieta)->setOutputEtScale(etScale.product());
175  }
176 
177  // pass all the setup info to the gct
179  m_gct->setJetFinderParams(jfPars.product());
180  m_gct->setHtMissScale(htMissScale.product());
181  m_gct->setupHfSumLuts(hfRingEtScale.product());
182  m_gct->setChannelMask(chanMask.product());
183  }
184  }
185 
186  if (success != 0 && m_verbose) {
187  edm::LogError("L1GctConfigError")
188  << "Configuration failed - GCT emulator will not be run" << std::endl;
189  }
190  return success;
191 }
192 
194 
195  // The emulator will always produce output collections, which get filled as long as
196  // the setup and input data are present. Start by making empty output collections.
197 
198  // create the em and jet collections
199  std::unique_ptr<L1GctEmCandCollection> isoEmResult (new L1GctEmCandCollection( ) );
200  std::unique_ptr<L1GctEmCandCollection> nonIsoEmResult(new L1GctEmCandCollection( ) );
201  std::unique_ptr<L1GctJetCandCollection> cenJetResult(new L1GctJetCandCollection( ) );
202  std::unique_ptr<L1GctJetCandCollection> forJetResult(new L1GctJetCandCollection( ) );
203  std::unique_ptr<L1GctJetCandCollection> tauJetResult(new L1GctJetCandCollection( ) );
204 
205  // create the energy sum digis
206  std::unique_ptr<L1GctEtTotalCollection> etTotResult (new L1GctEtTotalCollection( ) );
207  std::unique_ptr<L1GctEtHadCollection> etHadResult (new L1GctEtHadCollection ( ) );
208  std::unique_ptr<L1GctEtMissCollection> etMissResult(new L1GctEtMissCollection ( ) );
209  std::unique_ptr<L1GctHtMissCollection> htMissResult(new L1GctHtMissCollection ( ) );
210 
211  // create the Hf sums digis
212  std::unique_ptr<L1GctHFBitCountsCollection> hfBitCountResult (new L1GctHFBitCountsCollection ( ) );
213  std::unique_ptr<L1GctHFRingEtSumsCollection> hfRingEtSumResult(new L1GctHFRingEtSumsCollection( ) );
214 
215  // create internal data collections
216  std::unique_ptr<L1GctInternJetDataCollection> internalJetResult (new L1GctInternJetDataCollection( ));
217  std::unique_ptr<L1GctInternEtSumCollection> internalEtSumResult (new L1GctInternEtSumCollection ( ));
218  std::unique_ptr<L1GctInternHtMissCollection> internalHtMissResult(new L1GctInternHtMissCollection ( ));
219 
220  // get config data from EventSetup.
221  // check this has been done successfully before proceeding
222  if (configureGct(c) == 0) {
223 
224  // get the RCT data
227  bool gotEm = e.getByLabel(m_inputLabel, em);
228  bool gotRgn = e.getByLabel(m_inputLabel, rgn);
229 
230  // check the data
231  if (!gotEm && m_verbose) {
232  edm::LogError("L1GctInputFailedError")
233  << "Failed to get em candidates with label " << m_inputLabel << " - GCT emulator will not be run" << std::endl;
234  }
235 
236  if (!gotRgn && m_verbose) {
237  edm::LogError("L1GctInputFailedError")
238  << "Failed to get calo regions with label " << m_inputLabel << " - GCT emulator will not be run" << std::endl;
239  }
240 
241  if (gotEm && !em.isValid()) {
242  gotEm = false;
243  if (m_verbose) {
244  edm::LogError("L1GctInputFailedError")
245  << "isValid() flag set to false for em candidates with label " << m_inputLabel << " - GCT emulator will not be run" << std::endl;
246  }
247  }
248 
249  if (gotRgn && !rgn.isValid()) {
250  gotRgn = false;
251  if (m_verbose) {
252  edm::LogError("L1GctInputFailedError")
253  << "isValid() flag set to false for calo regions with label " << m_inputLabel << " - GCT emulator will not be run" << std::endl;
254  }
255  }
256 
257  // if all is ok, proceed with GCT processing
258  if (gotEm && gotRgn) {
259  // reset the GCT internal buffers
260  m_gct->reset();
261 
262  // fill the GCT source cards
263  m_gct->fillEmCands(*em);
264  m_gct->fillRegions(*rgn);
265 
266  // process the event
267  m_gct->process();
268 
269  // fill the em and jet collections
270  *isoEmResult = m_gct->getIsoElectrons();
271  *nonIsoEmResult = m_gct->getNonIsoElectrons();
272  *cenJetResult = m_gct->getCentralJets();
273  *forJetResult = m_gct->getForwardJets();
274  *tauJetResult = m_gct->getTauJets();
275 
276  // fill the energy sum digis
277  *etTotResult = m_gct->getEtSumCollection();
278  *etHadResult = m_gct->getEtHadCollection();
279  *etMissResult = m_gct->getEtMissCollection();
280  *htMissResult = m_gct->getHtMissCollection();
281 
282  // fill the Hf sums digis
283  *hfBitCountResult = m_gct->getHFBitCountsCollection ();
284  *hfRingEtSumResult = m_gct->getHFRingEtSumsCollection();
285 
286  // fill internal data collections if required
287  if (m_writeInternalData) {
288  *internalJetResult = m_gct->getInternalJets();
289  *internalEtSumResult = m_gct->getInternalEtSums();
290  *internalHtMissResult = m_gct->getInternalHtMiss();
291  }
292  }
293  }
294 
295  // put the collections into the event
296  e.put(std::move(isoEmResult),"isoEm");
297  e.put(std::move(nonIsoEmResult),"nonIsoEm");
298  e.put(std::move(cenJetResult),"cenJets");
299  e.put(std::move(forJetResult),"forJets");
300  e.put(std::move(tauJetResult),"tauJets");
301  e.put(std::move(etTotResult));
302  e.put(std::move(etHadResult));
303  e.put(std::move(etMissResult));
304  e.put(std::move(htMissResult));
305  e.put(std::move(hfBitCountResult));
306  e.put(std::move(hfRingEtSumResult));
307 
308  e.put(std::move(internalJetResult));
309  e.put(std::move(internalEtSumResult));
310  e.put(std::move(internalHtMissResult));
311 
312 }
313 
315 
void produce(edm::Event &e, const edm::EventSetup &c) override
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
L1GctHFRingEtSumsCollection getHFRingEtSumsCollection() const
void fillEmCands(const std::vector< L1CaloEmCand > &rgn)
set electrons from the RCT at the input to be processed
L1GctJetCandCollection getTauJets() const
tau jet outputs to GT
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
void setupTauAlgo(const bool useImprovedAlgo, const bool ignoreVetoBitsForIsolation)
setup the tau algorithm parameters
L1GctHFBitCountsCollection getHFBitCountsCollection() const
std::vector< L1GctEtMiss > L1GctEtMissCollection
Jet Et calibration LUT.
std::vector< L1GctHFRingEtSums > L1GctHFRingEtSumsCollection
void setJetFinderParams(const L1GctJetFinderParams *const jfpars)
std::vector< L1GctEtHad > L1GctEtHadCollection
std::vector< L1GctInternHtMiss > L1GctInternHtMissCollection
L1GlobalCaloTrigger::lutPtr lutPtr
typedefs
Definition: L1GctEmulator.h:33
L1GctJetCandCollection getForwardJets() const
forward jet outputs to GT
void beginJob() override
L1GctEmCandCollection getNonIsoElectrons() const
non-iso electron outputs to GT
L1GctHtMissCollection getHtMissCollection() const
Htmiss output to GT.
Bit-level emulation of the Global Calorimeter Trigger.
L1GctEtTotalCollection getEtSumCollection() const
Total Et output to GT.
std::vector< L1GctEtTotal > L1GctEtTotalCollection
L1GlobalCaloTrigger * m_gct
Definition: L1GctEmulator.h:53
std::vector< L1GctHFBitCounts > L1GctHFBitCountsCollection
std::vector< L1GctJetCand > L1GctJetCandCollection
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void setHtMissScale(const L1CaloEtScale *const scale)
setup scale for missing Ht
L1GctInternHtMissCollection getInternalHtMiss() const
std::string m_conditionsLabel
Definition: L1GctEmulator.h:65
void fillRegions(const std::vector< L1CaloRegion > &rgn)
L1GctEtHadCollection getEtHadCollection() const
Total hadronic Et output to GT.
void setupHfSumLuts(const L1CaloEtScale *const scale)
setup Hf sum LUTs
void setBxRange(const int firstBx, const int lastBx)
L1GctJetCandCollection getCentralJets() const
central jet outputs to GT
bool isValid() const
Definition: HandleBase.h:74
L1GctInternJetDataCollection getInternalJets() const
all jets from jetfinders in raw format
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:480
static const unsigned NUMBER_ETA_VALUES
Number of eta bins used in correction.
void reset()
Reset internal buffers.
void setChannelMask(const L1GctChannelMask *const mask)
setup the input channel mask
L1GctEmCandCollection getIsoElectrons() const
std::vector< L1GctHtMiss > L1GctHtMissCollection
void setJetEtCalibrationLuts(const lutPtrVector &jfluts)
setup the Jet Calibration Luts
bool m_writeInternalData
Definition: L1GctEmulator.h:59
lutPtrVector m_jetEtCalibLuts
Definition: L1GctEmulator.h:56
void endJob() override
std::vector< L1GctInternJetData > L1GctInternJetDataCollection
std::string m_inputLabel
Definition: L1GctEmulator.h:50
T get() const
Definition: EventSetup.h:71
std::vector< L1GctInternEtSum > L1GctInternEtSumCollection
int configureGct(const edm::EventSetup &c)
L1GctEmulator(const edm::ParameterSet &ps)
constructor
T const * product() const
Definition: ESHandle.h:86
L1GctEtMissCollection getEtMissCollection() const
Etmiss output to GT.
def move(src, dest)
Definition: eostools.py:511
void process()
process an event
std::vector< L1GctEmCand > L1GctEmCandCollection
~L1GctEmulator() override
destructor
L1GctInternEtSumCollection getInternalEtSums() const
Et sums and components in internal format.