ATLAS Offline Software
v50_util.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include <algorithm>
6 
7 #include "v50_util.h"
8 #include "eformat/FullEventFragmentNoTemplates.h"
9 #include "eformat/ROBFragmentNoTemplates.h"
10 #include "v40_FullEventFragment.h"
12 #include "eformat/Issue.h"
13 
14 namespace {
15 
16 // This should have been defined in eformat itself but it's not
17 const uint16_t MAJOR_V50_VERSION = 0x0500;
18 
22 ERS_DECLARE_ISSUE_BASE(offline_eformat_err, SkippedFragmentIssue, eformat::Issue,
23  "Skipping " << ftype << " fragment in " << ptype
24  << " fragment with identifier 0x"
25  << EFORMAT_HEX(source_id), ERS_EMPTY,
26  ((std::string) ftype) ((std::string) ptype) ((uint32_t) source_id))
27 
28 
34 #define EFORMAT_SKIPPED_FRAGMENT(ftype,ptype,sid) \
35  offline_eformat_err::SkippedFragmentIssue(ERS_HERE, ftype, ptype, sid)
36 
37 }
38 
39 namespace offline_eformat {
40 namespace v50 {
41 
43  eformat::CheckSum event_checksum,
44  eformat::CheckSum rob_checksum)
45 
46 {
47  // this has to do the opposite of what eformat::v40::convert
48  // is doing (for current = v50).
49 
50  eformat::helper::Version version(0, eformat::MAJOR_V40_VERSION);
51 
53  fe.check(); //this may throw
54 
55  // new version has 64-bit global id, cast it explicitly
56  uint32_t global_id = static_cast<uint32_t>(fe.global_id());
57 
58  //create the base FullEvent
59  auto nfe = std::make_unique<v40_write::FullEventFragment>
60  (fe.source_id(), fe.bc_time_seconds(),
61  fe.bc_time_nanoseconds(),
62  global_id, fe.run_type(),
63  fe.run_no(), fe.lumi_block(),
64  fe.lvl1_id(), fe.bc_id(),
65  fe.lvl1_trigger_type());
66 
67  nfe->lvl1_trigger_info(fe.nlvl1_trigger_info(), fe.lvl1_trigger_info());
68  nfe->lvl2_trigger_info(fe.nlvl2_trigger_info(), fe.lvl2_trigger_info());
69  nfe->event_filter_info(fe.nevent_filter_info(), fe.event_filter_info());
70  nfe->stream_tag(fe.nstream_tag(), fe.stream_tag());
71  nfe->status(fe.nstatus(), fe.status());
72  nfe->minor_version(version.minor_version());
73  nfe->checksum_type(event_checksum);
74 
75  std::vector<v40_write::ROBFragment*> acc_rob;
76  for (size_t i=0; i<fe.nchildren(); ++i) {
77  try {
78  eformat::read::ROBFragment rob(fe.child(i));
79  rob.check(MAJOR_V50_VERSION);
81  new v40_write::ROBFragment(rob.source_id(),
82  rob.rod_run_no(),
83  rob.rod_lvl1_id(), rob.rod_bc_id(),
84  rob.rod_lvl1_trigger_type(),
85  rob.rod_detev_type(),
86  rob.rod_ndata(), rob.rod_data(),
87  rob.rod_status_position());
88  nrob->status(rob.nstatus(), rob.status());
89  nrob->rod_status(rob.rod_nstatus(), rob.rod_status());
90  eformat::helper::Version rob_version(rob.rod_version());
91  nrob->minor_version(rob_version.minor_version());
92  eformat::helper::Version rod_version(rob.rod_version());
93  nrob->rod_minor_version(rod_version.minor_version());
94  nrob->checksum_type(rob_checksum);
95 
96  //make this new ROB part of the new ROS
97  nfe->append(nrob);
98  //make sure we don't forget to delete this guy
99  acc_rob.push_back(nrob);
100  }
101  catch (eformat::Issue& e) {
102  ers::warning(e);
103  ers::warning(EFORMAT_SKIPPED_FRAGMENT("ROB","FULL_EVENT",0));
104  //we skip this fragment, but do not loose the whole event
105  continue;
106  }
107  }
108 
109  //now the FullEvent is in `nfe', bind
110  const eformat::write::node_t* top = nfe->bind();
111  //memcpy the list of pages into contiguous memory
113 
114  //delete the allocated stuff
115  for (size_t i=0; i<acc_rob.size(); ++i) delete acc_rob[i];
116 
117  return retval;
118 }
119 
120 }} // namespace offline_eformat::v50
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
offline_eformat::v40_write::ROBFragment::minor_version
void minor_version(uint16_t v)
Changes the minor version number of the fragment.
Definition: v40_write_ROBFragment.h:208
v40_write_FullEventFragment.h
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
WriteCellNoiseToCool.src
src
Definition: WriteCellNoiseToCool.py:513
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
Issue
Configuration Issue
Definition: PscIssues.h:31
offline_eformat
Definition: util.h:19
EFORMAT_SKIPPED_FRAGMENT
#define EFORMAT_SKIPPED_FRAGMENT(ftype, ptype, sid)
offline_eformat::v40_write::ROBFragment::rod_minor_version
void rod_minor_version(uint16_t v)
Changes the minor version number of the underlying ROD fragment.
Definition: v40_write_ROBFragment.h:258
perfmonmt-printer.dest
dest
Definition: perfmonmt-printer.py:189
OFFLINE_FRAGMENTS_NAMESPACE::FullEventFragment
eformat::FullEventFragment< PointerType > FullEventFragment
Definition: RawEvent.h:26
offline_eformat::v40_write::ROBFragment::rod_status
void rod_status(uint32_t n, const uint32_t *status)
Changes the number of status words and the status words themselves from the ROD fragment.
Definition: v40_write_ROBFragment.cxx:289
v40_FullEventFragment.h
LArCellBinning_test.retval
def retval
Definition: LArCellBinning_test.py:112
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:93
lumiFormat.i
int i
Definition: lumiFormat.py:85
ERS_EMPTY
Configuration ERS_EMPTY
Definition: PscIssues.h:32
OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment
eformat::ROBFragment< PointerType > ROBFragment
Definition: RawEvent.h:27
offline_eformat::v50::convert_to_40
uint32_t convert_to_40(const uint32_t *src, uint32_t *dest, uint32_t max, eformat::CheckSum event_checksum, eformat::CheckSum rob_checksum)
Definition: v50_util.cxx:42
get_generator_info.version
version
Definition: get_generator_info.py:33
v50_util.h
offline_eformat::v40_write::ROBFragment::checksum_type
void checksum_type(uint32_t s)
Changes the check sum type for this fragment.
Definition: v40_write_ROBFragment.cxx:334
ERS_DECLARE_ISSUE_BASE
ERS_DECLARE_ISSUE_BASE(afp, CantReadCool, dqm_core::Exception, "Cannot read folder '"<< folder<< "' from COOL database '"<< database<< "'", ERS_EMPTY,((std::string) database)((std::string) folder))
offline_eformat::v40_write::ROBFragment::status
void status(uint32_t n, const uint32_t *status)
Changes the number of status words and the status words themselves from the fragment.
Definition: v40_write_ROBFragment.cxx:274
offline_eformat::v40_write::ROBFragment
Defines a helper class to aid the creation of ROB fragments.
Definition: v40_write_ROBFragment.h:35
top
@ top
Definition: TruthClasses.h:64
calibdata.copy
bool copy
Definition: calibdata.py:26