ATLAS Offline Software
Loading...
Searching...
No Matches
TableUtils Namespace Reference

Classes

struct  MultiColumnTable
struct  Range
struct  Range2D
struct  StatTable

Typedefs

using SummandDefinition = std::pair<std::size_t, int>
using RatioDefinition

Functions

template<class T_Stream, typename T_Counter>
T_Stream & dumpTable (T_Stream &out, Range< T_Counter > counter, const Range< std::string > &label, const std::string &label_prefix, const std::size_t column_width, const std::size_t min_label_width, const bool dump_footer, const bool separate_last_row, const unsigned int precision)
template<class T_Stream, typename T_Counter>
T_Stream & dumpTable (T_Stream &out, Range2D< T_Counter > counter, const Range< std::string > &row_label, const Range< std::string > &column_label, const std::string &top_left_label, const std::string &label_prefix, const std::size_t column_width, const std::size_t min_label_width, const bool dump_header, const bool dump_footer, const bool separate_last_row, const std::vector< unsigned int > &precision)
template<typename T_index, class T_string>
std::vector< std::string > makeLabelVector (T_index n_entries, std::initializer_list< std::pair< T_index, T_string > > a_list)
template<class T_Collection>
std::size_t maxLabelWidth (const T_Collection &col)
constexpr std::size_t categoryStride (const std::size_t categories, const std::size_t sub_categories, const std::size_t n_counter)
constexpr std::size_t subCategoryStride (const std::size_t categories, const std::size_t sub_categories, const std::size_t n_counter)
constexpr std::size_t counterStride (const std::size_t categories, const std::size_t sub_categories, const std::size_t n_counter)
template<typename T_Output, typename T_Input, const std::size_t N>
std::vector< T_Output > createCounterArrayWithProjections (const std::size_t categories, const std::size_t sub_categories, const std::vector< std::array< T_Input, N > > &input_counts)
template<typename T>
RatioDefinition defineSimpleRatio (T numerator, T denominator)
template<typename T>
std::tuple< std::string, RatioDefinitiondefineSimpleRatio (std::string &&name, T numerator, T denominator)
template<typename T>
SummandDefinition defineSummand (T counter_idx, int multiplier)
std::size_t computeSum (const std::vector< SummandDefinition > &sum_def, std::size_t eta_offset, std::size_t row_stride, std::size_t seed_i, const std::vector< std::size_t > &stat)
float computeRatio (std::size_t numerator, std::size_t denominator)
float computeRatio (const RatioDefinition &ratio_def, std::size_t eta_offset, std::size_t row_stride, std::size_t seed_i, const std::vector< std::size_t > &stat)
std::tuple< std::string, RatioDefinitionmakeRatioDefinition (std::string &&name, std::vector< SummandDefinition > &&numerator, std::vector< SummandDefinition > &&denominator)
std::tuple< std::vector< std::string >, std::vector< RatioDefinition > > splitRatioDefinitionsAndLabels (std::initializer_list< std::tuple< std::string, RatioDefinition > > a_ratio_list)
constexpr std::size_t categoryStride (const std::size_t categories, const std::size_t sub_categories, const std::vector< RatioDefinition > &ratio_def)
std::size_t subCategoryStride (const std::size_t categories, const std::size_t sub_categories, const std::vector< RatioDefinition > &ratio_def)
constexpr std::size_t ratioStride (const std::size_t categories, const std::size_t sub_categories, const std::vector< RatioDefinition > &ratio_def)
std::vector< float > computeRatios (const std::vector< RatioDefinition > &ratio_def, const std::size_t categories, const std::size_t sub_categories, const std::vector< std::size_t > &counter)
std::string makeBinLabel (const std::string &variable_name, const std::vector< float > &bins, std::size_t bin_i, bool abs_value=false, int precision=1)
std::string makeEtaBinLabel (const std::vector< float > &eta_bins, std::size_t eta_bin_i, bool abs_eta=false)

Typedef Documentation

◆ RatioDefinition

