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

Classes

struct  Range
struct  Range2D
struct  StatTable
struct  MultiColumnTable

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 397 of file TableUtils.h.

◆ SummandDefinition

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

Definition at line 396 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 319 of file TableUtils.h.

321 {
322 return 1;
323 }

◆ 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 483 of file TableUtils.h.

485 {
486 return 1;
487 }

◆ 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 444 of file TableUtils.h.

448 {
449 std::size_t numerator=computeSum(ratio_def.first, eta_offset, row_stride, seed_i, stat);
450 std::size_t denominator=!ratio_def.second.empty()
451 ? computeSum(ratio_def.second, eta_offset, row_stride, seed_i, stat)
452 : 1;
453 return computeRatio(numerator,denominator);
454 }
float computeRatio(std::size_t numerator, std::size_t denominator)
Definition TableUtils.h:434
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 434 of file TableUtils.h.

434 {
435 return denominator!=0 ? static_cast<float>(numerator/static_cast<double>(denominator)) : 0.f;
436 }

◆ 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:396

◆ 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 329 of file TableUtils.h.

331 {
332 return (categories+1);
333 }

◆ 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 342 of file TableUtils.h.

344 {
345 if (categories*sub_categories!= input_counts.size()) {
346 std::stringstream msg;
347 msg << "Category dimensions (" << categories << " * " << sub_categories << "="
348 << (categories * sub_categories) << ") and input counter container size "
349 << input_counts.size() << " do not match.";
350 throw std::logic_error(msg.str());
351 }
352 std::vector<T_Output> output_counts;
353 output_counts.resize((categories+1) * (sub_categories+1) * N);
354 const std::size_t sub_category_stride = subCategoryStride(categories, sub_categories, N);
355 const std::size_t counter_stride = counterStride(categories, sub_categories, N);
356 const std::size_t category_stride = categoryStride(categories, sub_categories, N);
357 // project seeds
358 for (std::size_t sub_category_i=0;
359 sub_category_i < sub_categories;
360 ++sub_category_i) {
361 for (std::size_t category_i=0; category_i<categories; ++category_i) {
362 std::size_t src_idx = category_i * sub_categories + sub_category_i;
363 std::size_t dest_idx_base = sub_category_i * sub_category_stride + 0 * counter_stride;
364 std::size_t dest_idx_project_categories_base = dest_idx_base;
365 dest_idx_base += category_i * category_stride;
366 dest_idx_project_categories_base += categories * category_stride;
367
368 for (std::size_t counter_i=0; counter_i<N; ++counter_i) {
369 std::size_t dest_idx=dest_idx_base + counter_i * counter_stride;
370 assert( src_idx < input_counts.size() && counter_i < input_counts[src_idx].size());
371 assert( dest_idx < output_counts.size());
372 output_counts[dest_idx] = input_counts[src_idx][counter_i];
373 assert( dest_idx_project_categories_base + counter_i * counter_stride < output_counts.size());
374 output_counts[dest_idx_project_categories_base + counter_i * counter_stride] += output_counts[dest_idx];
375 }
376 }
377 }
378 // project eta bins
379 for (std::size_t category_i=0; category_i<=categories; ++category_i) {
380 for (std::size_t counter_i=0; counter_i<N; ++counter_i) {
381 std::size_t dest_idx_base = 0 * sub_category_stride + counter_i * counter_stride + category_i;
382 std::size_t dest_idx_project_sub_categories = sub_categories * sub_category_stride + dest_idx_base;
383 assert( dest_idx_project_sub_categories < output_counts.size() );
384 for (std::size_t sub_category_i=0;
385 sub_category_i<sub_categories;
386 ++sub_category_i) {
387 std::size_t sub_category_idx = dest_idx_base + sub_category_i * sub_category_stride;
388 assert( sub_category_idx < output_counts.size() );
389 output_counts[dest_idx_project_sub_categories] += output_counts[sub_category_idx];
390 }
391 }
392 }
393 return output_counts;
394 }
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:319
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:324
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:329

