40std::string lowerName()
42 auto name = detName<DetID>();
43 std::transform(
name.begin(),
name.end(),
name.begin(), [](
unsigned char c) { return std::tolower(c); });
48std::string branchName(
const std::string& base,
int layer)
50 return std::format(
"{}{}_{}", detName<DetID>(), base,
layer);
56 : mClusters(NLayers, nullptr), mPatterns(NLayers, nullptr), mROFs(NLayers, nullptr), mLabels(NLayers, nullptr), mUseMC(useMC)
63 connectTree(ic.
options().
get<std::string>((lowerName<DetID>() +
"-cluster-infile").c_str()));
70 const auto entry = mTree->GetReadEntry() + 1;
73 const bool noEntry =
entry >= mTree->GetEntries();
75 LOG(info) << detName<DetID>() <<
"ClusterReader: no entry to read, publishing empty output";
77 mTree->GetEntry(
entry);
79 static const std::vector<o2::trkft3::Cluster<DetID>> noClusters;
80 static const std::vector<unsigned char> noPatterns;
81 static const std::vector<o2::trkft3::ROFRecord> noROFs;
85 const auto&
clusters = noEntry ? noClusters : *mClusters[
layer];
86 const auto& rofs = noEntry ? noROFs : *mROFs[
layer];
87 LOG(info) << detName<DetID>() <<
"ClusterReader on layer " <<
layer <<
" pushes " <<
clusters.size() <<
" clusters in " << rofs.size()
88 <<
" RO frames at entry " <<
entry;
96 if (noEntry || mTree->GetReadEntry() + 1 >= mTree->GetEntries()) {
106 mFile.reset(TFile::Open(
filename.c_str()));
107 if (!mFile || mFile->IsZombie()) {
108 throw std::runtime_error(detName<DetID>() +
"ClusterReader: cannot open " +
filename);
110 mTree.reset(mFile->Get<TTree>(
"o2sim"));
112 throw std::runtime_error(detName<DetID>() +
"ClusterReader: no tree o2sim in " +
filename);
115 setBranchAddress(
"ClusterComp",
layer, mClusters[
layer]);
116 setBranchAddress(
"ClusterPatt",
layer, mPatterns[
layer]);
117 setBranchAddress(
"ClustersROF",
layer, mROFs[
layer]);
119 setBranchAddress(
"ClusterMCTruth",
layer, mLabels[
layer]);
122 LOG(info) << detName<DetID>() <<
"ClusterReader: " <<
filename <<
" with " << mTree->GetEntries() <<
" entries";
126template <
typename Ptr>
127void ClusterReader<DetID>::setBranchAddress(
const std::string& base,
int layer, Ptr&
address)
129 const auto name = branchName<DetID>(base,
layer);
130 if (!mTree->GetBranch(
name.c_str())) {
131 throw std::runtime_error(detName<DetID>() +
"ClusterReader: no branch " +
name + (base ==
"ClusterMCTruth" ?
" (MC labels requested)" :
""));
133 if (
const Int_t status = mTree->SetBranchAddress(
name.c_str(), &
address); status != 0) {
134 throw std::runtime_error(std::format(
"{}ClusterReader: cannot set the address of {} ({})", detName<DetID>(),
name, status));
144 std::vector<OutputSpec> outputs;
145 for (
int layer = 0; layer < ClusterReader<DetID>::NLayers; ++
layer) {
146 outputs.emplace_back(
origin,
"COMPCLUSTERS",
layer, Lifetime::Timeframe);
147 outputs.emplace_back(
origin,
"PATTERNS",
layer, Lifetime::Timeframe);
148 outputs.emplace_back(
origin,
"CLUSTERSROF",
layer, Lifetime::Timeframe);
150 outputs.emplace_back(
origin,
"CLUSTERSMCTR",
layer, Lifetime::Timeframe);
154 lowerName<DetID>() +
"-cluster-reader",
158 Options{{lowerName<DetID>() +
"-cluster-infile", VariantType::String, std::move(defname), {
"Name of the input cluster file"}}}};
164 return getClusterReaderSpecT<o2::detectors::DetID::TRK>(useMC, std::move(defname));
169 return getClusterReaderSpecT<o2::detectors::DetID::FT3>(useMC, std::move(defname));
172template class ClusterReader<o2::detectors::DetID::TRK>;
173template class ClusterReader<o2::detectors::DetID::FT3>;
header::DataOrigin origin
Reads the TRK or FT3 clusters the cluster writer stored, one stream per layer.
Static class with identifiers, bitmasks and names for ALICE detectors.
static constexpr const char * getName(ID id)
names of defined detectors
T get(const char *key) const
void snapshot(const Output &spec, T const &object)
o2::header::DataHeader::SubSpecificationType SubSpecificationType
ConfigParamRegistry const & options()
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
ServiceRegistryRef services()
The services registry associated with this processing context.
ClusterReader(bool useMC)
void run(framework::ProcessingContext &pc) final
void init(framework::InitContext &ic) final
GLuint GLuint64EXT address
GLuint const GLchar * name
GLenum GLuint GLint GLint layer
constexpr o2::header::DataOrigin gDataOriginTRK
constexpr o2::header::DataOrigin gDataOriginFT3
Defining ITS Vertex explicitly as messageable.
std::vector< InputSpec > Inputs
framework::DataProcessorSpec getFT3ClusterReaderSpec(bool useMC=true, std::string defname="o2clus_ft3.root")
framework::DataProcessorSpec getTRKClusterReaderSpec(bool useMC=true, std::string defname="o2clus_trk.root")
The reader of defname, by default the cluster writer's file.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Cluster > clusters