51 std::string detStrL = dec ?
"o2_" :
"";
53 std::transform(detStrL.begin(), detStrL.end(), detStrL.begin(), ::tolower);
54 auto digitSizes = std::make_shared<std::vector<size_t>>(mLayers, 0);
55 auto digitSizeGetter = [digitSizes](std::vector<o2::itsmft::Digit>
const& inDigits,
DataRef const&
ref) {
56 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
57 (*digitSizes)[dh->subSpecification] = inDigits.size();
59 auto rofSizes = std::make_shared<std::vector<size_t>>(mLayers, 0);
60 auto rofSizeGetter = [rofSizes](std::vector<o2::itsmft::ROFRecord>
const& inROFs,
DataRef const&
ref) {
61 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
62 (*rofSizes)[dh->subSpecification] = inROFs.size();
66 auto finishWriting = [](TFile* outputfile, TTree* outputtree) {
67 const auto* brArr = outputtree->GetListOfBranches();
69 for (
const auto* brc : *brArr) {
70 int64_t
n = ((
const TBranch*)brc)->GetEntries();
71 if (nent && (nent !=
n)) {
72 LOG(error) <<
"Branches have different number of entries";
76 outputtree->SetEntries(nent);
80 outputfile->Write(
"", TObject::kOverwrite);
87 auto fillLabels = [detStr, doStag, digitSizes, rofSizes](TBranch& branch, std::vector<char>
const& labelbuffer,
DataRef const&
ref) {
89 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
90 auto layer =
static_cast<size_t>(dh->subSpecification);
91 LOG(info) << detStr <<
": WRITING " <<
labels.getNElements() <<
" LABELS" << (doStag ? std::format(
" FOR LAYER {}",
layer) :
"") <<
" WITH " << (*digitSizes)[
layer] <<
" DIGITS IN " << (*rofSizes)[
layer] <<
" ROFS";
94 auto ptr = &outputcontainer;
96 outputcontainer.
adopt(labelbuffer);
101 auto getIndex = [](
DataRef const&
ref) ->
size_t {
102 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
103 return static_cast<size_t>(dh->subSpecification);
105 auto getName = [doStag](std::string base,
size_t index) -> std::string {
112 std::vector<InputSpec> vecInpSpecDig, vecInpSpecROF, vecInpSpecLbl;
113 vecInpSpecDig.reserve(mLayers);
114 vecInpSpecROF.reserve(mLayers);
115 vecInpSpecLbl.reserve(mLayers);
116 for (
int iLayer = 0; iLayer < mLayers; iLayer++) {
117 vecInpSpecDig.emplace_back(
getName(detStr +
"digits", iLayer), Origin,
"DIGITS", iLayer);
118 vecInpSpecROF.emplace_back(
getName(detStr +
"digitsROF", iLayer), Origin,
"DIGITSROF", iLayer);
119 vecInpSpecLbl.emplace_back(
getName(detStr +
"_digitsMCTR", iLayer), Origin,
"DIGITSMCTR", iLayer);
123 (detStrL +
"digits.root").c_str(),
127 detStr +
"Digit",
"digit-branch",
133 detStr +
"DigitROF",
"digit-rof-branch",
139 detStr +
"DigitMCTruth",
"digit-mctruth-branch",
140 (mctruth ? mLayers : 0),
145 detStr +
"Calib",
"digit-calib-branch",