File indexing completed on 2026-04-30 07:33:03
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 #include "SteppingAction.hh"
0030
0031 #include "DetectorConstruction.hh"
0032 #include "PrimaryGeneratorAction.hh"
0033 #include "RunAction.hh"
0034
0035 #include "G4PolarizationHelper.hh"
0036 #include "G4RunManager.hh"
0037
0038
0039
0040 SteppingAction::SteppingAction(DetectorConstruction* det, PrimaryGeneratorAction* prim,
0041 RunAction* ruAct)
0042 : G4UserSteppingAction(), fDetector(det), fPrimary(prim), fRunAction(ruAct)
0043 {}
0044
0045
0046
0047 SteppingAction::~SteppingAction() {}
0048
0049
0050
0051 void SteppingAction::UserSteppingAction(const G4Step* aStep)
0052 {
0053 G4StepPoint* prePoint = aStep->GetPreStepPoint();
0054 G4StepPoint* endPoint = aStep->GetPostStepPoint();
0055
0056 G4String procName = endPoint->GetProcessDefinedStep()->GetProcessName();
0057 fRunAction->CountProcesses(procName);
0058
0059 if (prePoint->GetTouchableHandle()->GetVolume() == fDetector->GetBox()
0060 && endPoint->GetTouchableHandle()->GetVolume() == fDetector->GetWorld())
0061 {
0062 G4Track* aTrack = aStep->GetTrack();
0063 const G4ParticleDefinition* part = aTrack->GetDynamicParticle()->GetDefinition();
0064
0065 G4ThreeVector position = endPoint->GetPosition();
0066 G4ThreeVector direction = endPoint->GetMomentumDirection();
0067 G4double kinEnergy = endPoint->GetKineticEnergy();
0068
0069 G4ThreeVector beamDirection = fPrimary->GetParticleGun()->GetParticleMomentumDirection();
0070 G4double polZ = endPoint->GetPolarization().z();
0071
0072 G4double costheta = direction * beamDirection;
0073
0074 G4double xdir = direction * G4PolarizationHelper::GetParticleFrameX(beamDirection);
0075 G4double ydir = direction * G4PolarizationHelper::GetParticleFrameY(beamDirection);
0076
0077 G4double phi = std::atan2(ydir, xdir);
0078 fRunAction->FillData(part, kinEnergy, costheta, phi, polZ);
0079 }
0080 }
0081
0082