Initial value:
std::pair< std::vector< SummandDefinition >,
std::vector< SummandDefinition > >

Definition at line 377 of file TableUtils.h.

◆ SummandDefinition

using TableUtils::SummandDefinition = std::pair<std::size_t, int>

Definition at line 376 of file TableUtils.h.

Function Documentation

◆ categoryStride() [1/2]

std::size_t TableUtils::categoryStride ( const std::size_t categories,
const std::size_t sub_categories,
const std::size_t n_counter )
inlineconstexpr

Definition at line 299 of file TableUtils.h.

301 {
302 return 1;
303 }

◆ categoryStride() [2/2]

std::size_t TableUtils::categoryStride ( const std::size_t categories,
const std::size_t sub_categories,
const std::vector< RatioDefinition > & ratio_def )
inlineconstexpr

Definition at line 463 of file TableUtils.h.

465 {
466 return 1;
467 }

◆ computeRatio() [1/2]

float TableUtils::computeRatio ( const RatioDefinition & ratio_def,
std::size_t eta_offset,
std::size_t row_stride,
std::size_t seed_i,
const std::vector< std::size_t > & stat )
inline

Definition at line 424 of file TableUtils.h.

428 {
429 std::size_t numerator=computeSum(ratio_def.first, eta_offset, row_stride, seed_i, stat);
430 std::size_t denominator=!ratio_def.second.empty()
431 ? computeSum(ratio_def.second, eta_offset, row_stride, seed_i, stat)
432 : 1;
433 return computeRatio(numerator,denominator);
434 }
float computeRatio(std::size_t numerator, std::size_t denominator)
Definition TableUtils.h:414
std::size_t computeSum(const std::vector< SummandDefinition > &sum_def, std::size_t eta_offset, std::size_t row_stride, std::size_t seed_i, const std::vector< std::size_t > &stat)
Definition TableUtils.cxx:8

◆ computeRatio() [2/2]

float TableUtils::computeRatio ( std::size_t numerator,
std::size_t denominator )
inline

Definition at line 414 of file TableUtils.h.

414 {
415 return denominator!=0 ? static_cast<float>(numerator/static_cast<double>(denominator)) : 0.f;
416 }

◆ computeRatios()

std::vector< float > TableUtils::computeRatios ( const std::vector< RatioDefinition > & ratio_def,
const std::size_t categories,
const std::size_t sub_categories,
const std::vector< std::size_t > & counter )

Definition at line 21 of file TableUtils.cxx.

25 {
26 std::vector<float> ratio;
27 if (counter.size() % (categories*sub_categories) ) {
28 std::stringstream msg;
29 msg << "Category and sub category dimensions " << categories << " * " << sub_categories
30 << " not a common factor of the input counter vector "
31 << counter.size();
32 throw std::logic_error(msg.str());
33 }
34 std::size_t n_counter = counter.size() / (categories*sub_categories);
35 ratio.resize( categories * ratio_def.size() * sub_categories);
36
37 std::size_t input_counter_stride=categories;
38 std::size_t input_sub_category_stride = categories * n_counter;
39 std::size_t ratio_stride = categories;
40 std::size_t ratio_sub_category_stride = ratio_stride * ratio_def.size();
41
42 for (std::size_t sub_category_i=0; sub_category_i < sub_categories; ++sub_category_i) {
43 for (std::size_t ratio_i=0; ratio_i<ratio_def.size(); ++ratio_i) {
44 for (std::size_t category_i=0; category_i<categories; ++category_i) {
45 std::size_t ratio_dest_idx = sub_category_i * ratio_sub_category_stride + ratio_stride * ratio_i + category_i;
46 assert(ratio_dest_idx < ratio.size());
47 assert( sub_category_i * input_sub_category_stride < counter.size() );
48 assert( sub_category_i * input_sub_category_stride + n_counter * input_counter_stride <= counter.size() );
49 ratio[ratio_dest_idx] = computeRatio( ratio_def.at(ratio_i),
50 sub_category_i * input_sub_category_stride,
51 input_counter_stride,
52 category_i,
53 counter);
54 }
55 }
56 }
57 return ratio;
58 }
MsgStream & msg
Definition testRead.cxx:32

