Project
Loading...
Searching...
No Matches
test_ctf_io_mch.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#define BOOST_TEST_MODULE Test MCHCTFIO
13#define BOOST_TEST_MAIN
14#define BOOST_TEST_DYN_LINK
15
16#undef NDEBUG
17#include <cassert>
18
19#include <boost/test/unit_test.hpp>
20#include <boost/test/data/test_case.hpp>
21#include <boost/test/data/dataset.hpp>
23#include "MCHCTF/CTFCoder.h"
24#include "DataFormatsMCH/CTF.h"
27#include "Framework/Logger.h"
28#include <TFile.h>
29#include <TRandom.h>
30#include <TStopwatch.h>
31#include <TSystem.h>
32#include <cstring>
33
34using namespace o2::mch;
35namespace boost_data = boost::unit_test::data;
36
37inline std::vector<o2::ctf::ANSHeader> ANSVersions{o2::ctf::ANSVersionCompat, o2::ctf::ANSVersion1};
38
39BOOST_DATA_TEST_CASE(CTFTest, boost_data::make(ANSVersions), ansVersion)
40{
41 std::vector<ROFRecord> rofs;
42 std::vector<Digit> digs;
43 TStopwatch sw;
44 sw.Start();
46
47 for (int irof = 0; irof < 1000; irof++) {
48 ir += 1 + gRandom->Integer(200);
49 int nch = 0;
50 while (nch == 0) {
51 nch = gRandom->Poisson(20);
52 }
53 int start = digs.size();
54 for (int ich = 0; ich < nch; ich++) {
55 int16_t detID = 100 + gRandom->Integer(1025 - 100);
56 int16_t padID = gRandom->Integer(28672);
57 int32_t tfTime = ir.differenceInBC(ir0);
58 uint32_t adc = gRandom->Integer(1024 * 1024);
59 uint16_t nsamp = gRandom->Integer(1024);
60 auto& d = digs.emplace_back(detID, padID, adc, tfTime, nsamp);
61 bool sat = gRandom->Rndm() > 0.9;
62 d.setSaturated(sat);
63 }
64 rofs.emplace_back(ir, start, nch);
65 }
66
67 sw.Start();
68 std::vector<o2::ctf::BufferType> vec;
69 {
71 coder.setANSVersion(ansVersion);
72 coder.encode(vec, rofs, digs); // compress
73 }
74 sw.Stop();
75 LOG(info) << "Compressed in " << sw.CpuTime() << " s";
76
77 // writing
78 {
79 sw.Start();
81 TFile flOut("test_ctf_mch.root", "recreate");
82 TTree ctfTree(std::string(o2::base::NameConf::CTFTREENAME).c_str(), "O2 CTF tree");
83 ctfImage->print();
84 ctfImage->appendToTree(ctfTree, "MCH");
85 ctfTree.Write();
86 sw.Stop();
87 LOG(info) << "Wrote to tree in " << sw.CpuTime() << " s";
88 }
89
90 // reading
91 vec.clear();
92 {
93 sw.Start();
94 TFile flIn("test_ctf_mch.root");
95 std::unique_ptr<TTree> tree((TTree*)flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()));
97 o2::mch::CTF::readFromTree(vec, *(tree.get()), "MCH");
98 sw.Stop();
99 LOG(info) << "Read back from tree in " << sw.CpuTime() << " s";
100 }
101
102 std::vector<ROFRecord> rofsD;
103 std::vector<Digit> digsD;
104
105 sw.Start();
106 const auto ctfImage = o2::mch::CTF::getImage(vec.data());
107 {
109 coder.decode(ctfImage, rofsD, digsD); // decompress
110 }
111 sw.Stop();
112 LOG(info) << "Decompressed in " << sw.CpuTime() << " s";
113
114 LOG(info) << " BOOST_CHECK rofsD.size() " << rofsD.size() << " rofs.size() " << rofs.size()
115 << " BOOST_CHECK(digsD.size() " << digsD.size() << " digs.size()) " << digs.size();
116
117 BOOST_TEST(rofs == rofsD, boost::test_tools::per_element());
118 BOOST_TEST(digs == digsD, boost::test_tools::per_element());
119}
class for entropy encoding/decoding of MCH digit data
Definitions for MCH CTF data.
Definition of the MCH ROFrame record.
BOOST_DATA_TEST_CASE(DefaultConstructorNofSamplesIsInvariant, boost::unit_test::data::make(nsamples), nofSamples)
Definition testDigit.cxx:50
Definition of the Names Generator class.
static constexpr std::string_view CTFTREENAME
Definition NameConf.h:95
void setANSVersion(const ctf::ANSHeader &ansVersion) noexcept
void readFromTree(TTree &tree, const std::string &name, int ev=0)
read from tree to non-flat object
static auto get(void *head)
cast arbitrary buffer head to container class. Head is supposed to respect the alignment
static auto getImage(const void *newHead)
get const image of the container wrapper, with pointers in the image relocated to new head
o2::ctf::CTFIOSize decode(const CTF::base &ec, VROF &rofVec, VCOL &digVec)
entropy decode data from buffer with CTF
Definition CTFCoder.h:134
o2::ctf::CTFIOSize encode(VEC &buff, const gsl::span< const ROFRecord > &rofData, const gsl::span< const Digit > &digData)
entropy-encode data to buffer with CTF
Definition CTFCoder.h:65
GLuint start
Definition glcorearb.h:469
constexpr ANSHeader ANSVersionCompat
Definition ANSHeader.h:54
constexpr ANSHeader ANSVersion1
Definition ANSHeader.h:55
int64_t differenceInBC(const InteractionRecord &other) const
std::vector< Digit > digsD
std::vector< o2::ctf::BufferType > vec
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< ROFRecord > rofsD
BOOST_CHECK(tree)
std::vector< o2::ctf::ANSHeader > ANSVersions
TFile flOut("test_ctf_mch.root", "recreate")
o2::InteractionRecord ir(ir0)
TStopwatch sw
TTree ctfTree(std::string(o2::base::NameConf::CTFTREENAME).c_str(), "O2 CTF tree")
std::vector< Digit > digs
TFile flIn("test_ctf_mch.root")
o2::InteractionRecord ir0(3, 5)
BOOST_TEST(rofs==rofsD, boost::test_tools::per_element())
auto * ctfImage
std::unique_ptr< TTree > tree((TTree *) flIn.Get(std::string(o2::base::NameConf::CTFTREENAME).c_str()))
ArrayADC adc