/search.css" rel="stylesheet" type="text/css"/> /search.js">
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

GenVertex.h
Go to the documentation of this file.
00001 //--------------------------------------------------------------------------
00002 #ifndef HEPMC_GEN_VERTEX_H
00003 #define HEPMC_GEN_VERTEX_H
00004 
00006 // Matt.Dobbs@Cern.CH, September 1999, refer to:
00007 // M. Dobbs and J.B. Hansen, "The HepMC C++ Monte Carlo Event Record for
00008 // High Energy Physics", Computer Physics Communications (to be published).
00009 //
00010 // GenVertex within an event
00011 // A vertex is indirectly (via particle "edges") linked to other 
00012 //   vertices ("nodes") to form a composite "graph"
00014 
00015 // --> HANDLE COMPILER INCONSISTENCIES
00016 // This pre-compiler directive is included (2002-01-16) to allow compatibility
00017 // with several compilers.
00018 // Mar 27, 2004: HepMC is now standard compliant only. 
00019 //   I've removed forward_iterator, and it will no longer compile on gcc < 3. 
00020 #ifdef __SUNPRO_CC    // Solaris CC 5.2
00021 #define NEED_SOLARIS_FRIEND_FEATURE
00022 #endif // Platform
00023 
00024 #include "HepMC/WeightContainer.h"
00025 #include "HepMC/SimpleVector.h"
00026 #include <iostream>
00027 #include <iterator>
00028 #include <vector>
00029 #include <set>
00030 #include <algorithm>
00031 
00032 namespace HepMC {
00033 
00035     enum IteratorRange { parents, children, family, 
00036                          ancestors, descendants, relatives };
00037     class GenParticle;
00038     class GenEvent;
00039 
00041 
00047     class GenVertex {
00048 
00050         friend std::ostream& operator<<( std::ostream&, const GenVertex& );
00051         friend class GenEvent;
00052 
00053 #ifdef NEED_SOLARIS_FRIEND_FEATURE
00054         // This bit of ugly code is only for CC-5.2 compiler. 
00055         // M.Dobbs 2002/02/19 
00056         // It is not needed by linux gcc, nor Windows Visual C++.
00057     public: 
00058         class vertex_iterator;
00059         friend class vertex_iterator;
00060         class particle_iterator;
00061         friend class particle_iterator;
00062 #endif // NEED_SOLARIS_FRIEND_FEATURE
00063 
00064     public:
00066         GenVertex( const FourVector& position =FourVector(0,0,0,0),
00067                    int id = 0, 
00068                    const WeightContainer& weights = std::vector<double>() );
00069         GenVertex( const GenVertex& invertex );            
00070         virtual    ~GenVertex();
00071 
00072         void swap( GenVertex & other); 
00073         GenVertex& operator= ( const GenVertex& invertex ); 
00074         bool       operator==( const GenVertex& a ) const; 
00075         bool       operator!=( const GenVertex& a ) const; 
00076         void       print( std::ostream& ostr = std::cout ) const; 
00077 
00078         double     check_momentum_conservation() const;
00079 
00081         void       add_particle_in( GenParticle* inparticle );
00083         void       add_particle_out( GenParticle* outparticle );
00088         GenParticle* remove_particle( GenParticle* particle ); 
00089 
00090         operator    HepMC::FourVector() const; 
00091         operator   HepMC::ThreeVector() const; 
00092 
00094         // access methods //
00096 
00098         GenEvent*               parent_event() const;
00100         ThreeVector             point3d() const;
00102         FourVector              position() const;
00104         void                    set_position( const FourVector& position = FourVector(0,0,0,0) );
00107         int                     id() const;  
00108         void                    set_id( int id );  
00109 
00114         int                     barcode() const; 
00115 
00117         bool                    suggest_barcode( int the_bar_code );
00118         
00120         WeightContainer&        weights();
00122         const WeightContainer&  weights() const;
00123 
00125         // Iterators      // users should use prefer to use particle_iterator
00127 
00129         typedef std::vector<HepMC::GenParticle*>::const_iterator 
00130         particles_in_const_iterator;
00132         typedef std::vector<HepMC::GenParticle*>::const_iterator 
00133         particles_out_const_iterator;
00135         particles_in_const_iterator         particles_in_const_begin() const;
00137         particles_in_const_iterator         particles_in_const_end() const;
00139         particles_out_const_iterator        particles_out_const_begin() const;
00141         particles_out_const_iterator        particles_out_const_end() const;
00143         int                                 particles_in_size() const;
00145         int                                 particles_out_size() const;
00146 
00147     protected:
00148         //static unsigned int     counter(); //!< temporary for debugging
00149 
00153         void                    set_parent_event_( GenEvent* evt ); 
00154         void                    set_barcode_( int the_bar_code ); 
00155         void                    change_parent_event_( GenEvent* evt ); 
00156 
00158         // edge_iterator           // (protected - for internal use only)
00160         // If the user wants the functionality of the edge_iterator, he should
00161         // use particle_iterator with IteratorRange = family, parents, children
00162         //
00163 
00165 
00172         class edge_iterator :
00173           public std::iterator<std::forward_iterator_tag,HepMC::GenParticle*,ptrdiff_t>{
00174         public:
00175             edge_iterator();
00177             edge_iterator( const GenVertex& vtx, IteratorRange range =family );
00179             edge_iterator( const edge_iterator& p );
00180             virtual        ~edge_iterator();
00182             edge_iterator& operator=( const edge_iterator& p );
00184             GenParticle*      operator*(void) const;
00186             edge_iterator& operator++(void); // Pre-fix increment 
00188             edge_iterator  operator++(int);   // Post-fix increment
00190             bool           operator==( const edge_iterator& a ) const;
00192             bool           operator!=( const edge_iterator& a ) const;
00194             bool           is_parent() const;
00196             bool           is_child() const;
00198             const GenVertex*  vertex_root() const;
00199         private:
00200             const GenVertex*  m_vertex;
00201             IteratorRange  m_range;
00202             std::vector<HepMC::GenParticle*>::const_iterator m_set_iter;
00203             bool           m_is_inparticle_iter;
00204             bool           m_is_past_end;
00205         };
00206         friend class edge_iterator;
00208         int              edges_size( IteratorRange range = family ) const;
00210         edge_iterator    edges_begin( IteratorRange range = family) const;
00212         edge_iterator    edges_end( IteratorRange /* dummy_range */ ) const;
00213 
00214     public:
00216         // vertex_iterator           //
00218 
00220 
00236         class vertex_iterator :
00237           public std::iterator<std::forward_iterator_tag,HepMC::GenVertex*,ptrdiff_t>{
00238         public:
00239             vertex_iterator();
00241             vertex_iterator( GenVertex& vtx_root, IteratorRange range );
00243             vertex_iterator( GenVertex& vtx_root, IteratorRange range,
00244                              std::set<const HepMC::GenVertex*>& visited_vertices );
00246             vertex_iterator( const vertex_iterator& v_iter );
00247             virtual             ~vertex_iterator();
00249             vertex_iterator&    operator=( const vertex_iterator& );
00251             GenVertex*          operator*(void) const;
00253             vertex_iterator&    operator++(void);  //Pre-fix increment 
00255             vertex_iterator     operator++(int);   //Post-fix increment
00257             bool                operator==( const vertex_iterator& ) const;
00259             bool                operator!=( const vertex_iterator& ) const;
00261             GenVertex*          vertex_root() const;
00263             IteratorRange       range() const;
00265             void                copy_with_own_set( const vertex_iterator& 
00266                                                    v_iter,
00267                                                    std::set<const HepMC::GenVertex*>& 
00268                                                    visited_vertices );
00269 
00270         protected:                  // intended for internal use only
00272             GenVertex* follow_edge_(); 
00274             void    copy_recursive_iterator_( const vertex_iterator* 
00275                                               recursive_v_iter );
00276         private:
00277             GenVertex*       m_vertex;   // the vertex associated to this iter
00278             IteratorRange    m_range;
00279             std::set<const HepMC::GenVertex*>* m_visited_vertices;
00280             bool             m_it_owns_set;  // true if it is responsible for 
00281                                              // deleting the visited vertex set
00282             edge_iterator    m_edge; // particle edge pointing to return vtx
00283             vertex_iterator* m_recursive_iterator;
00284         };      
00285         friend class vertex_iterator;
00287         vertex_iterator     vertices_begin( IteratorRange range = relatives );
00289         vertex_iterator     vertices_end( IteratorRange /* dummy_range */ );
00290  
00291     public:
00293         // particle_iterator         //
00295 
00297 
00306         class particle_iterator :
00307           public std::iterator<std::forward_iterator_tag,GenParticle*,ptrdiff_t>{
00308         public:
00309             particle_iterator();
00311             particle_iterator( GenVertex& vertex_root, IteratorRange range );
00313             particle_iterator( const particle_iterator& );
00314             virtual             ~particle_iterator();
00316             particle_iterator&  operator=( const particle_iterator& );
00318             GenParticle*        operator*(void) const;
00320             particle_iterator&  operator++(void); 
00322             particle_iterator   operator++(int); 
00324             bool                operator==( const particle_iterator& ) const;
00326             bool                operator!=( const particle_iterator& ) const;
00327         protected:
00328             GenParticle*        advance_to_first_(); 
00329         private:
00330             vertex_iterator     m_vertex_iterator;
00331             edge_iterator       m_edge;     // points to the return
00332         };
00333         friend class particle_iterator;
00335         particle_iterator       particles_begin( IteratorRange range 
00336                                                  = relatives );
00338         particle_iterator       particles_end( IteratorRange 
00339                                                /* dummy_range */ );
00340 
00342     protected: 
00344         void delete_adopted_particles();
00346         void remove_particle_in( GenParticle* );
00348         void remove_particle_out( GenParticle* );
00349         
00350     private: // GenVertex data members
00351         FourVector              m_position;      //4-vec of vertex [mm]
00352         std::vector<HepMC::GenParticle*>  m_particles_in;  //all incoming particles
00353         std::vector<HepMC::GenParticle*>  m_particles_out; //all outgoing particles
00354         int                  m_id;
00355         WeightContainer      m_weights;       // weights for this vtx
00356         GenEvent*            m_event;
00357         int                  m_barcode;   // unique identifier in the event
00358 
00359         //static unsigned int  s_counter;
00360     };  
00361 
00363     // INLINES access methods //
00365 
00366     inline GenVertex::operator HepMC::FourVector() const { return position(); }
00367 
00368     inline GenVertex::operator HepMC::ThreeVector() const { return point3d(); }
00369 
00370     inline FourVector GenVertex::position() const { return m_position; }
00371 
00372     inline GenEvent* GenVertex::parent_event() const { return m_event; }
00373 
00374     inline ThreeVector GenVertex::point3d() const { 
00375         return ThreeVector(m_position.x(),m_position.y(),m_position.z()); 
00376     }
00377 
00378     inline int GenVertex::id() const { return m_id; }
00379 
00380     inline int  GenVertex::barcode() const { return m_barcode; }
00381     inline void GenVertex::set_barcode_( int bc ) { m_barcode = bc; }
00382 
00383     inline WeightContainer& GenVertex::weights() { return m_weights; }
00384 
00385     inline const WeightContainer& GenVertex::weights() const 
00386     { return m_weights; }
00387 
00388     inline void GenVertex::set_position( const FourVector& position ) {
00389         m_position = position;
00390     }
00391 
00392     inline void GenVertex::set_id( int id ) { m_id = id; }
00393 
00395     // INLINES  //
00397 
00398     inline GenVertex::particles_in_const_iterator 
00399     GenVertex::particles_in_const_begin() const { 
00400         return m_particles_in.begin(); 
00401     }
00402 
00403     inline GenVertex::particles_in_const_iterator 
00404     GenVertex::particles_in_const_end() const { 
00405         return m_particles_in.end(); 
00406     }
00407 
00408     inline GenVertex::particles_out_const_iterator 
00409     GenVertex::particles_out_const_begin() const { 
00410         return m_particles_out.begin();
00411     }
00412 
00413     inline GenVertex::particles_out_const_iterator 
00414     GenVertex::particles_out_const_end() const {        
00415         return m_particles_out.end(); 
00416     }
00417 
00418     inline int GenVertex::particles_in_size() const {
00419         return m_particles_in.size(); 
00420     }
00421 
00422     inline int GenVertex::particles_out_size() const {
00423         return m_particles_out.size(); 
00424     }   
00425 
00426     inline bool GenVertex::edge_iterator::operator==( 
00427         const edge_iterator& a ) const { 
00428         return **this == *a; 
00429     }
00430 
00431     inline bool GenVertex::edge_iterator::operator!=(
00432         const edge_iterator& a ) const { 
00433         return !(**this == *a); 
00434     }
00435 
00436     inline const GenVertex* GenVertex::edge_iterator::vertex_root() const {
00437         return m_vertex;
00438     }
00439 
00440     inline GenVertex::edge_iterator GenVertex::edges_begin( IteratorRange 
00441                                                       range ) const {
00442         return GenVertex::edge_iterator(*this, range);
00443     }
00444 
00445     inline GenVertex::edge_iterator GenVertex::edges_end( IteratorRange 
00446                                                     /* dummy_range */ ) const {
00447         return GenVertex::edge_iterator();
00448     }
00449 
00450     inline bool GenVertex::vertex_iterator::operator==( 
00451         const vertex_iterator& a ) const {
00452         return **this == *a; 
00453     }
00454 
00455     inline bool GenVertex::vertex_iterator::operator!=( 
00456         const vertex_iterator& a ) const {
00457         return !(**this == *a); 
00458     }
00459 
00460     inline GenVertex* GenVertex::vertex_iterator::vertex_root() const {
00461         return m_vertex; 
00462     }
00463 
00464     inline IteratorRange GenVertex::vertex_iterator::range() const {
00465         return m_range; 
00466     }
00467 
00468     inline GenVertex::vertex_iterator GenVertex::vertices_begin( 
00469         IteratorRange range ){
00470         // this is not const because the it could return itself
00471         return vertex_iterator( *this, range );
00472     }
00473 
00474     inline GenVertex::vertex_iterator GenVertex::vertices_end( 
00475         IteratorRange /* dummy_range */ ) {
00476         return vertex_iterator();
00477     }
00478 
00479     inline bool GenVertex::particle_iterator::operator==( 
00480         const particle_iterator& a ) const {
00481         return **this == *a; 
00482     }
00483 
00484     inline bool GenVertex::particle_iterator::operator!=( 
00485         const particle_iterator& a ) const {
00486         return !(**this == *a); 
00487     }
00488 
00489     inline GenVertex::particle_iterator GenVertex::particles_begin( 
00490         IteratorRange range ) {
00491         return particle_iterator( *this, range );
00492     }
00493 
00494     inline GenVertex::particle_iterator GenVertex::particles_end(
00495         IteratorRange /* dummy_range */ ){
00496         return particle_iterator();
00497     }
00498 
00499 } // HepMC
00500 
00501 #endif  // HEPMC_GEN_VERTEX_H
00502 //--------------------------------------------------------------------------
00503 
00504 
00505 
00506 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Fri May 16 2014 09:49:37 for HepMC by doxygen 1.7.4