◆ computeSum()

std::size_t TableUtils::computeSum ( const std::vector< SummandDefinition > & sum_def,
std::size_t eta_offset,
std::size_t row_stride,
std::size_t seed_i,
const std::vector< std::size_t > & stat )

Definition at line 8 of file TableUtils.cxx.

12 {
13 std::size_t sum=0;
14 for (const SummandDefinition &summand : sum_def ) {
15 assert( eta_offset + row_stride * summand.first + seed_i < stat.size() );
16 sum += stat[eta_offset + row_stride * summand.first + seed_i ] * summand.second;
17 }
18 return sum;
19 }
std::pair< std::size_t, int > SummandDefinition
Definition TableUtils.h:376

◆ counterStride()

std::size_t TableUtils::counterStride ( const std::size_t categories,
const std::size_t sub_categories,
const std::size_t n_counter )
inlineconstexpr

Definition at line 309 of file TableUtils.h.

311 {
312 return (categories+1);
313 }

◆ createCounterArrayWithProjections()

template<typename T_Output, typename T_Input, const std::size_t N>
std::vector< T_Output > TableUtils::createCounterArrayWithProjections ( const std::size_t categories,
const std::size_t sub_categories,
const std::vector< std::array< T_Input, N > > & input_counts )

Definition at line 322 of file TableUtils.h.

324 {
325 if (categories*sub_categories!= input_counts.size()) {
326 std::stringstream msg;
327 msg << "Category dimensions (" << categories << " * " << sub_categories << "="
328 << (categories * sub_categories) << ") and input counter container size "
329 << input_counts.size() << " do not match.";
330 throw std::logic_error(msg.str());
331 }
332 std::vector<T_Output> output_counts;
333 output_counts.resize((categories+1) * (sub_categories+1) * N);
334 const std::size_t sub_category_stride = subCategoryStride(categories, sub_categories, N);
335 const std::size_t counter_stride = counterStride(categories, sub_categories, N);
336 const std::size_t category_stride = categoryStride(categories, sub_categories, N);
337 // project seeds
338 for (std::size_t sub_category_i=0;
339 sub_category_i < sub_categories;
340 ++sub_category_i) {
341 for (std::size_t category_i=0; category_i<categories; ++category_i) {
342 std::size_t src_idx = category_i * sub_categories + sub_category_i;
343 std::size_t dest_idx_base = sub_category_i * sub_category_stride + 0 * counter_stride;
344 std::size_t dest_idx_project_categories_base = dest_idx_base;
345 dest_idx_base += category_i * category_stride;
346 dest_idx_project_categories_base += categories * category_stride;
347
348 for (std::size_t counter_i=0; counter_i<N; ++counter_i) {
349 std::size_t dest_idx=dest_idx_base + counter_i * counter_stride;
350 assert( src_idx < input_counts.size() && counter_i < input_counts[src_idx].size());
351 assert( dest_idx < output_counts.size());
352 output_counts[dest_idx] = input_counts[src_idx][counter_i];
353 assert( dest_idx_project_categories_base + counter_i * counter_stride < output_counts.size());
354 output_counts[dest_idx_project_categories_base + counter_i * counter_stride] += output_counts[dest_idx];
355 }
356 }
357 }
358 // project eta bins
359 for (std::size_t category_i=0; category_i<=categories; ++category_i) {
360 for (std::size_t counter_i=0; counter_i<N; ++counter_i) {
361 std::size_t dest_idx_base = 0 * sub_category_stride + counter_i * counter_stride + category_i;
362 std::size_t dest_idx_project_sub_categories = sub_categories * sub_category_stride + dest_idx_base;
363 assert( dest_idx_project_sub_categories < output_counts.size() );
364 for (std::size_t sub_category_i=0;
365 sub_category_i<sub_categories;
366 ++sub_category_i) {
367 std::size_t sub_category_idx = dest_idx_base + sub_category_i * sub_category_stride;
368 assert( sub_category_idx < output_counts.size() );
369 output_counts[dest_idx_project_sub_categories] += output_counts[sub_category_idx];
370 }
371 }
372 }
373 return output_counts;
374 }
constexpr std::size_t categoryStride(const std::size_t categories, const std::size_t sub_categories, const std::size_t n_counter)
Definition TableUtils.h:299
constexpr std::size_t subCategoryStride(const std::size_t categories, const std::size_t sub_categories, const std::size_t n_counter)
Definition TableUtils.h:304
constexpr std::size_t counterStride(const std::size_t categories, const std::size_t sub_categories, const std::size_t n_counter)
Definition TableUtils.h:309

