Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // G4PrimaryParticle class implementation 27 // 28 // Authors: G.Cosmo, 2 December 1995 - Design, 29 // M.Asai, 29 January 1996 - First im 30 // ------------------------------------------- 31 32 #include "G4PrimaryParticle.hh" 33 34 #include "G4ParticleDefinition.hh" 35 #include "G4ParticleTable.hh" 36 #include "G4SystemOfUnits.hh" 37 #include "G4VUserPrimaryParticleInformation.hh 38 #include "G4ios.hh" 39 40 G4Allocator<G4PrimaryParticle>*& aPrimaryParti 41 { 42 G4ThreadLocalStatic G4Allocator<G4PrimaryPar 43 return _instance; 44 } 45 46 G4PrimaryParticle::G4PrimaryParticle() : direc 47 48 G4PrimaryParticle::G4PrimaryParticle(G4int Pco 49 { 50 G4code = G4ParticleTable::GetParticleTable() 51 if (G4code != nullptr) { 52 mass = G4code->GetPDGMass(); 53 charge = G4code->GetPDGCharge(); 54 } 55 } 56 57 G4PrimaryParticle::G4PrimaryParticle(G4int Pco 58 : direction(0., 0., 1.), PDGcode(Pcode) 59 { 60 G4code = G4ParticleTable::GetParticleTable() 61 if (G4code != nullptr) { 62 mass = G4code->GetPDGMass(); 63 charge = G4code->GetPDGCharge(); 64 } 65 SetMomentum(px, py, pz); 66 } 67 68 G4PrimaryParticle::G4PrimaryParticle(G4int Pco 69 : direction(0., 0., 1.), PDGcode(Pcode) 70 { 71 G4code = G4ParticleTable::GetParticleTable() 72 if (G4code != nullptr) { 73 mass = G4code->GetPDGMass(); 74 charge = G4code->GetPDGCharge(); 75 } 76 Set4Momentum(px, py, pz, E); 77 } 78 79 G4PrimaryParticle::G4PrimaryParticle(const G4P 80 : G4code(Gcode), direction(0., 0., 1.) 81 { 82 if (G4code != nullptr) { 83 PDGcode = Gcode->GetPDGEncoding(); 84 mass = G4code->GetPDGMass(); 85 charge = G4code->GetPDGCharge(); 86 } 87 } 88 89 G4PrimaryParticle::G4PrimaryParticle(const G4P 90 G4double 91 : G4code(Gcode), direction(0., 0., 1.) 92 { 93 if (G4code != nullptr) { 94 PDGcode = Gcode->GetPDGEncoding(); 95 mass = G4code->GetPDGMass(); 96 charge = G4code->GetPDGCharge(); 97 } 98 SetMomentum(px, py, pz); 99 } 100 101 G4PrimaryParticle::G4PrimaryParticle(const G4P 102 G4double 103 : G4code(Gcode), direction(0., 0., 1.) 104 { 105 if (G4code != nullptr) { 106 PDGcode = Gcode->GetPDGEncoding(); 107 mass = G4code->GetPDGMass(); 108 charge = G4code->GetPDGCharge(); 109 } 110 Set4Momentum(px, py, pz, E); 111 } 112 113 G4PrimaryParticle::G4PrimaryParticle(const G4P 114 { 115 *this = right; 116 } 117 118 G4PrimaryParticle& G4PrimaryParticle::operator 119 { 120 if (this != &right) { 121 PDGcode = right.PDGcode; 122 G4code = right.G4code; 123 direction = right.direction; 124 kinE = right.kinE; 125 delete nextParticle; 126 if (right.nextParticle == nullptr) { 127 nextParticle = nullptr; 128 } 129 else { 130 nextParticle = new G4PrimaryParticle(*ri 131 } 132 delete daughterParticle; 133 if (right.daughterParticle == nullptr) { 134 daughterParticle = nullptr; 135 } 136 else { 137 daughterParticle = new G4PrimaryParticle 138 } 139 trackID = right.trackID; 140 mass = right.mass; 141 charge = right.charge; 142 polX = right.polX; 143 polY = right.polY; 144 polZ = right.polZ; 145 Weight0 = right.Weight0; 146 properTime = right.properTime; 147 148 // userInfo cannot be copied 149 userInfo = nullptr; 150 } 151 152 return *this; 153 } 154 155 G4bool G4PrimaryParticle::operator==(const G4P 156 { 157 return (this == &right); 158 } 159 160 G4bool G4PrimaryParticle::operator!=(const G4P 161 { 162 return (this != &right); 163 } 164 165 G4PrimaryParticle::~G4PrimaryParticle() 166 { 167 delete nextParticle; 168 nextParticle = nullptr; 169 170 delete daughterParticle; 171 daughterParticle = nullptr; 172 173 delete userInfo; 174 userInfo = nullptr; 175 } 176 177 void G4PrimaryParticle::SetMomentum(G4double p 178 { 179 if ((mass < 0.) && (G4code != nullptr)) { 180 mass = G4code->GetPDGMass(); 181 } 182 G4double pmom = std::sqrt(px * px + py * py 183 if (pmom > 0.0) { 184 direction.setX(px / pmom); 185 direction.setY(py / pmom); 186 direction.setZ(pz / pmom); 187 } 188 kinE = std::sqrt(px * px + py * py + pz * pz 189 } 190 191 void G4PrimaryParticle::Set4Momentum(G4double 192 { 193 G4double pmom = std::sqrt(px * px + py * py 194 if (pmom > 0.0) { 195 direction.setX(px / pmom); 196 direction.setY(py / pmom); 197 direction.setZ(pz / pmom); 198 } 199 G4double mas2 = E * E - pmom * pmom; 200 if (mas2 >= 0.) { 201 mass = std::sqrt(mas2); 202 } 203 else { 204 if (G4code != nullptr) { 205 mass = G4code->GetPDGMass(); 206 } 207 E = std::sqrt(pmom * pmom + mass * mass); 208 } 209 kinE = E - mass; 210 } 211 212 void G4PrimaryParticle::SetPDGcode(G4int Pcode 213 { 214 PDGcode = Pcode; 215 G4code = G4ParticleTable::GetParticleTable() 216 if (G4code != nullptr) { 217 mass = G4code->GetPDGMass(); 218 charge = G4code->GetPDGCharge(); 219 } 220 } 221 222 void G4PrimaryParticle::SetParticleDefinition( 223 { 224 G4code = Gcode; 225 if (G4code != nullptr) { 226 PDGcode = Gcode->GetPDGEncoding(); 227 mass = G4code->GetPDGMass(); 228 charge = G4code->GetPDGCharge(); 229 } 230 } 231 232 void G4PrimaryParticle::Print() const 233 { 234 G4cout << "==== PDGcode " << PDGcode << " P 235 if (G4code != nullptr) { 236 G4cout << G4code->GetParticleName() << G4e 237 } 238 else { 239 G4cout << " is not defined in G4." << G4en 240 } 241 G4cout << " Assigned charge : " << charge / 242 G4cout << " Momentum ( " << GetTotalMome 243 << GetTotalMomentum() * direction.y() 244 << GetTotalMomentum() * direction.z() 245 G4cout << " kinetic Energy : " << kinE / 246 if (mass >= 0.) { 247 G4cout << " Mass : " << mass / GeV << 248 } 249 else { 250 G4cout << " Mass is not assigned " << 251 } 252 G4cout << " Polarization ( " << polX << 253 G4cout << " Weight : " << Weight0 << G4e 254 if (properTime >= 0.0) { 255 G4cout << " PreAssigned proper decay t 256 } 257 if (userInfo != nullptr) { 258 userInfo->Print(); 259 } 260 if (daughterParticle != nullptr) { 261 G4cout << ">>>> Daughters" << G4endl; 262 daughterParticle->Print(); 263 } 264 if (nextParticle != nullptr) { 265 nextParticle->Print(); 266 } 267 else { 268 G4cout << "<<<< End of link" << G4endl; 269 } 270 } 271