![]() |
ModelSpace
|
Class for logging data to a file. More...
#include <SimLogger.h>
Classes | |
struct | Group |
Grouping methods – for some variables, such as arrays and vectors, we may want to lump all of the data elements together, even though they are tracked/"logged" as separate native datatypes. The following struct and associated tracking variables provide a mechanism for doing that. More... | |
Public Member Functions | |
SimLogger (Executive &executive, const std::string &filename="output.csv", unsigned int buffer_size=1) | |
Constructor for the SimLogger object – has a default rate of every ms. | |
unsigned int | bufferSize () |
Functions to get and set buffer size. | |
int | bufferSize (unsigned int buffer_size) |
std::string | filename () |
Functions to get and set filename. | |
int | filename (const std::string &name) |
std::string | outDir () |
Functions to get and set output directory. | |
int | outDir (const std::string &directory) |
virtual int | setup (const std::string &file_name) |
Function to set up the SimLogger. | |
int | addParameter (GraphTreeObject ¶meter, const std::string ¶m_name, bool recursive=false) |
Function to add a logging parameter to the SimLogger. Overloaded to add graph node by string or by object. | |
int | addParameter (const std::string ¶meter, const std::string ¶m_name, bool recursive=false) |
Function to add a logging parameter to the SimLogger. Overloaded to add graph node by string or by object. | |
virtual int | lockForLogging () |
Function to lock the file for logging once all parameters have been defined. Generates headers and creates buffers for logging based on parameters that have already been added above. | |
virtual int | log () |
Function to log data to buffer. Flushes buffer to file when full. | |
virtual int | close () |
Function to close down the file – logs remaining buffered data and closes. | |
int | writeHeaders (const int &val) |
int | writeHeaders (const unsigned int &val) |
int | writeHeaders (const double &val) |
int | writeHeaders (const GraphTreeObject &val) |
int | writeHeaders (void *val) |
int | writeHeaders (const std::string &val) |
template<typename T > | |
int | writeHeaders (const std::vector< T > &val) |
template<typename T , long unsigned int N> | |
int | writeHeaders (const std::array< T, N > &val) |
template<typename T , unsigned int R, unsigned int C> | |
int | writeHeaders (const Matrix< T, R, C > &val) |
int | writeToBuffer (const bool &val) |
Overloaded function to write data to the buffer. Should not be called directly by the user – is reserved for call within graph object providing the logging. | |
int | writeToBuffer (const int &val) |
int | writeToBuffer (const long unsigned int &val) |
int | writeToBuffer (const float &val) |
int | writeToBuffer (const double &val) |
int | writeToBuffer (const std::string &val) |
int | writeToBuffer (void *val) |
int | writeToBuffer (GraphTreeObject &val) |
template<typename T > | |
int | writeToBuffer (const std::vector< T > &val) |
Function to handle iteratable values – note here that we only need to define one templated instance because this function will be fully templated out to all DataIO objects that are instantiated, and calls the above ^ under the hood. | |
template<typename T , long unsigned int N> | |
int | writeToBuffer (const std::array< T, N > &val) |
template<typename T , unsigned int R, unsigned int C> | |
int | writeToBuffer (const Matrix< T, R, C > &val) |
void | logLevel (log_level_e new_level) |
Function to set the local model log level. | |
GraphTreeObject * | parent () |
Functions to get object's parent/children. | |
int | parent (GraphTreeObject *new_parent) |
Function to assign the node's parent via pointer. | |
int | parent (GraphTreeObject &new_parent) |
Function to assign the node's parent via reference. | |
std::vector< GraphTreeObject * > & | children () |
unsigned int | nChildren () |
Getters for number of children and descendants. | |
unsigned int | nDescendants () |
std::string | name () const |
Getter and setter for object name. | |
int | name (const std::string &new_name) |
int | rank () |
Getter for the object rank. | |
virtual int | type () |
Function to indicate type – -1 by default unless implemented downstream. | |
bool | loggable () |
Getter for object logability flag – note no setter because should only be set by this or a derived class in its definition. | |
std::string | address () |
Getter for object's string address. | |
std::vector< std::string > | search (const std::string &address) |
Function to search through the graph tree by string address. | |
GraphTreeObject * | getByAddress (const std::string &address) |
Function to get an object from the graph tree by string address. | |
void | dump (bool recursive=false) |
Function to dump the graph node, optionally including descendents. | |
void | graphNodeInfo () |
Function to return all info associated with a given graph node. | |
void | recurseGraphNodeInfo (unsigned int counter) |
Function to recurse through graph tree and print all node info. | |
virtual int | header (void *logger) |
Function to pass headers for this object to the logger. | |
virtual std::vector< std::string > | header_info () const |
void | findLoggable (std::vector< GraphTreeObject * > &matches) |
Function to find all loggable parameters in this node and its children. | |
virtual int | log (void *logger) |
Function to log data to a logger. | |
void | lock (bool recursive=true) |
Function to lock the graph tree object and its children to changes. | |
void | unlock (bool recursive=true) |
Function to unlock the graph tree and its children for changes. | |
bool | locked () |
Function to return whether graph tree object is locked. | |
Public Attributes | |
Executive * | exc |
Handle to the executive object – used for event logging, etc. | |
Protected Member Functions | |
void | _fillBuffers () |
Function to set all buffers to full size. | |
virtual int | _createSetupFile () |
Function to create a file, in whatever format is chosen, for logging. | |
virtual int | _writeToFile () |
Function to write buffered data to file. | |
void | recalculateDescendants () |
Function to recursively re-calculate the number of descendants of a given node on the tree. | |
void | recalculateRank () |
Function to recursively re-calculate the rank of a given node on the tree. | |
std::vector< std::string > | decomposeAddress (std::string address) |
Function to decompose a string into a series of substrings via indexing. | |
void | findMatches (const std::vector< std::string > &subaddresses, const unsigned int &num_subaddresses, unsigned int index, bool match_found, std::vector< GraphTreeObject * > &matches) |
Function to find all addresses mathcing the set of substrings @parem subaddresses A vector of subaddresses to match. | |
std::vector< GraphTreeObject * > | searchNodes (const std::string &address) |
Function to search through the graph tree by string address. | |
int | addChild (GraphTreeObject *child) |
Function to add a child to the graph tree object. | |
int | removeChild (GraphTreeObject *child) |
Function to remove a child from the graph node's children. | |
Protected Attributes | |
std::vector< GraphTreeObject * > | _logged_nodes |
A vector to hold all graph tree object pointers. | |
std::vector< std::string > | _log_names |
std::string | _current_name |
std::string | _filename |
String for the filename. | |
std::string | _output_directory |
unsigned int | _buffer_size = 10 |
Ok, so this is important. At the end of the day, every variable resolves somehow into a basic type, because it is mandated in our logging system. The catch is that we need to resolve variables into headers and then data streams, which can be difficult because C++ is a strongly typed language and we're not really detecting our type until runtime. The solution here is a little messy, but we're basically going to create a bunch of different vectors to hold our different variables, then tie each element to its vector via indices. Got it? God knows I sure don't. Here we go... Vectors to hold defined/accepted data types and read/write indices. | |
unsigned int | _buffer_write_idx = 0 |
unsigned int | _buffer_read_idx = 0 |
std::vector< std::vector< bool > > | _bool_vector |
std::vector< std::vector< int > > | _int_vector |
0 | |
std::vector< std::vector< long unsigned int > > | _uint_vector |
1 | |
std::vector< std::vector< float > > | _float_vector |
2 | |
std::vector< std::vector< double > > | _double_vector |
3 | |
std::vector< std::vector< std::string > > | _string_vector |
4 | |
bool | _locked |
5 | |
unsigned int | _seq_idx = 0 |
std::vector< std::string > | _headers |
std::vector< unsigned int > | _sequence |
std::vector< vector_select_e > | _type |
std::vector< int > | _group_idx |
std::vector< Group > | _groups |
Set to -1 if variable is not part of group. | |
log_level_e | _local_log_level = NONE |
Our local log level – allows a higher log level locally than the overall system. | |
GraphTreeObject * | _parent = nullptr |
Pointer to the object's parent – should be null if the object is the root. Is set to null by default. | |
std::vector< GraphTreeObject * > | _children |
Pointers to the object's children – automatically set to an empty vector, and can be increased to any size. | |
std::string | _name = DEFAULT_NAME |
String name for object. | |
uint16_t | _num_descendants = 0 |
Total number of descendants (includes children of children) of the tree, again not including the tree itself. | |
uint8_t | _num_children = 0 |
Number of direct children of the tree (not including the tree itself) | |
uint8_t | _rank = 0 |
Rank for how far down on the graph tree the object is – starts at zero and maxes out at 256 via variable size. | |
uint8_t | _graph_tree_type = BASE_GRAPH_TREE |
Variable to store graph tree object type. | |
bool | _loggable = false |
Variable to indicate whether the selected object is loggable. Set to false by default. | |
Class for logging data to a file.
This function defines a base logger class with functions as outlined and described in the header. It fully defines the updstream logging interface (interface to logged objects and buffering), but does not define a downstream interface to the actual output file. That interface is reserved for inherited classes. With that in mind, this class is essentially useless until inherited, and should not be used directly. Current planned inherited file structures are CSV and HDF5. The logger class is a generic class targeted at collecting, buffering, and writing data to a file. It operates on the graph tree by interfacing with objects inherited from it (graph tree by default cannot be logged). Desired log parameters can be passed either by a direct handle to the class or by string address, and may be passed as a single unit (just one data point) or a recursive inheritence (log an entire branch of the tree). Data may be buffered in the logger for speed and efficiency, but is not buffered by default for simplicity. Regardless, the buffer class is used as the primary method for collecting data off of graph tree objects for writing.
clockwerk::SimLogger::SimLogger | ( | Executive & | executive, |
const std::string & | filename = "output.csv" , |
||
unsigned int | buffer_size = 1 |
||
) |
Constructor for the SimLogger object – has a default rate of every ms.
exec | Handle to the executive object |
Function to create a file, in whatever format is chosen, for logging.
Reimplemented in modelspace::CsvLogger, and modelspace::Hdf5Logger.
Function to write buffered data to file.
Reimplemented in modelspace::CsvLogger, and modelspace::Hdf5Logger.
|
protectedinherited |
Function to add a child to the graph tree object.
child | A pointer to the graph tree object to add to the tree |
int clockwerk::SimLogger::addParameter | ( | const std::string & | parameter, |
const std::string & | param_name, | ||
bool | recursive = false |
||
) |
Function to add a logging parameter to the SimLogger. Overloaded to add graph node by string or by object.
parameter | Graph tree node passed as address string |
param_name | The name to which the parameter will be logged |
recursive | Flag indicating whether parameter should be added recursively (include all lower items on its tree) or not (the default) |
int clockwerk::SimLogger::addParameter | ( | GraphTreeObject & | parameter, |
const std::string & | param_name, | ||
bool | recursive = false |
||
) |
Function to add a logging parameter to the SimLogger. Overloaded to add graph node by string or by object.
parameter | Graph tree node passed as object |
param_name | The name to which the parameter will be logged |
recursive | Flag indicating whether parameter should be added recursively (include all lower items on its tree) or not (the default) |
|
inherited |
Getter for object's string address.
|
virtual |
Function to close down the file – logs remaining buffered data and closes.
Reimplemented in modelspace::CsvLogger, and modelspace::Hdf5Logger.
|
protectedinherited |
Function to decompose a string into a series of substrings via indexing.
address | The address to be decomposed |
Function to dump the graph node, optionally including descendents.
recursive | Parameter indicating whether to dump only one node (default/false) or the entire tree (true) |
|
inherited |
Function to find all loggable parameters in this node and its children.
matches | Expandable vector to hold all matches in the tree |
|
protectedinherited |
Function to find all addresses mathcing the set of substrings @parem subaddresses A vector of subaddresses to match.
num_subaddresses | The number of subaddresses to match |
index | The index of subaddresses to search in |
match_found | Variable indicating whether a match was found higher in the tree |
matches | Implicit return of all matches to the specified address |
|
inherited |
Function to get an object from the graph tree by string address.
address | The exact string address to access the variable with |
Function to pass headers for this object to the logger.
logger | Pointer to logger |
Reimplemented in clockwerk::DataIO< T >, clockwerk::DataIO< bool >, clockwerk::DataIO< clockwerk::Body< double > * >, clockwerk::DataIO< clockwerk::Body< T > * >, clockwerk::DataIO< clockwerk::CartesianVector< double, 2 > >, clockwerk::DataIO< clockwerk::CartesianVector< double, 3 > >, clockwerk::DataIO< clockwerk::CartesianVector< T, 3 > >, clockwerk::DataIO< clockwerk::Euler321< double > >, clockwerk::DataIO< clockwerk::Frame< double > * >, clockwerk::DataIO< clockwerk::Frame< T > * >, clockwerk::DataIO< clockwerk::Matrix< double, 2, 2 > >, clockwerk::DataIO< clockwerk::Matrix< double, 3, 3 > >, clockwerk::DataIO< clockwerk::Matrix< double, 6, 3 > >, clockwerk::DataIO< clockwerk::Matrix< double, 6, 6 > >, clockwerk::DataIO< clockwerk::Matrix< T, 3, 3 > >, clockwerk::DataIO< clockwerk::Node< double > * >, clockwerk::DataIO< clockwerk::Quaternion< double > >, clockwerk::DataIO< clockwerk::Quaternion< T > >, clockwerk::DataIO< clockwerk::Time >, clockwerk::DataIO< double >, clockwerk::DataIO< int >, clockwerk::DataIO< modelspace::integrator_type_e >, clockwerk::DataIO< std::string >, and clockwerk::DataIO< void * >.
|
inlinevirtualinherited |
Reimplemented in clockwerk::Time.
Function to lock the graph tree object and its children to changes.
recursive | Flag to indicate whether lock should be recursive |
|
virtual |
Function to lock the file for logging once all parameters have been defined. Generates headers and creates buffers for logging based on parameters that have already been added above.
|
virtual |
Function to log data to buffer. Flushes buffer to file when full.
Function to log data to a logger.
logger | Pointer to logger |
Reimplemented in clockwerk::Time, clockwerk::DataIO< T >, clockwerk::DataIO< bool >, clockwerk::DataIO< clockwerk::Body< double > * >, clockwerk::DataIO< clockwerk::Body< T > * >, clockwerk::DataIO< clockwerk::CartesianVector< double, 2 > >, clockwerk::DataIO< clockwerk::CartesianVector< double, 3 > >, clockwerk::DataIO< clockwerk::CartesianVector< T, 3 > >, clockwerk::DataIO< clockwerk::Euler321< double > >, clockwerk::DataIO< clockwerk::Frame< double > * >, clockwerk::DataIO< clockwerk::Frame< T > * >, clockwerk::DataIO< clockwerk::Matrix< double, 2, 2 > >, clockwerk::DataIO< clockwerk::Matrix< double, 3, 3 > >, clockwerk::DataIO< clockwerk::Matrix< double, 6, 3 > >, clockwerk::DataIO< clockwerk::Matrix< double, 6, 6 > >, clockwerk::DataIO< clockwerk::Matrix< T, 3, 3 > >, clockwerk::DataIO< clockwerk::Node< double > * >, clockwerk::DataIO< clockwerk::Quaternion< double > >, clockwerk::DataIO< clockwerk::Quaternion< T > >, clockwerk::DataIO< clockwerk::Time >, clockwerk::DataIO< double >, clockwerk::DataIO< int >, clockwerk::DataIO< modelspace::integrator_type_e >, clockwerk::DataIO< std::string >, and clockwerk::DataIO< void * >.
|
inline |
Function to set the local model log level.
new_level | The new level to set logging to |
|
inherited |
Function to assign the node's parent via reference.
new_parent | The new parent to assign the node to |
|
inherited |
Function to assign the node's parent via pointer.
new_parent | The new parent to assign the node to |
Function to recurse through graph tree and print all node info.
|
protectedinherited |
Function to remove a child from the graph node's children.
child | The child to remove |
|
inherited |
Function to search through the graph tree by string address.
address | `The address or address chunk to search for |
|
protectedinherited |
Function to search through the graph tree by string address.
address | `The address or address chunk to search for |
Function to set up the SimLogger.
file_name | Name of the file to log to |
Function to indicate type – -1 by default unless implemented downstream.
Function to unlock the graph tree and its children for changes.
recursive | Flag to indicate whether unlock should be recursive |
Overloaded function to write data to the buffer. Should not be called directly by the user – is reserved for call within graph object providing the logging.
|
protected |
5
Header and indexing variables