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, std::string_view 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 398 of file TableUtils.h.

◆ SummandDefinition

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

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

322 {
323 return 1;
324 }

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

486 {
487 return 1;
488 }

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

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

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

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

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

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

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

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

◆ defineSimpleRatio() [1/2]

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

Definition at line 413 of file TableUtils.h.

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

◆ defineSimpleRatio() [2/2]

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

Definition at line 405 of file TableUtils.h.

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

◆ defineSummand()

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

Definition at line 423 of file TableUtils.h.

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

◆ 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,
std::string_view 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 154 of file TableUtils.h.

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

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

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

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

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

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

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

◆ makeRatioDefinition()

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

Definition at line 459 of file TableUtils.h.

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

◆ maxLabelWidth()

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

Definition at line 311 of file TableUtils.h.

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

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

496 {
497 return (categories);
498 }

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

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

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

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

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

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