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)
156 return gsl::span<TruthElement>();
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>();
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>
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>
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());
349 flatheader.version = 1;
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();
std::vector< std::string > header
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error s
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error First event to Number of events to Number of iterations to Number of iterations to Number of initial iterations excluded from const char e
GLsizei GLsizei GLchar * source
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
VectorOfTObjectPtrs other