File indexing completed on 2026-04-17 07:52:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #include "SteppingAction.hh"
0034 #include "EventAction.hh"
0035 #include "DetectorConstruction.hh"
0036
0037 #include "G4AnalysisManager.hh"
0038 #include "G4Step.hh"
0039 #include "G4Event.hh"
0040 #include "G4RunManager.hh"
0041 #include "G4LogicalVolume.hh"
0042 #include "G4SystemOfUnits.hh"
0043
0044
0045
0046 SteppingAction::SteppingAction(EventAction* eventAction):
0047 fEventAction(eventAction)
0048 {}
0049
0050
0051
0052 void SteppingAction::UserSteppingAction(const G4Step* step)
0053 {
0054
0055 const DetectorConstruction* detectorConstruction
0056 = static_cast<const DetectorConstruction*>
0057 (G4RunManager::GetRunManager()->GetUserDetectorConstruction());
0058
0059
0060 fCrystalVolume = detectorConstruction->GetCrystalVolume();
0061 fConverterVolume = detectorConstruction->GetConverterVolume();
0062 if (fScoringVolume.size() == 0)
0063 fScoringVolume = detectorConstruction->GetScoringVolume();
0064 G4int NScoringVolumes = fScoringVolume.size();
0065
0066
0067
0068 G4bool scoreCrystalExit = detectorConstruction->GetScoringCrystalExit();
0069
0070
0071
0072 G4StepPoint* preStepPoint = step->GetPreStepPoint();
0073 G4StepPoint* postStepPoint = step->GetPostStepPoint();
0074
0075
0076 G4ThreeVector preStepPos = preStepPoint->GetPosition();
0077 G4ThreeVector postStepPos = postStepPoint->GetPosition();
0078 G4ThreeVector pos = preStepPos + G4UniformRand()*(postStepPos - preStepPos);
0079
0080
0081 G4LogicalVolume* volume =
0082 preStepPoint->GetTouchableHandle()->GetVolume()->GetLogicalVolume();
0083 G4String volumeName = volume->GetName();
0084
0085
0086 G4Track* track = step->GetTrack();
0087 G4String partName = track->GetDefinition()->GetParticleName();
0088 G4int trackID = track->GetTrackID();
0089
0090
0091 G4double edep = step->GetTotalEnergyDeposit();
0092
0093
0094 G4int eventID =
0095 G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID();
0096
0097
0098
0099 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
0100
0101
0102
0103
0104
0105 G4ThreeVector postStepMom;
0106 G4double postStepTime;
0107 G4LogicalVolume* volumeNext;
0108
0109
0110
0111 if (volume == fCrystalVolume) {
0112 fEventAction->AddEdepRad(edep);
0113
0114
0115 postStepMom = postStepPoint->GetMomentum();
0116 postStepTime = postStepPoint->GetGlobalTime();
0117 volumeNext =
0118 postStepPoint->GetTouchableHandle()->GetVolume()->GetLogicalVolume();
0119
0120 if (scoreCrystalExit && volumeNext && volume != volumeNext) {
0121 analysisManager->FillNtupleSColumn(4,0,partName);
0122 analysisManager->FillNtupleDColumn(4,1,postStepPos.x()/CLHEP::mm);
0123 analysisManager->FillNtupleDColumn(4,2,postStepPos.y()/CLHEP::mm);
0124 analysisManager->FillNtupleDColumn(4,3,postStepPos.z()/CLHEP::mm);
0125 analysisManager->FillNtupleDColumn(4,4,postStepMom.x()/CLHEP::MeV);
0126 analysisManager->FillNtupleDColumn(4,5,postStepMom.y()/CLHEP::MeV);
0127 analysisManager->FillNtupleDColumn(4,6,postStepMom.z()/CLHEP::MeV);
0128 analysisManager->FillNtupleDColumn(4,7,postStepTime/CLHEP::ns);
0129 analysisManager->FillNtupleIColumn(4,8,eventID);
0130 analysisManager->FillNtupleIColumn(4,9,trackID);
0131 analysisManager->AddNtupleRow(4);
0132 }
0133
0134 }
0135
0136
0137
0138 if (volume == fConverterVolume) {
0139 fEventAction->AddEdepConv(edep);
0140
0141
0142
0143 postStepMom = postStepPoint->GetMomentum();
0144 postStepTime = postStepPoint->GetGlobalTime();
0145 volumeNext =
0146 postStepPoint->GetTouchableHandle()->GetVolume()->GetLogicalVolume();
0147 if (scoreCrystalExit && volumeNext && volume != volumeNext) {
0148 analysisManager->FillNtupleSColumn(4,0,partName);
0149 analysisManager->FillNtupleDColumn(4,1,postStepPos.x()/CLHEP::mm);
0150 analysisManager->FillNtupleDColumn(4,2,postStepPos.y()/CLHEP::mm);
0151 analysisManager->FillNtupleDColumn(4,3,postStepPos.z()/CLHEP::mm);
0152 analysisManager->FillNtupleDColumn(4,4,postStepMom.x()/CLHEP::MeV);
0153 analysisManager->FillNtupleDColumn(4,5,postStepMom.y()/CLHEP::MeV);
0154 analysisManager->FillNtupleDColumn(4,6,postStepMom.z()/CLHEP::MeV);
0155 analysisManager->FillNtupleDColumn(4,7,postStepTime/CLHEP::ns);
0156 analysisManager->FillNtupleIColumn(4,8,eventID);
0157 analysisManager->FillNtupleIColumn(4,9,trackID);
0158 analysisManager->AddNtupleRow(4);
0159 }
0160
0161 }
0162
0163
0164
0165
0166 for (int i = 0; i < NScoringVolumes; i++) {
0167 if (volume == fScoringVolume[i]) {
0168 if (edep > 0) {
0169 fEventAction->AddEdepInSpheres(i, edep);
0170 }
0171 }
0172 }
0173
0174 }
0175
0176
0177