16#ifndef WORKFLOWHELPER_H
17#define WORKFLOWHELPER_H
51 std::vector<o2::dataformats::ConstMCLabelContainerView>
mcInputs;
52 std::vector<gsl::span<const char>>
inputs;
60 std::array<const o2::dataformats::ConstMCLabelContainerView*, constants::MAXSECTOR>
inputDigitsMCPtrs;
65static auto getWorkflowTPCInput(
o2::framework::ProcessingContext& pc,
int verbosity = 0,
bool do_mcLabels =
false,
bool do_clusters =
true,
unsigned long tpcSectorMask = 0xFFFFFFFFF,
bool do_digits =
false)
67 auto retVal = std::make_unique<internal::getWorkflowTPCInput_ret>();
69 if (do_clusters && do_digits) {
70 throw std::invalid_argument(
"Currently cannot process both clusters and digits");
72 std::array<int, constants::MAXSECTOR> inputDigitsMCIndex;
75 std::vector<o2::framework::InputSpec>
filter = {
79 unsigned long recvMask = 0;
81 std::fill(inputDigitsMCIndex.begin(), inputDigitsMCIndex.end(), -1);
84 auto const* sectorHeader = o2::framework::DataRefUtils::getHeader<TPCSectorHeader*>(
ref);
85 if (sectorHeader ==
nullptr) {
87 LOG(error) <<
"sector header missing on header stack";
90 const int sector = sectorHeader->sector();
94 if (recvMask & sectorHeader->sectorBits) {
95 throw std::runtime_error(
"can only have one MC data set per sector");
97 recvMask |= (sectorHeader->sectorBits & tpcSectorMask);
98 retVal->internal.inputrefs[sector].labels =
ref;
100 inputDigitsMCIndex[sector] =
retVal->internal.inputDigitsMC.size();
104 if (recvMask != tpcSectorMask) {
105 throw std::runtime_error(
"Incomplete set of MC labels received");
109 if (tpcSectorMask & (1ul <<
i)) {
111 LOG(info) <<
"GOT MC LABELS FOR SECTOR " <<
i <<
" -> " <<
retVal->internal.inputDigitsMC[inputDigitsMCIndex[
i]].getNElements();
113 if (inputDigitsMCIndex[
i] == -1) {
114 throw std::runtime_error(
"digit mc labels missing");
116 retVal->inputDigitsMCPtrs[
i] = &
retVal->internal.inputDigitsMC[inputDigitsMCIndex[
i]];
118 retVal->inputDigitsMCPtrs[
i] =
nullptr;
124 if (do_clusters || do_digits) {
125 std::vector<o2::framework::InputSpec>
filter = {
129 unsigned long recvMask = 0;
131 auto const* sectorHeader = o2::framework::DataRefUtils::getHeader<TPCSectorHeader*>(
ref);
132 if (sectorHeader ==
nullptr) {
133 throw std::runtime_error(
"sector header missing on header stack");
135 const int sector = sectorHeader->sector();
139 if (recvMask & sectorHeader->sectorBits) {
140 throw std::runtime_error(
"can only have one cluster data set per sector");
142 recvMask |= (sectorHeader->sectorBits & tpcSectorMask);
143 retVal->internal.inputrefs[sector].data =
ref;
145 if (tpcSectorMask & (1ul << sector)) {
148 LOG(info) <<
"GOT DIGITS SPAN FOR SECTOR " << sector <<
" -> " <<
retVal->inputDigits[sector].size();
153 if (recvMask != tpcSectorMask) {
154 throw std::runtime_error(
"Incomplete set of clusters/digits received");
157 for (
auto const& refentry :
retVal->internal.inputrefs) {
158 auto& sector = refentry.first;
159 auto&
ref = refentry.second.data;
161 if (
ref.payload ==
nullptr) {
165 if (!(tpcSectorMask & (1ul << sector))) {
168 if (refentry.second.labels.header !=
nullptr && refentry.second.labels.payload !=
nullptr) {
180 memset(&
retVal->clusterIndex, 0,
sizeof(
retVal->clusterIndex));
181 ClusterNativeHelper::Reader::fillIndex(
retVal->clusterIndex,
retVal->internal.clusterBuffer,
retVal->internal.clustersMCBuffer,
retVal->internal.inputs,
retVal->internal.mcInputs, tpcSectorMask);
Meta data for a group describing it by sector number and global padrow.
Helper class to read the binary format of TPC ClusterNative.
Class of a TPC cluster in TPC-native coordinates (row, time)
A const (ready only) version of MCTruthContainer.
Definition of a container to keep Monte Carlo truth external to simulation objects.
InputRecord & inputs()
The inputs associated with this processing context.
ClusterNativeAccess::ConstMCLabelContainerViewWithBuffer ConstMCLabelContainerViewWithBuffer
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
constexpr o2::header::DataOrigin gDataOriginTPC
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
static o2::header::DataHeader::PayloadSizeType getPayloadSize(const DataRef &ref)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"