OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
LossDataSink.h
Go to the documentation of this file.
1 //
2 // Copyright & License: See Copyright.readme in src directory
3 //
4 
5 #ifndef OPAL_LOSSOUTPUT_H_
6 #define OPAL_LOSSOUTPUT_H_
7 
9 #include "Utility/IpplInfo.h"
10 #include "Algorithms/Vektor.h"
13 
14 #include <string>
15 #include <fstream>
16 #include <vector>
17 #include <functional>
18 #include <set>
19 
20 #include <hdf5.h>
21 #include "H5hut.h"
22 
23 struct SetStatistics {
24  SetStatistics();
25 
26  std::string element_m;
27  double spos_m;
28  double refTime_m; // ns
29  double tmean_m; // ns
30  double trms_m; // ns
31  unsigned long nTotal_m;
48 };
49 
50 namespace std {
51  template<>
52  struct less<SetStatistics> : binary_function<SetStatistics, SetStatistics, bool> {
53  bool operator() (const SetStatistics& x, const SetStatistics& y) const {
54  return x.spos_m < y.spos_m;
55  }
56  };
57 }
58 /*
59  - In the destructor we do ALL the file handling
60  - h5hut_mode_m defines h5hut or ASCII
61  */
62 class LossDataSink {
63  public:
64  LossDataSink();
65 
66  LossDataSink(std::string elem, bool hdf5Save, ElementBase::ElementType type = ElementBase::ANY);
67 
68  LossDataSink(const LossDataSink &rsh);
69  ~LossDataSink() noexcept(false);
70 
71  bool inH5Mode() { return h5hut_mode_m;}
72 
73  void save(unsigned int numSets = 1, OpalData::OPENMODE openMode = OpalData::OPENMODE::UNDEFINED);
74 
75  void addReferenceParticle(const Vector_t &x,
76  const Vector_t &p,
77  double time,
78  double spos,
79  long long globalTrackStep);
80 
81  void addParticle(const Vector_t &x, const Vector_t &p, const size_t id);
82 
83  void addParticle(const Vector_t &x, const Vector_t &p, const size_t id,
84  const double time, const size_t turn, const size_t& bunchNum = 0);
85 
86  size_t size() const;
87 
88  std::set<SetStatistics> computeStatistics(unsigned int numSets);
89 
90 private:
91  void openASCII() {
92  if(Ippl::myNode() == 0) {
93  os_m.open(fn_m.c_str(), std::ios::out);
94  }
95  }
96  void openH5(h5_int32_t mode = H5_O_WRONLY);
97 
98  void appendASCII() {
99  if(Ippl::myNode() == 0) {
100  os_m.open(fn_m.c_str(), std::ios::app);
101  }
102  }
103 
105  if(Ippl::myNode() == 0) {
106  //FIXME Issue #45 (Cyclotron units)
107  os_m << "# Element " << element_m << " x (m), y (m), z (m), px ( ), py ( ), pz ( ), id";
108  if (time_m.size() != 0) {
109  os_m << ", turn, bunchNumber, time (ns) ";
110  }
111  os_m << std::endl;
112  }
113  }
114  void writeHeaderH5();
115 
116  void saveASCII();
117  void saveH5(unsigned int setIdx);
118 
119  void closeASCII() {
120  if(Ippl::myNode() == 0)
121  os_m.close();
122  }
123 
124  bool hasNoParticlesToDump();
125 
126  bool hasTimeAttribute();
127 
128  void reportOnError(h5_int64_t rc, const char* file, int line);
129 
130  void splitSets(unsigned int numSets);
131  SetStatistics computeSetStatistics(unsigned int setIdx);
132 
133  // filename without extension
134  std::string fn_m;
135 
136  // write either in ASCII or H5hut format
138 
139  // used to write out data in ASCII mode
140  std::ofstream os_m;
141 
143  h5_file_t H5file_m;
144 
145  std::string element_m;
146 
148  h5_int64_t H5call_m;
149 
150  std::vector<long> id_m;
151  std::vector<double> x_m;
152  std::vector<double> y_m;
153  std::vector<double> z_m;
154  std::vector<double> px_m;
155  std::vector<double> py_m;
156  std::vector<double> pz_m;
157  std::vector<size_t> bunchNum_m;
158 
159  std::vector<size_t> turn_m;
160  std::vector<double> time_m;
161 
162  std::vector<Vector_t> RefPartR_m;
163  std::vector<Vector_t> RefPartP_m;
164  std::vector<h5_int64_t> globalTrackStep_m;
165  std::vector<double> refTime_m;
166  std::vector<double> spos_m;
167 
168  std::vector<unsigned long> startSet_m;
169 
171 };
172 
173 inline
174 size_t LossDataSink::size() const {
175  return x_m.size();
176 }
177 
178 inline
179 std::set<SetStatistics> LossDataSink::computeStatistics(unsigned int numStatistics) {
180  std::set<SetStatistics> stats;
181 
182  splitSets(numStatistics);
183 
184  for (unsigned int i = 0; i < numStatistics; ++ i) {
185  auto setStats = computeSetStatistics(i);
186  if (setStats.nTotal_m > 0) {
187  stats.insert(setStats);
188  }
189  }
190 
191  return stats;
192 }
193 
194 #endif
195 
196 // vi: set et ts=4 sw=4 sts=4:
197 // Local Variables:
198 // mode:c++
199 // c-basic-offset: 4
200 // indent-tabs-mode:nil
201 // End:
void writeHeaderH5()
ElementBase::ElementType type_m
Definition: LossDataSink.h:170
bool hasTimeAttribute()
void reportOnError(h5_int64_t rc, const char *file, int line)
Vector_t psqsum_m
Definition: LossDataSink.h:43
std::vector< unsigned long > startSet_m
Definition: LossDataSink.h:168
h5_file_t H5file_m
used to write out data in H5hut mode
Definition: LossDataSink.h:143
Vector_t rmin_m
Definition: LossDataSink.h:34
std::vector< double > pz_m
Definition: LossDataSink.h:156
std::vector< long > id_m
Definition: LossDataSink.h:150
static int myNode()
Definition: IpplInfo.cpp:794
std::string fn_m
Definition: LossDataSink.h:134
std::set< SetStatistics > computeStatistics(unsigned int numSets)
Definition: LossDataSink.h:179
std::vector< double > z_m
Definition: LossDataSink.h:153
void save(unsigned int numSets=1, OpalData::OPENMODE openMode=OpalData::OPENMODE::UNDEFINED)
std::vector< size_t > bunchNum_m
Definition: LossDataSink.h:157
std::vector< double > px_m
Definition: LossDataSink.h:154
std::string element_m
Definition: LossDataSink.h:145
std::vector< Vector_t > RefPartP_m
Definition: LossDataSink.h:163
Vector_t rpsum_m
Definition: LossDataSink.h:44
Vector_t rprms_m
Definition: LossDataSink.h:40
Vector_t fac_m
Definition: LossDataSink.h:47
Vector_t rrms_m
Definition: LossDataSink.h:38
void closeASCII()
Definition: LossDataSink.h:119
void saveH5(unsigned int setIdx)
double refTime_m
Definition: LossDataSink.h:28
OPENMODE
Enum for writing to files.
Definition: OpalData.h:69
~LossDataSink() noexcept(false)
h5_int64_t H5call_m
Current record, or time step, of H5 file.
Definition: LossDataSink.h:148
std::string element_m
Definition: LossDataSink.h:26
Vector_t prms_m
Definition: LossDataSink.h:39
Vector_t rmean_m
Definition: LossDataSink.h:36
Vector_t rsqsum_m
Definition: LossDataSink.h:42
Vector_t eps2_m
Definition: LossDataSink.h:45
std::vector< double > py_m
Definition: LossDataSink.h:155
Vector_t pmean_m
Definition: LossDataSink.h:37
std::vector< double > spos_m
Definition: LossDataSink.h:166
void writeHeaderASCII()
Definition: LossDataSink.h:104
void addReferenceParticle(const Vector_t &x, const Vector_t &p, double time, double spos, long long globalTrackStep)
void appendASCII()
Definition: LossDataSink.h:98
std::vector< Vector_t > RefPartR_m
Definition: LossDataSink.h:162
Vector_t normEmit_m
Definition: LossDataSink.h:41
void splitSets(unsigned int numSets)
std::vector< size_t > turn_m
Definition: LossDataSink.h:159
double tmean_m
Definition: LossDataSink.h:29
Vector_t eps_norm_m
Definition: LossDataSink.h:46
std::vector< double > x_m
Definition: LossDataSink.h:151
std::ofstream os_m
Definition: LossDataSink.h:140
Vector_t rmax_m
Definition: LossDataSink.h:35
bool inH5Mode()
Definition: LossDataSink.h:71
void openH5(h5_int32_t mode=H5_O_WRONLY)
Vector_t RefPartP_m
Definition: LossDataSink.h:33
Vector_t RefPartR_m
Definition: LossDataSink.h:32
std::vector< double > time_m
Definition: LossDataSink.h:160
unsigned long nTotal_m
Definition: LossDataSink.h:31
std::vector< double > y_m
Definition: LossDataSink.h:152
bool hasNoParticlesToDump()
SetStatistics computeSetStatistics(unsigned int setIdx)
std::vector< double > refTime_m
Definition: LossDataSink.h:165
size_t size() const
Definition: LossDataSink.h:174
void openASCII()
Definition: LossDataSink.h:91
void addParticle(const Vector_t &x, const Vector_t &p, const size_t id)
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
std::vector< h5_int64_t > globalTrackStep_m
Definition: LossDataSink.h:164