49 static_assert(
DetID == o2::detectors::DetID::TRK ||
DetID == o2::detectors::DetID::FT3,
"only TRK and FT3 digit writers are supported");
53 auto detStrL = detStr;
54 std::transform(detStrL.begin(), detStrL.end(), detStrL.begin(), [](
unsigned char c) { return std::tolower(c); });
56 detStrL =
"o2_" + detStrL;
59 auto digitSizes = std::make_shared<std::vector<size_t>>(mLayers, 0);
60 auto digitSizeGetter = [digitSizes](std::vector<o2::trkft3::Digit>
const& inDigits,
DataRef const&
ref) {
61 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
62 (*digitSizes)[dh->subSpecification] = inDigits.size();
64 auto rofSizes = std::make_shared<std::vector<size_t>>(mLayers, 0);
65 auto rofSizeGetter = [rofSizes](std::vector<o2::trkft3::ROFRecord>
const& inROFs,
DataRef const&
ref) {
66 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
67 (*rofSizes)[dh->subSpecification] = inROFs.size();
71 auto finishWriting = [](TFile* outputfile, TTree* outputtree) {
72 const auto* brArr = outputtree->GetListOfBranches();
74 for (
const auto* brc : *brArr) {
75 int64_t
n = ((
const TBranch*)brc)->GetEntries();
76 if (nent && (nent !=
n)) {
77 LOG(error) <<
"Branches have different number of entries";
81 outputtree->SetEntries(nent);
82 outputfile->Write(
"", TObject::kOverwrite);
87 auto fillLabels = [detStr, 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"
92 << std::format(
" FOR LAYER {}",
layer) <<
" WITH " << (*digitSizes)[
layer]
93 <<
" DIGITS IN " << (*rofSizes)[
layer] <<
" ROFS";
96 auto ptr = &outputcontainer;
98 outputcontainer.
adopt(labelbuffer);
103 auto getIndex = [](
DataRef const&
ref) ->
size_t {
104 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
105 return static_cast<size_t>(dh->subSpecification);
107 auto getName = [](std::string base,
size_t index) -> std::string {
111 std::vector<InputSpec> vecInpSpecDig, vecInpSpecROF, vecInpSpecLbl;
112 vecInpSpecDig.reserve(mLayers);
113 vecInpSpecROF.reserve(mLayers);
114 vecInpSpecLbl.reserve(mLayers);
115 for (
int iLayer = 0; iLayer < mLayers; iLayer++) {
116 vecInpSpecDig.emplace_back(
getName(detStr +
"digits", iLayer), Origin,
"DIGITS", iLayer);
117 vecInpSpecROF.emplace_back(
getName(detStr +
"digitsROF", iLayer), Origin,
"DIGITSROF", iLayer);
118 vecInpSpecLbl.emplace_back(
getName(detStr +
"_digitsMCTR", iLayer), Origin,
"DIGITSMCTR", iLayer);
122 (detStrL +
"digits.root").c_str(),
126 detStr +
"Digit",
"digit-branch",
132 detStr +
"DigitROF",
"digit-rof-branch",
138 detStr +
"DigitMCTruth",
"digit-mctruth-branch",
139 (mctruth ? mLayers : 0),
144 detStr +
"Calib",
"digit-calib-branch",