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 ////////////////////////////////////////////// 26 //////////////////////////////////////////////////////////////////////////////// 27 // 27 // // 28 // File: G4AlphaDecay.cc 28 // File: G4AlphaDecay.cc // 29 // Author: D.H. Wright (SLAC) 29 // Author: D.H. Wright (SLAC) // 30 // Date: 20 October 2014 30 // Date: 20 October 2014 // 31 // 31 // // 32 ////////////////////////////////////////////// 32 //////////////////////////////////////////////////////////////////////////////// 33 33 34 #include "G4AlphaDecay.hh" 34 #include "G4AlphaDecay.hh" 35 #include "G4IonTable.hh" 35 #include "G4IonTable.hh" 36 #include "Randomize.hh" 36 #include "Randomize.hh" 37 #include "G4ThreeVector.hh" 37 #include "G4ThreeVector.hh" 38 #include "G4DynamicParticle.hh" 38 #include "G4DynamicParticle.hh" 39 #include "G4DecayProducts.hh" 39 #include "G4DecayProducts.hh" 40 #include "G4PhysicalConstants.hh" 40 #include "G4PhysicalConstants.hh" 41 #include "G4SystemOfUnits.hh" 41 #include "G4SystemOfUnits.hh" 42 #include <iostream> 42 #include <iostream> 43 #include <iomanip> 43 #include <iomanip> 44 44 45 G4AlphaDecay::G4AlphaDecay(const G4ParticleDef 45 G4AlphaDecay::G4AlphaDecay(const G4ParticleDefinition* theParentNucleus, 46 const G4double& bra 46 const G4double& branch, const G4double& Qvalue, 47 const G4double& exc << 47 const G4double& excitationE) 48 const G4Ions::G4Flo << 48 : G4VDecayChannel("alpha decay"), transitionQ(Qvalue), daughterEx(excitationE), 49 : G4NuclearDecay("alpha decay", Alpha, excita << 49 halflifeThreshold(nanosecond) 50 { 50 { 51 SetParent(theParentNucleus); // Store name 51 SetParent(theParentNucleus); // Store name of parent nucleus, delete G4MT_parent 52 SetBR(branch); 52 SetBR(branch); 53 53 54 SetNumberOfDaughters(2); 54 SetNumberOfDaughters(2); >> 55 SetDaughter(0, "alpha"); // Store name of 1st daughter 55 G4IonTable* theIonTable = 56 G4IonTable* theIonTable = 56 (G4IonTable*)(G4ParticleTable::GetParticle 57 (G4IonTable*)(G4ParticleTable::GetParticleTable()->GetIonTable()); 57 G4int daughterZ = theParentNucleus->GetAtomi 58 G4int daughterZ = theParentNucleus->GetAtomicNumber() - 2; 58 G4int daughterA = theParentNucleus->GetAtomi << 59 G4int daughterA = theParentNucleus->GetAtomicMass() - 4; 59 SetDaughter(0, theIonTable->GetIon(daughterZ << 60 SetDaughter(1, theIonTable->GetIon(daughterZ, daughterA, daughterEx) ); 60 SetDaughter(1, "alpha"); << 61 } 61 } 62 62 63 63 >> 64 G4AlphaDecay::G4AlphaDecay(const G4AlphaDecay& right) >> 65 : G4VDecayChannel(right), transitionQ(right.transitionQ), >> 66 daughterEx(right.daughterEx), halflifeThreshold(right.halflifeThreshold) >> 67 {} >> 68 >> 69 64 G4AlphaDecay::~G4AlphaDecay() 70 G4AlphaDecay::~G4AlphaDecay() 65 {} 71 {} 66 72 67 73 68 G4DecayProducts* G4AlphaDecay::DecayIt(G4doubl 74 G4DecayProducts* G4AlphaDecay::DecayIt(G4double) 69 { 75 { 70 // Fill G4MT_parent with theParentNucleus (s 76 // Fill G4MT_parent with theParentNucleus (stored by SetParent in ctor) 71 CheckAndFillParent(); << 77 if (G4MT_parent == 0) FillParent(); 72 78 73 // Fill G4MT_daughters with alpha and residu 79 // Fill G4MT_daughters with alpha and residual nucleus (stored by SetDaughter) 74 CheckAndFillDaughters(); << 80 if (G4MT_daughters == 0) FillDaughters(); 75 81 76 G4double alphaMass = G4MT_daughters[1]->GetP << 82 G4double alphaMass = G4MT_daughters[0]->GetPDGMass(); 77 // Excitation energy included in PDG mass 83 // Excitation energy included in PDG mass 78 G4double nucleusMass = G4MT_daughters[0]->Ge << 84 G4double nucleusMass = G4MT_daughters[1]->GetPDGMass(); 79 85 80 // Q value was calculated from atomic masses 86 // Q value was calculated from atomic masses. 81 // Use it to get correct alpha energy. 87 // Use it to get correct alpha energy. 82 G4double cmMomentum = std::sqrt(transitionQ* 88 G4double cmMomentum = std::sqrt(transitionQ*(transitionQ + 2.*alphaMass)* 83 (transitionQ + 89 (transitionQ + 2.*nucleusMass)* 84 (transitionQ + 90 (transitionQ + 2.*alphaMass + 2.*nucleusMass) )/ 85 (transitionQ + 91 (transitionQ + alphaMass + nucleusMass)/2.; 86 92 87 // Set up final state 93 // Set up final state 88 // parentParticle is set at rest here becaus 94 // parentParticle is set at rest here because boost with correct momentum 89 // is done later 95 // is done later 90 G4DynamicParticle parentParticle(G4MT_parent 96 G4DynamicParticle parentParticle(G4MT_parent, G4ThreeVector(0,0,0), 0.0); 91 G4DecayProducts* products = new G4DecayProdu 97 G4DecayProducts* products = new G4DecayProducts(parentParticle); 92 98 93 G4double costheta = 2.*G4UniformRand()-1.0; 99 G4double costheta = 2.*G4UniformRand()-1.0; 94 G4double sintheta = std::sqrt(1.0 - costheta 100 G4double sintheta = std::sqrt(1.0 - costheta*costheta); 95 G4double phi = twopi*G4UniformRand()*rad; 101 G4double phi = twopi*G4UniformRand()*rad; 96 G4ThreeVector direction(sintheta*std::cos(ph 102 G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi), 97 costheta); 103 costheta); 98 104 99 G4double KE = std::sqrt(cmMomentum*cmMomentu 105 G4double KE = std::sqrt(cmMomentum*cmMomentum + alphaMass*alphaMass) 100 - alphaMass; 106 - alphaMass; 101 G4DynamicParticle* daughterparticle = 107 G4DynamicParticle* daughterparticle = 102 new G4DynamicParticle(G4MT_daughters[1], d << 108 new G4DynamicParticle(G4MT_daughters[0], direction, KE, alphaMass); 103 products->PushProducts(daughterparticle); 109 products->PushProducts(daughterparticle); 104 110 105 KE = std::sqrt(cmMomentum*cmMomentum + nucle 111 KE = std::sqrt(cmMomentum*cmMomentum + nucleusMass*nucleusMass) - nucleusMass; 106 daughterparticle = 112 daughterparticle = 107 new G4DynamicParticle(G4MT_daughters[0], - << 113 new G4DynamicParticle(G4MT_daughters[1], -1.0*direction, KE, nucleusMass); 108 products->PushProducts(daughterparticle); 114 products->PushProducts(daughterparticle); 109 115 110 // Energy conservation check << 111 // For alpha decays, do final energy check a << 112 // which is well-measured using atomic mass << 113 // should not be used since they are not usu << 114 // always decay atoms and not fully stripped << 115 /* << 116 G4int nProd = products->entries(); << 117 G4DynamicParticle* temp = 0; << 118 G4double Esum = 0.0; << 119 for (G4int i = 0; i < nProd; i++) { << 120 temp = products->operator[](i); << 121 Esum += temp->GetKineticEnergy(); << 122 } << 123 G4double eCons = (transitionQ - Esum)/keV; << 124 if (eCons > 1.e-07) G4cout << " Alpha decay << 125 */ << 126 return products; 116 return products; 127 } 117 } 128 118 129 119 130 void G4AlphaDecay::DumpNuclearInfo() << 120 void G4AlphaDecay::DumpInfo() 131 { 121 { 132 G4cout << " G4AlphaDecay for parent nucleus 122 G4cout << " G4AlphaDecay for parent nucleus " << GetParentName() << G4endl; 133 G4cout << " decays to " << GetDaughterName(0 123 G4cout << " decays to " << GetDaughterName(0) << " + " << GetDaughterName(1) 134 << " with branching ratio " << GetBR( << 124 << " with branching ratio " << GetBR() << " and Q value " 135 << transitionQ << G4endl; 125 << transitionQ << G4endl; 136 } 126 } 137 127 138 128