16#ifndef ALICEO2_DATAFORMATS_MCTRUTH_H_
17#define ALICEO2_DATAFORMATS_MCTRUTH_H_
81template <
typename TruthElement>
91 std::vector<MCTruthHeaderElement> mHeaderArray;
92 std::vector<TruthElement> mTruthArray;
96 std::vector<char> mStreamerData;
98 size_t getSize(uint32_t dataindex)
const
117 MCTruthContainer(std::vector<MCTruthHeaderElement>& header, std::vector<TruthElement>& truthArray)
140 TruthElement
const&
getElement(uint32_t elementindex)
const {
return mTruthArray[elementindex]; }
156 return gsl::span<TruthElement>();
163 gsl::span<const TruthElement>
getLabels(uint32_t dataindex)
const
166 return gsl::span<const TruthElement>();
168 return gsl::span<const TruthElement>(&mTruthArray[
getMCTruthHeader(dataindex).
index], getSize(dataindex));
173 mHeaderArray.clear();
182 mHeaderArray = std::vector<MCTruthHeaderElement>();
183 mTruthArray = std::vector<TruthElement>();
184 mStreamerData = std::vector<char>();
190 void addElement(uint32_t dataindex, TruthElement
const& element,
bool noElement =
false)
192 if (dataindex < mHeaderArray.size()) {
195 if (dataindex != (mHeaderArray.size() - 1)) {
196 throw std::runtime_error(
"MCTruthContainer: unsupported code path");
202 int holes = dataindex - mHeaderArray.size();
204 for (
int i = 0;
i < holes; ++
i) {
205 mHeaderArray.emplace_back(mTruthArray.size());
208 mHeaderArray.emplace_back(mTruthArray.size());
211 mTruthArray.emplace_back(element);
223 template <
typename CompatibleLabel>
224 void addElements(uint32_t dataindex, gsl::span<CompatibleLabel> elements)
226 static_assert(std::is_same<TruthElement, CompatibleLabel>::value ||
227 std::is_assignable<TruthElement, CompatibleLabel>::value ||
228 std::is_base_of<TruthElement, CompatibleLabel>::value,
229 "Need to add compatible labels");
231 for (
auto& e : elements) {
236 template <
typename CompatibleLabel>
237 void addElements(uint32_t dataindex,
const std::vector<CompatibleLabel>&
v)
239 using B =
typename std::remove_const<CompatibleLabel>::type;
240 auto s = gsl::span<CompatibleLabel>(
const_cast<B*
>(&
v[0]),
v.size());
250 if (dataindex >= mHeaderArray.size()) {
254 assert(dataindex == mHeaderArray.size());
256 mHeaderArray.resize(dataindex + 1);
257 mHeaderArray[dataindex] = mTruthArray.size();
258 mTruthArray.emplace_back(element);
261 if (dataindex == mHeaderArray.size() - 1) {
271 auto currentindex = mHeaderArray[dataindex].index;
272 auto lastindex = currentindex + getSize(dataindex);
273 assert(currentindex >= 0);
276 mTruthArray.resize(mTruthArray.size() + 1);
278 for (
int i = mTruthArray.size() - 1;
i > lastindex; --
i) {
279 mTruthArray[
i] = mTruthArray[
i - 1];
282 mTruthArray[lastindex] = element;
285 for (uint32_t
i = dataindex + 1;
i < mHeaderArray.size(); ++
i) {
286 auto oldindex = mHeaderArray[
i].index;
287 mHeaderArray[
i].index = (oldindex != (uint32_t)-1) ? oldindex + 1 : oldindex;
293 void setFrom(std::vector<MCTruthHeaderElement>& header, std::vector<TruthElement>& truthArray)
295 mHeaderArray = std::move(header);
296 mTruthArray = std::move(truthArray);
302 const auto oldtruthsize = mTruthArray.size();
303 const auto oldheadersize = mHeaderArray.size();
306 std::copy(
other.mHeaderArray.begin(),
other.mHeaderArray.end(), std::back_inserter(mHeaderArray));
307 std::copy(
other.mTruthArray.begin(),
other.mTruthArray.end(), std::back_inserter(mTruthArray));
310 for (uint32_t
i = oldheadersize;
i < mHeaderArray.size(); ++
i) {
311 mHeaderArray[
i].index += oldtruthsize;
318 const auto oldtruthsize = mTruthArray.size();
319 const auto oldheadersize = mHeaderArray.size();
320 auto endIdx = from +
n;
321 assert(endIdx <=
other.mHeaderArray.size());
322 const auto* headBeg = &
other.mHeaderArray[from];
323 const auto* headEnd = headBeg +
n;
324 const auto* trtArrBeg = &
other.mTruthArray[
other.getMCTruthHeader(from).index];
325 const auto* trtArrEnd = (endIdx ==
other.mHeaderArray.size()) ? (&
other.mTruthArray.back()) + 1 : &
other.mTruthArray[
other.getMCTruthHeader(endIdx).index];
328 std::copy(headBeg, headEnd, std::back_inserter(mHeaderArray));
329 std::copy(trtArrBeg, trtArrEnd, std::back_inserter(mTruthArray));
332 for (uint32_t
i = oldheadersize;
i < mHeaderArray.size(); ++
i) {
333 mHeaderArray[
i].index +=
offset;
341 template <
typename ContainerType>
345 container.resize((bufferSize /
sizeof(
typename ContainerType::value_type)) + ((bufferSize %
sizeof(
typename ContainerType::value_type)) > 0 ? 1 : 0));
346 char*
target =
reinterpret_cast<char*
>(container.data());
351 flatheader.sizeofTruthElement =
sizeof(TruthElement);
352 flatheader.reserved = 0;
353 flatheader.nofHeaderElements = mHeaderArray.size();
354 flatheader.nofTruthElements = mTruthArray.size();
355 size_t copySize = flatheader.sizeofHeaderElement * flatheader.nofHeaderElements;
356 memcpy(
target, mHeaderArray.data(), copySize);
358 copySize = flatheader.sizeofTruthElement * flatheader.nofTruthElements;
359 memcpy(
target, mTruthArray.data(), copySize);
374 if (bufferSize <
sizeof(
FlatHeader) + flatheader.sizeofHeaderElement * flatheader.nofHeaderElements + flatheader.sizeofTruthElement * flatheader.nofTruthElements) {
375 throw std::runtime_error(
"inconsistent buffer size: too small");
378 if (flatheader.sizeofHeaderElement !=
sizeof(
MCTruthHeaderElement) || flatheader.sizeofTruthElement !=
sizeof(TruthElement)) {
380 throw std::runtime_error(
"member element sizes don't match");
387 mHeaderArray.resize(flatheader.nofHeaderElements);
388 mTruthArray.resize(flatheader.nofTruthElements);
389 size_t copySize = flatheader.sizeofHeaderElement * flatheader.nofHeaderElements;
390 memcpy(mHeaderArray.data(),
source, copySize);
392 copySize = flatheader.sizeofTruthElement * flatheader.nofTruthElements;
393 memcpy(mTruthArray.data(),
source, copySize);
397 template <
typename Stream>
400 stream <<
"MCTruthContainer index = " <<
getIndexedSize() <<
" for " <<
getNElements() <<
" elements(s), flat buffer size " << mStreamerData.size() <<
"\n";
410 if (mHeaderArray.size() > 0) {
411 mStreamerData.clear();
414 restore_from(mStreamerData.data(), mStreamerData.size());
415 mStreamerData.clear();
425 if (mStreamerData.size() > 0) {
429 mStreamerData.clear();
GLsizei GLsizei GLchar * source
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
VectorOfTObjectPtrs other