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: G4ProtonDecay.cc 28 // File: G4ProtonDecay.cc // 29 // Author: L.G. Sarmiento (Lund) 29 // Author: L.G. Sarmiento (Lund) // 30 // Date: 10 March 2015 30 // Date: 10 March 2015 // 31 // 31 // // 32 ////////////////////////////////////////////// 32 //////////////////////////////////////////////////////////////////////////////// 33 33 34 #include "G4ProtonDecay.hh" 34 #include "G4ProtonDecay.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 G4ProtonDecay::G4ProtonDecay(const G4ParticleD 45 G4ProtonDecay::G4ProtonDecay(const G4ParticleDefinition* theParentNucleus, 46 const G4double& b << 46 const G4double& branch, const G4double& Qvalue, 47 const G4double& e << 47 const G4double& excitationE) 48 const G4Ions::G4F << 48 : G4NuclearDecay("proton decay", Proton, excitationE), transitionQ(Qvalue) 49 : G4NuclearDecay("proton decay", Proton, exci << 50 { 49 { 51 SetParent(theParentNucleus); // Store name 50 SetParent(theParentNucleus); // Store name of parent nucleus, delete G4MT_parent 52 SetBR(branch); 51 SetBR(branch); 53 52 54 SetNumberOfDaughters(2); 53 SetNumberOfDaughters(2); 55 G4IonTable* theIonTable = 54 G4IonTable* theIonTable = 56 (G4IonTable*)(G4ParticleTable::GetParticle 55 (G4IonTable*)(G4ParticleTable::GetParticleTable()->GetIonTable()); 57 G4int daughterZ = theParentNucleus->GetAtomi 56 G4int daughterZ = theParentNucleus->GetAtomicNumber() - 1; 58 G4int daughterA = theParentNucleus->GetAtomi 57 G4int daughterA = theParentNucleus->GetAtomicMass() - 1; 59 SetDaughter(0, theIonTable->GetIon(daughterZ << 58 SetDaughter(0, theIonTable->GetIon(daughterZ, daughterA, excitationE) ); 60 SetDaughter(1, "proton"); 59 SetDaughter(1, "proton"); 61 } 60 } 62 61 63 62 64 G4ProtonDecay::~G4ProtonDecay() 63 G4ProtonDecay::~G4ProtonDecay() 65 {} 64 {} 66 65 67 66 68 G4DecayProducts* G4ProtonDecay::DecayIt(G4doub 67 G4DecayProducts* G4ProtonDecay::DecayIt(G4double) 69 { 68 { 70 // Fill G4MT_parent with theParentNucleus (s 69 // Fill G4MT_parent with theParentNucleus (stored by SetParent in ctor) 71 CheckAndFillParent(); << 70 if (G4MT_parent == 0) FillParent(); 72 71 73 // Fill G4MT_daughters with proton and resid 72 // Fill G4MT_daughters with proton and residual nucleus (stored by SetDaughter) 74 CheckAndFillDaughters(); << 73 if (G4MT_daughters == 0) FillDaughters(); 75 74 76 G4double protonMass = G4MT_daughters[1]->Get 75 G4double protonMass = G4MT_daughters[1]->GetPDGMass(); 77 // Excitation energy included in PDG mass 76 // Excitation energy included in PDG mass 78 G4double nucleusMass = G4MT_daughters[0]->Ge 77 G4double nucleusMass = G4MT_daughters[0]->GetPDGMass(); 79 78 80 // Q value was calculated from atomic masses 79 // Q value was calculated from atomic masses. 81 // Use it to get correct proton energy. 80 // Use it to get correct proton energy. 82 G4double cmMomentum = std::sqrt(transitionQ* 81 G4double cmMomentum = std::sqrt(transitionQ*(transitionQ + 2.*protonMass)* 83 (transitionQ + 82 (transitionQ + 2.*nucleusMass)* 84 (transitionQ + 83 (transitionQ + 2.*protonMass + 2.*nucleusMass) )/ 85 (transitionQ + 84 (transitionQ + protonMass + nucleusMass)/2.; 86 85 87 // Set up final state 86 // Set up final state 88 // parentParticle is set at rest here becaus 87 // parentParticle is set at rest here because boost with correct momentum 89 // is done later 88 // is done later 90 G4DynamicParticle parentParticle(G4MT_parent 89 G4DynamicParticle parentParticle(G4MT_parent, G4ThreeVector(0,0,0), 0.0); 91 G4DecayProducts* products = new G4DecayProdu 90 G4DecayProducts* products = new G4DecayProducts(parentParticle); 92 91 93 G4double costheta = 2.*G4UniformRand()-1.0; 92 G4double costheta = 2.*G4UniformRand()-1.0; 94 G4double sintheta = std::sqrt(1.0 - costheta 93 G4double sintheta = std::sqrt(1.0 - costheta*costheta); 95 G4double phi = twopi*G4UniformRand()*rad; 94 G4double phi = twopi*G4UniformRand()*rad; 96 G4ThreeVector direction(sintheta*std::cos(ph 95 G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi), 97 costheta); 96 costheta); 98 97 99 G4double KE = std::sqrt(cmMomentum*cmMomentu 98 G4double KE = std::sqrt(cmMomentum*cmMomentum + protonMass*protonMass) 100 - protonMass; 99 - protonMass; 101 G4DynamicParticle* daughterparticle = 100 G4DynamicParticle* daughterparticle = 102 new G4DynamicParticle(G4MT_daughters[1], d 101 new G4DynamicParticle(G4MT_daughters[1], direction, KE, protonMass); 103 products->PushProducts(daughterparticle); 102 products->PushProducts(daughterparticle); 104 103 105 KE = std::sqrt(cmMomentum*cmMomentum + nucle 104 KE = std::sqrt(cmMomentum*cmMomentum + nucleusMass*nucleusMass) - nucleusMass; 106 daughterparticle = 105 daughterparticle = 107 new G4DynamicParticle(G4MT_daughters[0], - 106 new G4DynamicParticle(G4MT_daughters[0], -1.0*direction, KE, nucleusMass); 108 products->PushProducts(daughterparticle); 107 products->PushProducts(daughterparticle); 109 108 110 // Energy conservation check 109 // Energy conservation check 111 // For proton decays, do final energy check 110 // For proton decays, do final energy check against reaction Q value 112 // which is well-measured using atomic mass 111 // which is well-measured using atomic mass differences. Nuclear masses 113 // should not be used since they are not usu 112 // should not be used since they are not usually directly measured and we 114 // always decay atoms and not fully stripped 113 // always decay atoms and not fully stripped nuclei. 115 /* 114 /* 116 G4int nProd = products->entries(); 115 G4int nProd = products->entries(); 117 G4DynamicParticle* temp = 0; 116 G4DynamicParticle* temp = 0; 118 G4double Esum = 0.0; 117 G4double Esum = 0.0; 119 for (G4int i = 0; i < nProd; i++) { 118 for (G4int i = 0; i < nProd; i++) { 120 temp = products->operator[](i); 119 temp = products->operator[](i); 121 Esum += temp->GetKineticEnergy(); 120 Esum += temp->GetKineticEnergy(); 122 } 121 } 123 G4double eCons = (transitionQ - Esum)/keV; 122 G4double eCons = (transitionQ - Esum)/keV; 124 if (eCons > 1.e-07) G4cout << " Proton decay 123 if (eCons > 1.e-07) G4cout << " Proton decay check: Ediff (keV) = " << eCons << G4endl; 125 */ 124 */ 126 return products; 125 return products; 127 } 126 } 128 127 129 128 130 void G4ProtonDecay::DumpNuclearInfo() 129 void G4ProtonDecay::DumpNuclearInfo() 131 { 130 { 132 G4cout << " G4ProtonDecay for parent nucleus 131 G4cout << " G4ProtonDecay for parent nucleus " << GetParentName() << G4endl; 133 G4cout << " decays to " << GetDaughterName(0 132 G4cout << " decays to " << GetDaughterName(0) << " + " << GetDaughterName(1) 134 << " with branching ratio " << GetBR( 133 << " with branching ratio " << GetBR() << "% and Q value " 135 << transitionQ << G4endl; 134 << transitionQ << G4endl; 136 } 135 } 137 136 138 137