ATLAS Offline Software
Loading...
Searching...
No Matches
test-hdf5-writer.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "HDF5Utils/Writer.h"
6
7//-------------------------------------------------------------------------
8// output data structure
9struct out_t
10{
11 double dtype;
12 float ftype;
13 char ctype;
14 short stype;
15 int itype;
16 long ltype;
17 long long lltype;
18 unsigned char uctype;
19 unsigned short ustype;
20 unsigned int uitype;
21 unsigned long ultype;
22 unsigned long long ulltype;
23 bool btype;
24};
26
28 consumer_t consumers;
29#define ADD(NAME) consumers.add(#NAME, [](const out_t& o){ return o.NAME;}, 0)
30 ADD(ctype);
31 ADD(stype);
32 ADD(itype);
33 ADD(ltype);
34 ADD(lltype);
35 ADD(uctype);
36 ADD(ustype);
37 ADD(uitype);
38 ADD(ultype);
39 ADD(ulltype);
40 ADD(ftype);
41 ADD(dtype);
42 ADD(btype);
43#undef ADD
45 consumers.add("half" , [](const out_t& o) { return o.ftype; }, 0, half);
46 consumers.add("dhalf", [](const out_t& o) { return o.dtype; }, 0, half);
47 return consumers;
48}
49
50//-------------------------------------------------------------------------
51// outputs
52
53std::vector<out_t> getOutputs(int offset, size_t length, float factor) {
54 std::vector<out_t> outvec;
55 for (size_t n = 0; n < length; n++) {
56 out_t out;
57 long long int shifted = n + offset;
58 double factored = shifted*factor;
59 out.dtype = factored;
60 out.ftype = factored;
61 out.ctype = shifted;
62 out.stype = shifted;
63 out.itype = shifted;
64 out.ltype = shifted;
65 out.lltype = shifted;
66 out.uctype = shifted;
67 out.ustype = shifted;
68 out.uitype = shifted;
69 out.ultype = shifted;
70 out.ulltype = shifted;
71 out.btype = n % 2;
72 outvec.push_back(out);
73 }
74 return outvec;
75}
76
77template <size_t N>
78auto nestOutputs(int offset, size_t length) {
79 using ret_t = decltype(
80 nestOutputs<N-1>(std::declval<int>(),std::declval<size_t>()));
81 std::vector<ret_t> ret;
82 for (size_t n = 0; n < length; n++) {
83 ret.push_back(nestOutputs<N-1>(n + offset, length + 1));
84 }
85 return ret;
86}
87template<>
88auto nestOutputs<1>(int offset, size_t length) {
89 return getOutputs(offset, length, 0.5);
90}
91
92//-------------------------------------------------------------------------
93// main routine
94
95void fill(H5::Group& out_file, size_t iterations) {
96
97 const int deflate = 7;
98
99 // scalar output
100 using scalar_writer_t = H5Utils::Writer<0, consumer_t::input_type>;
101 scalar_writer_t::configuration_type scalar_config{};
102 scalar_config.name = "scalar";
103 scalar_config.deflate = deflate;
104 consumer_t consumers = getConsumers();
105 scalar_writer_t scalar(out_file, consumers, scalar_config);
106 for (size_t n = 0; n < iterations; n++) {
107 scalar.fill(getOutputs(1 + n, 1, 0.5).at(0));
108 }
109
110 // 1d output
112 d1_t::configuration_type d1_config{};
113 d1_config.name = "1d";
114 d1_config.extent = {10};
115 d1_config.chunks = {5};
116 d1_config.deflate = deflate;
117 d1_t d1(out_file, consumers, d1_config);
118 for (size_t n = 0; n < iterations; n++) {
119 d1.fill(getOutputs(n, 10, 0.5));
120 }
121
122 // 4d output
124 d4_t::configuration_type d4_config;
125 d4_config.name = "4d";
126 d4_config.extent = {2,3,4,5};
127 d4_config.chunks = {1,2,1,2};
128 d4_config.deflate = deflate;
129 d4_t d4(out_file, consumers, d4_config);
130 for (size_t n = 0; n < iterations; n++) {
131 auto vals = nestOutputs<4>(n, 2);
132 // store some specific value to make sure we have the indexing
133 // right
134 vals.at(1).at(2).at(3).at(4).stype = 86;
135 d4.fill(std::move(vals));
136 }
137}
138//coverity[root_function]
139int main(int nargs, char* argv[]) {
140 H5::H5File out_file("output.h5", H5F_ACC_TRUNC);
141 size_t iterations = 1;
142 if (nargs > 2) {
143 return 1;
144 }
145 if (nargs > 1) iterations = std::atoi(argv[1]);
146 //coverity[TAINTED_SCALAR]
147 fill(out_file, iterations);
148 return 0;
149}
double length(const pvec &v)
void add(const std::string &name, const std::function< T(I)> &, const T &default_value=T(), Compression=Compression::STANDARD)
This should be the only method you need in this class.
Definition Writer.h:164
Writer.
Definition Writer.h:350
int main()
Definition hello.cxx:18
unsigned long long ulltype
long long lltype
unsigned long ultype
unsigned char uctype
unsigned int uitype
unsigned short ustype
H5Utils::Consumers< const out_t & > consumer_t
consumer_t getConsumers()
void fill(H5::Group &out_file, size_t iterations)
#define ADD(NAME)
auto nestOutputs< 1 >(int offset, size_t length)
auto nestOutputs(int offset, size_t length)
std::vector< out_t > getOutputs(int offset, size_t length, float factor)