CMS 3D CMS Logo

GTTFileWriter.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: L1Trigger/DemonstratorTools
4 // Class: GTTFileWriter
5 //
14 //
15 // Original Author: Thomas Williams <thomas.williams@stfc.ac.uk>
16 // Created: Mon, 15 Feb 2021 00:39:44 GMT
17 //
18 //
19 
20 // system include files
21 #include <memory>
22 
23 #include "ap_int.h"
24 
25 // user include files
28 
31 
34 
43 
51 
52 //
53 // class declaration
54 //
55 
56 class GTTFileWriter : public edm::one::EDAnalyzer<edm::one::SharedResources> {
57 public:
58  explicit GTTFileWriter(const edm::ParameterSet&);
59 
60  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
61 
62 private:
63  // ----------constants, enums and typedefs ---------
64  // NOTE: At least some of the info from these constants will eventually come from config files
65  static constexpr size_t kFramesPerTMUXPeriod = 9;
66  static constexpr size_t kGapLengthInput = 6;
67  static constexpr size_t kGapLengthOutputToCorrelator = 44;
68  static constexpr size_t kGapLengthOutputToGlobalTriggerSums = 3;
69  static constexpr size_t kGapLengthOutputToGlobalTriggerTaus = 36;
70  static constexpr size_t kGapLengthOutputToGlobalTriggerMesons = 15;
71  static constexpr size_t kGapLengthOutputToGlobalTriggerVertices = 6;
72  static constexpr size_t kTrackTMUX = 18;
73  static constexpr size_t kGTTBoardTMUX = 6;
74  static constexpr size_t kMaxLinesPerFile = 1024;
75 
76  const std::map<l1t::demo::LinkId, std::vector<size_t>> kChannelIdsInput = {
77  /* logical channel within time slice -> vector of channel indices (one entry per time slice) */
78  {{"tracks", 0}, {0, 18, 36}},
79  {{"tracks", 1}, {1, 19, 37}},
80  {{"tracks", 2}, {2, 20, 38}},
81  {{"tracks", 3}, {3, 21, 39}},
82  {{"tracks", 4}, {4, 22, 40}},
83  {{"tracks", 5}, {5, 23, 41}},
84  {{"tracks", 6}, {6, 24, 42}},
85  {{"tracks", 7}, {7, 25, 43}},
86  {{"tracks", 8}, {8, 26, 44}},
87  {{"tracks", 9}, {9, 27, 45}},
88  {{"tracks", 10}, {10, 28, 46}},
89  {{"tracks", 11}, {11, 29, 47}},
90  {{"tracks", 12}, {12, 30, 48}},
91  {{"tracks", 13}, {13, 31, 49}},
92  {{"tracks", 14}, {14, 32, 50}},
93  {{"tracks", 15}, {15, 33, 51}},
94  {{"tracks", 16}, {16, 34, 52}},
95  {{"tracks", 17}, {17, 35, 53}}};
96 
97  const std::map<std::string, l1t::demo::ChannelSpec> kChannelSpecsInput = {
98  /* interface name -> {link TMUX, inter-packet gap} */
99  {"tracks", {kTrackTMUX, kGapLengthInput}}};
100 
101  const std::map<l1t::demo::LinkId, std::pair<l1t::demo::ChannelSpec, std::vector<size_t>>>
103  /* logical channel within time slice -> {{link TMUX, inter-packet gap}, vector of channel indices} */
104  {{"vertices", 0}, {{kGTTBoardTMUX, kGapLengthOutputToCorrelator}, {0}}}};
105 
106  const std::map<l1t::demo::LinkId, std::vector<size_t>> kChannelIdsOutputToGlobalTrigger = {
107  /* logical channel within time slice -> vector of channel indices (one entry per time slice) */
108  {{"sums", 0}, {0}},
109  {{"taus", 1}, {1}},
110  {{"mesons", 2}, {2}},
111  {{"vertices", 3}, {3}}};
112 
113  const std::map<std::string, l1t::demo::ChannelSpec> kChannelSpecsOutputToGlobalTrigger = {
114  /* interface name -> {link TMUX, inter-packet gap} */
119 
121  typedef std::vector<Track_t> TrackCollection_t;
123 
124  // ----------member functions ----------------------
125  void analyze(const edm::Event&, const edm::EventSetup&) override;
126  void endJob() override;
127 
128  // ----------member data ---------------------------
138 
145 };
146 
147 //
148 // class implementation
149 //
150 
152  : tracksToken_(consumes<edm::View<Track_t>>(iConfig.getUntrackedParameter<edm::InputTag>("tracks"))),
153  convertedTracksToken_(
154  consumes<edm::View<Track_t>>(iConfig.getUntrackedParameter<edm::InputTag>("convertedTracks"))),
155  convertedTrackCollectionToken_(
156  consumes<TrackCollection_t>(iConfig.getUntrackedParameter<edm::InputTag>("convertedTracks"))),
157  selectedTracksToken_(
158  consumes<TrackRefCollection_t>(iConfig.getUntrackedParameter<edm::InputTag>("selectedTracks"))),
159  vertexAssociatedTracksToken_(
160  consumes<TrackRefCollection_t>(iConfig.getUntrackedParameter<edm::InputTag>("vertexAssociatedTracks"))),
161  verticesToken_(consumes<edm::View<l1t::VertexWord>>(iConfig.getUntrackedParameter<edm::InputTag>("vertices"))),
162  jetsToken_(consumes<edm::View<l1t::TkJetWord>>(iConfig.getUntrackedParameter<edm::InputTag>("jets"))),
163  htMissToken_(consumes<edm::View<l1t::EtSum>>(iConfig.getUntrackedParameter<edm::InputTag>("htmiss"))),
164  etMissToken_(consumes<edm::View<l1t::EtSum>>(iConfig.getUntrackedParameter<edm::InputTag>("etmiss"))),
165  fileWriterInputTracks_(l1t::demo::parseFileFormat(iConfig.getUntrackedParameter<std::string>("format")),
166  iConfig.getUntrackedParameter<std::string>("inputFilename"),
167  iConfig.getUntrackedParameter<std::string>("fileExtension"),
168  kFramesPerTMUXPeriod,
169  kGTTBoardTMUX,
170  kMaxLinesPerFile,
171  kChannelIdsInput,
172  kChannelSpecsInput),
173  fileWriterConvertedTracks_(l1t::demo::parseFileFormat(iConfig.getUntrackedParameter<std::string>("format")),
174  iConfig.getUntrackedParameter<std::string>("inputConvertedFilename"),
175  iConfig.getUntrackedParameter<std::string>("fileExtension"),
176  kFramesPerTMUXPeriod,
177  kGTTBoardTMUX,
178  kMaxLinesPerFile,
179  kChannelIdsInput,
180  kChannelSpecsInput),
181  fileWriterSelectedTracks_(l1t::demo::parseFileFormat(iConfig.getUntrackedParameter<std::string>("format")),
182  iConfig.getUntrackedParameter<std::string>("selectedTracksFilename"),
183  iConfig.getUntrackedParameter<std::string>("fileExtension"),
184  kFramesPerTMUXPeriod,
185  kGTTBoardTMUX,
186  kMaxLinesPerFile,
187  kChannelIdsInput,
188  kChannelSpecsInput),
189  fileWriterVertexAssociatedTracks_(
190  l1t::demo::parseFileFormat(iConfig.getUntrackedParameter<std::string>("format")),
191  iConfig.getUntrackedParameter<std::string>("vertexAssociatedTracksFilename"),
192  iConfig.getUntrackedParameter<std::string>("fileExtension"),
193  kFramesPerTMUXPeriod,
194  kGTTBoardTMUX,
195  kMaxLinesPerFile,
196  kChannelIdsInput,
197  kChannelSpecsInput),
198  fileWriterOutputToCorrelator_(l1t::demo::parseFileFormat(iConfig.getUntrackedParameter<std::string>("format")),
199  iConfig.getUntrackedParameter<std::string>("outputCorrelatorFilename"),
200  iConfig.getUntrackedParameter<std::string>("fileExtension"),
201  kFramesPerTMUXPeriod,
202  kGTTBoardTMUX,
203  kMaxLinesPerFile,
204  kChannelSpecsOutputToCorrelator),
205  fileWriterOutputToGlobalTrigger_(l1t::demo::parseFileFormat(iConfig.getUntrackedParameter<std::string>("format")),
206  iConfig.getUntrackedParameter<std::string>("outputGlobalTriggerFilename"),
207  iConfig.getUntrackedParameter<std::string>("fileExtension"),
208  kFramesPerTMUXPeriod,
209  kGTTBoardTMUX,
210  kMaxLinesPerFile,
211  kChannelIdsOutputToGlobalTrigger,
212  kChannelSpecsOutputToGlobalTrigger) {}
213 
215  using namespace edm;
216  using namespace l1t::demo::codecs;
217 
218  // 0) Gather the necessary collections
219  const auto& tracksCollection = iEvent.get(tracksToken_);
220  const auto& convertedTracksCollection = iEvent.get(convertedTracksToken_);
221  const auto& verticesCollection = iEvent.get(verticesToken_);
222  const auto& jetsCollection = iEvent.get(jetsToken_);
223  const auto& htMissCollection = iEvent.get(htMissToken_);
224  const auto& etMissCollection = iEvent.get(etMissToken_);
225 
226  edm::Handle<TrackCollection_t> convertedTracksHandle;
227  edm::Handle<TrackRefCollection_t> selectedTracksHandle;
228  edm::Handle<TrackRefCollection_t> vertexAssociatedTracksHandle;
229  iEvent.getByToken(convertedTrackCollectionToken_, convertedTracksHandle);
230  iEvent.getByToken(selectedTracksToken_, selectedTracksHandle);
231  iEvent.getByToken(vertexAssociatedTracksToken_, vertexAssociatedTracksHandle);
232 
233  // 1) Encode 'object' information onto vectors containing link data
234  const auto trackData(encodeTracks(tracksCollection));
235  const auto convertedTrackData(encodeTracks(convertedTracksCollection));
236  const auto selectedTrackData(encodeTracks(convertedTracksHandle, selectedTracksHandle));
237  const auto vertexAssociatedTrackData(encodeTracks(convertedTracksHandle, vertexAssociatedTracksHandle));
238  const auto vertexData(encodeVertices(verticesCollection));
239  const auto jetsData(encodeTkJets(jetsCollection));
240  const auto htMissData(encodeHtSums(htMissCollection));
241  const auto etMissData(encodeEtSums(etMissCollection));
242 
243  // 2) Pack 'object' information into 'event data' object
244  l1t::demo::EventData eventDataTracks;
245  l1t::demo::EventData eventDataConvertedTracks;
246  l1t::demo::EventData eventDataSelectedTracks;
247  l1t::demo::EventData eventDataVertexAssociatedTracks;
248  for (size_t i = 0; i < 18; i++) {
249  eventDataTracks.add({"tracks", i}, trackData.at(i));
250  eventDataConvertedTracks.add({"tracks", i}, convertedTrackData.at(i));
251  eventDataSelectedTracks.add({"tracks", i}, selectedTrackData.at(i));
252  eventDataVertexAssociatedTracks.add({"tracks", i}, vertexAssociatedTrackData.at(i));
253  }
254 
255  l1t::demo::EventData eventDataVertices;
256  eventDataVertices.add({"vertices", 0}, vertexData.at(0));
257 
258  // 2b) For the global trigger 'event data' combine different objects into one 'logical' link
259  std::vector<ap_uint<64>> sumsData;
260  sumsData.insert(sumsData.end(), jetsData.at(0).begin(), jetsData.at(0).end());
261  sumsData.insert(sumsData.end(), 24, 0);
262  sumsData.insert(sumsData.end(), htMissData.at(0).begin(), htMissData.at(0).end());
263  sumsData.insert(sumsData.end(), 1, 0);
264  sumsData.insert(sumsData.end(), etMissData.at(0).begin(), etMissData.at(0).end());
265 
266  std::vector<ap_uint<64>> tracksVerticesData;
267  tracksVerticesData.insert(tracksVerticesData.end(), 36, 0);
268  tracksVerticesData.insert(tracksVerticesData.end(), vertexData.at(0).begin(), vertexData.at(0).end());
269  tracksVerticesData.insert(tracksVerticesData.end(), 2, 0);
270 
271  l1t::demo::EventData eventDataGlobalTrigger;
272  eventDataGlobalTrigger.add({"sums", 0}, sumsData);
273  eventDataGlobalTrigger.add({"taus", 1}, std::vector<ap_uint<64>>(18, 0)); // Placeholder until tau object is written
274  eventDataGlobalTrigger.add({"mesons", 2},
275  std::vector<ap_uint<64>>(39, 0)); // Placeholder until light meson objects are written
276  eventDataGlobalTrigger.add({"vertices", 3}, tracksVerticesData);
277 
278  // 3) Pass the 'event data' object to the file writer
279 
280  fileWriterInputTracks_.addEvent(eventDataTracks);
281  fileWriterConvertedTracks_.addEvent(eventDataConvertedTracks);
282  fileWriterSelectedTracks_.addEvent(eventDataSelectedTracks);
283  fileWriterVertexAssociatedTracks_.addEvent(eventDataVertexAssociatedTracks);
284  fileWriterOutputToCorrelator_.addEvent(eventDataVertices);
285  fileWriterOutputToGlobalTrigger_.addEvent(eventDataGlobalTrigger);
286 }
287 
288 // ------------ method called once each job just after ending the event loop ------------
290  // Writing pending events to file before exiting
295 }
296 
297 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
299  // GTTFileWriter
301  desc.addUntracked<edm::InputTag>("tracks", edm::InputTag("l1tTTTracksFromTrackletEmulation", "Level1TTTracks"));
302  desc.addUntracked<edm::InputTag>("convertedTracks", edm::InputTag("l1tGTTInputProducer", "Level1TTTracksConverted"));
303  desc.addUntracked<edm::InputTag>("selectedTracks",
304  edm::InputTag("l1tTrackSelectionProducer", "Level1TTTracksSelectedEmulation"));
305  desc.addUntracked<edm::InputTag>(
306  "vertexAssociatedTracks",
307  edm::InputTag("l1tTrackSelectionProducer", "Level1TTTracksSelectedAssociatedEmulation"));
308  desc.addUntracked<edm::InputTag>("vertices", edm::InputTag("l1tVertexProducer", "L1VerticesEmulation"));
309  desc.addUntracked<edm::InputTag>("jets", edm::InputTag("l1tTrackJetsEmulation", "L1TrackJets"));
310  desc.addUntracked<edm::InputTag>("htmiss", edm::InputTag("l1tTrackerEmuHTMiss", "L1TrackerEmuHTMiss"));
311  desc.addUntracked<edm::InputTag>("etmiss", edm::InputTag("l1tTrackerEmuEtMiss", "L1TrackerEmuEtMiss"));
312  desc.addUntracked<std::string>("inputFilename", "L1GTTInputFile");
313  desc.addUntracked<std::string>("inputConvertedFilename", "L1GTTInputConvertedFile");
314  desc.addUntracked<std::string>("selectedTracksFilename", "L1GTTSelectedTracksFile");
315  desc.addUntracked<std::string>("vertexAssociatedTracksFilename", "L1GTTVertexAssociatedTracksFile");
316  desc.addUntracked<std::string>("outputCorrelatorFilename", "L1GTTOutputToCorrelatorFile");
317  desc.addUntracked<std::string>("outputGlobalTriggerFilename", "L1GTTOutputToGlobalTriggerFile");
318  desc.addUntracked<std::string>("format", "APx");
319  desc.addUntracked<std::string>("fileExtension", "txt");
320  descriptions.add("GTTFileWriter", desc);
321 }
322 
323 //define this as a plug-in
l1t::demo::BoardDataWriter fileWriterVertexAssociatedTracks_
static constexpr size_t kTrackTMUX
l1t::demo::BoardDataWriter fileWriterOutputToCorrelator_
std::array< std::vector< ap_uint< 64 > >, 1 > encodeHtSums(const edm::View< l1t::EtSum > &)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const edm::EDGetTokenT< edm::View< l1t::EtSum > > etMissToken_
void endJob() override
const edm::EDGetTokenT< edm::View< Track_t > > convertedTracksToken_
void addEvent(const EventData &data)
FileFormat parseFileFormat(const std::string &)
Definition: utilities.cc:73
delete x;
Definition: CaloConfig.h:22
void add(const LinkId &, const std::vector< ap_uint< 64 >> &)
Definition: EventData.cc:14
std::array< std::vector< ap_uint< 64 > >, 18 > encodeTracks(const edm::View< TTTrack< Ref_Phase2TrackerDigi_ >> &, int debug=0)
const edm::EDGetTokenT< edm::View< l1t::EtSum > > htMissToken_
const edm::EDGetTokenT< edm::View< l1t::VertexWord > > verticesToken_
const edm::EDGetTokenT< edm::View< l1t::TkJetWord > > jetsToken_
int iEvent
Definition: GenABIO.cc:224
static constexpr size_t kMaxLinesPerFile
GTTFileWriter(const edm::ParameterSet &)
static constexpr size_t kGapLengthOutputToGlobalTriggerMesons
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static constexpr size_t kFramesPerTMUXPeriod
TTTrack< Ref_Phase2TrackerDigi_ > Track_t
l1t::demo::BoardDataWriter fileWriterInputTracks_
const std::map< l1t::demo::LinkId, std::pair< l1t::demo::ChannelSpec, std::vector< size_t > > > kChannelSpecsOutputToCorrelator
static constexpr size_t kGapLengthOutputToGlobalTriggerTaus
std::array< std::vector< ap_uint< 64 > >, 1 > encodeEtSums(const edm::View< l1t::EtSum > &)
Class to store the L1 Track Trigger tracks.
Definition: TTTrack.h:29
std::array< std::vector< ap_uint< 64 > >, 1 > encodeVertices(const edm::View< l1t::VertexWord > &)
static constexpr size_t kGapLengthOutputToCorrelator
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const std::map< l1t::demo::LinkId, std::vector< size_t > > kChannelIdsInput
l1t::demo::BoardDataWriter fileWriterSelectedTracks_
const std::map< std::string, l1t::demo::ChannelSpec > kChannelSpecsInput
static constexpr size_t kGapLengthOutputToGlobalTriggerVertices
HLT enums.
std::vector< Track_t > TrackCollection_t
const std::map< std::string, l1t::demo::ChannelSpec > kChannelSpecsOutputToGlobalTrigger
static constexpr size_t kGTTBoardTMUX
const edm::EDGetTokenT< TrackCollection_t > convertedTrackCollectionToken_
const edm::EDGetTokenT< TrackRefCollection_t > selectedTracksToken_
std::array< std::vector< ap_uint< 64 > >, 1 > encodeTkJets(const edm::View< l1t::TkJetWord > &)
Definition: codecs_tkjets.cc:9
static constexpr size_t kGapLengthInput
static constexpr size_t kGapLengthOutputToGlobalTriggerSums
l1t::demo::BoardDataWriter fileWriterOutputToGlobalTrigger_
edm::RefVector< TrackCollection_t > TrackRefCollection_t
Class representing information phase-2 ATCA I/O data corresponding to a single event, with logical channel IDs (essentially string-uint pairs, e.g. tracks-0 to tracks-17).
Definition: EventData.h:28
const edm::EDGetTokenT< TrackRefCollection_t > vertexAssociatedTracksToken_
l1t::demo::BoardDataWriter fileWriterConvertedTracks_
const std::map< l1t::demo::LinkId, std::vector< size_t > > kChannelIdsOutputToGlobalTrigger
void analyze(const edm::Event &, const edm::EventSetup &) override
const edm::EDGetTokenT< edm::View< Track_t > > tracksToken_