File indexing completed on 2026-09-09 08:28:20
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 "HistoManager.hh"
0032 #include "PrimaryGeneratorAction.hh"
0033 #include "PrimaryGeneratorAction2.hh"
0034 #include "PrimaryGeneratorAction3.hh"
0035 #include "PrimaryGeneratorAction4.hh"
0036 #include "RunAction.hh"
0037
0038 #include "G4PhysicalConstants.hh"
0039 #include "G4Track.hh"
0040
0041
0042
0043 TrackingAction::TrackingAction(PrimaryGeneratorAction* prim) : fPrimary(prim)
0044 {
0045
0046 fNewUz = fPrimary->GetAction3()->GetNewUz();
0047 }
0048
0049
0050
0051 void TrackingAction::PreUserTrackingAction(const G4Track* track)
0052 {
0053 G4int selectedGeneratorAction = fPrimary->GetSelectedAction();
0054 G4AnalysisManager* analysis = G4AnalysisManager::Instance();
0055 G4int id = 0;
0056
0057 if (selectedGeneratorAction == 2) {
0058
0059
0060 id = 1;
0061 analysis->FillH1(id, track->GetKineticEnergy());
0062 }
0063
0064 else if (selectedGeneratorAction == 0) {
0065
0066
0067 id = 5;
0068 G4ThreeVector um = track->GetMomentumDirection();
0069 G4double cosalpha = um.z();
0070 analysis->FillH1(id, cosalpha);
0071
0072
0073
0074 id = 6;
0075 G4double psi = std::atan2(um.y(), um.x());
0076 if (psi < 0.) psi += twopi;
0077 analysis->FillH1(id, psi);
0078 }
0079 else if (selectedGeneratorAction == 3) {
0080
0081
0082 id = 5;
0083 G4ThreeVector um = track->GetMomentumDirection();
0084 G4double cosalpha = fNewUz * um;
0085 analysis->FillH1(id, cosalpha);
0086
0087
0088
0089 id = 6;
0090
0091 G4ThreeVector u1(1., 0., 0.);
0092 u1.rotateUz(fNewUz);
0093 G4ThreeVector u2(0., 1., 0.);
0094 u2.rotateUz(fNewUz);
0095
0096 G4double psi = std::atan2(u2 * um, u1 * um);
0097 if (psi < 0.) psi += twopi;
0098 analysis->FillH1(id, psi);
0099 }
0100
0101 else if (selectedGeneratorAction == 4) {
0102 G4ThreeVector vertex = track->GetVertexPosition();
0103 G4double r = vertex.mag();
0104 if (r <= 0.0) return;
0105
0106 G4ThreeVector ur = vertex / r;
0107
0108
0109
0110 id = 2;
0111 G4double dr = analysis->GetH1Width(id);
0112 G4double dv = 2 * twopi * r * r * dr;
0113 if (dv > 0.) analysis->FillH1(id, r, 1. / dv);
0114
0115
0116
0117 id = 3;
0118 G4double costheta = ur.z();
0119 analysis->FillH1(id, costheta);
0120
0121
0122
0123 id = 4;
0124 G4double phi = std::atan2(ur.y(), ur.x());
0125 if (phi < 0.) phi += twopi;
0126 analysis->FillH1(id, phi);
0127
0128
0129
0130 id = 5;
0131 G4ThreeVector um = track->GetMomentumDirection();
0132 G4double cosalpha = ur * um;
0133 analysis->FillH1(id, cosalpha);
0134
0135
0136
0137 id = 6;
0138
0139 G4ThreeVector u1(1., 0., 0.);
0140 u1.rotateUz(ur);
0141 G4ThreeVector u2(0., 1., 0.);
0142 u2.rotateUz(ur);
0143
0144 G4double psi = std::atan2(u2 * um, u1 * um);
0145 if (psi < 0.) psi += twopi;
0146 analysis->FillH1(id, psi);
0147 }
0148 }
0149
0150
0151
0152 void TrackingAction::PostUserTrackingAction(const G4Track*) {}
0153
0154