CMS 3D CMS Logo

L1GTObjectBoardWriter.cc
Go to the documentation of this file.
1 
7 
10 
15 
20 
22 
25 
28 
35 
38 
39 #include <vector>
40 #include <algorithm>
41 #include <string>
42 #include <type_traits>
43 #include <optional>
44 #include <array>
45 #include <unordered_map>
46 
47 using namespace l1t;
48 
50 public:
52 
54 
55 private:
56  void analyze(const edm::Event&, const edm::EventSetup&) override;
57  void endJob() override;
58 
59  enum BufferType { INPUT, OUTPUT };
60 
62  unsigned int eventCounter_;
63  unsigned int maxEvents_;
64  std::unordered_map<std::string, std::size_t> numChannels_;
66 
67  // From upstream
74 
78 
86 };
87 
88 template <typename T1, typename T2>
89 static std::vector<T1> vconvert(std::vector<T2> ivec) {
90  return std::vector<T1>(ivec.begin(), ivec.end());
91 }
92 
93 static constexpr std::array<const char*, 27> AVAILABLE_COLLECTIONS{{"GTTPromptJets",
94  "GTTDisplacedJets",
95  "GTTPromptHtSum",
96  "GTTDisplacedHtSum",
97  "GTTEtSum",
98  "GTTHadronicTaus",
99  "CL2JetsSC4",
100  "CL2JetsSC8",
101  "CL2Taus",
102  "CL2HtSum",
103  "CL2EtSum",
104  "GCTNonIsoEg",
105  "GCTIsoEg",
106  "GCTJets",
107  "GCTTaus",
108  "GCTHtSum",
109  "GCTEtSum",
110  "GMTSaPromptMuons",
111  "GMTSaDisplacedMuons",
112  "GMTTkMuons",
113  "GMTTopo",
114  "CL2Electrons",
115  "CL2Photons",
116  "GTTPhiCandidates",
117  "GTTRhoCandidates",
118  "GTTBsCandidates",
119  "GTTPrimaryVert"}};
120 
122  : bufferFileType_(config.getUntrackedParameter<std::string>("bufferFileType") == "input" ? INPUT : OUTPUT),
123  eventCounter_(0),
124  maxEvents_(config.getUntrackedParameter<unsigned int>("maxEvents")),
125  numChannels_(),
126  boardDataWriter_(
127  demo::parseFileFormat(config.getUntrackedParameter<std::string>("patternFormat")),
128  config.getUntrackedParameter<std::string>("filename"),
129  config.getUntrackedParameter<std::string>("fileExtension"),
130  9,
131  1,
132  config.getUntrackedParameter<unsigned int>("maxFrames"),
133  [&]() {
134  if (bufferFileType_ == INPUT) {
135  const edm::ParameterSet& iChannels = config.getUntrackedParameterSet("InputChannels");
137 
138  channelMap.insert(
139  {{"GCT", 1},
140  {{6, 0},
141  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("GCT_1"))}});
142  channelMap.insert(
143  {{"GMT", 1},
144  {{18, 0},
145  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("GMT_1"))}});
146  channelMap.insert(
147  {{"GTT", 1},
148  {{6, 0},
149  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("GTT_1"))}});
150  channelMap.insert(
151  {{"GTT", 2},
152  {{6, 0},
153  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("GTT_2"))}});
154  channelMap.insert(
155  {{"GTT", 3},
156  {{6, 0},
157  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("GTT_3"))}});
158  channelMap.insert(
159  {{"GTT", 4},
160  {{6, 0},
161  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("GTT_4"))}});
162  channelMap.insert(
163  {{"CL2", 1},
164  {{6, 0},
165  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("CL2_1"))}});
166  channelMap.insert(
167  {{"CL2", 2},
168  {{6, 0},
169  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("CL2_2"))}});
170  channelMap.insert(
171  {{"CL2", 3},
172  {{6, 0},
173  vconvert<std::size_t>(iChannels.getUntrackedParameter<std::vector<unsigned int>>("CL2_3"))}});
174 
175  return channelMap;
176  } else {
177  const edm::ParameterSet& oChannels = config.getUntrackedParameterSet("OutputChannels");
179  for (const char* name : AVAILABLE_COLLECTIONS) {
180  std::vector<unsigned int> channels = oChannels.getUntrackedParameter<std::vector<unsigned int>>(name);
181  for (std::size_t i = 0; i < channels.size(); i++) {
182  channelMap.insert({{name, i}, {{1, 0}, {channels.at(i)}}});
183  }
184  numChannels_.insert({name, channels.size()});
185  }
186  return channelMap;
187  }
188  }()),
189  gttPromptJetToken_(consumes<TkJetWordCollection>(config.getUntrackedParameter<edm::InputTag>("GTTPromptJets"))),
190  gttDisplacedJetToken_(
191  consumes<TkJetWordCollection>(config.getUntrackedParameter<edm::InputTag>("GTTDisplacedJets"))),
192  gttPromptHtSumToken_(consumes<std::vector<EtSum>>(config.getUntrackedParameter<edm::InputTag>("GTTPromptHtSum"))),
193  gttDisplacedHtSumToken_(
194  consumes<std::vector<EtSum>>(config.getUntrackedParameter<edm::InputTag>("GTTDisplacedHtSum"))),
195  gttEtSumToken_(consumes<std::vector<EtSum>>(config.getUntrackedParameter<edm::InputTag>("GTTEtSum"))),
196  gttPrimaryVertexToken_(
197  consumes<VertexWordCollection>(config.getUntrackedParameter<edm::InputTag>("GTTPrimaryVert"))),
198  gmtSaPromptMuonToken_(
199  consumes<SAMuonCollection>(config.getUntrackedParameter<edm::InputTag>("GMTSaPromptMuons"))),
200  gmtSaDisplacedMuonToken_(
201  consumes<SAMuonCollection>(config.getUntrackedParameter<edm::InputTag>("GMTSaDisplacedMuons"))),
202  gmtTkMuonToken_(consumes<TrackerMuonCollection>(config.getUntrackedParameter<edm::InputTag>("GMTTkMuons"))),
203  cl2JetSC4Token_(consumes<PFJetCollection>(config.getUntrackedParameter<edm::InputTag>("CL2JetsSC4"))),
204  cl2JetSC8Token_(consumes<PFJetCollection>(config.getUntrackedParameter<edm::InputTag>("CL2JetsSC8"))),
205  cl2PhotonToken_(consumes<TkEmCollection>(config.getUntrackedParameter<edm::InputTag>("CL2Photons"))),
206  cl2ElectronToken_(consumes<TkElectronCollection>(config.getUntrackedParameter<edm::InputTag>("CL2Electrons"))),
207  cl2TauToken_(consumes<PFTauCollection>(config.getUntrackedParameter<edm::InputTag>("CL2Taus"))),
208  cl2EtSumToken_(consumes<std::vector<EtSum>>(config.getUntrackedParameter<edm::InputTag>("CL2EtSum"))),
209  cl2HtSumToken_(consumes<std::vector<EtSum>>(config.getUntrackedParameter<edm::InputTag>("CL2HtSum"))) {}
210 
211 template <typename T, P2GTCandidate::ObjectType type = P2GTCandidate::Undefined>
212 static std::vector<ap_uint<64>> packCollection(const std::vector<T>& collection) {
213  std::vector<ap_uint<64>> packed;
214  std::optional<ap_uint<64>> next_packed;
215 
216  for (std::size_t idx = 0; idx < collection.size() && idx < 12; idx++) {
217  const T& obj = collection[idx];
218  if constexpr (std::is_same_v<T, TkJetWord>) {
219  ap_uint<128> word = obj.tkJetWord();
220  packed.emplace_back(word(63, 0));
221  packed.emplace_back(word(127, 64));
222  } else if constexpr (std::is_same_v<T, EtSum>) {
224  packed.emplace_back(l1t::demo::codecs::encodeEtSum(obj));
226  packed.emplace_back(l1t::demo::codecs::encodeHtSum(obj));
227  } else if constexpr (type == P2GTCandidate::CL2EtSum) {
228  l1gt::Sum sum{true /* valid */, obj.pt(), obj.phi() / l1gt::Scales::ETAPHI_LSB, 0 /* scalar sum */};
229  packed.emplace_back(sum.pack_ap());
230  } else if constexpr (type == P2GTCandidate::CL2HtSum) {
231  // Make interfaces great again!
232  const EtSum& ht = collection[0];
233  const EtSum& mht = collection[1];
234 
235  l1gt::Sum sum{true /* valid */, mht.pt(), mht.phi() / l1gt::Scales::ETAPHI_LSB, ht.pt()};
236  packed.emplace_back(sum.pack_ap());
237  }
238  break;
239  } else if constexpr (std::is_same_v<T, VertexWord>) {
240  packed.emplace_back(obj.vertexWord());
241  } else if constexpr (std::is_same_v<T, SAMuon>) {
242  packed.emplace_back(obj.word());
243  } else if constexpr (std::is_same_v<T, TrackerMuon>) {
244  std::array<uint64_t, 2> word = obj.word();
245  if (next_packed.has_value()) {
246  packed.emplace_back(word[1] << 32 | next_packed.value());
247  next_packed.reset();
248  } else {
249  next_packed = word[1];
250  }
251 
252  packed.emplace_back(word[0]);
253  } else if constexpr (std::is_same_v<T, PFJet>) {
254  packed.emplace_back(obj.encodedJet()[0]);
255  packed.emplace_back(obj.encodedJet()[1]);
256  } else if constexpr (std::is_same_v<T, TkEm> || std::is_same_v<T, TkElectron>) {
257  ap_uint<96> word = obj.template egBinaryWord<96>();
258  if (next_packed.has_value()) {
259  packed.emplace_back(word(95, 64) << 32 | next_packed.value());
260  next_packed.reset();
261  } else {
262  next_packed = word(95, 64);
263  }
264 
265  packed.emplace_back(word(63, 0));
266  } else if constexpr (std::is_same_v<T, PFTau>) {
267  std::array<uint64_t, 2> word = obj.encodedTau();
268  if (next_packed.has_value()) {
269  packed.emplace_back(word[1] << 32 | next_packed.value());
270  next_packed.reset();
271  } else {
272  next_packed = word[1];
273  }
274 
275  packed.emplace_back(word[0]);
276  }
277  }
278 
279  // Filling up remaining words with 0
280  if constexpr (std::is_same_v<T, TkJetWord> || std::is_same_v<T, PFJet>) {
281  while (packed.size() < 24) {
282  packed.emplace_back(0);
283  }
284  } else if constexpr (std::is_same_v<T, TrackerMuon> || std::is_same_v<T, TkEm> || std::is_same_v<T, TkElectron> ||
285  std::is_same_v<T, PFTau>) {
286  while (packed.size() < 18) {
287  if (next_packed) {
288  packed.emplace_back(next_packed.value());
289  next_packed.reset();
290  } else {
291  packed.emplace_back(0);
292  }
293  }
294  } else if constexpr (std::is_same_v<T, SAMuon> || std::is_same_v<T, VertexWord>) {
295  while (packed.size() < 12) {
296  packed.emplace_back(0);
297  }
298  } else if constexpr (std::is_same_v<T, EtSum>) {
299  if (packed.size() < 1) {
300  packed.emplace_back(0);
301  }
302  }
303 
304  return packed;
305 }
306 
307 template <typename T>
308 static std::vector<T> operator+(std::vector<T>&& lhs, std::vector<T>&& rhs) {
309  std::vector<T> concat;
310  concat.reserve(lhs.size() + rhs.size());
311  std::move(lhs.begin(), lhs.end(), std::back_inserter(concat));
312  std::move(rhs.begin(), rhs.end(), std::back_inserter(concat));
313  return concat;
314 }
315 
317  const TkJetWordCollection& gttPromptJets = event.get(gttPromptJetToken_);
318  const TkJetWordCollection& gttDisplacedJets = event.get(gttDisplacedJetToken_);
319  const std::vector<EtSum>& gttPromptHtSum = event.get(gttPromptHtSumToken_);
320  const std::vector<EtSum>& gttDisplacedHtSum = event.get(gttDisplacedHtSumToken_);
321  const std::vector<EtSum>& gttEtSum = event.get(gttEtSumToken_);
322  const VertexWordCollection& gttPrimaryVertices = event.get(gttPrimaryVertexToken_);
323  const SAMuonCollection& gmtSaPromptMuons = event.get(gmtSaPromptMuonToken_);
324  const SAMuonCollection& gmtSaDisplacedMuons = event.get(gmtSaDisplacedMuonToken_);
326  const PFJetCollection& cl2JetsSC4 = event.get(cl2JetSC4Token_);
327  const PFJetCollection& cl2JetsSC8 = event.get(cl2JetSC8Token_);
328  const TkEmCollection& cl2Photons = event.get(cl2PhotonToken_);
329  const TkElectronCollection& cl2Electrons = event.get(cl2ElectronToken_);
330  const PFTauCollection& cl2Taus = event.get(cl2TauToken_);
331  const std::vector<EtSum>& cl2EtSum = event.get(cl2EtSumToken_);
332  const std::vector<EtSum>& cl2HtSum = event.get(cl2HtSumToken_);
333 
334  if (bufferFileType_ == INPUT) {
336  demo::EventData{{{{"GTT", 1},
337  packCollection(gttPromptJets) + packCollection(gttDisplacedJets) +
338  packCollection<EtSum, P2GTCandidate::GTTPromptHtSum>(gttPromptHtSum) +
339  packCollection<EtSum, P2GTCandidate::GTTDisplacedHtSum>(gttDisplacedHtSum) +
340  packCollection<EtSum, P2GTCandidate::GTTEtSum>(gttEtSum)},
341  {{"GTT", 2}, std::vector<ap_uint<64>>(18, 0)},
342  {{"CL2", 1},
343  packCollection(cl2JetsSC4) + packCollection<EtSum, P2GTCandidate::CL2HtSum>(cl2HtSum) +
344  packCollection<EtSum, P2GTCandidate::CL2EtSum>(cl2EtSum) + packCollection(cl2JetsSC8)},
345  {{"CL2", 2}, packCollection(cl2Taus)},
346  {{"GCT", 1}, std::vector<ap_uint<64>>(50, 0)},
347  {{"GMT", 1},
348  packCollection(gmtSaPromptMuons) + packCollection(gmtSaDisplacedMuons) +
349  packCollection(gmtTkMuons) + std::vector<ap_uint<64>>(12, 0)},
350  {{"CL2", 3}, packCollection(cl2Electrons) + packCollection(cl2Photons)},
351  {{"GTT", 3}, std::vector<ap_uint<64>>(39, 0)},
352  {{"GTT", 4}, std::vector<ap_uint<64>>(36, 0) + packCollection(gttPrimaryVertices)}}});
353  } else {
354  std::map<demo::LinkId, std::vector<ap_uint<64>>> eventData;
355 
356  for (const char* name : AVAILABLE_COLLECTIONS) {
357  std::vector<ap_uint<64>> data;
358 
359  if (std::string("GTTPromptJets") == name) {
360  data = packCollection(gttPromptJets);
361  } else if (std::string("GTTDisplacedJets") == name) {
362  data = packCollection(gttDisplacedJets);
363  } else if (std::string("GTTPromptHtSum") == name) {
364  data = packCollection<EtSum, P2GTCandidate::GTTPromptHtSum>(gttPromptHtSum);
365  } else if (std::string("GTTDisplacedHtSum") == name) {
366  data = packCollection<EtSum, P2GTCandidate::GTTDisplacedHtSum>(gttDisplacedHtSum);
367  } else if (std::string("GTTEtSum") == name) {
368  data = packCollection<EtSum, P2GTCandidate::GTTEtSum>(gttEtSum);
369  } else if (std::string("GTTPrimaryVert") == name) {
370  data = packCollection(gttPrimaryVertices);
371  } else if (std::string("GMTSaPromptMuons") == name) {
372  data = packCollection(gmtSaPromptMuons);
373  } else if (std::string("GMTSaDisplacedMuons") == name) {
374  data = packCollection(gmtSaDisplacedMuons);
375  } else if (std::string("GMTTkMuons") == name) {
377  } else if (std::string("CL2JetsSC4") == name) {
378  data = packCollection(cl2JetsSC4);
379  } else if (std::string("CL2JetsSC8") == name) {
380  data = packCollection(cl2JetsSC8);
381  } else if (std::string("CL2Photons") == name) {
382  data = packCollection(cl2Photons);
383  } else if (std::string("CL2Electrons") == name) {
384  data = packCollection(cl2Electrons);
385  } else if (std::string("CL2Taus") == name) {
386  data = packCollection(cl2Taus);
387  } else if (std::string("CL2EtSum") == name) {
388  data = packCollection<EtSum, P2GTCandidate::CL2EtSum>(cl2EtSum);
389  } else if (std::string("CL2HtSum") == name) {
390  data = packCollection<EtSum, P2GTCandidate::CL2HtSum>(cl2HtSum);
391  }
392 
393  for (std::size_t i = 0; i < numChannels_.at(name); i++) {
394  for (std::size_t j = i; j < data.size(); j += numChannels_.at(name)) {
395  eventData[{name, i}].push_back(data[j]);
396  }
397 
398  while (eventData[{name, i}].size() < 9) {
399  eventData[{name, i}].push_back(0);
400  }
401  }
402  }
403 
404  boardDataWriter_.addEvent(eventData);
405  }
406 
407  eventCounter_++;
408 
409  if (maxEvents_ != 0 && eventCounter_ == maxEvents_) {
411  eventCounter_ = 0;
412  }
413 }
414 
416 
419  desc.addUntracked<std::string>("filename");
420  desc.addUntracked<std::string>("fileExtension", "txt");
421  desc.addUntracked<unsigned int>("maxFrames", 1024);
422  desc.addUntracked<unsigned int>("maxEvents", 0);
423  desc.addUntracked<std::string>("patternFormat", "EMPv2");
424  desc.ifValue(edm::ParameterDescription<std::string>("bufferFileType", "input", false),
425  edm::allowedValues<std::string>("input", "output"));
426 
427  desc.addUntracked<edm::InputTag>("GTTPromptJets");
428  desc.addUntracked<edm::InputTag>("GTTDisplacedJets");
429  desc.addUntracked<edm::InputTag>("GTTPromptHtSum");
430  desc.addUntracked<edm::InputTag>("GTTDisplacedHtSum");
431  desc.addUntracked<edm::InputTag>("GTTEtSum");
432  desc.addUntracked<edm::InputTag>("GTTPrimaryVert");
433 
434  desc.addUntracked<edm::InputTag>("GMTSaPromptMuons");
435  desc.addUntracked<edm::InputTag>("GMTSaDisplacedMuons");
436  desc.addUntracked<edm::InputTag>("GMTTkMuons");
437 
438  desc.addUntracked<edm::InputTag>("CL2JetsSC4");
439  desc.addUntracked<edm::InputTag>("CL2JetsSC8");
440  desc.addUntracked<edm::InputTag>("CL2Photons");
441  desc.addUntracked<edm::InputTag>("CL2Electrons");
442  desc.addUntracked<edm::InputTag>("CL2Taus");
443  desc.addUntracked<edm::InputTag>("CL2EtSum");
444  desc.addUntracked<edm::InputTag>("CL2HtSum");
445 
446  edm::ParameterSetDescription inputChannelDesc;
447  inputChannelDesc.addUntracked<std::vector<unsigned int>>("GCT_1");
448  inputChannelDesc.addUntracked<std::vector<unsigned int>>("GMT_1");
449  inputChannelDesc.addUntracked<std::vector<unsigned int>>("GTT_1");
450  inputChannelDesc.addUntracked<std::vector<unsigned int>>("GTT_2");
451  inputChannelDesc.addUntracked<std::vector<unsigned int>>("GTT_3");
452  inputChannelDesc.addUntracked<std::vector<unsigned int>>("GTT_4");
453  inputChannelDesc.addUntracked<std::vector<unsigned int>>("CL2_1");
454  inputChannelDesc.addUntracked<std::vector<unsigned int>>("CL2_2");
455  inputChannelDesc.addUntracked<std::vector<unsigned int>>("CL2_3");
456 
457  desc.addOptionalUntracked<edm::ParameterSetDescription>("InputChannels", inputChannelDesc);
458 
459  edm::ParameterSetDescription outputChannelDesc;
460  for (const char* name : AVAILABLE_COLLECTIONS) {
461  outputChannelDesc.addUntracked<std::vector<unsigned int>>(name);
462  }
463 
464  desc.addOptionalUntracked<edm::ParameterSetDescription>("OutputChannels", outputChannelDesc);
465 
466  descriptions.addDefault(desc);
467 }
468 
const edm::EDGetTokenT< std::vector< EtSum > > gttPromptHtSumToken_
std::vector< l1t::TkJetWord > TkJetWordCollection
Definition: TkJetWord.h:191
std::vector< TkElectron > TkElectronCollection
Definition: TkElectronFwd.h:16
const edm::EDGetTokenT< PFJetCollection > cl2JetSC8Token_
std::vector< l1t::PFTau > PFTauCollection
Definition: PFTau.h:90
static void fillDescriptions(edm::ConfigurationDescriptions &)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
ap_uint< 64 > encodeEtSum(const l1t::EtSum &v)
Definition: codecs_etsums.cc:6
void addEvent(const EventData &data)
const edm::EDGetTokenT< std::vector< EtSum > > gttDisplacedHtSumToken_
FileFormat parseFileFormat(const std::string &)
Definition: utilities.cc:73
delete x;
Definition: CaloConfig.h:22
Definition: config.py:1
const edm::EDGetTokenT< VertexWordCollection > gttPrimaryVertexToken_
ap_uint< 64 > encodeHtSum(const l1t::EtSum &v)
Definition: codecs_htsums.cc:6
example_stream void analyze(const edm::Event &, const edm::EventSetup &) override
const edm::EDGetTokenT< TkJetWordCollection > gttPromptJetToken_
static std::vector< T > operator+(std::vector< T > &&lhs, std::vector< T > &&rhs)
T getUntrackedParameter(std::string const &, T const &) const
std::vector< l1t::PFJet > PFJetCollection
Definition: PFJet.h:61
const edm::EDGetTokenT< std::vector< EtSum > > cl2EtSumToken_
const edm::EDGetTokenT< TkElectronCollection > cl2ElectronToken_
static std::vector< T1 > vconvert(std::vector< T2 > ivec)
std::vector< TkEm > TkEmCollection
Definition: TkEmFwd.h:17
uint64_t word
void addDefault(ParameterSetDescription const &psetDescription)
L1GTObjectBoardWriter(const edm::ParameterSet &)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
static constexpr std::array< const char *, 27 > AVAILABLE_COLLECTIONS
std::vector< VertexWord > VertexWordCollection
Definition: VertexWord.h:197
const BufferType bufferFileType_
void analyze(const edm::Event &, const edm::EventSetup &) override
const edm::EDGetTokenT< std::vector< EtSum > > gttEtSumToken_
std::map< LinkId, std::pair< ChannelSpec, std::vector< size_t > > > ChannelMap_t
const edm::EDGetTokenT< TrackerMuonCollection > gmtTkMuonToken_
std::vector< TrackerMuon > TrackerMuonCollection
Definition: TrackerMuon.h:17
std::vector< SAMuon > SAMuonCollection
Definition: SAMuon.h:15
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const edm::EDGetTokenT< TkEmCollection > cl2PhotonToken_
const edm::EDGetTokenT< PFJetCollection > cl2JetSC4Token_
std::unordered_map< std::string, std::size_t > numChannels_
const edm::EDGetTokenT< PFTauCollection > cl2TauToken_
const edm::EDGetTokenT< SAMuonCollection > gmtSaDisplacedMuonToken_
constexpr float ETAPHI_LSB
Definition: gt_datatypes.h:45
const edm::EDGetTokenT< TkJetWordCollection > gttDisplacedJetToken_
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:80
const edm::EDGetTokenT< std::vector< EtSum > > cl2HtSumToken_
static std::vector< ap_uint< 64 > > packCollection(const std::vector< T > &collection)
demo::BoardDataWriter boardDataWriter_
const edm::EDGetTokenT< SAMuonCollection > gmtSaPromptMuonToken_
long double 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
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1