◆ defineSimpleRatio() [1/2]

template<typename T>
std::tuple< std::string, RatioDefinition > TableUtils::defineSimpleRatio ( std::string && name,
T numerator,
T denominator )
inline

Definition at line 392 of file TableUtils.h.

392 {
393 return std::make_pair( std::move(name), defineSimpleRatio(numerator, denominator) );
394 }
RatioDefinition defineSimpleRatio(T numerator, T denominator)
Definition TableUtils.h:384

◆ defineSimpleRatio() [2/2]

template<typename T>
RatioDefinition TableUtils::defineSimpleRatio ( T numerator,
T denominator )
inline

Definition at line 384 of file TableUtils.h.

384 {
385 return std::make_pair( std::vector< SummandDefinition > { std::make_pair(static_cast<std::size_t>(numerator),1)},
386 std::vector< SummandDefinition > { std::make_pair(static_cast<std::size_t>(denominator),1)});
387 }

◆ defineSummand()

template<typename T>
SummandDefinition TableUtils::defineSummand ( T counter_idx,
int multiplier )
inline

Definition at line 402 of file TableUtils.h.

402 {
403 return std::make_pair(static_cast<std::size_t>(counter_idx), multiplier) ;
404 }

◆ dumpTable() [1/2]

template<class T_Stream, typename T_Counter>
T_Stream & TableUtils::dumpTable ( T_Stream & out,
Range2D< T_Counter > counter,
const Range< std::string > & row_label,
const Range< std::string > & column_label,
const std::string & top_left_label,
const std::string & label_prefix,
const std::size_t column_width,
const std::size_t min_label_width,
const bool dump_header,
const bool dump_footer,
const bool separate_last_row,
const std::vector< unsigned int > & precision )

Definition at line 153 of file TableUtils.h.

164 {
165 if (counter && row_label && column_label
166 && counter.equalSize(row_label)
167 && counter.nColumns() == column_label.size()) {
168 std::size_t max_size =std::max(top_left_label.size(), static_cast<std::size_t>(min_label_width));
169 for (const std::string &name : row_label ) {
170 max_size = std::max(max_size, name.size() + label_prefix.size());
171 }
172 std::size_t the_width = column_width;
173 for (const std::string &name : column_label ) {
174 the_width = std::max(the_width, name.size());
175 }
176 std::size_t total_size =max_size+2*2;
177 for (std::size_t column_i=0; column_i<column_label.size(); ++column_i) {
178 total_size += the_width + 3;
179 }
180 std::string line(total_size, '-');
181 std::size_t pos=0;
182 line[pos]='|';
183 pos += max_size+3;
184 for (std::size_t column_i=0; column_i<column_label.size(); ++column_i) {
185 line[pos]='|';
186 pos += the_width + 3;
187 }
188 line[line.size()-1]='|';
189 if (dump_header) {
190 out << line << std::endl << "| " << std::setw(max_size) << top_left_label << " |" << std::left;
191 for (const std::string &header : column_label ) {
192 out << " " << std::setw(the_width) << header << " |";
193 }
194 out << std::right << std::endl;
195 }
196 out << line << std::endl;
197 std::size_t idx=0;
198 std::string empty;
199 auto default_precision = out.precision();
200 for (const Range<T_Counter> &a_row : counter) {
201 if (separate_last_row && idx+1 == row_label.size()) {
202 out << line << std::endl;
203 }
204 assert( idx < row_label.size());
205 out << "| " << (label_prefix.empty() ? std::left : std::right)
206 << std::setw(label_prefix.size()) << ( idx==0 ? label_prefix : empty)
207 << std::setw(max_size-label_prefix.size()) << row_label[idx] << std::right << " |";
208 unsigned int col_i=0;
209 for (const T_Counter &a : a_row) {
210 out << " "
211 << std::setprecision( (col_i < precision.size()
212 && precision[col_i] != std::numeric_limits<unsigned int>::max())
213 ? precision[col_i]
214 : default_precision)
215 << std::setw(the_width) << a << " |";
216 ++col_i;
217 }
218 out << std::endl;
219 ++idx;
220 }
221 out << std::setprecision(default_precision);
222 if (dump_footer) {
223 out << line;
224 }
225 }
226 return out;
227 }
static Double_t a
static const Attributes_t empty
std::size_t size() const
Definition TableUtils.h:47

