00001
00002 #ifndef Bsc_BscSD_h
00003 #define Bsc_BscSD_h
00004
00005
00006 #include "SimG4Core/Notification/interface/Observer.h"
00007 #include "SimG4Core/SensitiveDetector/interface/SensitiveTkDetector.h"
00008
00009 #include "SimG4Core/Notification/interface/BeginOfRun.h"
00010 #include "SimG4Core/Notification/interface/BeginOfEvent.h"
00011 #include "SimG4Core/Notification/interface/EndOfEvent.h"
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "SimG4CMS/Forward/interface/BscG4Hit.h"
00022 #include "SimG4CMS/Forward/interface/BscG4HitCollection.h"
00023 #include "SimG4CMS/Forward/interface/BscNumberingScheme.h"
00024
00025
00026 #include "G4Step.hh"
00027 #include "G4StepPoint.hh"
00028 #include "G4Track.hh"
00029 #include "G4VPhysicalVolume.hh"
00030
00031
00032
00033
00034
00035
00036 #include <string>
00037
00038
00039
00040 class TrackingSlaveSD;
00041
00042 class BscSD;
00043
00044 class TrackInformation;
00045 class SimTrackManager;
00046 class TrackingSlaveSD;
00047 class UpdatablePSimHit;
00048 class G4ProcessTypeEnumerator;
00049 class G4TrackToParticleID;
00050
00051
00052
00053
00054 class BscSD : public SensitiveTkDetector,
00055 public Observer<const BeginOfRun *>,
00056 public Observer<const BeginOfEvent*>,
00057 public Observer<const EndOfEvent*> {
00058
00059 public:
00060
00061 BscSD(std::string, const DDCompactView &, SensitiveDetectorCatalog &,
00062 edm::ParameterSet const &, const SimTrackManager* );
00063
00064
00065 virtual ~BscSD();
00066
00067 virtual bool ProcessHits(G4Step *,G4TouchableHistory *);
00068 virtual uint32_t setDetUnitId(G4Step*);
00069
00070 virtual void Initialize(G4HCofThisEvent * HCE);
00071 virtual void EndOfEvent(G4HCofThisEvent * eventHC);
00072 virtual void clear();
00073 virtual void DrawAll();
00074 virtual void PrintAll();
00075
00076 virtual double getEnergyDeposit(G4Step* step);
00077
00078
00079 void fillHits(edm::PSimHitContainer&, std::string use);
00080
00081 std::vector<std::string> getNames();
00082
00083 private:
00084 void update(const BeginOfRun *);
00085 void update(const BeginOfEvent *);
00086 void update(const ::EndOfEvent *);
00087 virtual void clearHits();
00088
00089
00090
00091
00092
00093
00094 private:
00095
00096 G4ThreeVector SetToLocal(G4ThreeVector global);
00097 G4ThreeVector SetToLocalExit(G4ThreeVector globalPoint);
00098 void GetStepInfo(G4Step* aStep);
00099 G4bool HitExists();
00100 void CreateNewHit();
00101 void UpdateHit();
00102 void StoreHit(BscG4Hit*);
00103 void ResetForNewPrimary();
00104 void Summarize();
00105
00106
00107 private:
00108
00109
00110 TrackingSlaveSD* slave;
00111 BscNumberingScheme * numberingScheme;
00112
00113 G4ThreeVector entrancePoint, exitPoint;
00114 G4ThreeVector theEntryPoint ;
00115 G4ThreeVector theExitPoint ;
00116
00117 float incidentEnergy;
00118 G4int primID ;
00119
00120
00121 std::string name;
00122 G4int hcID;
00123 BscG4HitCollection* theHC;
00124 const SimTrackManager* theManager;
00125
00126 G4int tsID;
00127 BscG4Hit* currentHit;
00128 G4Track* theTrack;
00129 G4VPhysicalVolume* currentPV;
00130
00131 uint32_t unitID, previousUnitID;
00132 G4int primaryID, tSliceID;
00133 G4double tSlice;
00134
00135 G4StepPoint* preStepPoint;
00136 G4StepPoint* postStepPoint;
00137 float edeposit;
00138
00139 G4ThreeVector hitPoint;
00140
00141 G4ThreeVector hitPointExit;
00142 G4ThreeVector hitPointLocal;
00143 G4ThreeVector hitPointLocalExit;
00144 float Pabs;
00145 float Tof;
00146 float Eloss;
00147 short ParticleType;
00148
00149 float ThetaAtEntry;
00150 float PhiAtEntry;
00151
00152 int ParentId;
00153 float Vx,Vy,Vz;
00154 float X,Y,Z;
00155
00156
00157
00158
00159
00160 int eventno;
00161
00162 protected:
00163
00164 float edepositEM, edepositHAD;
00165 G4int emPDG;
00166 G4int epPDG;
00167 G4int gammaPDG;
00168 };
00169
00170 #endif // BscSD_h
00171
00172
00173
00174