00001
00002
00003
00004
00005
00006 #ifndef __GLG4PrimaryGeneratorAction_hh__
00007 #define __GLG4PrimaryGeneratorAction_hh__ 1
00008
00009
00010
00011
00012 #include "G4VUserPrimaryGeneratorAction.hh"
00013
00014 class GLG4PrimaryGeneratorMessenger;
00015 class GLG4DetectorConstruction;
00016 class G4Event;
00017 class G4Track;
00018 class G4String;
00019 class GLG4VPosGen;
00020 class GLG4VVertexGen;
00021
00022 class GLG4PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
00023 {
00024 public:
00025 GLG4PrimaryGeneratorAction(GLG4DetectorConstruction *argDC);
00026 ~GLG4PrimaryGeneratorAction();
00027
00028 void GeneratePrimaries(G4Event * argEvent);
00029
00030 void DeferTrackToLaterEvent(const G4Track * track);
00031
00032 void NotifyTimeToNextStackedEvent( double t );
00033
00034 double GetUniversalTime() { return myUniversalTime; }
00035
00036 double GetUniversalTimeSincePriorEvent()
00037 { return myUniversalTimeSincePriorEvent; }
00038
00039 int GetTypeOfCurrentEvent()
00040 { return myTypeOfCurrentEvent; }
00041
00042 double GetEventRate(int i) { return myEventRate[i]; }
00043 void SetEventRate(int i, double r);
00044
00045 int GetEventTriggerCondition(int iev) { return myEventTriggerCondition[iev];}
00046 void SetEventTriggerCondition(int iev, int itc);
00047
00048 double GetEventWindow() { return myEventWindow; }
00049 void SetEventWindow(double argEventWindow);
00050
00051 double GetChainClip() { return myChainClip; }
00052 void SetChainClip(double argChainClip);
00053
00054 static G4String GetEventTypeName(int argEventType);
00055
00056 static const char * GetPositionCodeName(int argPosCode)
00057 { return thePositionCodeNames[argPosCode]; }
00058 static const char * GetVertexCodeName(int argVertexCode)
00059 { return theVertexCodeNames[argVertexCode]; }
00060 static int GetPositionCodeForEventType(int argEventType)
00061 { return theEventGeneratorCodes[argEventType].poscode; }
00062 static int GetVertexCodeForEventType(int argEventType)
00063 { return theEventGeneratorCodes[argEventType].vertexcode; }
00064
00065 static GLG4VVertexGen * GetVertexGenerator(int i)
00066 { return theVertexGenerators[i]; }
00067 static GLG4VPosGen * GetPositionGenerator(int i)
00068 { return thePositionGenerators[i]; }
00069
00070 static GLG4PrimaryGeneratorAction* GetTheGLG4PrimaryGeneratorAction()
00071 { return theGLG4PrimaryGeneratorAction; }
00072
00073 enum { kGunEvtIndex=3, kGunPosIndex=9, kGunVtxIndex=17,
00074 kDelayEvtIndex=51, kDelayPosIndex=12, kDelayVtxIndex=19 };
00075 enum { theNumEventTypes = 52,
00076 theNumPosGenCodes = 13,
00077 theNumVertexGenCodes= 20 };
00078 enum { kGeneratorTriggerNormal=0, kGeneratorTriggerPileupOnly=1,
00079 kGeneratorTriggerDelay=2 };
00080
00081 private:
00082 GLG4DetectorConstruction *myDetector;
00083 GLG4PrimaryGeneratorMessenger *myMessenger;
00084
00085 double myUniversalTime;
00086 double myUniversalTimeSincePriorEvent;
00087 int myTypeOfCurrentEvent;
00088 double myEventWindow;
00089 double myChainClip;
00090 double myEventRate[theNumEventTypes];
00091 int myEventTriggerCondition[theNumEventTypes];
00092 double myTimeToNextEvent[theNumEventTypes];
00093
00094 static GLG4VVertexGen * theVertexGenerators[theNumVertexGenCodes];
00095 static GLG4VPosGen * thePositionGenerators[theNumPosGenCodes];
00096 static const char * theVertexCodeNames[theNumVertexGenCodes];
00097 static const char * thePositionCodeNames[theNumPosGenCodes];
00098 typedef struct codepair_s { int poscode, vertexcode; } codepair_t;
00099 static codepair_t theEventGeneratorCodes[theNumEventTypes];
00100 static GLG4PrimaryGeneratorAction* theGLG4PrimaryGeneratorAction;
00101 };
00102
00103 #endif