File indexing completed on 2025-04-10 08:06:16
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 "TrackingAction.hh"
0035
0036 #include "Run.hh"
0037
0038 #include "G4IonTable.hh"
0039 #include "G4ParticleDefinition.hh"
0040 #include "G4ParticleTypes.hh"
0041 #include "G4Step.hh"
0042 #include "G4StepPoint.hh"
0043 #include "G4SystemOfUnits.hh"
0044 #include "G4Track.hh"
0045
0046 const std::array<G4String, TrackingAction::fkNumberScoringVolumes>
0047 TrackingAction::fkArrayScoringVolumeNames = {"calorimeter"};
0048
0049 const std::array<G4String, TrackingAction::fkNumberKinematicRegions>
0050 TrackingAction::fkArrayKinematicRegionNames = {"", "below 20 MeV", "above 20 MeV"};
0051
0052 const std::array<G4String, TrackingAction::fkNumberParticleTypes>
0053 TrackingAction::fkArrayParticleTypeNames = {"all", "electron", "gamma", "muon",
0054 "neutrino", "pion", "neutron", "proton",
0055 "ion", "otherMeson", "otherBaryon"};
0056
0057
0058
0059 G4int TrackingAction::GetIndex(const G4int iScoringVolume, const G4int iKinematicRegion,
0060 const G4int iParticleType)
0061 {
0062 G4int index = -1;
0063 if (iScoringVolume >= 0 && iScoringVolume < fkNumberScoringVolumes && iKinematicRegion >= 0
0064 && iKinematicRegion < fkNumberKinematicRegions && iParticleType >= 0
0065 && iParticleType < fkNumberParticleTypes)
0066 {
0067 index = iScoringVolume * fkNumberKinematicRegions * fkNumberParticleTypes
0068 + iKinematicRegion * fkNumberParticleTypes + iParticleType;
0069 }
0070 return index;
0071 }
0072
0073
0074
0075 TrackingAction::TrackingAction() : G4UserTrackingAction()
0076 {
0077 Initialize();
0078 }
0079
0080
0081
0082 void TrackingAction::Initialize()
0083 {
0084
0085 fArrayMultiplicities.fill(0);
0086 fArraySumKineticEnergies.fill(0.0);
0087 }
0088
0089
0090
0091 void TrackingAction::PreUserTrackingAction(const G4Track* aTrack)
0092 {
0093
0094
0095
0096
0097
0098 if (aTrack == nullptr || aTrack->GetCurrentStepNumber() != 0 || aTrack->GetDefinition() == nullptr
0099 || aTrack->GetLogicalVolumeAtVertex() == nullptr
0100 || (aTrack->GetLogicalVolumeAtVertex()->GetName() != "logicAbsorber"
0101 && aTrack->GetLogicalVolumeAtVertex()->GetName() != "logicActive"))
0102 {
0103 return;
0104 }
0105 G4int iScoringVolume = 0;
0106
0107 G4int iKinematicRegion = aTrack->GetKineticEnergy() < 20.0 ? 1 : 2;
0108 G4int absPdg = std::abs(aTrack->GetDefinition()->GetPDGEncoding());
0109 G4int iParticleType = -1;
0110 if (absPdg == 11)
0111 iParticleType = 1;
0112 else if (absPdg == 22)
0113 iParticleType = 2;
0114 else if (absPdg == 13)
0115 iParticleType = 3;
0116 else if (absPdg == 12 || absPdg == 14 || absPdg == 16)
0117 iParticleType = 4;
0118
0119 else if (absPdg == 111 || absPdg == 211)
0120 iParticleType = 5;
0121 else if (absPdg == 2112)
0122 iParticleType = 6;
0123 else if (absPdg == 2212)
0124 iParticleType = 7;
0125 else if (G4IonTable::IsIon(aTrack->GetDefinition())
0126 || G4IonTable::IsAntiIon(aTrack->GetDefinition()))
0127 iParticleType = 8;
0128
0129 else if (absPdg < 1000)
0130 iParticleType = 9;
0131
0132 else if (absPdg > 1000)
0133 iParticleType = 10;
0134
0135
0136 G4int index = GetIndex(iScoringVolume, iKinematicRegion, iParticleType);
0137 ++fArrayMultiplicities[index];
0138 fArraySumKineticEnergies[index] += aTrack->GetKineticEnergy();
0139
0140 index = GetIndex(iScoringVolume, iKinematicRegion, 0);
0141 ++fArrayMultiplicities[index];
0142 fArraySumKineticEnergies[index] += aTrack->GetKineticEnergy();
0143
0144 index = GetIndex(iScoringVolume, 0, iParticleType);
0145 ++fArrayMultiplicities[index];
0146 fArraySumKineticEnergies[index] += aTrack->GetKineticEnergy();
0147
0148 index = GetIndex(iScoringVolume, 0, 0);
0149 ++fArrayMultiplicities[index];
0150 fArraySumKineticEnergies[index] += aTrack->GetKineticEnergy();
0151 if (fRunPtr) {
0152 fRunPtr->SetTrackingArray1(fArrayMultiplicities);
0153 fRunPtr->SetTrackingArray2(fArraySumKineticEnergies);
0154 }
0155 }
0156
0157
0158
0159 void TrackingAction::PostUserTrackingAction(const G4Track* ) {}
0160
0161