40 std::string detStrL = dec ?
"o2_" :
"";
41 const int mLayers = doStag ? 7 : 1;
43 std::transform(detStrL.begin(), detStrL.end(), detStrL.begin(), ::tolower);
45 auto digitSizes = std::make_shared<std::vector<size_t>>(mLayers, 0);
46 auto digitSizeGetter = [digitSizes](std::vector<o2::itsmft::Digit>
const& inDigits,
DataRef const&
ref) {
47 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
48 (*digitSizes)[dh->subSpecification] = inDigits.size();
50 auto rofSizes = std::make_shared<std::vector<size_t>>(mLayers, 0);
51 auto rofSizeGetter = [rofSizes](std::vector<o2::itsmft::ROFRecord>
const& inROFs,
DataRef const&
ref) {
52 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
53 (*rofSizes)[dh->subSpecification] = inROFs.size();
56 auto finishWriting = [](TFile* outputfile, TTree* outputtree) {
57 const auto* brArr = outputtree->GetListOfBranches();
59 for (
const auto* brc : *brArr) {
60 int64_t
n = ((
const TBranch*)brc)->GetEntries();
61 if (nent && (nent !=
n)) {
62 LOG(error) <<
"Branches have different number of entries";
66 outputtree->SetEntries(nent);
67 outputtree->Write(
"", TObject::kOverwrite);
74 auto fillLabels = [detStr, digitSizes, rofSizes](TBranch& branch, std::vector<char>
const& labelbuffer,
DataRef const&
ref) {
76 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
77 auto layer =
static_cast<size_t>(dh->subSpecification);
78 LOG(info) << detStr <<
": WRITING " <<
labels.getNElements() <<
" LABELS FOR LAYER " <<
layer <<
" WITH " << (*digitSizes)[
layer] <<
" DIGITS IN " << (*rofSizes)[
layer] <<
" ROFS";
81 auto ptr = &outputcontainer;
83 outputcontainer.
adopt(labelbuffer);
88 auto getIndex = [](
DataRef const&
ref) ->
size_t {
89 auto const* dh = DataRefUtils::getHeader<o2::header::DataHeader*>(
ref);
90 return static_cast<size_t>(dh->subSpecification);
92 auto getName = [&doStag](std::string base,
size_t index) -> std::string {
99 std::vector<InputSpec> vecInpSpecDig, vecInpSpecROF, vecInpSpecLbl;
100 vecInpSpecDig.reserve(mLayers);
101 vecInpSpecROF.reserve(mLayers);
102 vecInpSpecLbl.reserve(mLayers);
103 for (
int iLayer = 0; iLayer < mLayers; iLayer++) {
104 vecInpSpecDig.emplace_back(
getName(
"digits", iLayer),
"IT3",
"DIGITS", iLayer);
105 vecInpSpecROF.emplace_back(
getName(
"digitsROF", iLayer),
"IT3",
"DIGITSROF", iLayer);
106 vecInpSpecLbl.emplace_back(
getName(
"digitsMCTR", iLayer),
"IT3",
"DIGITSMCTR", iLayer);
110 (detStrL +
"digits.root").c_str(),
115 detStr +
"Digit",
"digit-branch",
121 detStr +
"DigitROF",
"digit-rof-branch",
127 "IT3DigitMCTruth",
"digit-mctruth-branch",
128 (mctruth ? mLayers : 0),