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: G4SFDecay.cc 28 // File: G4SFDecay.cc // 29 // Author: D.H. Wright (SLAC) 29 // Author: D.H. Wright (SLAC) // 30 // Date: 27 March 2019 30 // Date: 27 March 2019 // 31 // 31 // // 32 ////////////////////////////////////////////// 32 //////////////////////////////////////////////////////////////////////////////// 33 33 34 #include "G4SFDecay.hh" 34 #include "G4SFDecay.hh" 35 #include "G4fissionEvent.hh" 35 #include "G4fissionEvent.hh" 36 #include "G4IonTable.hh" 36 #include "G4IonTable.hh" 37 #include "G4ThreeVector.hh" 37 #include "G4ThreeVector.hh" 38 #include "G4LorentzVector.hh" 38 #include "G4LorentzVector.hh" 39 #include "G4DynamicParticle.hh" 39 #include "G4DynamicParticle.hh" 40 #include "G4DecayProducts.hh" 40 #include "G4DecayProducts.hh" 41 #include "G4Neutron.hh" 41 #include "G4Neutron.hh" 42 #include "G4Gamma.hh" 42 #include "G4Gamma.hh" 43 #include "G4SystemOfUnits.hh" 43 #include "G4SystemOfUnits.hh" 44 #include "G4PhysicalConstants.hh" 44 #include "G4PhysicalConstants.hh" 45 45 46 46 47 G4SFDecay::G4SFDecay(const G4ParticleDefinitio 47 G4SFDecay::G4SFDecay(const G4ParticleDefinition* theParentNucleus, 48 const G4double& branch, c 48 const G4double& branch, const G4double& Qvalue, 49 const G4double& excitatio 49 const G4double& excitationE, 50 const G4Ions::G4FloatLeve 50 const G4Ions::G4FloatLevelBase& flb) 51 : G4NuclearDecay("SF decay", SpFission, excit 51 : G4NuclearDecay("SF decay", SpFission, excitationE, flb), transitionQ(Qvalue) 52 { 52 { 53 SetParent(theParentNucleus); // Store name 53 SetParent(theParentNucleus); // Store name of parent nucleus, delete G4MT_parent 54 SetBR(branch); 54 SetBR(branch); 55 55 56 parentZ = theParentNucleus->GetAtomicNumber( 56 parentZ = theParentNucleus->GetAtomicNumber(); 57 parentA = theParentNucleus->GetAtomicMass(); 57 parentA = theParentNucleus->GetAtomicMass(); 58 58 59 // SetNumberOfDaughters(0); doesn't seem to 59 // SetNumberOfDaughters(0); doesn't seem to work 60 // Set to 1 for now 60 // Set to 1 for now 61 // When we later install proper fragment gene 61 // When we later install proper fragment generation, set this to 2 62 // and modify Z and A in DecayIt() 62 // and modify Z and A in DecayIt() 63 SetNumberOfDaughters(1); 63 SetNumberOfDaughters(1); 64 G4IonTable* theIonTable = 64 G4IonTable* theIonTable = 65 (G4IonTable*)(G4ParticleTable::GetParticle 65 (G4IonTable*)(G4ParticleTable::GetParticleTable()->GetIonTable()); 66 SetDaughter(0, theIonTable->GetIon(parentZ, 66 SetDaughter(0, theIonTable->GetIon(parentZ, parentA, excitationE, flb) ); 67 } 67 } 68 68 69 69 70 G4SFDecay::~G4SFDecay() 70 G4SFDecay::~G4SFDecay() 71 {} 71 {} 72 72 73 73 74 G4DecayProducts* G4SFDecay::DecayIt(G4double) 74 G4DecayProducts* G4SFDecay::DecayIt(G4double) 75 { 75 { 76 // Fill G4MT_parent with theParentNucleus (s 76 // Fill G4MT_parent with theParentNucleus (stored by SetParent in ctor) 77 CheckAndFillParent(); 77 CheckAndFillParent(); 78 78 79 // Set up final state 79 // Set up final state 80 // parentParticle is set at rest here becaus 80 // parentParticle is set at rest here because boost with correct momentum 81 // is done later 81 // is done later 82 G4LorentzVector atRest(G4MT_parent->GetPDGMa 82 G4LorentzVector atRest(G4MT_parent->GetPDGMass(), 83 G4ThreeVector(0.,0.,0 83 G4ThreeVector(0.,0.,0.) ); 84 G4DynamicParticle parentParticle(G4MT_parent 84 G4DynamicParticle parentParticle(G4MT_parent, atRest); 85 G4DecayProducts* products = new G4DecayProdu 85 G4DecayProducts* products = new G4DecayProducts(parentParticle); 86 86 87 // Generate LLNL code for parent nucleus 87 // Generate LLNL code for parent nucleus 88 G4int code = 1000*G4MT_parent->GetAtomicNumb 88 G4int code = 1000*G4MT_parent->GetAtomicNumber() + 89 G4MT_parent->GetAtomicMass 89 G4MT_parent->GetAtomicMass(); 90 90 91 // Let G4fissionEvent do the decay 91 // Let G4fissionEvent do the decay 92 // Argument 2 : time, passed through to set 92 // Argument 2 : time, passed through to set time of secondary 93 // Argument 3 : nubar, when set to -1, selec 93 // Argument 3 : nubar, when set to -1, selects spontaneous fission 94 // Argument 4 : energy used in Watt spectrum 94 // Argument 4 : energy used in Watt spectrum 95 G4fissionEvent aFission(code, 10.0, -1, 0.); 95 G4fissionEvent aFission(code, 10.0, -1, 0.); 96 G4int nNeut = aFission.getNeutronNu(); 96 G4int nNeut = aFission.getNeutronNu(); 97 G4int nGam = aFission.getPhotonNu(); 97 G4int nGam = aFission.getPhotonNu(); 98 98 99 G4DynamicParticle* dynPart = 0; 99 G4DynamicParticle* dynPart = 0; 100 G4ThreeVector direction(0.,0.,0.); 100 G4ThreeVector direction(0.,0.,0.); 101 G4double KE = 0.; // energy from generator 101 G4double KE = 0.; // energy from generator is in MeV 102 102 103 if (nNeut > 0) { 103 if (nNeut > 0) { 104 // Put neutrons on the stack 104 // Put neutrons on the stack 105 for (G4int i = 0; i < nNeut; i++) { 105 for (G4int i = 0; i < nNeut; i++) { 106 KE = aFission.getNeutronEnergy(i); 106 KE = aFission.getNeutronEnergy(i); 107 direction.setX(aFission.getNeutronDircos 107 direction.setX(aFission.getNeutronDircosu(i) ); 108 direction.setY(aFission.getNeutronDircos 108 direction.setY(aFission.getNeutronDircosv(i) ); 109 direction.setZ(aFission.getNeutronDircos 109 direction.setZ(aFission.getNeutronDircosw(i) ); 110 110 111 dynPart = new G4DynamicParticle(G4Neutro 111 dynPart = new G4DynamicParticle(G4Neutron::Neutron(), direction, KE); 112 112 113 // Not needed - time comes from parent t 113 // Not needed - time comes from parent track 114 // dynPart->SetProperTime(aFission.getNe 114 // dynPart->SetProperTime(aFission.getNeutronAge(i) ); 115 115 116 products->PushProducts(dynPart); 116 products->PushProducts(dynPart); 117 } 117 } 118 118 119 // Put gammas on the stack 119 // Put gammas on the stack 120 for (G4int i = 0; i < nGam; i++) { 120 for (G4int i = 0; i < nGam; i++) { 121 KE = aFission.getPhotonEnergy(i); 121 KE = aFission.getPhotonEnergy(i); 122 direction.setX(aFission.getPhotonDircosu 122 direction.setX(aFission.getPhotonDircosu(i) ); 123 direction.setY(aFission.getPhotonDircosv 123 direction.setY(aFission.getPhotonDircosv(i) ); 124 direction.setZ(aFission.getPhotonDircosw 124 direction.setZ(aFission.getPhotonDircosw(i) ); 125 125 126 dynPart = new G4DynamicParticle(G4Gamma: 126 dynPart = new G4DynamicParticle(G4Gamma::Gamma(), direction, KE); 127 127 128 // Not needed - time comes from parent t 128 // Not needed - time comes from parent track 129 // dynPart->SetProperTime(aFission.getPh 129 // dynPart->SetProperTime(aFission.getPhotonAge(i) ); 130 130 131 products->PushProducts(dynPart); 131 products->PushProducts(dynPart); 132 // No residual nucleus in this model 132 // No residual nucleus in this model 133 } 133 } 134 134 135 } else { 135 } else { 136 // No data for this isotope, return parent 136 // No data for this isotope, return parent nucleus for now 137 // G4cout << " No fission data for this iso 137 // G4cout << " No fission data for this isotope " << G4endl; 138 G4DynamicParticle* parent = 138 G4DynamicParticle* parent = 139 new G4DynamicParticle(G4MT_parent, G4Thr 139 new G4DynamicParticle(G4MT_parent, G4ThreeVector(0.,0.,0.) ); 140 products->PushProducts(parent); 140 products->PushProducts(parent); 141 } 141 } 142 142 143 // Energy conservation check not valid in th 143 // Energy conservation check not valid in this model 144 144 145 return products; 145 return products; 146 } 146 } 147 147 148 148 149 void G4SFDecay::DumpNuclearInfo() 149 void G4SFDecay::DumpNuclearInfo() 150 { 150 { 151 G4cout << " G4SFDecay for parent nucleus " < 151 G4cout << " G4SFDecay for parent nucleus " << GetParentName() << G4endl; 152 G4cout << " decays to neutrons and gammas, w 152 G4cout << " decays to neutrons and gammas, with branching ratio " << GetBR() 153 << "% and Q value " << transitionQ << 153 << "% and Q value " << transitionQ << G4endl; 154 } 154 } 155 155 156 156