Go to the documentation of this file.00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef TRAJECTORYDIAGNOSTICS_HPP
00044 #define TRAJECTORYDIAGNOSTICS_HPP 1
00045
00046
00047 #include <vector>
00048 #include "histogram.hpp"
00049 #include "types.hpp"
00050
00051
00060 class TrajectoryDiagnosticColumn
00061 {
00062
00063 trajectory_diagnostic_e _diag;
00064 std::vector<double> _data;
00066 public:
00067
00070 TrajectoryDiagnosticColumn( trajectory_diagnostic_e diag )
00071 : _diag(diag) {}
00072
00080 void mirror( coordinate_axis_e axis, double level );
00081
00084 void add_data( double x ) {
00085 _data.push_back( x );
00086 }
00087
00090 std::vector<double> &data( void ) { return( _data ); }
00091
00094 const std::vector<double> &data( void ) const { return( _data ); }
00095
00098 size_t size( void ) const { return( _data.size() ); }
00099
00102 trajectory_diagnostic_e diagnostic( void ) const { return( _diag ); }
00103
00106 const double &operator()( size_t i ) const { return( _data[i] ); }
00107
00110 double &operator()( size_t i ) { return( _data[i] ); }
00111
00114 const double &operator[]( size_t i ) const { return( _data[i] ); }
00115
00118 double &operator[]( size_t i ) { return( _data[i] ); }
00119 };
00120
00121
00126 class TrajectoryDiagnosticData
00127 {
00128
00129 std::vector<TrajectoryDiagnosticColumn> _column;
00131 public:
00132
00135 TrajectoryDiagnosticData() {}
00136
00139 TrajectoryDiagnosticData( std::vector<trajectory_diagnostic_e> diag ) {
00140 for( size_t a = 0; a < diag.size(); a++ )
00141 _column.push_back( TrajectoryDiagnosticColumn( diag[a] ) );
00142 }
00143
00146 void mirror( coordinate_axis_e axis, double level ) {
00147 for( size_t a = 0; a < _column.size(); a++ )
00148 _column[a].mirror( axis, level );
00149 }
00150
00153 void clear() {
00154 _column.clear();
00155 }
00156
00159 void add_data_column( trajectory_diagnostic_e diag ) {
00160 _column.push_back( TrajectoryDiagnosticColumn( diag ) );
00161 }
00162
00165 size_t diag_size() const {
00166 return( _column.size() );
00167 }
00168
00171 size_t traj_size() const {
00172 if( _column.size() > 0 )
00173 return( _column[0].size() );
00174 return( 0 );
00175 }
00176
00179 trajectory_diagnostic_e diagnostic( size_t i ) const {
00180 return( _column[i].diagnostic() );
00181 }
00182
00185 const TrajectoryDiagnosticColumn &operator()( size_t i ) const {
00186 return( _column[i] );
00187 }
00188
00191 TrajectoryDiagnosticColumn &operator()( size_t i ) {
00192 return( _column[i] );
00193 }
00194
00198 const double &operator()( size_t j, size_t i ) const {
00199 return( _column[i](j) );
00200 }
00201
00205 double &operator()( size_t j, size_t i ) {
00206 return( _column[i](j) );
00207 }
00208
00211 void add_data( size_t i, double x ) {
00212 _column[i].add_data( x );
00213 }
00214 };
00215
00216
00236 class Emittance
00237 {
00238 protected:
00239
00240 double _Isum;
00241
00242 double _xave;
00243 double _xpave;
00244
00245 double _x2;
00246 double _xp2;
00247 double _xxp;
00248
00249 double _alpha;
00250 double _beta;
00251 double _gamma;
00252 double _epsilon;
00253
00254 double _angle;
00255 double _rmajor;
00256 double _rminor;
00257
00258 public:
00259
00262 Emittance();
00263
00267 Emittance( const std::vector<double> &x,
00268 const std::vector<double> &xp,
00269 const std::vector<double> &I );
00270
00274 Emittance( const std::vector<double> &x,
00275 const std::vector<double> &xp );
00276
00286 Emittance( size_t xsize, size_t xpsize, const double range[4],
00287 const std::vector<double> &I );
00288
00291 double xave( void ) const { return( _xave ); }
00292
00295 double xpave( void ) const { return( _xpave ); }
00296
00299 double alpha( void ) const { return( _alpha ); }
00300
00303 double beta( void ) const { return( _beta ); }
00304
00307 double gamma( void ) const { return( _gamma ); }
00308
00311 double epsilon( void ) const { return( _epsilon ); }
00312
00315 double angle( void ) const { return( _angle ); }
00316
00319 double rmajor( void ) const { return( _rmajor ); }
00320
00323 double rminor( void ) const { return( _rminor ); }
00324
00327 void debug_print( std::ostream &os ) const;
00328 };
00329
00330
00331
00336 class EmittanceConv : public Emittance
00337 {
00338
00339 Histogram2D *_grid;
00340
00341 public:
00342
00358 EmittanceConv( int n, int m,
00359 const std::vector<double> &r,
00360 const std::vector<double> &rp,
00361 const std::vector<double> &ap,
00362 const std::vector<double> &I );
00363
00366 ~EmittanceConv();
00367
00370 const Histogram2D &histogram( void ) const { return( *_grid ); }
00371
00374 void free_histogram( void ) { delete _grid; _grid = NULL; }
00375 };
00376
00377
00378 #endif
00379