OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
SumErrSq.h
Go to the documentation of this file.
1 #ifndef __SUMERRSQ_H__
2 #define __SUMERRSQ_H__
3 
4 #include <map>
5 #include <string>
6 #include <fstream>
7 #include <iterator>
8 
9 #include "boost/type_traits/remove_cv.hpp"
10 #include "boost/variant/get.hpp"
11 #include "boost/variant/variant.hpp"
12 #include "boost/smart_ptr.hpp"
13 
14 #include "Util/Types.h"
15 #include "Util/SDDSReader.h"
17 
18 class Measurement {
19 public:
20  double spos;
21  double measurement;
22 
23  friend std::istream & operator>>(std::istream & stream, Measurement & measurement);
24 };
25 
35 struct SumErrSq {
36 
37  static const std::string name;
38 
40 
41  if (args.size() != 3) {
42  throw OptPilotException("SumErrSq::operator()",
43  "sumErrSq expects 3 arguments, " + std::to_string(args.size()) + " given");
44  }
45 
46  std::string measurement_filename = boost::get<std::string>(args[0]);
47  var_name_ = boost::get<std::string>(args[1]);
48  stat_filename_ = boost::get<std::string>(args[2]);
49 
50  //FIXME: we could assume measurements don't change
51  parseMeasurements(measurement_filename);
52  bool is_valid = true;
53 
54  boost::scoped_ptr<SDDSReader> sim_stats(new SDDSReader(stat_filename_));
55  try {
56  sim_stats->parseFile();
57  } catch (OptPilotException &ex) {
58  std::cout << "Caught exception: " << ex.what() << std::endl;
59  is_valid = false;
60  }
61 
62  double sum = 0;
63 
64  for(Measurement measurement : measurements_) {
65  double sim_value = 0.0;
66  try {
67  sim_stats->getInterpolatedValue(
68  measurement.spos, var_name_, sim_value);
69  } catch(OptPilotException &e) {
70  std::cout << "Exception while getting value "
71  << "from SDDS file: " << e.what()
72  << std::endl;
73  is_valid = false;
74  }
75  double val = measurement.measurement - sim_value;
76  sum += val * val;
77  }
78 
79  return boost::make_tuple(sqrt(sum/measurements_.size()), is_valid);
80  }
81 
82 private:
83 
84  std::vector<Measurement> measurements_;
85 
86  std::string var_name_;
87  std::string stat_filename_;
88 
89  void parseMeasurements(std::string measurement_filename);
90 
91  // define a mapping to arguments in argument vector
92  boost::tuple<std::string, std::string, std::string> argument_types;
93 };
94 
95 #endif
std::string var_name_
Definition: SumErrSq.h:86
virtual const char * what() const
void parseMeasurements(std::string measurement_filename)
Definition: SumErrSq.cpp:13
constexpr double e
The value of .
Definition: Physics.h:40
std::string stat_filename_
Definition: SumErrSq.h:87
std::vector< Measurement > measurements_
Definition: SumErrSq.h:84
double measurement
Definition: SumErrSq.h:21
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
Definition: PETE.h:1213
boost::tuple< double, bool > Result_t
Definition: Expression.h:37
double spos
Definition: SumErrSq.h:20
std::vector< argument_t > arguments_t
Definition: function.hpp:19
static const std::string name
Definition: SumErrSq.h:37
Implements a parser and value extractor for Probe loss files.
Definition: SDDSReader.h:6
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
friend std::istream & operator>>(std::istream &stream, Measurement &measurement)
Definition: SumErrSq.cpp:5
boost::tuple< std::string, std::string, std::string > argument_types
Definition: SumErrSq.h:92
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
Expressions::Result_t operator()(client::function::arguments_t args)
Definition: SumErrSq.h:39