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