All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
include/N3AnaBase/event/sim_event_utils.h
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 } // end of namespace nemo3
00367 
00368 #endif // __N3AnaBase__sim_event_utils_h
00369 
00370 // end of sim_event_utils.h