BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
StorableTimeslice.h
Go to the documentation of this file.
1// Copyright 2013 Jan de Cuveland <cmail@cuveland.de>
2/// \file
3/// \brief Defines the fles::StorableTimeslice class.
4// #pragma once#
5
6#ifndef STTS_H
7#define STTS_H 1
8
9#include "ArchiveDescriptor.h"
10#include "StorableMicroslice.h"
11#include "Timeslice.h"
12
13#include <algorithm> // std::copy
14#include <boost/serialization/access.hpp>
15#include <boost/serialization/vector.hpp>
16#include <cstdint>
17#include <fstream>
18#include <vector>
19// Note: <fstream> has to precede boost/serialization includes for non-obvious
20// reasons to avoid segfault similar to
21// http://lists.debian.org/debian-hppa/2009/11/msg00069.html
22
23namespace fles
24{
25
26// template <class Base, class Derived, ArchiveType archive_type>
27// class InputArchive;
28// template <class Base, class Derived, ArchiveType archive_type>
29// class InputArchiveLoop;
30
31/**
32 * \brief The StorableTimeslice class contains the data of a single timeslice.
33 */
34class StorableTimeslice : public Timeslice
35{
36 public:
37 StorableTimeslice(); // KAA - moved from private
38 /// Copy constructor.
40 /// Delete assignment operator (not implemented).
41 // void operator=(const StorableTimeslice&) = delete;
42 /// Move constructor.
44
45 // /// Construct by copying from given Timeslice object.
46 // StorableTimeslice(const Timeslice& ts);
47
48 /// Construct and initialize empty timeslice to fill using append_component.
49 explicit StorableTimeslice(uint32_t num_core_microslices, uint64_t index = UINT64_MAX, uint64_t ts_pos = UINT64_MAX)
50 {
52 timeslice_descriptor_.ts_pos = ts_pos;
53 timeslice_descriptor_.num_core_microslices = num_core_microslices;
54 timeslice_descriptor_.num_components = 0;
55 }
56
57 /// Append a single component to fill using append_microslice.
58 uint32_t append_component(uint64_t num_microslices, uint64_t /* dummy */ = 0)
59 {
61 ts_desc.ts_num = timeslice_descriptor_.index;
62 ts_desc.offset = 0;
64
65 std::vector<uint8_t> data;
66 for (uint64_t m = 0; m < num_microslices; ++m) {
68 uint8_t* desc_bytes = reinterpret_cast<uint8_t*>(&desc);
69 data.insert(data.end(), desc_bytes, desc_bytes + sizeof(MicrosliceDescriptor));
70 }
71
72 ts_desc.size = data.size();
73 desc_.push_back(ts_desc);
74 data_.push_back(data);
75 uint32_t component = timeslice_descriptor_.num_components++;
76
78 return component;
79 }
80
81 /// Append a single microslice using given descriptor and content.
82 uint64_t append_microslice(uint32_t component,
83 uint64_t microslice,
85 const uint8_t* content)
86 {
87 assert(component < timeslice_descriptor_.num_components);
88 std::vector<uint8_t>& this_data = data_[component];
89 TimesliceComponentDescriptor& this_desc = desc_[component];
90
91 assert(microslice < this_desc.num_microslices);
92 uint8_t* desc_bytes = reinterpret_cast<uint8_t*>(&descriptor);
93
94 // set offset relative to first microslice
95 if (microslice > 0) {
96 uint64_t offset = this_data.size() - this_desc.num_microslices * sizeof(MicrosliceDescriptor);
97 uint64_t first_offset = reinterpret_cast<MicrosliceDescriptor*>(this_data.data())->offset;
98 descriptor.offset = offset + first_offset;
99 }
100
101 std::copy(desc_bytes, desc_bytes + sizeof(MicrosliceDescriptor),
102 &this_data[microslice * sizeof(MicrosliceDescriptor)]);
103
104 this_data.insert(this_data.end(), content, content + descriptor.size);
105 this_desc.size = this_data.size();
106
108 return microslice;
109 }
110
111 /// Append a single microslice object.
112 uint64_t append_microslice(uint32_t component, uint64_t microslice, StorableMicroslice& m)
113 {
114 return append_microslice(component, microslice, m.desc(), m.content());
115 }
116
117 private:
118 friend class boost::serialization::access;
120 friend class InputArchiveLoop<Timeslice, StorableTimeslice, ArchiveType::TimesliceArchive>;
121 friend class TimesliceSubscriber;
122
123 template<class Archive>
124 void serialize(Archive& ar, const unsigned int /* version */)
125 {
127 ar & data_;
128 ar & desc_;
129
131 }
132
134 {
135 data_ptr_.resize(num_components());
136 desc_ptr_.resize(num_components());
137 for (size_t c = 0; c < num_components(); ++c) {
138 desc_ptr_[c] = &desc_[c];
139 data_ptr_[c] = data_[c].data();
140 }
141 }
142
143 std::vector<std::vector<uint8_t>> data_;
144 std::vector<TimesliceComponentDescriptor> desc_;
145};
146
147} // namespace fles
148#endif // STTS_H
__m128 m
Definition P4_F32vec4.h:27
The StorableMicroslice class contains the data of a single microslice.
The StorableTimeslice class contains the data of a single timeslice.
std::vector< std::vector< uint8_t > > data_
uint32_t append_component(uint64_t num_microslices, uint64_t=0)
Append a single component to fill using append_microslice.
uint64_t append_microslice(uint32_t component, uint64_t microslice, MicrosliceDescriptor descriptor, const uint8_t *content)
Append a single microslice using given descriptor and content.
StorableTimeslice(StorableTimeslice &&ts) noexcept
Delete assignment operator (not implemented).
uint64_t append_microslice(uint32_t component, uint64_t microslice, StorableMicroslice &m)
Append a single microslice object.
StorableTimeslice(const StorableTimeslice &ts)
Copy constructor.
std::vector< TimesliceComponentDescriptor > desc_
void serialize(Archive &ar, const unsigned int)
StorableTimeslice(uint32_t num_core_microslices, uint64_t index=UINT64_MAX, uint64_t ts_pos=UINT64_MAX)
Construct and initialize empty timeslice to fill using append_component.
The Timeslice class provides read access to the data of a timeslice.
Definition Timeslice.h:29
uint64_t num_components() const
Retrieve the number of components (contributing input channels).
Definition Timeslice.h:43
uint64_t num_microslices(uint64_t component) const
Retrieve the total number of microslices.
Definition Timeslice.h:40
const MicrosliceDescriptor & descriptor(uint64_t component, uint64_t microslice) const
Retrieve the descriptor of a given microslice.
Definition Timeslice.h:53
const uint8_t * content(uint64_t component, uint64_t microslice) const
Retrieve a pointer to the data content of a given microslice.
Definition Timeslice.h:46
TimesliceDescriptor timeslice_descriptor_
The timeslice descriptor.
Definition Timeslice.h:79
std::vector< uint8_t * > data_ptr_
A vector of pointers to the data content, one per timeslice component.
Definition Timeslice.h:82
uint64_t num_core_microslices() const
Retrieve the number of core microslices.
Definition Timeslice.h:37
std::vector< TimesliceComponentDescriptor * > desc_ptr_
A vector of pointers to the microslice descriptors, one per timeslice component.
Definition Timeslice.h:86
uint64_t index() const
Retrieve the timeslice index.
Definition Timeslice.h:34
Defines the fles::ArchiveDescriptor class.
Defines the fles::StorableMicroslice class.
Defines the fles::Timeslice abstract base class.
Main FLES namespace.
ArchiveType
The archive type enum (e.g., timeslice, microslice).
Microslice descriptor struct.
uint64_t offset
Offset in event buffer (bytes).
Timeslice component descriptor struct.
uint64_t num_microslices
Number of microslices.
uint64_t size
Size (in bytes) of corresponding data.
uint64_t offset
Start offset (in bytes) of corresponding data.