forked from mkrzewic/AliceO2
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDataHeader.h
More file actions
178 lines (154 loc) · 5.6 KB
/
DataHeader.h
File metadata and controls
178 lines (154 loc) · 5.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
//The main O2 data header, v0.1
//origin: CWG4
//blame: Mikolaj Krzewicki, mkrzewic@cern.ch
// Matthias Richter, Matthias.Richter@cern.ch
// David Rohr, drohr@cern.ch
#ifndef ALICEO2_BASE_DATA_HEADER_
#define ALICEO2_BASE_DATA_HEADER_
#include <cstdint>
#include <cstring>
#include <cstdio>
namespace AliceO2 {
namespace Base {
//constant field lengths for char fields
const uint32_t gSizeMagicString = 4;
const uint32_t gSizeDataOriginString = 4;
const uint32_t gSizePayloadSerializationString = 8;
const uint32_t gSizeDataDescriptionString = 16;
struct DataHeader;
struct DataOrigin;
struct DataDescription;
struct PayloadSerialization;
//____________________________________________________________________________
//the main header struct
struct DataHeader
{
//other constants
static const uint32_t sVersion = 1;
static const char* sMagicString;
//__the data layout:
//a magic string
union {
char magicString[gSizeMagicString];
uint32_t magicStringInt;
};
//origin of the data (originating detector)
union {
char dataOrigin[gSizeDataOriginString];
uint32_t dataOriginInt;
};
//serialization method
union {
char payloadSerialization[gSizePayloadSerializationString];
uint64_t payloadSerializationInt;
};
//data type descriptor
union {
char dataDescription[gSizeDataDescriptionString];
uint64_t dataDescriptionInt[2];
};
//sub specification (e.g. link number)
uint64_t subSpecification;
//flags, first bit indicates that a sub header follows
uint32_t flags;
uint32_t headerVersion; //version of this header
uint32_t headerSize; //size of this header
uint32_t payloadSize; //size of the associated data
//___NEVER MODIFY THE ABOVE
//___NEW STUFF GOES BELOW
//___the functions:
DataHeader(); //ctor
DataHeader(const DataHeader&); //copy ctor
DataHeader& operator=(const DataHeader&); //assignment
DataHeader& operator=(const DataOrigin&); //assignment
DataHeader& operator=(const DataDescription&); //assignment
DataHeader& operator=(const PayloadSerialization&); //assignment
bool operator==(const DataHeader&); //comparison
bool operator==(const DataOrigin&); //comparison
bool operator==(const DataDescription&); //comparison
bool operator==(const PayloadSerialization&); //comparison
void print() const;
};
//____________________________________________________________________________
struct DataOrigin
{
//origin of the data (originating detector)
union {
char dataOrigin[gSizeDataOriginString];
uint32_t dataOriginInt;
};
DataOrigin(const char* origin)
//: dataOriginInt(*(reinterpret_cast<const uint32_t*>(origin))) {}
: dataOrigin() {
memset(dataOrigin, ' ', gSizeDataOriginString-1);
if (origin) {
strncpy(dataOrigin, origin, gSizeDataOriginString-1);
}
dataOrigin[gSizeDataOriginString-1] = '\0';
}
void print() const {printf("Data origin : %s\n", dataOrigin);}
};
//____________________________________________________________________________
struct DataDescription
{
//data type descriptor
union {
char dataDescription[gSizeDataDescriptionString];
uint64_t dataDescriptionInt[2];
};
DataDescription(const char* desc)
//: dataDescriptionInt { (reinterpret_cast<const uint64_t*>(desc))[0],
// (reinterpret_cast<const uint64_t*>(desc))[1]
// } {}
: dataDescription() {
memset(dataDescription, ' ', gSizeDataDescriptionString-1);
if (desc) {
strncpy(dataDescription, desc, gSizeDataDescriptionString-1);
}
dataDescription[gSizeDataDescriptionString-1] = '\0';
}
void print() const {printf("Data descr. : %s\n", dataDescription);}
};
//____________________________________________________________________________
struct PayloadSerialization
{
//serialization method
union {
char payloadSerialization[gSizePayloadSerializationString];
uint64_t payloadSerializationInt;
};
PayloadSerialization(const char* serialization)
//: payloadSerializationInt(*(reinterpret_cast<const uint64_t*>(serialization))) {}
: payloadSerialization() {
memset(payloadSerialization, ' ', gSizePayloadSerializationString-1);
if (serialization) {
strncpy(payloadSerialization, serialization, gSizePayloadSerializationString-1);
}
payloadSerialization[gSizePayloadSerializationString-1] = '\0';
}
void print() const {printf("Serialization: %s\n", payloadSerialization);}
};
//____________________________________________________________________________
//possible data origins
extern const DataOrigin gDataOriginAny;
extern const DataOrigin gDataOriginInvalid;
extern const DataOrigin gDataOriginTPC;
extern const DataOrigin gDataOriginTRD;
extern const DataOrigin gDataOriginTOF;
//____________________________________________________________________________
//possible data types
extern const DataDescription gDataDescriptionAny;
extern const DataDescription gDataDescriptionInvalid;
extern const DataDescription gDataDescriptionRaw;
extern const DataDescription gDataDescriptionClusters;
extern const DataDescription gDataDescriptionTracks;
//____________________________________________________________________________
//possible serialization types
extern const PayloadSerialization gPayloadSerializationAny;
extern const PayloadSerialization gPayloadSerializationInvalid;
extern const PayloadSerialization gPayloadSerializationNone;
extern const PayloadSerialization gPayloadSerializationROOT;
extern const PayloadSerialization gPayloadSerializationFlatBuf;
} //namespace Base
} //namespace AliceO2
#endif