00001
00002
00003 #ifndef __N3AnaBase__sim_event_utils_h
00004 #define __N3AnaBase__sim_event_utils_h 1
00005
00006 #include <stdexcept>
00007 #include <iostream>
00008 #include <list>
00009 #include <vector>
00010
00011 #include <datatools/serialization/serialization.h>
00012 #include <datatools/utils/properties.h>
00013 #include <datatools/utils/i_clear.h>
00014
00015 #include <geomtools/utils.h>
00016
00017
00018 namespace nemo3 {
00019
00034
00035 class sim_vertex
00036 {
00037 public:
00038
00039 static const int INVALID_ID = -1;
00040
00041 private:
00042
00043 int32_t __id;
00044 double __time;
00045 geomtools::vector_3d __position;
00046
00047 public:
00048
00050 sim_vertex (int32_t id_ = INVALID_ID,
00051 double time_ = 0.0);
00052
00054 sim_vertex (int32_t id_,
00055 const geomtools::vector_3d & v_,
00056 double time_ = 0.0);
00057
00059 void set_id (int32_t id_);
00060
00062 void set_time (double time_);
00063
00065 int32_t get_id () const;
00066
00068 double get_time () const;
00069
00071 void set_position (const geomtools::vector_3d &);
00072
00074 const geomtools::vector_3d & get_position () const;
00075
00077 const geomtools::vector_3d & get_position_ro () const
00078 {
00079 return get_position ();
00080 }
00081
00083 geomtools::vector_3d & get_position ();
00084
00086 geomtools::vector_3d & get_position_rw ()
00087 {
00088 return get_position ();
00089 }
00090
00092 const geomtools::vector_3d & get_vertex () const
00093 {
00094 return get_position ();
00095 }
00096
00098 const geomtools::vector_3d & get_vertex_ro () const
00099 {
00100 return get_position ();
00101 }
00102
00103 private:
00104
00106 friend class boost::serialization::access;
00107
00109 template<class Archive>
00110 void serialize (Archive & ar_,
00111 const unsigned int version_)
00112 {
00113 ar_ & boost::serialization::make_nvp ("id", __id);
00114 ar_ & boost::serialization::make_nvp ("time", __time);
00115 ar_ & boost::serialization::make_nvp ("position", __position);
00116 }
00117
00118 };
00119
00121 class sim_particle
00122 {
00123 public:
00124
00125 static const int INVALID_ID = -1;
00126 static const int INVALID_TYPE = -1;
00127
00128 private:
00129
00130 int32_t __id;
00131 int32_t __type;
00132 int32_t __vertex_id;
00133 double __time;
00134 geomtools::vector_3d __momentum;
00135 sim_vertex * __vertex;
00136
00137 public:
00138
00140 sim_particle (int32_t id_ = INVALID_ID,
00141 int32_t type_ = INVALID_TYPE,
00142 int32_t vertex_id_ = sim_vertex::INVALID_ID,
00143 double time_ = 0.0);
00144
00146 virtual ~sim_particle ()
00147 {
00148 clear_vertex ();
00149 }
00150
00152 int32_t get_id () const;
00153
00155 void set_id (int32_t id_);
00156
00158 int32_t get_type () const;
00159
00161 void set_type (int32_t type_);
00162
00164 int32_t get_vertex_id () const;
00165
00167 void set_vertex_id (int32_t id_);
00168
00170 void set_time (double time_);
00171
00173 double get_time () const;
00174
00176 const geomtools::vector_3d & get_momentum () const;
00177
00179 void set_momentum (const geomtools::vector_3d &);
00180
00182 bool has_vertex () const;
00183
00185 void clear_vertex ();
00186
00188 void set_vertex (const sim_vertex &);
00189
00191 const sim_vertex & get_vertex () const;
00192
00193 private:
00194
00196 friend class boost::serialization::access;
00197
00199 template<class Archive>
00200 void serialize (Archive & ar_,
00201 const unsigned int version_)
00202 {
00203 ar_ & boost::serialization::make_nvp ("id", __id);
00204 ar_ & boost::serialization::make_nvp ("type", __type);
00205 ar_ & boost::serialization::make_nvp ("vertex_id", __vertex_id);
00206 ar_ & boost::serialization::make_nvp ("time", __time);
00207 ar_ & boost::serialization::make_nvp ("momentum", __momentum);
00208 ar_ & boost::serialization::make_nvp ("vertex", __vertex);
00209 }
00210
00211 };
00212
00214 class sim_primary_event :
00215 public datatools::utils::i_clear,
00216 public datatools::serialization::i_serializable
00217 {
00218 public:
00219 typedef std::vector<sim_vertex> vertex_col;
00220 typedef std::vector<sim_particle> particle_col;
00221
00223 static const std::string SERIAL_TAG;
00224
00225 private:
00226 bool __lock;
00227 double __time;
00228 vertex_col __vertices;
00229 particle_col __particles;
00230 datatools::utils::properties __properties;
00231
00232 private:
00234 void __reset ()
00235 {
00236 __lock = false;
00237 __particles.clear ();
00238 __vertices.clear ();
00239 __properties.clear ();
00240 }
00241
00242 public:
00243
00245 virtual void clear ();
00246
00248 virtual const std::string & get_serial_tag () const;
00249
00251 void set_time (double t_);
00252
00254 double get_time () const;
00255
00257 sim_primary_event ();
00258
00260 virtual ~sim_primary_event ();
00261
00263 size_t get_number_of_vertices () const
00264 {
00265 return __vertices.size ();
00266 }
00267
00269 const vertex_col & get_vertices () const
00270 {
00271 return __vertices;
00272 }
00273
00275 vertex_col & get_vertices ()
00276 {
00277 if (is_locked ())
00278 {
00279 throw std::runtime_error ("sim_primary_event::get_vertices: Object is locked: cannot access vertex collection in write mode!");
00280 }
00281 return __vertices;
00282 }
00283
00285 const sim_vertex & get_vertex (int i_) const;
00286
00288 void add_vertex (const sim_vertex &);
00289
00291 const sim_particle & get_particle (int i_) const;
00292
00294 size_t get_number_of_particles () const
00295 {
00296 return __particles.size ();
00297 }
00298
00300 void add_particle (const sim_particle &);
00301
00303 const particle_col & get_particles () const
00304 {
00305 return __particles;
00306 }
00307
00309 particle_col & get_particles ()
00310 {
00311 if (is_locked ())
00312 {
00313 throw std::runtime_error ("sim_primary_event::get_particles: Object is locked: cannot access particles collection in write mode!");
00314 }
00315 return __particles;
00316 }
00317
00319 const datatools::utils::properties & get_properties () const;
00320
00322 const datatools::utils::properties & get_properties_ro () const
00323 {
00324 return get_properties ();
00325 }
00326
00328 datatools::utils::properties & get_properties ();
00329
00331 datatools::utils::properties & get_properties_rw ()
00332 {
00333 return get_properties ();
00334 }
00335
00337 bool is_locked () const;
00338
00340 void lock ();
00341
00343 void unlock ();
00344
00346 void sync ();
00347
00348 private:
00349
00351 friend class boost::serialization::access;
00352
00354 template<class Archive>
00355 void serialize (Archive & ar_,
00356 const unsigned int version_)
00357 {
00358 ar_ & boost::serialization::make_nvp ("lock", __lock);
00359 ar_ & boost::serialization::make_nvp ("time", __time);
00360 ar_ & boost::serialization::make_nvp ("vertices", __vertices);
00361 ar_ & boost::serialization::make_nvp ("particles", __particles);
00362 ar_ & boost::serialization::make_nvp ("properties", __properties);
00363 }
00364 };
00365
00366 }
00367
00368 #endif // __N3AnaBase__sim_event_utils_h
00369
00370