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 #include "G4LENDElastic.hh" 27 #include "G4LENDElastic.hh" 28 #include "G4Pow.hh" << 29 #include "G4PhysicalConstants.hh" 28 #include "G4PhysicalConstants.hh" 30 #include "G4SystemOfUnits.hh" 29 #include "G4SystemOfUnits.hh" 31 #include "G4Nucleus.hh" 30 #include "G4Nucleus.hh" 32 #include "G4IonTable.hh" 31 #include "G4IonTable.hh" 33 32 34 //extern "C" double MyRNG(void*) { return dran << 35 //extern "C" double MyRNG(void*) { return CLH << 36 << 37 G4HadFinalState * G4LENDElastic::ApplyYourself 33 G4HadFinalState * G4LENDElastic::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aTarg ) 38 { 34 { 39 35 40 G4double temp = aTrack.GetMaterial()->GetTe 36 G4double temp = aTrack.GetMaterial()->GetTemperature(); 41 37 42 //G4int iZ = int ( aTarg.GetZ() ); 38 //G4int iZ = int ( aTarg.GetZ() ); 43 //G4int iA = int ( aTarg.GetN() ); 39 //G4int iA = int ( aTarg.GetN() ); 44 //migrate to integer A and Z (GetN_asInt re 40 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this) 45 G4int iZ = aTarg.GetZ_asInt(); 41 G4int iZ = aTarg.GetZ_asInt(); 46 G4int iA = aTarg.GetA_asInt(); 42 G4int iA = aTarg.GetA_asInt(); 47 G4int iM = 0; 43 G4int iM = 0; 48 if ( aTarg.GetIsotope() != NULL ) { 44 if ( aTarg.GetIsotope() != NULL ) { 49 iM = aTarg.GetIsotope()->Getm(); 45 iM = aTarg.GetIsotope()->Getm(); 50 } 46 } 51 47 52 G4double ke = aTrack.GetKineticEnergy(); 48 G4double ke = aTrack.GetKineticEnergy(); 53 49 >> 50 //G4HadFinalState* theResult = new G4HadFinalState(); 54 G4HadFinalState* theResult = &theParticleCh 51 G4HadFinalState* theResult = &theParticleChange; 55 theResult->Clear(); 52 theResult->Clear(); 56 53 57 G4GIDI_target* aTarget = get_target_from_ma << 54 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA , iM ) )->second->GetTarget(); 58 if ( aTarget == NULL ) return returnUnchang << 55 G4double aMu = aTarget->getElasticFinalState( ke*MeV, temp, NULL, NULL ); 59 << 60 G4double aMu = aTarget->getElasticFinalStat << 61 56 62 G4double phi = twopi*G4UniformRand(); 57 G4double phi = twopi*G4UniformRand(); 63 G4double theta = std::acos( aMu ); 58 G4double theta = std::acos( aMu ); 64 //G4double sinth = std::sin( theta ); 59 //G4double sinth = std::sin( theta ); 65 60 66 G4ReactionProduct theNeutron( aTrack.GetDef << 61 G4ReactionProduct theNeutron( const_cast<G4ParticleDefinition *>( aTrack.GetDefinition() ) ); 67 theNeutron.SetMomentum( aTrack.Get4Momentum 62 theNeutron.SetMomentum( aTrack.Get4Momentum().vect() ); 68 theNeutron.SetKineticEnergy( ke ); 63 theNeutron.SetKineticEnergy( ke ); 69 64 70 //G4ParticleDefinition* pd = G4IonTable::Ge << 65 //G4cout << "iZ " << iZ << " iA " << iA << G4endl; 71 //TK 170509 Fix for the case of excited iso << 66 72 G4double EE = 0.0; << 67 G4ReactionProduct theTarget( G4IonTable::GetIonTable()->FindIon( iZ , iA , iM ) ); 73 if ( iM != 0 ) { << 74 G4LENDManager::GetInstance()->GetExcitat << 75 } << 76 G4ParticleDefinition* target_pd = G4IonTabl << 77 G4ReactionProduct theTarget( target_pd ); << 78 68 79 G4double mass = target_pd->GetPDGMass(); << 69 G4double mass = G4IonTable::GetIonTable()->FindIon( iZ , iA , iM )->GetPDGMass(); 80 70 81 // add Thermal motion 71 // add Thermal motion 82 G4double kT = k_Boltzmann*temp; 72 G4double kT = k_Boltzmann*temp; 83 G4ThreeVector v ( G4RandGauss::shoot() * st 73 G4ThreeVector v ( G4RandGauss::shoot() * std::sqrt( kT*mass ) 84 , G4RandGauss::shoot() * st 74 , G4RandGauss::shoot() * std::sqrt( kT*mass ) 85 , G4RandGauss::shoot() * st 75 , G4RandGauss::shoot() * std::sqrt( kT*mass ) ); 86 theTarget.SetMomentum( v ); 76 theTarget.SetMomentum( v ); 87 77 88 G4ThreeVector the3Neutron = theNeutron.Ge 78 G4ThreeVector the3Neutron = theNeutron.GetMomentum(); 89 G4double nEnergy = theNeutron.GetTotalEne 79 G4double nEnergy = theNeutron.GetTotalEnergy(); 90 G4ThreeVector the3Target = theTarget.GetM 80 G4ThreeVector the3Target = theTarget.GetMomentum(); 91 G4double tEnergy = theTarget.GetTotalEner 81 G4double tEnergy = theTarget.GetTotalEnergy(); 92 G4ReactionProduct theCMS; 82 G4ReactionProduct theCMS; 93 G4double totE = nEnergy+tEnergy; 83 G4double totE = nEnergy+tEnergy; 94 G4ThreeVector the3CMS = the3Target+the3Ne 84 G4ThreeVector the3CMS = the3Target+the3Neutron; 95 theCMS.SetMomentum(the3CMS); 85 theCMS.SetMomentum(the3CMS); 96 G4double cmsMom = std::sqrt(the3CMS*the3C 86 G4double cmsMom = std::sqrt(the3CMS*the3CMS); 97 G4double sqrts = std::sqrt((totE-cmsMom)* 87 G4double sqrts = std::sqrt((totE-cmsMom)*(totE+cmsMom)); 98 theCMS.SetMass(sqrts); 88 theCMS.SetMass(sqrts); 99 theCMS.SetTotalEnergy(totE); 89 theCMS.SetTotalEnergy(totE); 100 90 101 theNeutron.Lorentz(theNeutron, theCMS); 91 theNeutron.Lorentz(theNeutron, theCMS); 102 theTarget.Lorentz(theTarget, theCMS); 92 theTarget.Lorentz(theTarget, theCMS); 103 G4double en = theNeutron.GetTotalMoment 93 G4double en = theNeutron.GetTotalMomentum(); // already in CMS. 104 G4ThreeVector cms3Mom=theNeutron.GetMom 94 G4ThreeVector cms3Mom=theNeutron.GetMomentum(); // for neutron direction in CMS 105 G4double cms_theta=cms3Mom.theta(); 95 G4double cms_theta=cms3Mom.theta(); 106 G4double cms_phi=cms3Mom.phi(); 96 G4double cms_phi=cms3Mom.phi(); 107 G4ThreeVector tempVector; 97 G4ThreeVector tempVector; 108 tempVector.setX( std::cos(theta)*std::s 98 tempVector.setX( std::cos(theta)*std::sin(cms_theta)*std::cos(cms_phi) 109 +std::sin(theta)*std::c 99 +std::sin(theta)*std::cos(phi)*std::cos(cms_theta)*std::cos(cms_phi) 110 -std::sin(theta)*std::s 100 -std::sin(theta)*std::sin(phi)*std::sin(cms_phi) ); 111 tempVector.setY( std::cos(theta)*std::s 101 tempVector.setY( std::cos(theta)*std::sin(cms_theta)*std::sin(cms_phi) 112 +std::sin(theta)*std::c 102 +std::sin(theta)*std::cos(phi)*std::cos(cms_theta)*std::sin(cms_phi) 113 +std::sin(theta)*std::s 103 +std::sin(theta)*std::sin(phi)*std::cos(cms_phi) ); 114 tempVector.setZ( std::cos(theta)*std::c 104 tempVector.setZ( std::cos(theta)*std::cos(cms_theta) 115 -std::sin(theta)*std::c 105 -std::sin(theta)*std::cos(phi)*std::sin(cms_theta) ); 116 tempVector *= en; 106 tempVector *= en; 117 theNeutron.SetMomentum(tempVector); 107 theNeutron.SetMomentum(tempVector); 118 theTarget.SetMomentum(-tempVector); 108 theTarget.SetMomentum(-tempVector); 119 G4double tP = theTarget.GetTotalMomentu 109 G4double tP = theTarget.GetTotalMomentum(); 120 G4double tM = theTarget.GetMass(); 110 G4double tM = theTarget.GetMass(); 121 theTarget.SetTotalEnergy(std::sqrt((tP+ 111 theTarget.SetTotalEnergy(std::sqrt((tP+tM)*(tP+tM)-2.*tP*tM)); 122 112 123 113 124 theNeutron.Lorentz(theNeutron, -1.*theCM << 114 theNeutron.Lorentz(theNeutron, -1.*theCMS); 125 theTarget.Lorentz(theTarget, -1.*theCMS) << 126 115 127 //110913 Add Protection for very low energy (1 116 //110913 Add Protection for very low energy (1e-6eV) scattering 128 if ( theNeutron.GetKineticEnergy() <= 0 117 if ( theNeutron.GetKineticEnergy() <= 0 ) 129 { 118 { 130 theNeutron.SetTotalEnergy ( theNeutro << 119 theNeutron.SetTotalEnergy ( theNeutron.GetMass() * ( 1 + std::pow( 10 , -15.65 ) ) ); 131 } 120 } 132 121 >> 122 theTarget.Lorentz(theTarget, -1.*theCMS); 133 if ( theTarget.GetKineticEnergy() < 0 ) 123 if ( theTarget.GetKineticEnergy() < 0 ) 134 { 124 { 135 theTarget.SetTotalEnergy ( theTarget. << 125 theTarget.SetTotalEnergy ( theTarget.GetMass() * ( 1 + std::pow( 10 , -15.65 ) ) ); 136 } 126 } 137 //110913 END 127 //110913 END 138 128 >> 129 theTarget.Lorentz(theTarget, -1.*theCMS); >> 130 139 theResult->SetEnergyChange(theNeutron.Get 131 theResult->SetEnergyChange(theNeutron.GetKineticEnergy()); 140 theResult->SetMomentumChange(theNeutron.G 132 theResult->SetMomentumChange(theNeutron.GetMomentum().unit()); 141 G4DynamicParticle* theRecoil = new G4Dyna 133 G4DynamicParticle* theRecoil = new G4DynamicParticle; 142 134 143 theRecoil->SetDefinition( target_pd ); << 135 // theRecoil->SetDefinition( ionTable->GetIon( iZ , iA ) ); >> 136 theRecoil->SetDefinition( G4IonTable::GetIonTable()->FindIon( iZ, iA , iM )); 144 theRecoil->SetMomentum( theTarget.GetMome 137 theRecoil->SetMomentum( theTarget.GetMomentum() ); 145 theResult->AddSecondary( theRecoil, secID << 138 >> 139 theResult->AddSecondary( theRecoil ); 146 140 147 return theResult; 141 return theResult; 148 142 149 } 143 } 150 144 151 145