52 std::string detStrL = dec ?
"o2_" :
"";
54 std::transform(detStrL.begin(), detStrL.end(), detStrL.begin(), ::tolower);
55 auto digitSizes = std::make_shared<std::vector<size_t>>(mLayers, 0);
56 auto digitSizeGetter = [digitSizes](std::vector<o2::itsmft::Digit>
const& inDigits,
DataRef const&
ref) {
57 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
58 (*digitSizes)[dh->subSpecification] = inDigits.size();
60 auto rofSizes = std::make_shared<std::vector<size_t>>(mLayers, 0);
61 auto rofSizeGetter = [rofSizes](std::vector<o2::itsmft::ROFRecord>
const& inROFs,
DataRef const&
ref) {
62 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
63 (*rofSizes)[dh->subSpecification] = inROFs.size();
67 auto finishWriting = [](TFile* outputfile, TTree* outputtree) {
68 const auto* brArr = outputtree->GetListOfBranches();
70 for (
const auto* brc : *brArr) {
71 int64_t
n = ((
const TBranch*)brc)->GetEntries();
72 if (nent && (nent !=
n)) {
73 LOG(error) <<
"Branches have different number of entries";
84 LOG(info) <<
"No branch was filled, writing one empty entry per branch";
85 std::vector<TBranch*> branches;
86 for (
auto* o : *brArr) {
87 branches.push_back((TBranch*)o);
90 auto* labelptr = &emptyLabels;
91 for (
auto* br : branches) {
92 if (TString(br->GetName()).Contains(
"MCTruth")) {
95 remapped->ResetAddress();
102 outputtree->SetEntries(nent);
106 outputfile->Write(
"", TObject::kOverwrite);
113 auto fillLabels = [detStr, doStag, digitSizes, rofSizes](TBranch& branch, std::vector<char>
const& labelbuffer,
DataRef const&
ref) {
115 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
116 auto layer =
static_cast<size_t>(dh->subSpecification);
117 LOG(info) << detStr <<
": WRITING " <<
labels.getNElements() <<
" LABELS" << (doStag ? std::format(
" FOR LAYER {}",
layer) :
"") <<
" WITH " << (*digitSizes)[
layer] <<
" DIGITS IN " << (*rofSizes)[
layer] <<
" ROFS";
120 auto ptr = &outputcontainer;
122 outputcontainer.
adopt(labelbuffer);
127 auto getIndex = [](
DataRef const&
ref) ->
size_t {
128 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
129 return static_cast<size_t>(dh->subSpecification);
131 auto getName = [doStag](std::string base,
size_t index) -> std::string {
138 std::vector<InputSpec> vecInpSpecDig, vecInpSpecROF, vecInpSpecLbl;
139 vecInpSpecDig.reserve(mLayers);
140 vecInpSpecROF.reserve(mLayers);
141 vecInpSpecLbl.reserve(mLayers);
142 for (
int iLayer = 0; iLayer < mLayers; iLayer++) {
143 vecInpSpecDig.emplace_back(
getName(detStr +
"digits", iLayer), Origin,
"DIGITS", iLayer);
144 vecInpSpecROF.emplace_back(
getName(detStr +
"digitsROF", iLayer), Origin,
"DIGITSROF", iLayer);
145 vecInpSpecLbl.emplace_back(
getName(detStr +
"_digitsMCTR", iLayer), Origin,
"DIGITSMCTR", iLayer);
149 (detStrL +
"digits.root").c_str(),
153 detStr +
"Digit",
"digit-branch",
159 detStr +
"DigitROF",
"digit-rof-branch",
165 detStr +
"DigitMCTruth",
"digit-mctruth-branch",
166 (mctruth ? mLayers : 0),
171 detStr +
"DigitMC2ROF",
"digit-mc2rof-branch",
172 (mctruth ? mLayers : 0),
176 detStr +
"Calib",
"digit-calib-branch",