◆ defineSimpleRatio() [1/2]

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

Definition at line 412 of file TableUtils.h.

412 {
413 return std::make_pair( std::move(name), defineSimpleRatio(numerator, denominator) );
414 }
RatioDefinition defineSimpleRatio(T numerator, T denominator)
Definition TableUtils.h:404

◆ defineSimpleRatio() [2/2]

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

Definition at line 404 of file TableUtils.h.

404 {
405 return std::make_pair( std::vector< SummandDefinition > { std::make_pair(static_cast<std::size_t>(numerator),1)},
406 std::vector< SummandDefinition > { std::make_pair(static_cast<std::size_t>(denominator),1)});
407 }

◆ defineSummand()

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

Definition at line 422 of file TableUtils.h.

422 {
423 return std::make_pair(static_cast<std::size_t>(counter_idx), multiplier) ;
424 }

◆ 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 505 of file TableUtils.h.

509 {
510 std::stringstream range_label;
511 range_label << std::fixed << std::setprecision(precision);
512 if (bin_i==bins.size()+1) {
513 range_label << " All " << variable_name;
514 }
515 else {
516 if (bin_i==0) {
517 std::stringstream value_str;
518 value_str << std::fixed << std::setprecision(precision) << 0.;
519 range_label << std::setw(4) << (abs_value ? value_str.str().c_str() : "-inf") << "-";
520 }
521 else {
522 range_label << std::setw(4) << bins.at(bin_i-1) <<"-";
523 }
524 if (bin_i>=bins.size()) {
525 range_label << std::setw(4) << "+inf";
526 }
527 else {
528 range_label << std::setw(4) << bins.at(bin_i);
529 }
530 }
531 return range_label.str();
532 }
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 534 of file TableUtils.h.

536 {
537 return TableUtils::makeBinLabel("eta",eta_bins, eta_bin_i,abs_eta, 1);
538 }
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:505

◆ 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 295 of file TableUtils.h.

297 {
298 std::vector<std::string> labels;
299 labels.resize( n_entries );
300 if (a_list.size() != n_entries) {
301 throw std::logic_error("Expected number of entries and elements in the initializer lists do not match.");
302 }
303 for ( auto elm : a_list) {
304 labels.at(elm.first) = std::move(elm.second);
305 }
306 return labels;
307 }

◆ makeRatioDefinition()

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

Definition at line 458 of file TableUtils.h.

460 {
461 return std::make_tuple(std::move(name),
462 std::make_pair(std::move(numerator),
463 std::move(denominator)));
464 }

◆ maxLabelWidth()

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

Definition at line 310 of file TableUtils.h.

310 {
311 std::size_t max_width=0u;
312 for (const auto &elm : col ) {
313 max_width = std::max( max_width, elm.size());
314 }
315 return max_width;
316 }

◆ 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 493 of file TableUtils.h.

495 {
496 return (categories);
497 }

◆ 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 468 of file TableUtils.h.

469 {
470 std::tuple< std::vector<std::string>, std::vector<RatioDefinition> > splitted;
471 std::get<0>(splitted).reserve( a_ratio_list.size() );
472 for ( auto a_ratio : a_ratio_list) {
473 std::get<0>(splitted).emplace_back( std::move(std::get<0>(a_ratio)) );
474 }
475 std::get<1>(splitted).reserve( a_ratio_list.size() );
476 for ( auto a_ratio : a_ratio_list) {
477 std::get<1>(splitted).emplace_back( std::move(std::get<1>(a_ratio)) );
478 }
479 return splitted;
480 }

◆ 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 324 of file TableUtils.h.

326 {
327 return (categories+1) * n_counter;
328 }

◆ 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 488 of file TableUtils.h.

490 {
491 return (categories) * ratio_def.size();
492 }