◆ dumpTable() [2/2]

template<class T_Stream, typename T_Counter>
T_Stream & TableUtils::dumpTable ( T_Stream & out,
Range< T_Counter > counter,
const Range< std::string > & label,
const std::string & label_prefix,
const std::size_t column_width,
const std::size_t min_label_width,
const bool dump_footer,
const bool separate_last_row,
const unsigned int precision )

Definition at line 105 of file TableUtils.h.

113 {
114 if (counter && label && counter.equalSize(label)) {
115 std::size_t max_size =min_label_width;
116 for (const std::string &name : label ) {
117 max_size = std::max(max_size, name.size());
118 }
119 const std::size_t total_size =max_size+3+2*2+column_width;
120 std::string line(total_size, '-');
121 std::array<std::size_t,3> vertical_line_pos{0u, max_size+3, line.size()-1};
122 for (std::size_t pos : vertical_line_pos) {
123 line[pos]='|';
124 }
125 out << line << std::endl;
126 std::size_t idx=0;
127 std::string empty;
128 auto default_precision = out.precision();
129 for (const T_Counter &a : counter) {
130 if (separate_last_row && idx+1 == label.size()) {
131 out << line << std::endl;
132 }
133 assert( idx < label.size());
134 out << "| " << (label_prefix.empty() ? std::left : std::right)
135 << std::setw(label_prefix.size()) << ( idx==0 ? label_prefix : empty)
136 << std::setw(max_size-label_prefix.size()) << label[idx] << std::right
137 << std::setprecision( precision != std::numeric_limits<unsigned int>::max() ? precision : default_precision)
138 << " | " << std::setw(column_width) << a << " |" << std::endl;
139 ++idx;
140 }
141 out << std::setprecision(default_precision);
142 if (dump_footer) {
143 out << line << std::endl;
144 }
145 }
146 return out;
147 }
std::string label(const std::string &format, int i)
Definition label.h:19

◆ makeBinLabel()

std::string TableUtils::makeBinLabel ( const std::string & variable_name,
const std::vector< float > & bins,
std::size_t bin_i,
bool abs_value = false,
int precision = 1 )
inline

Definition at line 485 of file TableUtils.h.

489 {
490 std::stringstream range_label;
491 range_label << std::fixed << std::setprecision(precision);
492 if (bin_i==bins.size()+1) {
493 range_label << " All " << variable_name;
494 }
495 else {
496 if (bin_i==0) {
497 std::stringstream value_str;
498 value_str << std::fixed << std::setprecision(precision) << 0.;
499 range_label << std::setw(4) << (abs_value ? value_str.str().c_str() : "-inf") << "-";
500 }
501 else {
502 range_label << std::setw(4) << bins.at(bin_i-1) <<"-";
503 }
504 if (bin_i>=bins.size()) {
505 range_label << std::setw(4) << "+inf";
506 }
507 else {
508 range_label << std::setw(4) << bins.at(bin_i);
509 }
510 }
511 return range_label.str();
512 }
static const std::vector< std::string > bins

