00001 #ifndef __GLG4VertexGen_h__
00002 #define __GLG4VertexGen_h__ 1
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "globals.hh"
00014 #include <stdio.h>
00015 #include <set>
00016
00017 class G4Event;
00018 class G4Track;
00019 class G4PrimaryVertex;
00020 class G4ParticleDefinition ;
00021 class GLG4PrimaryGeneratorAction;
00022
00023
00024 class GLG4VVertexGen {
00025 public:
00026 GLG4VVertexGen(const char *arg_dbname) : _dbname(arg_dbname) { }
00027 virtual ~GLG4VVertexGen() { }
00028 virtual void GeneratePrimaryVertex( G4Event *argEvent )=0;
00029
00030 virtual void SetState( G4String newValues ) = 0;
00031
00032 virtual G4String GetState() = 0;
00033
00034
00035 protected:
00036 G4String _dbname;
00037 };
00038
00039
00040
00041
00042
00043
00044 class GLG4VertexGen_Gun : public GLG4VVertexGen {
00045 public:
00046 GLG4VertexGen_Gun(const char *arg_dbname);
00047 virtual ~GLG4VertexGen_Gun();
00048 virtual void GeneratePrimaryVertex( G4Event *argEvent );
00049
00050
00051 virtual void SetState( G4String newValues );
00052
00053
00054
00055
00056
00057 virtual G4String GetState();
00058
00059
00060 public:
00061
00062
00063
00064 enum { numberOfElements = 110};
00065 static const char * theElementNames[numberOfElements];
00066
00067 private:
00068 G4ParticleDefinition *_pDef;
00069 G4ThreeVector _mom;
00070 G4double _ke;
00071 G4ThreeVector _pol;
00072 G4int _multiplicity;
00073 };
00074
00075
00076
00077
00078
00079 class GLG4VertexGen_HEPEvt : public GLG4VVertexGen {
00080 public:
00081 GLG4VertexGen_HEPEvt(const char *arg_dbname);
00082 virtual ~GLG4VertexGen_HEPEvt();
00083 virtual void GeneratePrimaryVertex( G4Event *argEvent );
00084
00085
00086 virtual void SetState( G4String newValues );
00087
00088
00089
00090
00091
00092
00093 virtual G4String GetState();
00094
00095
00096 void Open(const char *argFilename);
00097 void GetDataLine(char *buffer, size_t size);
00098 void Close();
00099
00100 enum { kIonCodeOffset = 9800000,
00101 kPDGcodeModulus=10000000,
00102 kISTHEP_ParticleForTracking=1,
00103 kISTHEP_InformatonMin=100,
00104 kISTHEP_Max=213
00105 };
00106
00107 private:
00108 G4String _filename;
00109 FILE * _file;
00110 bool _isPipe;
00111 };
00112
00113
00114 class GLG4VertexGen_Stack : public GLG4VVertexGen {
00115 public:
00116 GLG4VertexGen_Stack(const char *arg_dbname,GLG4PrimaryGeneratorAction* argGLG4PGA);
00117 virtual ~GLG4VertexGen_Stack();
00118 virtual void GeneratePrimaryVertex( G4Event *argEvent );
00119
00120 virtual void SetState( G4String newValues );
00121
00122 virtual G4String GetState();
00123
00124
00125 void StackIt(const G4Track* track);
00126
00127 struct LessThan_for_VertexTime {
00128 bool operator()(G4PrimaryVertex* a, G4PrimaryVertex* b)
00129 { return ( a->GetT0() < b->GetT0() ); }
00130 };
00131
00132 private:
00133 GLG4PrimaryGeneratorAction* fGLG4PGA;
00134 std::multiset<G4PrimaryVertex*,LessThan_for_VertexTime> _stack;
00135 typedef std::multiset<G4PrimaryVertex*,LessThan_for_VertexTime>::iterator _stack_iterator_t;
00136 };
00137
00138
00139 #endif