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 // G4VDecayChannel 27 // 28 // Class description: 29 // 30 // Abstract class to describe decay kinematics 31 32 // Author: H.Kurashige, 27 July 1996 33 // ------------------------------------------- 34 #ifndef G4VDecayChannel_hh 35 #define G4VDecayChannel_hh 1 36 37 #include "G4AutoLock.hh" 38 #include "G4Threading.hh" 39 #include "G4ThreeVector.hh" 40 #include "G4ios.hh" 41 #include "globals.hh" 42 43 #include <cmath> 44 45 class G4ParticleDefinition; 46 class G4DecayProducts; 47 class G4ParticleTable; 48 49 class G4VDecayChannel 50 { 51 public: 52 // Constructors 53 G4VDecayChannel(const G4String& aName, G4i 54 G4VDecayChannel(const G4String& aName, con 55 G4int theNumberOfDaughters 56 const G4String& theDaughte 57 const G4String& theDaughte 58 59 // Destructor 60 virtual ~G4VDecayChannel(); 61 62 // Equality operators 63 G4bool operator==(const G4VDecayChannel& r 64 G4bool operator!=(const G4VDecayChannel& r 65 66 // Less-than operator is defined for G4Dec 67 inline G4bool operator<(const G4VDecayChan 68 69 virtual G4DecayProducts* DecayIt(G4double 70 71 // Get kinematics name 72 inline const G4String& GetKinematicsName() 73 74 // Get branching ratio 75 inline G4double GetBR() const; 76 77 // Get number of daughter particles 78 inline G4int GetNumberOfDaughters() const; 79 80 // Get the pointer to the parent particle 81 inline G4ParticleDefinition* GetParent(); 82 83 // Get the pointer to a daughter particle 84 inline G4ParticleDefinition* GetDaughter(G 85 86 // Get the angular momentum of the decay 87 G4int GetAngularMomentum(); 88 89 // Get the name of the parent particle 90 inline const G4String& GetParentName() con 91 92 // Get the name of a daughter particle 93 inline const G4String& GetDaughterName(G4i 94 95 // Get mass of parent 96 inline G4double GetParentMass() const; 97 98 // Get mass of daughter 99 inline G4double GetDaughterMass(G4int anIn 100 101 // Set the parent particle (by name or by 102 void SetParent(const G4ParticleDefinition* 103 inline void SetParent(const G4String& part 104 105 // Set branching ratio 106 void SetBR(G4double value); 107 108 // Set number of daughter particles 109 void SetNumberOfDaughters(G4int value); 110 111 // Set a daughter particle (by name or by 112 void SetDaughter(G4int anIndex, const G4Pa 113 void SetDaughter(G4int anIndex, const G4St 114 115 inline void SetVerboseLevel(G4int value); 116 inline G4int GetVerboseLevel() const; 117 void DumpInfo(); 118 119 inline G4double GetRangeMass() const; 120 inline void SetRangeMass(G4double val); 121 virtual G4bool IsOKWithParentMass(G4double 122 123 void SetPolarization(const G4ThreeVector&) 124 inline const G4ThreeVector& GetPolarizatio 125 126 protected: 127 // Default constructor 128 G4VDecayChannel(); 129 130 // Copy constructor and assignment operato 131 G4VDecayChannel(const G4VDecayChannel&); 132 G4VDecayChannel& operator=(const G4VDecayC 133 134 // Clear daughters array 135 void ClearDaughtersName(); 136 137 inline void CheckAndFillDaughters(); 138 inline void CheckAndFillParent(); 139 140 G4double DynamicalMass(G4double massPDG, G 141 142 protected: 143 // Kinematics name 144 G4String kinematics_name = ""; 145 // Branching ratio [0.0 - 1.0] 146 G4double rbranch = 0.0; 147 // Parent particle 148 G4String* parent_name = nullptr; 149 // Daughter particles 150 G4String** daughters_name = nullptr; 151 152 // Range of mass allowed in decay 153 G4double rangeMass = 2.5; 154 155 // Polarization of the parent particle 156 G4ThreeVector parent_polarization; 157 158 // Pointer to particle table 159 G4ParticleTable* particletable = nullptr; 160 161 static const G4String noName; 162 163 G4ParticleDefinition* G4MT_parent = nullpt 164 G4ParticleDefinition** G4MT_daughters = nu 165 G4double G4MT_parent_mass = 0.0; 166 G4double* G4MT_daughters_mass = nullptr; 167 G4double* G4MT_daughters_width = nullptr; 168 G4Mutex daughtersMutex; 169 G4Mutex parentMutex; 170 171 // Number of daughters 172 G4int numberOfDaughters = 0; 173 174 // Control flag for output message 175 // 0: Silent 176 // 1: Warning message 177 // 2: More 178 G4int verboseLevel = 1; 179 180 private: 181 // Fill daughters array 182 void FillDaughters(); 183 184 // Fill parent 185 void FillParent(); 186 187 const G4String& GetNoName() const; 188 }; 189 190 // ------------------------------------------- 191 // Inline methods 192 // ------------------------------------------- 193 194 inline G4bool G4VDecayChannel::operator<(const 195 { 196 return (this->rbranch < right.rbranch); 197 } 198 199 inline G4ParticleDefinition* G4VDecayChannel:: 200 { 201 // pointers to daughter particles are filled 202 CheckAndFillDaughters(); 203 204 // get the pointer to a daughter particle 205 if ((anIndex >= 0) && (anIndex < numberOfDau 206 return G4MT_daughters[anIndex]; 207 } 208 209 if (verboseLevel > 0) 210 G4cout << "G4VDecayChannel::GetDaughter i 211 return nullptr; 212 } 213 214 inline const G4String& G4VDecayChannel::GetDau 215 { 216 if ((anIndex >= 0) && (anIndex < numberOfDau 217 return *daughters_name[anIndex]; 218 } 219 220 if (verboseLevel > 0) { 221 G4cout << "G4VDecayChannel::GetDaughterNam 222 G4cout << "index out of range " << anIndex 223 } 224 return GetNoName(); 225 } 226 227 inline G4double G4VDecayChannel::GetDaughterMa 228 { 229 if ((anIndex >= 0) && (anIndex < numberOfDau 230 return G4MT_daughters_mass[anIndex]; 231 } 232 233 if (verboseLevel > 0) { 234 G4cout << "G4VDecayChannel::GetDaughterMas 235 G4cout << "index out of range " << anIndex 236 } 237 return 0.0; 238 } 239 240 inline G4ParticleDefinition* G4VDecayChannel:: 241 { 242 // the pointer to the parent particle is fil 243 CheckAndFillParent(); 244 // get the pointer to the parent particle 245 return G4MT_parent; 246 } 247 248 inline const G4String& G4VDecayChannel::GetPar 249 { 250 return *parent_name; 251 } 252 253 inline G4double G4VDecayChannel::GetParentMass 254 { 255 return G4MT_parent_mass; 256 } 257 258 inline void G4VDecayChannel::SetParent(const G 259 { 260 delete parent_name; 261 parent_name = new G4String(particle_name); 262 G4MT_parent = nullptr; 263 } 264 265 inline G4int G4VDecayChannel::GetNumberOfDaugh 266 { 267 return numberOfDaughters; 268 } 269 270 inline const G4String& G4VDecayChannel::GetKin 271 { 272 return kinematics_name; 273 } 274 275 inline G4double G4VDecayChannel::GetBR() const 276 { 277 return rbranch; 278 } 279 280 inline void G4VDecayChannel::SetVerboseLevel(G 281 { 282 verboseLevel = value; 283 } 284 285 inline G4int G4VDecayChannel::GetVerboseLevel( 286 { 287 return verboseLevel; 288 } 289 290 inline G4double G4VDecayChannel::GetRangeMass( 291 { 292 return rangeMass; 293 } 294 295 inline void G4VDecayChannel::SetRangeMass(G4do 296 { 297 if (val >= 0.) rangeMass = val; 298 } 299 300 inline void G4VDecayChannel::SetPolarization(c 301 { 302 parent_polarization = polar; 303 } 304 305 inline const G4ThreeVector& G4VDecayChannel::G 306 { 307 return parent_polarization; 308 } 309 310 inline void G4VDecayChannel::CheckAndFillDaugh 311 { 312 G4AutoLock l(&daughtersMutex); 313 if (G4MT_daughters == nullptr) { 314 l.unlock(); 315 FillDaughters(); 316 } 317 } 318 319 inline void G4VDecayChannel::CheckAndFillParen 320 { 321 G4AutoLock l(&parentMutex); 322 if (G4MT_parent == nullptr) { 323 l.unlock(); 324 FillParent(); 325 } 326 } 327 328 #endif 329