TTTT Analysis 0.1

dataset.hpp
Go to the documentation of this file.
1
31 #ifndef dataset_hpp
32 #define dataset_hpp
33 #include <iostream>
34 #include "value.hpp"
35 #include "container.hpp"
36 #include "log.hpp"
37
38 namespace fv{
39
40 typedef std::map<std::string, GenContainer*> ContainerSet;
41
42 /*
43 * A DataSet is a generic source of data that is used to populate
44 * ObservedValues. For each ObservedValue, it is recommened that the DataSet
45 * have a field whose value is updated when the load_next() method is called. A
46 * pointer to this value is then passed during the creation of the
47 * ObservedValue. It is important, therefore, that the location in memory of
48 * the data not change from event to event.
49 */
50 class DataSet{
51 private:
52 void summary(){
53 INFO(GenValue::summary());
54 INFO(GenFunction::summary());
55 }
56
57
58 protected:
59 ContainerSet containers;
60 virtual bool load_next() = 0;
61 virtual int get_events() = 0;
62 virtual int get_current_event() = 0;
63
64 std::map<std::string,std::string> get_container_name_value_map(){
65 std::map<std::string, std::string> value_map;
66 for(auto container : containers)
67 value_map[container.first] = container.second->get_value_name();
68 return value_map;
69 }
70
71 std::map<std::string,std::string> get_function_name_impl_map(){
72 std::map<std::string, std::string> impl_map;
73 for(auto fn : GenFunction::function_registry)
74 if (fn.second != nullptr){
75 impl_map[fn.first] = GenFunction::format_code(fn.second->get_impl());
76 }
77 return impl_map;
78 }
79 public:
80 void process(bool silent=false){
81 int events, current_event;
82 summary();
83 events = get_events();
84 if (!silent) std::cout << std::endl;
85 while( load_next() ){
86 current_event = get_current_event();
87 if (!silent) std::cout << "\rprocessing event: " << current_event+1 << "/" << events << std::flush;
88 GenValue::reset();
89 for(auto con : containers){
90 con.second->fill();
91 }
92 }
93 if (!silent) std::cout << " Finished!" << std::endl;
94 }
95
96 virtual void save_all(){
97 for(auto container : containers)
98 container.second->save();
99 }
100
101 template<typename C, typename... ArgTypes>
102 C* register_container(ArgTypes... args){
103 C* container = new C(args...);
104 if (containers[container->get_name()] != nullptr){
105 CRITICAL("Container with name \""+container->get_name()+"\" already exists.", -1);
106 }
107 containers[container->get_name()] = container;
108 return container;
109 }
110
111 GenContainer* get_container(std::string container_name){
112 GenContainer* c = containers[container_name];
113 if (c == nullptr){
114 CRITICAL("Request for container \"" << container_name << "\" failed. Doesn't exist.", -1);
115 }
116 return c;
117 }
118 };
119 }
120 #endif // dataset_hpp
fv
The namespace containing all filval classes and functions.
Definition: api.hpp:38
fv::GenFunction::format_code
static std::string format_code(const std::string &code)
Attempt to invoke clang-format for the purpose of printing out nicely formatted functions to the log ...
Definition: value.hpp:176
log.hpp
fv::GenFunction::function_registry
static std::map< const std::string, GenFunction * > function_registry
Static mapping of functions from their name to the object wrapper of the function.
Definition: value.hpp:155