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 "G4LENDCapture.hh" 27 #include "G4LENDCapture.hh" 28 #include "G4Fragment.hh" << 29 #include "G4PhotonEvaporation.hh" << 30 #include "G4SystemOfUnits.hh" 28 #include "G4SystemOfUnits.hh" 31 #include "G4Nucleus.hh" 29 #include "G4Nucleus.hh" 32 #include "G4ParticleTable.hh" 30 #include "G4ParticleTable.hh" 33 #include "G4IonTable.hh" << 34 31 35 G4HadFinalState * G4LENDCapture::ApplyYourself 32 G4HadFinalState * G4LENDCapture::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& aTarg ) 36 { 33 { 37 34 38 G4double temp = aTrack.GetMaterial()->GetTe 35 G4double temp = aTrack.GetMaterial()->GetTemperature(); 39 36 40 //G4int iZ = int ( aTarg.GetZ() ); 37 //G4int iZ = int ( aTarg.GetZ() ); 41 //G4int iA = int ( aTarg.GetN() ); 38 //G4int iA = int ( aTarg.GetN() ); 42 //migrate to integer A and Z (GetN_asInt re 39 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this) 43 G4int iZ = aTarg.GetZ_asInt(); 40 G4int iZ = aTarg.GetZ_asInt(); 44 G4int iA = aTarg.GetA_asInt(); 41 G4int iA = aTarg.GetA_asInt(); 45 G4int iM = 0; 42 G4int iM = 0; 46 if ( aTarg.GetIsotope() != NULL ) { 43 if ( aTarg.GetIsotope() != NULL ) { 47 iM = aTarg.GetIsotope()->Getm(); 44 iM = aTarg.GetIsotope()->Getm(); 48 } 45 } 49 46 50 G4double ke = aTrack.GetKineticEnergy(); 47 G4double ke = aTrack.GetKineticEnergy(); 51 48 52 G4HadFinalState* theResult = &theParticleCh 49 G4HadFinalState* theResult = &theParticleChange; 53 theResult->Clear(); 50 theResult->Clear(); 54 51 55 G4GIDI_target* aTarget = get_target_from_ma << 52 G4GIDI_target* aTarget = usedTarget_map.find( lend_manager->GetNucleusEncoding( iZ , iA , iM ) )->second->GetTarget(); 56 if ( aTarget == NULL ) return returnUnchang << 53 std::vector<G4GIDI_Product>* products = aTarget->getCaptureFinalState( ke*MeV, temp, NULL, NULL ); 57 std::vector<G4GIDI_Product>* products = aTa << 58 54 59 G4int ipZ = aTrack.GetDefinition()->GetAtom << 60 G4int ipA = aTrack.GetDefinition()->GetAtom << 61 55 62 G4bool needResidual=true; << 63 << 64 G4ThreeVector p(0,0,0); << 65 if ( products != NULL ) 56 if ( products != NULL ) 66 { 57 { 67 58 >> 59 G4ThreeVector p(0,0,0); 68 G4int totN = 0; 60 G4int totN = 0; 69 61 70 for ( G4int j = 0; j < int( products->si 62 for ( G4int j = 0; j < int( products->size() ); j++ ) 71 { 63 { 72 G4int jZ = (*products)[j].Z; 64 G4int jZ = (*products)[j].Z; 73 G4int jA = (*products)[j].A; 65 G4int jA = (*products)[j].A; 74 66 75 //G4cout << "ZA = " << 1000 * (*produ 67 //G4cout << "ZA = " << 1000 * (*products)[j].Z + (*products)[j].A << " EK = " 76 // << (*products)[j].kineticEnerg 68 // << (*products)[j].kineticEnergy 77 // << " px " << (*products)[j]. 69 // << " px " << (*products)[j].px 78 // << " py " << (*products)[j]. 70 // << " py " << (*products)[j].py 79 // << " pz " << (*products)[j]. 71 // << " pz " << (*products)[j].pz 80 // << G4endl; 72 // << G4endl; 81 73 82 if ( jZ == iZ + ipZ && jA == iA + ipA << 83 << 84 G4ThreeVector dp((*products)[j].px,(* 74 G4ThreeVector dp((*products)[j].px,(*products)[j].py,(*products)[j].pz); 85 p += dp; 75 p += dp; 86 76 87 G4DynamicParticle* theSec = new G4Dyn 77 G4DynamicParticle* theSec = new G4DynamicParticle; 88 78 89 if ( jA == 1 && jZ == 1 ) { << 79 if ( jA == 1 && jZ == 1 ) >> 80 { 90 theSec->SetDefinition( G4Proton::P 81 theSec->SetDefinition( G4Proton::Proton() ); 91 totN += 1; 82 totN += 1; 92 } 83 } 93 else if ( jA == 1 && jZ == 0 ) 84 else if ( jA == 1 && jZ == 0 ) 94 { 85 { 95 theSec->SetDefinition( G4Neutron:: 86 theSec->SetDefinition( G4Neutron::Neutron() ); 96 totN += 1; 87 totN += 1; 97 } 88 } 98 else if ( jZ > 0 ) { << 89 else if ( jZ > 0 ) >> 90 { 99 if ( jA != 0 ) 91 if ( jA != 0 ) 100 { 92 { 101 theSec->SetDefinition( G4IonTab << 93 theSec->SetDefinition( G4ParticleTable::GetParticleTable()->FindIon( jZ , jA , 0 , 0 ) ); 102 totN += jA; 94 totN += jA; 103 } 95 } 104 else 96 else 105 { 97 { 106 theSec->SetDefinition( G4IonTab << 98 theSec->SetDefinition( G4ParticleTable::GetParticleTable()->FindIon( jZ , iA+1-totN , 0 , 0 ) ); 107 } 99 } 108 } 100 } 109 else { << 101 else >> 102 { 110 theSec->SetDefinition( G4Gamma::Ga 103 theSec->SetDefinition( G4Gamma::Gamma() ); 111 } 104 } 112 105 113 theSec->SetMomentum( G4ThreeVector( ( 106 theSec->SetMomentum( G4ThreeVector( (*products)[j].px*MeV , (*products)[j].py*MeV , (*products)[j].pz*MeV ) ); 114 107 115 /* << 116 if ( dp.mag() == 0 ) 108 if ( dp.mag() == 0 ) 117 { 109 { 118 //theSec->SetMomentum( -p*MeV ); << 110 theSec->SetMomentum( -p*MeV ); 119 } 111 } 120 */ << 121 112 122 theResult->AddSecondary( theSec, secI << 113 theResult->AddSecondary( theSec ); 123 } 114 } 124 } 115 } 125 else << 126 { << 127 << 128 //For the case data does not provide fin << 129 << 130 //G4cout << "products != NULL; iZ = " << << 131 << 132 // TK comment << 133 // aTarg->ReturnTargetParticle()->Get4Mo << 134 G4Fragment nucleus( iA + ipA , iZ + ipZ << 135 G4PhotonEvaporation photonEvaporation; << 136 photonEvaporation.SetICM( TRUE ); << 137 G4FragmentVector* products_from_PE = pho << 138 G4FragmentVector::iterator it; << 139 << 140 for (it = products_from_PE->begin(); it << 141 { << 142 if ( (*it)->GetZ_asInt() == iZ + ipZ << 143 G4DynamicParticle* theSec = new G4Dyn << 144 if ( (*it)->GetParticleDefinition() ! << 145 //G4cout << (*it)->GetParticleDefi << 146 theSec->SetDefinition( (*it)->GetP << 147 theSec->Set4Momentum( (*it)->GetMo << 148 } else { << 149 //G4cout << (*it)->GetZ_asInt() << << 150 theSec->SetDefinition( G4IonTable: << 151 theSec->Set4Momentum( (*it)->GetMo << 152 } << 153 theResult->AddSecondary( theSec, secI << 154 } << 155 delete products_from_PE; << 156 } << 157 << 158 //if necessary, generate residual nucleus << 159 if ( needResidual ) { << 160 G4DynamicParticle* residual = new G4Dyna << 161 residual->SetDefinition( G4IonTable::Get << 162 residual->SetMomentum( -p*MeV ); << 163 theResult->AddSecondary( residual, secID << 164 } << 165 << 166 delete products; 116 delete products; 167 117 168 theResult->SetStatusChange( stopAndKill ); 118 theResult->SetStatusChange( stopAndKill ); 169 119 170 return theResult; 120 return theResult; 171 121 172 } 122 } 173 123