All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
LArFormattingHelper.cc
Go to the documentation of this file.
1 /**
2  * @file larpandoracontent/LArHelpers/LArFormattingHelper.cc
3  *
4  * @brief Implementation of the lar formatting helper class.
5  *
6  * $Log: $
7  */
8 
10 
11 #include <iomanip>
12 
13 using namespace pandora;
14 
15 namespace lar_content
16 {
17 
18 void LArFormattingHelper::SetStyle(const LArFormattingHelper::Style style, std::ostream &stream)
19 {
20  LArFormattingHelper::PrintFormatCharacter(static_cast<unsigned int>(style), stream);
21 }
22 
23 //--------------------------------------------------------------------------------------------------------------------------------------
24 
25 void LArFormattingHelper::SetColor(const LArFormattingHelper::Color color, std::ostream &stream)
26 {
27  LArFormattingHelper::PrintFormatCharacter(static_cast<unsigned int>(color), stream);
28 }
29 
30 //--------------------------------------------------------------------------------------------------------------------------------------
31 
32 void LArFormattingHelper::ResetStyle(std::ostream &stream)
33 {
34  LArFormattingHelper::SetStyle(REGULAR, stream);
35 }
36 
37 //--------------------------------------------------------------------------------------------------------------------------------------
38 
39 void LArFormattingHelper::ResetColor(std::ostream &stream)
40 {
41  LArFormattingHelper::SetColor(DEFAULT, stream);
42 }
43 
44 //--------------------------------------------------------------------------------------------------------------------------------------
45 
46 void LArFormattingHelper::Reset(std::ostream &stream)
47 {
48  LArFormattingHelper::ResetColor(stream);
49  LArFormattingHelper::ResetStyle(stream);
50 }
51 
52 //--------------------------------------------------------------------------------------------------------------------------------------
53 
54 void LArFormattingHelper::PrintFormatCharacter(const unsigned int code, std::ostream &stream)
55 {
56  if (!(stream << LArFormattingHelper::GetFormatCharacter(code)))
57  throw StatusCodeException(STATUS_CODE_INVALID_PARAMETER);
58 }
59 
60 //--------------------------------------------------------------------------------------------------------------------------------------
61 
62 std::string LArFormattingHelper::GetFormatCharacter(const unsigned int code)
63 {
64  const std::string startFormattingCode("\x1B[");
65  const std::string endFormattingCode("m");
66  return (startFormattingCode + std::to_string(code) + endFormattingCode);
67 }
68 
69 //--------------------------------------------------------------------------------------------------------------------------------------
70 
71 void LArFormattingHelper::PrintHeader(const std::string &title, const unsigned int width)
72 {
73  LArFormattingHelper::SetStyle(BOLD);
74  std::cout << std::endl << std::string(width, '-') << "\r-" << title << std::endl;
75  LArFormattingHelper::Reset();
76 }
77 
78 //--------------------------------------------------------------------------------------------------------------------------------------
79 
80 void LArFormattingHelper::PrintRule(const unsigned int width)
81 {
82  LArFormattingHelper::PrintHeader("", width);
83 }
84 
85 //--------------------------------------------------------------------------------------------------------------------------------------
86 //--------------------------------------------------------------------------------------------------------------------------------------
87 
88 LArFormattingHelper::Table::Table(const StringVector &columnTitles, const unsigned int precision) :
89  m_columnTitles(columnTitles),
90  m_precision(precision)
91 {
92  m_stringstream.precision(m_precision);
93 
94  for (const std::string &title : m_columnTitles)
95  m_widths.push_back(title.length());
96 }
97 
98 //--------------------------------------------------------------------------------------------------------------------------------------
99 
101 {
102  if (m_columnTitles[m_elements.size() % m_columnTitles.size()] == "")
103  {
104  m_format.push_back("");
105  m_elements.push_back("");
106  }
107 }
108 
109 //--------------------------------------------------------------------------------------------------------------------------------------
110 
111 bool LArFormattingHelper::Table::IsSeparatorColumn(const unsigned int column) const
112 {
113  if (column >= m_columnTitles.size())
114  throw StatusCodeException(STATUS_CODE_OUT_OF_RANGE);
115 
116  return (m_columnTitles[column] == "");
117 }
118 
119 //--------------------------------------------------------------------------------------------------------------------------------------
120 
122 {
123  if (m_widths.empty() || m_elements.empty())
124  throw StatusCodeException(STATUS_CODE_OUT_OF_RANGE);
125 
126  const unsigned int currentElementIndex(m_elements.size() - 1);
127  const unsigned int column(currentElementIndex % m_widths.size());
128  m_widths[column] = std::max(static_cast<unsigned int>(m_elements[currentElementIndex].length()), m_widths[column]);
129 }
130 
131 //--------------------------------------------------------------------------------------------------------------------------------------
132 
134 {
135  if (m_columnTitles.empty())
136  return;
137 
138  this->PrintColumnTitles();
139  this->PrintHorizontalLine();
140  this->PrintTableElements();
141 }
142 
143 //--------------------------------------------------------------------------------------------------------------------------------------
144 
146 {
147  for (unsigned int i = 0, nColumns = m_columnTitles.size(); i < nColumns; ++i)
148  this->PrintTableCell(m_columnTitles[i], LArFormattingHelper::GetFormatCharacter(LArFormattingHelper::BOLD), i);
149 }
150 
151 //--------------------------------------------------------------------------------------------------------------------------------------
152 
154 {
155  for (unsigned int i = 0, nColumns = m_columnTitles.size(); i < nColumns; ++i)
156  this->PrintTableCell(std::string(m_widths[i], '-'), LArFormattingHelper::GetFormatCharacter(LArFormattingHelper::REGULAR), i);
157 }
158 
159 //--------------------------------------------------------------------------------------------------------------------------------------
160 
162 {
163  if (m_columnTitles.empty())
164  return;
165 
166  const unsigned int nRows((m_elements.size() + m_columnTitles.size() - 1) / m_columnTitles.size());
167  const unsigned int nColumns(m_columnTitles.size());
168  if (nRows * nColumns != m_elements.size())
169  {
170  std::cout << "LArFormattingHelper::Table::PrintTableElements - Error: Number of table elements added doesn't fill a whole row" << std::endl;
171  throw StatusCodeException(STATUS_CODE_OUT_OF_RANGE);
172  }
173 
174  for (unsigned int i = 0; i < nRows * nColumns; i++)
175  this->PrintTableCell(m_elements[i], m_format[i], i);
176 }
177 
178 //--------------------------------------------------------------------------------------------------------------------------------------
179 
180 void LArFormattingHelper::Table::PrintTableCell(const std::string &value, const std::string &format, const unsigned int index) const
181 {
182  if (m_columnTitles.empty())
183  return;
184 
185  const unsigned int column(index % m_widths.size());
186 
187  const std::string separator(this->IsSeparatorColumn(column) ? "" : " ");
188  std::cout << "|" << format << separator << std::setw(m_widths[column]) << std::internal << value << separator
189  << std::resetiosflags(std::ios::adjustfield);
191 
192  if (column == m_columnTitles.size() - 1)
193  std::cout << "|" << std::endl;
194 }
195 
196 } // namespace lar_content
void PrintTableCell(const std::string &value, const std::string &format, const unsigned int index) const
Print a table cell.
static std::string format(PyObject *obj, unsigned int pos, unsigned int indent, unsigned int maxlen, unsigned int depth)
Definition: fclmodule.cxx:374
bool IsSeparatorColumn(const unsigned int column) const
If the supplied column is a separator (vertical rule)
def style
Definition: util.py:237
void PrintTableElements() const
Print the table elements.
Math::BigFloat precision(-16)
static std::string GetFormatCharacter(const unsigned int code)
Get a formatting character.
void PrintHorizontalLine() const
Print a horizontal line.
std::stringstream m_stringstream
The stringstream to print objects to.
const unsigned int m_precision
The number of significant figures to use when displaying number types.
const pandora::StringVector m_columnTitles
The vector of columns titles in the table.
void CheckAndSetSeparatorColumn()
Check if the next table cell is in a separator column, if so add a blank element. ...
required by fuzzyCluster table::sbnd_g4_services gaushitTruthMatch pandora
Definition: reco_sbnd.fcl:182
std::string to_string(WindowPattern const &pattern)
std::vector< unsigned int > m_widths
The widths of each column (in units of number of characters)
void Print() const
Print the table.
temporary value
static void ResetStyle(std::ostream &stream=std::cout)
Reset the style of the standard output stream.
void UpdateColumnWidth()
Update the width of the last column in which an element was added.
void PrintColumnTitles() const
Print the column titles.
BEGIN_PROLOG could also be cout