00001 #ifndef SimDataFormats_TrackingVertex_h 00002 #define SimDataFormats_TrackingVertex_h 00003 00013 #include "DataFormats/Common/interface/RefVector.h" 00014 #include "DataFormats/Math/interface/LorentzVector.h" 00015 #include "DataFormats/Math/interface/Point3D.h" 00016 00017 #include "SimDataFormats/EncodedEventId/interface/EncodedEventId.h" 00018 #include "SimDataFormats/HepMCProduct/interface/HepMCProduct.h" 00019 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticle.h" 00020 #include "SimDataFormats/TrackingAnalysis/interface/TrackingParticleFwd.h" 00021 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h" 00022 00023 class TrackingVertex { 00024 00025 friend std::ostream& operator<< (std::ostream& s, const TrackingVertex & tv); 00026 00027 public: 00028 00029 typedef edm::RefVector<edm::HepMCProduct, HepMC::GenVertex > GenVertexRefVector; 00030 typedef edm::Ref<edm::HepMCProduct, HepMC::GenVertex > GenVertexRef; 00031 typedef math::XYZTLorentzVectorD LorentzVector; 00032 typedef GenVertexRefVector::iterator genv_iterator; 00033 typedef std::vector<SimVertex>::const_iterator g4v_iterator; 00034 typedef TrackingParticleRefVector::iterator tp_iterator; 00035 00036 // Default constructor and constructor from values 00037 TrackingVertex(); 00038 TrackingVertex(const LorentzVector &position, const bool inVolume, 00039 const EncodedEventId e = EncodedEventId(0)); 00040 00041 // Setters 00042 void setEventId(EncodedEventId e) {eId_=e;}; 00043 00044 // Track and vertex iterators 00045 genv_iterator genVertices_begin() const; // Ref's to HepMC and Geant4 00046 genv_iterator genVertices_end() const; // vertices associated with 00047 g4v_iterator g4Vertices_begin() const; // this vertex, respectively 00048 g4v_iterator g4Vertices_end() const; // .... 00049 00050 tp_iterator daughterTracks_begin() const; // Ref's to daughter and source 00051 tp_iterator daughterTracks_end() const; // tracks associated with 00052 tp_iterator sourceTracks_begin() const; // this vertex, respectively 00053 tp_iterator sourceTracks_end() const; // .... 00054 00055 unsigned int nG4Vertices() const { return g4Vertices_.size(); }; 00056 unsigned int nGenVertices() const { return genVertices_.size(); }; 00057 unsigned int nDaughterTracks() const { return daughterTracks_.size(); }; 00058 unsigned int nSourceTracks() const { return sourceTracks_.size(); }; 00059 00060 // Add references to TrackingParticles, Geant4, and HepMC vertices to containers 00061 void addG4Vertex( const SimVertex& ); 00062 void addGenVertex( const GenVertexRef& ); 00063 void addDaughterTrack(const TrackingParticleRef&); 00064 void addParentTrack( const TrackingParticleRef&); 00065 void clearDaughterTracks(); 00066 void clearParentTracks(); 00067 00068 // Getters for RefVectors 00069 const std::vector<SimVertex>& g4Vertices() const; 00070 const GenVertexRefVector& genVertices() const; 00071 const TrackingParticleRefVector& sourceTracks() const; 00072 const TrackingParticleRefVector& daughterTracks() const; 00073 00074 // Getters for other info 00075 const LorentzVector& position() const { return position_; }; 00076 const EncodedEventId& eventId() const { return eId_; }; 00077 const bool inVolume() const { return inVolume_; }; 00078 00079 private: 00080 00081 LorentzVector position_; // Vertex position and time 00082 bool inVolume_; // Is it inside tracker volume? 00083 EncodedEventId eId_; 00084 00085 // References to G4 and generator vertices and TrackingParticles 00086 00087 std::vector<SimVertex> g4Vertices_; 00088 GenVertexRefVector genVertices_; 00089 TrackingParticleRefVector daughterTracks_; 00090 TrackingParticleRefVector sourceTracks_; 00091 }; 00092 00093 #endif