Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4VDecayChannel 26 // G4VDecayChannel 27 // 27 // 28 // Class description: 28 // Class description: 29 // 29 // 30 // Abstract class to describe decay kinematics 30 // Abstract class to describe decay kinematics 31 31 32 // Author: H.Kurashige, 27 July 1996 << 32 // Author: H.Kurashige, 27 July 1996 33 // ------------------------------------------- 33 // -------------------------------------------------------------------- 34 #ifndef G4VDecayChannel_hh 34 #ifndef G4VDecayChannel_hh 35 #define G4VDecayChannel_hh 1 35 #define G4VDecayChannel_hh 1 36 36 37 #include "G4AutoLock.hh" << 37 #include <cmath> 38 #include "G4Threading.hh" << 38 39 #include "G4ThreeVector.hh" << 40 #include "G4ios.hh" 39 #include "G4ios.hh" 41 #include "globals.hh" 40 #include "globals.hh" 42 << 41 #include "G4ThreeVector.hh" 43 #include <cmath> << 42 #include "G4Threading.hh" >> 43 #include "G4AutoLock.hh" 44 44 45 class G4ParticleDefinition; 45 class G4ParticleDefinition; 46 class G4DecayProducts; 46 class G4DecayProducts; 47 class G4ParticleTable; 47 class G4ParticleTable; 48 48 49 class G4VDecayChannel 49 class G4VDecayChannel 50 { 50 { 51 public: 51 public: 52 // Constructors << 52 53 G4VDecayChannel(const G4String& aName, G4i 53 G4VDecayChannel(const G4String& aName, G4int Verbose = 1); 54 G4VDecayChannel(const G4String& aName, con << 54 G4VDecayChannel(const G4String& aName, 55 G4int theNumberOfDaughters << 55 const G4String& theParentName, 56 const G4String& theDaughte << 56 G4double theBR, 57 const G4String& theDaughte << 57 G4int theNumberOfDaughters, >> 58 const G4String& theDaughterName1, >> 59 const G4String& theDaughterName2 = "", >> 60 const G4String& theDaughterName3 = "", >> 61 const G4String& theDaughterName4 = "", >> 62 const G4String& theDaughterName5 = "" ); >> 63 // Constructors 58 64 59 // Destructor << 60 virtual ~G4VDecayChannel(); 65 virtual ~G4VDecayChannel(); >> 66 // Destructor 61 67 62 // Equality operators << 63 G4bool operator==(const G4VDecayChannel& r 68 G4bool operator==(const G4VDecayChannel& r) const { return (this == &r); } 64 G4bool operator!=(const G4VDecayChannel& r 69 G4bool operator!=(const G4VDecayChannel& r) const { return (this != &r); } >> 70 // Equality operators 65 71 66 // Less-than operator is defined for G4Dec << 67 inline G4bool operator<(const G4VDecayChan 72 inline G4bool operator<(const G4VDecayChannel& right) const; >> 73 // Less-than operator is defined for G4DecayTable 68 74 69 virtual G4DecayProducts* DecayIt(G4double 75 virtual G4DecayProducts* DecayIt(G4double parentMass = -1.0) = 0; 70 76 71 // Get kinematics name << 72 inline const G4String& GetKinematicsName() 77 inline const G4String& GetKinematicsName() const; 73 << 78 // Get kinematics name 74 // Get branching ratio << 75 inline G4double GetBR() const; 79 inline G4double GetBR() const; >> 80 // Get branching ratio >> 81 inline G4int GetNumberOfDaughters() const; >> 82 // Get number of daughter particles 76 83 77 // Get number of daughter particles << 78 inline G4int GetNumberOfDaughters() const; << 79 << 80 // Get the pointer to the parent particle << 81 inline G4ParticleDefinition* GetParent(); 84 inline G4ParticleDefinition* GetParent(); 82 << 85 // Get the pointer to the parent particle 83 // Get the pointer to a daughter particle << 84 inline G4ParticleDefinition* GetDaughter(G 86 inline G4ParticleDefinition* GetDaughter(G4int anIndex); >> 87 // Get the pointer to a daughter particle 85 88 86 // Get the angular momentum of the decay << 87 G4int GetAngularMomentum(); 89 G4int GetAngularMomentum(); 88 << 90 // Get the angular momentum of the decay 89 // Get the name of the parent particle << 90 inline const G4String& GetParentName() con 91 inline const G4String& GetParentName() const; 91 << 92 // Get the name of the parent particle 92 // Get the name of a daughter particle << 93 inline const G4String& GetDaughterName(G4i 93 inline const G4String& GetDaughterName(G4int anIndex) const; >> 94 // Get the name of a daughter particle 94 95 95 // Get mass of parent << 96 inline G4double GetParentMass() const; 96 inline G4double GetParentMass() const; << 97 // Get mass of parent 97 << 98 inline G4double GetDaughterMass(G4int anIndex) const; 98 // Get mass of daughter << 99 // Get mass of daughter 99 inline G4double GetDaughterMass(G4int anIn << 100 100 << 101 void SetParent(const G4ParticleDefinition * particle_type); 101 // Set the parent particle (by name or by << 102 inline void SetParent(const G4String &particle_name); 102 void SetParent(const G4ParticleDefinition* << 103 // Set the parent particle (by name or by pointer) 103 inline void SetParent(const G4String& part << 104 void SetBR(G4double value); 104 << 105 // Set branching ratio 105 // Set branching ratio << 106 void SetNumberOfDaughters(G4int value); 106 void SetBR(G4double value); << 107 // Set number of daughter particles 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 108 void SetDaughter(G4int anIndex, const G4ParticleDefinition* particle_type); 113 void SetDaughter(G4int anIndex, const G4St 109 void SetDaughter(G4int anIndex, const G4String& particle_name); >> 110 // Set a daughter particle (by name or by pointer) 114 111 115 inline void SetVerboseLevel(G4int value); 112 inline void SetVerboseLevel(G4int value); 116 inline G4int GetVerboseLevel() const; 113 inline G4int GetVerboseLevel() const; 117 void DumpInfo(); 114 void DumpInfo(); 118 << 115 119 inline G4double GetRangeMass() const; 116 inline G4double GetRangeMass() const; 120 inline void SetRangeMass(G4double val); 117 inline void SetRangeMass(G4double val); 121 virtual G4bool IsOKWithParentMass(G4double << 118 virtual G4bool IsOKWithParentMass(G4double parentMass); 122 119 123 void SetPolarization(const G4ThreeVector&) 120 void SetPolarization(const G4ThreeVector&); 124 inline const G4ThreeVector& GetPolarizatio 121 inline const G4ThreeVector& GetPolarization() const; 125 122 126 protected: 123 protected: 127 // Default constructor << 124 >> 125 void ClearDaughtersName(); >> 126 // Clear daughters array >> 127 >> 128 inline void CheckAndFillDaughters(); >> 129 inline void CheckAndFillParent(); >> 130 >> 131 G4double DynamicalMass(G4double massPDG, G4double width, >> 132 G4double maxDev = 1.0) const; >> 133 128 G4VDecayChannel(); 134 G4VDecayChannel(); >> 135 // Default constructor 129 136 130 // Copy constructor and assignment operato << 131 G4VDecayChannel(const G4VDecayChannel&); 137 G4VDecayChannel(const G4VDecayChannel&); 132 G4VDecayChannel& operator=(const G4VDecayC 138 G4VDecayChannel& operator=(const G4VDecayChannel&); >> 139 // Copy constructor and assignment operator 133 140 134 // Clear daughters array << 141 private: 135 void ClearDaughtersName(); << 136 142 137 inline void CheckAndFillDaughters(); << 143 void FillDaughters(); 138 inline void CheckAndFillParent(); << 144 // Fill daughters array >> 145 void FillParent(); >> 146 // Fill parent 139 147 140 G4double DynamicalMass(G4double massPDG, G << 148 const G4String& GetNoName() const; 141 149 142 protected: 150 protected: 143 // Kinematics name << 151 144 G4String kinematics_name = ""; 152 G4String kinematics_name = ""; 145 // Branching ratio [0.0 - 1.0] << 153 // Kinematics name 146 G4double rbranch = 0.0; 154 G4double rbranch = 0.0; 147 // Parent particle << 155 // Branching ratio [0.0 - 1.0] 148 G4String* parent_name = nullptr; 156 G4String* parent_name = nullptr; 149 // Daughter particles << 157 // Parent particle 150 G4String** daughters_name = nullptr; 158 G4String** daughters_name = nullptr; 151 << 159 // Daughter particles 152 // Range of mass allowed in decay << 160 153 G4double rangeMass = 2.5; 161 G4double rangeMass = 2.5; >> 162 // Range of mass allowed in decay 154 163 155 // Polarization of the parent particle << 156 G4ThreeVector parent_polarization; 164 G4ThreeVector parent_polarization; 157 << 165 // Polarization of the parent particle 158 // Pointer to particle table << 166 159 G4ParticleTable* particletable = nullptr; 167 G4ParticleTable* particletable = nullptr; >> 168 // Pointer to particle table 160 169 161 static const G4String noName; 170 static const G4String noName; 162 171 163 G4ParticleDefinition* G4MT_parent = nullpt << 172 G4ParticleDefinition* G4MT_parent = nullptr; 164 G4ParticleDefinition** G4MT_daughters = nu 173 G4ParticleDefinition** G4MT_daughters = nullptr; 165 G4double G4MT_parent_mass = 0.0; << 174 G4double G4MT_parent_mass = 0.0; 166 G4double* G4MT_daughters_mass = nullptr; << 175 G4double* G4MT_daughters_mass = nullptr; 167 G4double* G4MT_daughters_width = nullptr; << 176 G4double* G4MT_daughters_width = nullptr; 168 G4Mutex daughtersMutex; 177 G4Mutex daughtersMutex; 169 G4Mutex parentMutex; 178 G4Mutex parentMutex; 170 179 171 // Number of daughters << 172 G4int numberOfDaughters = 0; 180 G4int numberOfDaughters = 0; >> 181 // Number of daughters 173 182 174 // Control flag for output message << 175 // 0: Silent << 176 // 1: Warning message << 177 // 2: More << 178 G4int verboseLevel = 1; 183 G4int verboseLevel = 1; 179 << 184 // Control flag for output message 180 private: << 185 // 0: Silent 181 // Fill daughters array << 186 // 1: Warning message 182 void FillDaughters(); << 187 // 2: More 183 << 184 // Fill parent << 185 void FillParent(); << 186 << 187 const G4String& GetNoName() const; << 188 }; 188 }; 189 189 190 // ------------------------------------------- 190 // ------------------------------------------------------------ 191 // Inline methods 191 // Inline methods 192 // ------------------------------------------- 192 // ------------------------------------------------------------ 193 193 194 inline G4bool G4VDecayChannel::operator<(const << 194 inline >> 195 G4bool G4VDecayChannel::operator<(const G4VDecayChannel& right) const 195 { 196 { 196 return (this->rbranch < right.rbranch); 197 return (this->rbranch < right.rbranch); 197 } 198 } 198 199 199 inline G4ParticleDefinition* G4VDecayChannel:: << 200 inline 200 { << 201 G4ParticleDefinition* G4VDecayChannel::GetDaughter(G4int anIndex) 201 // pointers to daughter particles are filled << 202 { >> 203 // pointers to daughter particles are filled, if they are not set yet 202 CheckAndFillDaughters(); 204 CheckAndFillDaughters(); 203 205 204 // get the pointer to a daughter particle 206 // get the pointer to a daughter particle 205 if ((anIndex >= 0) && (anIndex < numberOfDau << 207 if ( (anIndex>=0) && (anIndex<numberOfDaughters) ) >> 208 { 206 return G4MT_daughters[anIndex]; 209 return G4MT_daughters[anIndex]; 207 } 210 } 208 << 211 else 209 if (verboseLevel > 0) << 212 { 210 G4cout << "G4VDecayChannel::GetDaughter i << 213 if (verboseLevel>0) 211 return nullptr; << 214 G4cout << "G4VDecayChannel::GetDaughter index out of range " >> 215 << anIndex << G4endl; >> 216 return nullptr; >> 217 } 212 } 218 } 213 219 214 inline const G4String& G4VDecayChannel::GetDau << 220 inline >> 221 const G4String& G4VDecayChannel::GetDaughterName(G4int anIndex) const 215 { 222 { 216 if ((anIndex >= 0) && (anIndex < numberOfDau << 223 if ( (anIndex>=0) && (anIndex<numberOfDaughters) ) >> 224 { 217 return *daughters_name[anIndex]; 225 return *daughters_name[anIndex]; 218 } 226 } 219 << 227 else 220 if (verboseLevel > 0) { << 228 { 221 G4cout << "G4VDecayChannel::GetDaughterNam << 229 if (verboseLevel>0) 222 G4cout << "index out of range " << anIndex << 230 { >> 231 G4cout << "G4VDecayChannel::GetDaughterName "; >> 232 G4cout << "index out of range " << anIndex << G4endl; >> 233 } >> 234 return GetNoName(); 223 } 235 } 224 return GetNoName(); << 225 } 236 } 226 237 227 inline G4double G4VDecayChannel::GetDaughterMa << 238 inline >> 239 G4double G4VDecayChannel::GetDaughterMass(G4int anIndex) const 228 { 240 { 229 if ((anIndex >= 0) && (anIndex < numberOfDau << 241 if ( (anIndex>=0) && (anIndex<numberOfDaughters) ) >> 242 { 230 return G4MT_daughters_mass[anIndex]; 243 return G4MT_daughters_mass[anIndex]; 231 } 244 } 232 << 245 else 233 if (verboseLevel > 0) { << 246 { 234 G4cout << "G4VDecayChannel::GetDaughterMas << 247 if (verboseLevel>0) 235 G4cout << "index out of range " << anIndex << 248 { >> 249 G4cout << "G4VDecayChannel::GetDaughterMass "; >> 250 G4cout << "index out of range " << anIndex << G4endl; >> 251 } >> 252 return 0.0; 236 } 253 } 237 return 0.0; << 238 } 254 } 239 255 240 inline G4ParticleDefinition* G4VDecayChannel:: << 256 inline 241 { << 257 G4ParticleDefinition* G4VDecayChannel::GetParent() 242 // the pointer to the parent particle is fil << 258 { >> 259 // the pointer to the parent particle is filled, if it is not set yet 243 CheckAndFillParent(); 260 CheckAndFillParent(); 244 // get the pointer to the parent particle 261 // get the pointer to the parent particle 245 return G4MT_parent; 262 return G4MT_parent; 246 } 263 } 247 264 248 inline const G4String& G4VDecayChannel::GetPar << 265 inline >> 266 const G4String& G4VDecayChannel::GetParentName() const 249 { 267 { 250 return *parent_name; 268 return *parent_name; 251 } 269 } 252 270 253 inline G4double G4VDecayChannel::GetParentMass << 271 inline >> 272 G4double G4VDecayChannel::GetParentMass() const 254 { 273 { 255 return G4MT_parent_mass; 274 return G4MT_parent_mass; 256 } 275 } 257 276 258 inline void G4VDecayChannel::SetParent(const G << 277 inline >> 278 void G4VDecayChannel::SetParent(const G4String& particle_name) 259 { 279 { 260 delete parent_name; << 280 if (parent_name != nullptr) delete parent_name; 261 parent_name = new G4String(particle_name); 281 parent_name = new G4String(particle_name); 262 G4MT_parent = nullptr; 282 G4MT_parent = nullptr; 263 } 283 } 264 284 265 inline G4int G4VDecayChannel::GetNumberOfDaugh << 285 inline 266 { << 286 G4int G4VDecayChannel::GetNumberOfDaughters() const 267 return numberOfDaughters; << 287 { >> 288 return numberOfDaughters; 268 } 289 } 269 290 270 inline const G4String& G4VDecayChannel::GetKin << 291 inline >> 292 const G4String& G4VDecayChannel::GetKinematicsName() const 271 { 293 { 272 return kinematics_name; 294 return kinematics_name; 273 } 295 } 274 296 275 inline G4double G4VDecayChannel::GetBR() const << 297 inline >> 298 G4double G4VDecayChannel::GetBR() const 276 { 299 { 277 return rbranch; 300 return rbranch; 278 } 301 } 279 302 280 inline void G4VDecayChannel::SetVerboseLevel(G << 303 inline >> 304 void G4VDecayChannel::SetVerboseLevel(G4int value) 281 { 305 { 282 verboseLevel = value; 306 verboseLevel = value; 283 } 307 } 284 308 285 inline G4int G4VDecayChannel::GetVerboseLevel( << 309 inline >> 310 G4int G4VDecayChannel::GetVerboseLevel() const 286 { 311 { 287 return verboseLevel; 312 return verboseLevel; 288 } 313 } 289 314 290 inline G4double G4VDecayChannel::GetRangeMass( << 315 inline >> 316 G4double G4VDecayChannel::GetRangeMass() const 291 { 317 { 292 return rangeMass; 318 return rangeMass; 293 } 319 } 294 320 295 inline void G4VDecayChannel::SetRangeMass(G4do << 321 inline 296 { << 322 void G4VDecayChannel::SetRangeMass(G4double val){ if(val>=0.) rangeMass=val; } 297 if (val >= 0.) rangeMass = val; << 298 } << 299 323 300 inline void G4VDecayChannel::SetPolarization(c << 324 inline >> 325 void G4VDecayChannel::SetPolarization(const G4ThreeVector& polar) 301 { 326 { 302 parent_polarization = polar; 327 parent_polarization = polar; 303 } 328 } 304 329 305 inline const G4ThreeVector& G4VDecayChannel::G << 330 inline >> 331 const G4ThreeVector& G4VDecayChannel::GetPolarization() const 306 { 332 { 307 return parent_polarization; 333 return parent_polarization; 308 } 334 } 309 335 310 inline void G4VDecayChannel::CheckAndFillDaugh << 336 inline >> 337 void G4VDecayChannel::CheckAndFillDaughters() 311 { 338 { 312 G4AutoLock l(&daughtersMutex); 339 G4AutoLock l(&daughtersMutex); 313 if (G4MT_daughters == nullptr) { << 340 if ( G4MT_daughters == nullptr ) >> 341 { 314 l.unlock(); 342 l.unlock(); 315 FillDaughters(); 343 FillDaughters(); 316 } 344 } 317 } 345 } 318 346 319 inline void G4VDecayChannel::CheckAndFillParen << 347 inline >> 348 void G4VDecayChannel::CheckAndFillParent() 320 { 349 { 321 G4AutoLock l(&parentMutex); 350 G4AutoLock l(&parentMutex); 322 if (G4MT_parent == nullptr) { << 351 if ( G4MT_parent == nullptr ) >> 352 { 323 l.unlock(); 353 l.unlock(); 324 FillParent(); 354 FillParent(); 325 } 355 } 326 } 356 } 327 357 328 #endif 358 #endif 329 359