◆ makeEtaBinLabel()

std::string TableUtils::makeEtaBinLabel ( const std::vector< float > & eta_bins,
std::size_t eta_bin_i,
bool abs_eta = false )
inline

Definition at line 514 of file TableUtils.h.

516 {
517 return TableUtils::makeBinLabel("eta",eta_bins, eta_bin_i,abs_eta, 1);
518 }
std::string makeBinLabel(const std::string &variable_name, const std::vector< float > &bins, std::size_t bin_i, bool abs_value=false, int precision=1)
Definition TableUtils.h:485

◆ makeLabelVector()

template<typename T_index, class T_string>
std::vector< std::string > TableUtils::makeLabelVector ( T_index n_entries,
std::initializer_list< std::pair< T_index, T_string > > a_list )

Definition at line 275 of file TableUtils.h.

277 {
278 std::vector<std::string> labels;
279 labels.resize( n_entries );
280 if (a_list.size() != n_entries) {
281 throw std::logic_error("Expected number of entries and elements in the initializer lists do not match.");
282 }
283 for ( auto elm : a_list) {
284 labels.at(elm.first) = std::move(elm.second);
285 }
286 return labels;
287 }

◆ makeRatioDefinition()

std::tuple< std::string, RatioDefinition > TableUtils::makeRatioDefinition ( std::string && name,
std::vector< SummandDefinition > && numerator,
std::vector< SummandDefinition > && denominator )
inline

Definition at line 438 of file TableUtils.h.

440 {
441 return std::make_tuple(std::move(name),
442 std::make_pair(std::move(numerator),
443 std::move(denominator)));
444 }

◆ maxLabelWidth()

template<class T_Collection>
std::size_t TableUtils::maxLabelWidth ( const T_Collection & col)

Definition at line 290 of file TableUtils.h.

290 {
291 std::size_t max_width=0u;
292 for (const auto &elm : col ) {
293 max_width = std::max( max_width, elm.size());
294 }
295 return max_width;
296 }

◆ ratioStride()

std::size_t TableUtils::ratioStride ( const std::size_t categories,
const std::size_t sub_categories,
const std::vector< RatioDefinition > & ratio_def )
inlineconstexpr

Definition at line 473 of file TableUtils.h.

475 {
476 return (categories);
477 }

◆ splitRatioDefinitionsAndLabels()

std::tuple< std::vector< std::string >, std::vector< RatioDefinition > > TableUtils::splitRatioDefinitionsAndLabels ( std::initializer_list< std::tuple< std::string, RatioDefinition > > a_ratio_list)
inline

Definition at line 448 of file TableUtils.h.

449 {
450 std::tuple< std::vector<std::string>, std::vector<RatioDefinition> > splitted;
451 std::get<0>(splitted).reserve( a_ratio_list.size() );
452 for ( auto a_ratio : a_ratio_list) {
453 std::get<0>(splitted).emplace_back( std::move(std::get<0>(a_ratio)) );
454 }
455 std::get<1>(splitted).reserve( a_ratio_list.size() );
456 for ( auto a_ratio : a_ratio_list) {
457 std::get<1>(splitted).emplace_back( std::move(std::get<1>(a_ratio)) );
458 }
459 return splitted;
460 }

◆ subCategoryStride() [1/2]

std::size_t TableUtils::subCategoryStride ( const std::size_t categories,
const std::size_t sub_categories,
const std::size_t n_counter )
inlineconstexpr

Definition at line 304 of file TableUtils.h.

306 {
307 return (categories+1) * n_counter;
308 }

◆ subCategoryStride() [2/2]

std::size_t TableUtils::subCategoryStride ( const std::size_t categories,
const std::size_t sub_categories,
const std::vector< RatioDefinition > & ratio_def )
inline

Definition at line 468 of file TableUtils.h.

470 {
471 return (categories) * ratio_def.size();
472 }