CMS 3D CMS Logo

L1TCaloSummary.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: L1Trigger/L1TCaloSummary
4 // Class: L1TCaloSummary
5 //
13 //
14 // Original Author: Sridhara Dasu
15 // Created: Sat, 14 Nov 2015 14:18:27 GMT
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 
22 // user include files
25 
28 
30 
33 
34 #include "L1Trigger/L1TCaloLayer1/src/UCTLayer1.hh"
35 #include "L1Trigger/L1TCaloLayer1/src/UCTCrate.hh"
36 #include "L1Trigger/L1TCaloLayer1/src/UCTCard.hh"
37 #include "L1Trigger/L1TCaloLayer1/src/UCTRegion.hh"
38 #include "L1Trigger/L1TCaloLayer1/src/UCTTower.hh"
39 #include "L1Trigger/L1TCaloLayer1/src/UCTGeometry.hh"
40 
41 #include "L1Trigger/L1TCaloLayer1/src/UCTObject.hh"
42 #include "L1Trigger/L1TCaloLayer1/src/UCTSummaryCard.hh"
43 #include "L1Trigger/L1TCaloLayer1/src/UCTGeometryExtended.hh"
44 
51 
55 
57 
58 #include "L1Trigger/L1TCaloLayer1/src/UCTLogging.hh"
59 #include <bitset>
60 
61 #include <string>
62 #include <sstream>
63 
64 //Anomaly detection includes
65 #include "ap_fixed.h"
66 #include "hls4ml/emulator.h"
67 
68 using namespace l1tcalo;
69 using namespace l1extra;
70 using namespace std;
71 
72 //
73 // class declaration
74 //
75 
76 template <class INPUT, class OUTPUT>
78 public:
79  explicit L1TCaloSummary(const edm::ParameterSet&);
80  ~L1TCaloSummary() override = default;
81 
82  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
83 
84 private:
85  //void beginJob() override;
86  void produce(edm::Event&, const edm::EventSetup&) override;
87  //void endJob() override;
88 
89  void print();
90 
91  // ----------member data ---------------------------
92 
93  uint32_t nPumBins;
94 
95  std::vector<std::vector<std::vector<uint32_t>>> pumLUT;
96 
98 
99  uint32_t jetSeed;
100  uint32_t tauSeed;
102  uint32_t eGammaSeed;
105 
106  bool verbose;
108 
110 
111  UCTLayer1* layer1;
112 
113  hls4mlEmulator::ModelLoader loader;
114  std::shared_ptr<hls4mlEmulator::Model> model;
115 
117  std::vector<edm::ParameterSet> testPatterns;
118 };
119 
120 //
121 // constants, enums and typedefs
122 //
123 
124 //
125 // static data member definitions
126 //
127 
128 //
129 // constructors and destructor
130 //
131 template <class INPUT, class OUTPUT>
133  : nPumBins(iConfig.getParameter<unsigned int>("nPumBins")),
134  pumLUT(nPumBins, std::vector<std::vector<uint32_t>>(2, std::vector<uint32_t>(13))),
135  caloScaleFactor(iConfig.getParameter<double>("caloScaleFactor")),
136  jetSeed(iConfig.getParameter<unsigned int>("jetSeed")),
137  tauSeed(iConfig.getParameter<unsigned int>("tauSeed")),
138  tauIsolationFactor(iConfig.getParameter<double>("tauIsolationFactor")),
139  eGammaSeed(iConfig.getParameter<unsigned int>("eGammaSeed")),
140  eGammaIsolationFactor(iConfig.getParameter<double>("eGammaIsolationFactor")),
141  boostedJetPtFactor(iConfig.getParameter<double>("boostedJetPtFactor")),
142  verbose(iConfig.getParameter<bool>("verbose")),
143  fwVersion(iConfig.getParameter<int>("firmwareVersion")),
144  regionToken(consumes<L1CaloRegionCollection>(edm::InputTag("simCaloStage2Layer1Digis"))),
145  loader(hls4mlEmulator::ModelLoader(iConfig.getParameter<string>("CICADAModelVersion"))),
146  overwriteWithTestPatterns(iConfig.getParameter<bool>("useTestPatterns")),
147  testPatterns(iConfig.getParameter<std::vector<edm::ParameterSet>>("testPatterns")) {
148  std::vector<double> pumLUTData;
149  char pumLUTString[10];
150  for (uint32_t pumBin = 0; pumBin < nPumBins; pumBin++) {
151  for (uint32_t side = 0; side < 2; side++) {
152  if (side == 0)
153  sprintf(pumLUTString, "pumLUT%2.2dp", pumBin);
154  else
155  sprintf(pumLUTString, "pumLUT%2.2dn", pumBin);
156  pumLUTData = iConfig.getParameter<std::vector<double>>(pumLUTString);
157  for (uint32_t iEta = 0; iEta < std::max((uint32_t)pumLUTData.size(), MaxUCTRegionsEta); iEta++) {
158  pumLUT[pumBin][side][iEta] = (uint32_t)round(pumLUTData[iEta] / caloScaleFactor);
159  }
160  if (pumLUTData.size() != (MaxUCTRegionsEta))
161  edm::LogError("L1TCaloSummary") << "PUM LUT Data size integrity check failed; Expected size = "
162  << MaxUCTRegionsEta << "; Provided size = " << pumLUTData.size()
163  << "; Will use what is provided :(" << std::endl;
164  }
165  }
166  produces<L1JetParticleCollection>("Boosted");
167 
168  //anomaly trigger loading
169  model = loader.load_model();
170  produces<l1t::CICADABxCollection>("CICADAScore");
171 }
172 
173 //
174 // member functions
175 //
176 
177 // ------------ method called to produce the data ------------
178 template <class INPUT, class OUTPUT>
180  using namespace edm;
181 
182  std::unique_ptr<L1JetParticleCollection> bJetCands(new L1JetParticleCollection);
183 
184  std::unique_ptr<l1t::CICADABxCollection> CICADAScore = std::make_unique<l1t::CICADABxCollection>();
185  CICADAScore->setBXRange(-2, 2);
186 
187  UCTGeometry g;
188 
189  // Here we read region data from the region collection created by L1TCaloLayer1 instead of
190  // independently creating regions from TPGs for processing by the summary card. This results
191  // in a single region vector of size 252 whereas from independent creation we had 3*6 vectors
192  // of size 7*2. Indices are mapped in UCTSummaryCard accordingly.
193  UCTSummaryCard summaryCard =
195  std::vector<UCTRegion*> inputRegions;
196  inputRegions.clear();
197  edm::Handle<std::vector<L1CaloRegion>> regionCollection;
198  if (!iEvent.getByToken(regionToken, regionCollection))
199  edm::LogError("L1TCaloSummary") << "UCT: Failed to get regions from region collection!";
200  iEvent.getByToken(regionToken, regionCollection);
201  //Model input
202  //This is done as a flat vector input, but future versions may involve 2D input
203  //This will have to be handled later
204  INPUT modelInput[252];
205  for (const L1CaloRegion& i : *regionCollection) {
206  UCTRegionIndex r = g.getUCTRegionIndexFromL1CaloRegion(i.gctEta(), i.gctPhi());
207  UCTTowerIndex t = g.getUCTTowerIndexFromL1CaloRegion(r, i.raw());
208  uint32_t absCaloEta = std::abs(t.first);
209  uint32_t absCaloPhi = std::abs(t.second);
210  bool negativeEta = false;
211  if (t.first < 0)
212  negativeEta = true;
213  uint32_t crate = g.getCrate(t.first, t.second);
214  uint32_t card = g.getCard(t.first, t.second);
215  uint32_t region = g.getRegion(absCaloEta, absCaloPhi);
216  UCTRegion* test = new UCTRegion(crate, card, negativeEta, region, fwVersion);
217  test->setRegionSummary(i.raw());
218  inputRegions.push_back(test);
219  //This *should* fill the tensor in the proper order to be fed to the anomaly model
220  //We take 4 off of the GCT eta/iEta.
221  //iEta taken from this ranges from 4-17, (I assume reserving lower and higher for forward regions)
222  //So our first index, index 0, is technically iEta=4, and so-on.
223  //CICADA reads this as a flat vector
224  modelInput[14 * i.gctPhi() + (i.gctEta() - 4)] = i.et();
225  }
226  // Check if we're using test patterns. If so, we overwrite the inputs with a test pattern
227  if (overwriteWithTestPatterns) {
228  unsigned int evt = iEvent.id().event();
229  unsigned int totalTestPatterns = testPatterns.size();
230  unsigned int patternElement = evt % totalTestPatterns;
231  const edm::ParameterSet& element = testPatterns.at(patternElement);
232  std::stringstream inputStream;
233  std::string PhiRowString;
234 
235  edm::LogWarning("L1TCaloSummary") << "Overwriting existing CICADA input with test pattern!\n";
236 
237  for (unsigned short int iPhi = 1; iPhi <= 18; ++iPhi) {
238  PhiRowString = "";
239  std::stringstream PhiRowStringStream;
240  PhiRowStringStream << "iPhi_" << iPhi;
241  PhiRowString = PhiRowStringStream.str();
242  std::vector<unsigned int> phiRow = element.getParameter<std::vector<unsigned int>>(PhiRowString);
243  for (unsigned short int iEta = 1; iEta <= 14; ++iEta) {
244  modelInput[14 * (iPhi - 1) + (iEta - 1)] = phiRow.at(iEta - 1);
245  inputStream << phiRow.at(iEta - 1) << " ";
246  }
247  inputStream << "\n";
248  }
249  edm::LogInfo("L1TCaloSummary") << "Input Stream:\n" << inputStream.str();
250  }
251 
252  //Extract model output
253  OUTPUT modelResult[1] = {
254  OUTPUT("0.0", 10)}; //the 10 here refers to the fact that we read in "0.0" as a decimal number
255  model->prepare_input(modelInput);
256  model->predict();
257  model->read_result(modelResult);
258 
259  CICADAScore->push_back(0, modelResult[0].to_float());
260 
261  if (overwriteWithTestPatterns)
262  edm::LogInfo("L1TCaloSummary") << "Test Pattern Output: " << CICADAScore->at(0, 0);
263 
264  summaryCard.setRegionData(inputRegions);
265 
266  if (!summaryCard.process()) {
267  edm::LogError("L1TCaloSummary") << "UCT: Failed to process summary card" << std::endl;
268  exit(1);
269  }
270 
271  double pt = 0;
272  double eta = -999.;
273  double phi = -999.;
274  double mass = 0;
275 
276  std::list<UCTObject*> boostedJetObjs = summaryCard.getBoostedJetObjs();
277  for (std::list<UCTObject*>::const_iterator i = boostedJetObjs.begin(); i != boostedJetObjs.end(); i++) {
278  const UCTObject* object = *i;
279  pt = ((double)object->et()) * caloScaleFactor * boostedJetPtFactor;
280  eta = g.getUCTTowerEta(object->iEta());
281  phi = g.getUCTTowerPhi(object->iPhi());
282  bitset<3> activeRegionEtaPattern = 0;
283  for (uint32_t iEta = 0; iEta < 3; iEta++) {
284  bool activeStrip = false;
285  for (uint32_t iPhi = 0; iPhi < 3; iPhi++) {
286  if (object->boostedJetRegionET()[3 * iEta + iPhi] > 30 &&
287  object->boostedJetRegionET()[3 * iEta + iPhi] > object->et() * 0.0625)
288  activeStrip = true;
289  }
290  if (activeStrip)
291  activeRegionEtaPattern |= (0x1 << iEta);
292  }
293  bitset<3> activeRegionPhiPattern = 0;
294  for (uint32_t iPhi = 0; iPhi < 3; iPhi++) {
295  bool activeStrip = false;
296  for (uint32_t iEta = 0; iEta < 3; iEta++) {
297  if (object->boostedJetRegionET()[3 * iEta + iPhi] > 30 &&
298  object->boostedJetRegionET()[3 * iEta + iPhi] > object->et() * 0.0625)
299  activeStrip = true;
300  }
301  if (activeStrip)
302  activeRegionPhiPattern |= (0x1 << iPhi);
303  }
304  string regionEta = activeRegionEtaPattern.to_string<char, std::string::traits_type, std::string::allocator_type>();
305  string regionPhi = activeRegionPhiPattern.to_string<char, std::string::traits_type, std::string::allocator_type>();
306 
307  bool centralHighest = object->boostedJetRegionET()[4] >= object->boostedJetRegionET()[0] &&
308  object->boostedJetRegionET()[4] >= object->boostedJetRegionET()[1] &&
309  object->boostedJetRegionET()[4] >= object->boostedJetRegionET()[2] &&
310  object->boostedJetRegionET()[4] >= object->boostedJetRegionET()[3] &&
311  object->boostedJetRegionET()[4] >= object->boostedJetRegionET()[5] &&
312  object->boostedJetRegionET()[4] >= object->boostedJetRegionET()[6] &&
313  object->boostedJetRegionET()[4] >= object->boostedJetRegionET()[7] &&
314  object->boostedJetRegionET()[4] >= object->boostedJetRegionET()[8];
315 
316  if (abs(eta) < 2.5 && ((regionEta == "101" && (regionPhi == "110" || regionPhi == "101" || regionPhi == "010")) ||
317  ((regionEta == "110" || regionEta == "101" || regionEta == "010") && regionPhi == "101") ||
318  (regionEta == "111" && (regionPhi == "110" || regionPhi == "010")) ||
319  ((regionEta == "110" || regionEta == "010") && regionPhi == "111") ||
320  ((regionEta == "010" || regionPhi == "010" || regionEta == "110" || regionPhi == "110" ||
321  regionEta == "011" || regionPhi == "011") &&
322  centralHighest)))
323  bJetCands->push_back(L1JetParticle(math::PtEtaPhiMLorentzVector(pt, eta, phi, mass), L1JetParticle::kCentral));
324  }
325 
326  iEvent.put(std::move(bJetCands), "Boosted");
327  //Write out anomaly score
328  iEvent.put(std::move(CICADAScore), "CICADAScore");
329 }
330 
331 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
332 template <class INPUT, class OUTPUT>
334  //The following says we do not know what parameters are allowed so do no validation
335  // Please change this to state exactly what you do use, even if it is no parameters
337  desc.setUnknown();
338  descriptions.addDefault(desc);
339 }
340 
341 // Initial version, X.0.0, input/output typing
346 // X.1.0 version input.output typing
351 // X.1.1 version input/output typing
352 typedef L1TCaloSummary<ap_uint<10>, ap_ufixed<16, 8, AP_RND, AP_SAT, AP_SAT>> L1TCaloSummary_CICADA_vXp1p1;
354 // X.1.2 version input/output typing
355 typedef L1TCaloSummary<ap_uint<10>, ap_ufixed<16, 8, AP_RND_CONV, AP_SAT>> L1TCaloSummary_CICADA_vXp1p2;
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
bool verbose
bool overwriteWithTestPatterns
Log< level::Error, false > LogError
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
L1TCaloSummary< ap_uint< 10 >, ap_ufixed< 16, 8 > > L1TCaloSummary_CICADA_v2p1p0
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:25
L1TCaloSummary< ap_uint< 10 >, ap_ufixed< 16, 8, AP_RND_CONV, AP_SAT > > L1TCaloSummary_CICADA_vXp1p2
L1TCaloSummary(const edm::ParameterSet &)
int iEvent
Definition: GenABIO.cc:224
void addDefault(ParameterSetDescription const &psetDescription)
UCTLayer1 * layer1
void produce(edm::Event &, const edm::EventSetup &) override
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
L1TCaloSummary< ap_ufixed< 10, 10 >, ap_fixed< 11, 5 > > L1TCaloSummary_CICADA_v1p0p0
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::vector< edm::ParameterSet > testPatterns
edm::EDGetTokenT< L1CaloRegionCollection > regionToken
Log< level::Info, false > LogInfo
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
L1TCaloSummary< ap_ufixed< 10, 10 >, ap_fixed< 11, 5 > > L1TCaloSummary_CICADA_v1p1p0
std::shared_ptr< hls4mlEmulator::Model > model
L1TCaloSummary< ap_uint< 10 >, ap_ufixed< 16, 8 > > L1TCaloSummary_CICADA_v2p0p0
double boostedJetPtFactor
L1TCaloSummary< ap_uint< 10 >, ap_ufixed< 16, 8, AP_RND, AP_SAT, AP_SAT > > L1TCaloSummary_CICADA_vXp1p1
double eGammaIsolationFactor
hls4mlEmulator::ModelLoader loader
HLT enums.
std::vector< std::vector< std::vector< uint32_t > > > pumLUT
A calorimeter trigger region (sum of 4x4 trigger towers)
Definition: L1CaloRegion.h:21
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< L1CaloRegion > L1CaloRegionCollection
double caloScaleFactor
Log< level::Warning, false > LogWarning
def move(src, dest)
Definition: eostools.py:511
def exit(msg="")