File indexing completed on 2025-04-10 08:06:18
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
0034 #include "Run.hh"
0035
0036 #include "G4Run.hh"
0037 #include "G4RunManager.hh"
0038 #include "G4SystemOfUnits.hh"
0039
0040
0041
0042 Run::Run()
0043 : G4Run(),
0044 fNumEvents(0),
0045 fPrimaryParticleId(0),
0046 fPrimaryParticleEnergy(0.0),
0047 fPrimaryParticleDirection(G4ThreeVector(0.0, 0.0, 0.0)),
0048 fTargetMaterialName(""),
0049 fCubicVolumeScoringShell(1.0)
0050 {
0051 fSteppingArray.fill(0.0);
0052 fTrackingArray1.fill(0);
0053 fTrackingArray2.fill(0.0);
0054 }
0055
0056
0057
0058 void Run::RecordEvent(const G4Event* anEvent)
0059 {
0060
0061
0062 G4int nEvt = anEvent->GetEventID();
0063 if (nEvt % 10 == 0) G4cout << " Event#=" << nEvt << G4endl;
0064 G4Run::RecordEvent(anEvent);
0065 }
0066
0067
0068
0069 void Run::Merge(const G4Run* aRun)
0070 {
0071
0072
0073 const Run* localRun = static_cast<const Run*>(aRun);
0074 fPrimaryParticleId = localRun->GetPrimaryParticleId();
0075 fPrimaryParticleEnergy = localRun->GetPrimaryParticleEnergy();
0076 fPrimaryParticleDirection = localRun->GetPrimaryParticleDirection();
0077 fTargetMaterialName = localRun->GetTargetMaterialName();
0078 fCubicVolumeScoringShell = localRun->GetCubicVolumeScoringShell();
0079 fNumEvents += localRun->GetNumberOfEvent();
0080 for (G4int i = 0; i < SteppingAction::fkNumberCombinations; ++i) {
0081 fSteppingArray[i] += localRun->GetSteppingArray()[i];
0082 }
0083 for (G4int i = 0; i < TrackingAction::fkNumberCombinations; ++i) {
0084 fTrackingArray1[i] += localRun->GetTrackingArray1()[i];
0085 fTrackingArray2[i] += localRun->GetTrackingArray2()[i];
0086 }
0087 G4Run::Merge(aRun);
0088 }
0089
0090
0091
0092 void Run::PrintInfo() const
0093 {
0094
0095
0096 const G4double floatingNumberOfEvents =
0097 std::max(1.0, fNumEvents > 0 ? fNumEvents * 1.0 : GetNumberOfEvent() * 1.0);
0098
0099
0100 const G4double conversionFactor = CLHEP::cm * CLHEP::cm;
0101 const G4double factor =
0102 conversionFactor / (0.5 * fCubicVolumeScoringShell * floatingNumberOfEvents);
0103 G4cout << std::setprecision(6) << G4endl << G4endl
0104 << " =============== Run::PrintInfo() =============== \t RunID = " << GetRunID()
0105 << G4endl << " Primary particle PDG code = " << fPrimaryParticleId << G4endl
0106 << " Primary particle kinetic energy = " << fPrimaryParticleEnergy / CLHEP::GeV << " GeV"
0107 << G4endl << " Primary particle direction = " << fPrimaryParticleDirection << G4endl
0108 << " Target material = " << fTargetMaterialName << G4endl
0109 << " Cubic-volume scoring shell = " << fCubicVolumeScoringShell << " mm^3" << G4endl
0110 << " Number of events = " << floatingNumberOfEvents << G4endl
0111 << " Conversion factor: fluence from mm^-2 to cm^-2 = " << conversionFactor << G4endl
0112 << " Particle fluence in unit of cm^-2 :" << G4endl;
0113 for (G4int i = 0; i < SteppingAction::fkNumberKinematicRegions; ++i) {
0114 for (G4int j = 0; j < SteppingAction::fkNumberScoringPositions; ++j) {
0115 for (G4int k = 0; k < SteppingAction::fkNumberParticleTypes; ++k) {
0116 G4int index = SteppingAction::GetIndex(i, j, k);
0117
0118 G4cout << " case=" << std::setw(3) << index << " " << std::setw(12)
0119 << SteppingAction::fkArrayKinematicRegionNames[i] << " " << std::setw(12)
0120 << SteppingAction::fkArrayScoringPositionNames[j] << " " << std::setw(12)
0121 << SteppingAction::fkArrayParticleTypeNames[k] << " " << std::setw(8)
0122 << factor * fSteppingArray[index] << G4endl;
0123 }
0124 }
0125 }
0126 G4cout << " ------------------------------------------------------------- " << G4endl
0127 << " Extra information: particle production \t \t <N> <E_kin> <Sum_Ekin> [MeV]"
0128 << G4endl;
0129 const G4double normalization = 1.0 / floatingNumberOfEvents;
0130 for (G4int i = 0; i < TrackingAction::fkNumberScoringVolumes; ++i) {
0131 for (G4int j = 0; j < TrackingAction::fkNumberKinematicRegions; ++j) {
0132 for (G4int k = 0; k < TrackingAction::fkNumberParticleTypes; ++k) {
0133 G4int index = TrackingAction::GetIndex(i, j, k);
0134
0135 G4cout << " case=" << std::setw(3) << index << " " << std::setw(12)
0136 << TrackingAction::fkArrayScoringVolumeNames[i] << " " << std::setw(12)
0137 << TrackingAction::fkArrayKinematicRegionNames[j] << " " << std::setw(12)
0138 << TrackingAction::fkArrayParticleTypeNames[k] << " " << std::setw(8)
0139 << normalization * fTrackingArray1[index] << " " << std::setw(8)
0140 << (fTrackingArray1[index] > 0 ? fTrackingArray2[index] / fTrackingArray1[index]
0141 : 0.0)
0142 << " " << std::setw(8) << normalization * fTrackingArray2[index] << G4endl;
0143 }
0144 }
0145 }
0146 G4cout << " ============================================================= " << G4endl << G4endl;
0147 }
0148
0149
0150
0151 void Run::SetSteppingArray(
0152 const std::array<G4double, SteppingAction::fkNumberCombinations>& inputArray)
0153 {
0154 for (G4int i = 0; i < SteppingAction::fkNumberCombinations; ++i) {
0155 fSteppingArray[i] = inputArray[i];
0156 }
0157 }
0158
0159
0160
0161 void Run::SetTrackingArray1(
0162 const std::array<G4long, TrackingAction::fkNumberCombinations>& inputArray)
0163 {
0164 for (G4int i = 0; i < TrackingAction::fkNumberCombinations; ++i) {
0165 fTrackingArray1[i] = inputArray[i];
0166 }
0167 }
0168
0169
0170
0171 void Run::SetTrackingArray2(
0172 const std::array<G4double, TrackingAction::fkNumberCombinations>& inputArray)
0173 {
0174 for (G4int i = 0; i < TrackingAction::fkNumberCombinations; ++i) {
0175 fTrackingArray2[i] = inputArray[i];
0176 }
0177 }
0178
0179