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 // 080505 Fixed and changed sampling method of 26 // 080505 Fixed and changed sampling method of impact parameter by T. Koi 27 // 080602 Fix memory leaks by T. Koi 27 // 080602 Fix memory leaks by T. Koi 28 // 080612 Delete unnecessary dependency and un 28 // 080612 Delete unnecessary dependency and unused functions 29 // Change criterion of reaction by T. K 29 // Change criterion of reaction by T. Koi 30 // 081107 Add UnUseGEM (then use the default c 30 // 081107 Add UnUseGEM (then use the default channel of G4Evaporation) 31 // UseFrag (chage criterion of a in 31 // UseFrag (chage criterion of a inelastic reaction) 32 // Fix bug in nucleon projectiles by T 32 // Fix bug in nucleon projectiles by T. Koi 33 // 090122 Be8 -> Alpha + Alpha 33 // 090122 Be8 -> Alpha + Alpha 34 // 090331 Change member shenXS and genspaXS ob 34 // 090331 Change member shenXS and genspaXS object to pointer 35 // 091119 Fix for incidence of neutral particl 35 // 091119 Fix for incidence of neutral particles 36 // 36 // 37 #include "G4QMDReaction.hh" 37 #include "G4QMDReaction.hh" 38 #include "G4QMDNucleus.hh" 38 #include "G4QMDNucleus.hh" 39 #include "G4QMDGroundStateNucleus.hh" 39 #include "G4QMDGroundStateNucleus.hh" 40 #include "G4Pow.hh" << 41 #include "G4PhysicalConstants.hh" << 42 #include "G4SystemOfUnits.hh" << 43 #include "G4NistManager.hh" << 44 << 45 #include "G4CrossSectionDataSetRegistry.hh" << 46 #include "G4BGGPionElasticXS.hh" << 47 #include "G4BGGPionInelasticXS.hh" << 48 #include "G4VCrossSectionDataSet.hh" << 49 #include "G4CrossSectionInelastic.hh" << 50 #include "G4ComponentGGNuclNuclXsc.hh" << 51 #include "G4PhysicsModelCatalog.hh" << 52 40 >> 41 #include "G4NistManager.hh" 53 42 54 G4QMDReaction::G4QMDReaction() 43 G4QMDReaction::G4QMDReaction() 55 : G4HadronicInteraction("QMDModel") << 44 : system ( NULL ) 56 , system ( NULL ) << 57 , deltaT ( 1 ) // in fsec (c=1) 45 , deltaT ( 1 ) // in fsec (c=1) 58 , maxTime ( 100 ) // will have maxTime-th time 46 , maxTime ( 100 ) // will have maxTime-th time step 59 , envelopF ( 1.05 ) // 10% for Peripheral reac 47 , envelopF ( 1.05 ) // 10% for Peripheral reactions 60 , gem ( true ) 48 , gem ( true ) 61 , frag ( false ) 49 , frag ( false ) 62 , secID( -1 ) << 63 { 50 { 64 theXS = new G4CrossSectionInelastic( new G4 << 65 pipElNucXS = new G4BGGPionElasticXS(G4PionP << 66 pipElNucXS->BuildPhysicsTable(*(G4PionPlus: << 67 << 68 pimElNucXS = new G4BGGPionElasticXS(G4PionM << 69 pimElNucXS->BuildPhysicsTable(*(G4PionMinus << 70 << 71 pipInelNucXS = new G4BGGPionInelasticXS(G4P << 72 pipInelNucXS->BuildPhysicsTable(*(G4PionPlu << 73 << 74 pimInelNucXS = new G4BGGPionInelasticXS(G4P << 75 pimInelNucXS->BuildPhysicsTable(*(G4PionMin << 76 51 >> 52 //090331 >> 53 shenXS = new G4IonsShenCrossSection(); >> 54 //genspaXS = new G4GeneralSpaceNNCrossSection(); >> 55 piNucXS = new G4PiNuclearCrossSection(); 77 meanField = new G4QMDMeanField(); 56 meanField = new G4QMDMeanField(); 78 collision = new G4QMDCollision(); 57 collision = new G4QMDCollision(); 79 58 80 excitationHandler = new G4ExcitationHandler << 59 excitationHandler = new G4ExcitationHandler; >> 60 evaporation = new G4Evaporation; >> 61 excitationHandler->SetEvaporation( evaporation ); 81 setEvaporationCh(); 62 setEvaporationCh(); 82 << 83 coulomb_collision_gamma_proj = 0.0; << 84 coulomb_collision_rx_proj = 0.0; << 85 coulomb_collision_rz_proj = 0.0; << 86 coulomb_collision_px_proj = 0.0; << 87 coulomb_collision_pz_proj = 0.0; << 88 << 89 coulomb_collision_gamma_targ = 0.0; << 90 coulomb_collision_rx_targ = 0.0; << 91 coulomb_collision_rz_targ = 0.0; << 92 coulomb_collision_px_targ = 0.0; << 93 coulomb_collision_pz_targ = 0.0; << 94 << 95 secID = G4PhysicsModelCatalog::GetModelID( << 96 } 63 } 97 64 98 65 >> 66 99 G4QMDReaction::~G4QMDReaction() 67 G4QMDReaction::~G4QMDReaction() 100 { 68 { >> 69 delete evaporation; 101 delete excitationHandler; 70 delete excitationHandler; 102 delete collision; 71 delete collision; 103 delete meanField; 72 delete meanField; 104 } 73 } 105 74 106 75 >> 76 107 G4HadFinalState* G4QMDReaction::ApplyYourself( 77 G4HadFinalState* G4QMDReaction::ApplyYourself( const G4HadProjectile & projectile , G4Nucleus & target ) 108 { 78 { 109 //G4cout << "G4QMDReaction::ApplyYourself" 79 //G4cout << "G4QMDReaction::ApplyYourself" << G4endl; 110 80 111 theParticleChange.Clear(); 81 theParticleChange.Clear(); 112 82 113 system = new G4QMDSystem; 83 system = new G4QMDSystem; 114 84 115 G4int proj_Z = 0; 85 G4int proj_Z = 0; 116 G4int proj_A = 0; 86 G4int proj_A = 0; 117 const G4ParticleDefinition* proj_pd = ( con << 87 G4ParticleDefinition* proj_pd = ( G4ParticleDefinition* ) projectile.GetDefinition(); 118 if ( proj_pd->GetParticleType() == "nucleus 88 if ( proj_pd->GetParticleType() == "nucleus" ) 119 { 89 { 120 proj_Z = proj_pd->GetAtomicNumber(); 90 proj_Z = proj_pd->GetAtomicNumber(); 121 proj_A = proj_pd->GetAtomicMass(); 91 proj_A = proj_pd->GetAtomicMass(); 122 } 92 } 123 else 93 else 124 { 94 { 125 proj_Z = (int)( proj_pd->GetPDGCharge()/ 95 proj_Z = (int)( proj_pd->GetPDGCharge()/eplus ); 126 proj_A = 1; 96 proj_A = 1; 127 } 97 } 128 //G4int targ_Z = int ( target.GetZ() + 0.5 << 98 G4int targ_Z = int ( target.GetZ() + 0.5 ); 129 //G4int targ_A = int ( target.GetN() + 0.5 << 99 G4int targ_A = int ( target.GetN() + 0.5 ); 130 //migrate to integer A and Z (GetN_asInt re << 100 G4ParticleDefinition* targ_pd = G4ParticleTable::GetParticleTable()->GetIon( targ_Z , targ_A , 0.0 ); 131 G4int targ_Z = target.GetZ_asInt(); << 132 G4int targ_A = target.GetA_asInt(); << 133 const G4ParticleDefinition* targ_pd = G4Ion << 134 101 135 102 136 //G4NistManager* nistMan = G4NistManager::I << 103 G4NistManager* nistMan = G4NistManager::Instance(); 137 // G4Element* G4NistManager::FindOrBuildElem 104 // G4Element* G4NistManager::FindOrBuildElement( targ_Z ); 138 105 139 const G4DynamicParticle* proj_dp = new G4Dy << 106 const G4DynamicParticle* proj_dp = new G4DynamicParticle ( proj_pd , projectile.Get4Momentum() ); 140 //const G4Element* targ_ele = nistMan->Fin << 107 const G4Element* targ_ele = nistMan->FindOrBuildElement( targ_Z ); 141 //G4double aTemp = projectile.GetMaterial() << 108 G4double aTemp = projectile.GetMaterial()->GetTemperature(); 142 << 109 143 // Glauber-Gribov nucleus-nucleus cross sec << 110 //090331 144 // therefore call GetElementCrossSection in << 111 145 //G4double xs_0 = theXS->GetIsoCrossSection << 112 G4VCrossSectionDataSet* theXS = shenXS; 146 G4double xs_0 = theXS->GetElementCrossSecti << 113 147 << 114 if ( proj_pd->GetParticleType() == "meson" ) theXS = piNucXS; 148 // When the projectile is a pion << 149 if (proj_pd == G4PionPlus::PionPlus() ) { << 150 xs_0 = pipElNucXS->GetElementCrossSection << 151 pipInelNucXS->GetElementCrossSecti << 152 } else if (proj_pd == G4PionMinus::PionMinu << 153 xs_0 = pimElNucXS->GetElementCrossSection << 154 pimInelNucXS->GetElementCrossSecti << 155 } << 156 115 157 //G4double xs_0 = genspaXS->GetCrossSection << 116 G4double xs_0 = theXS->GetCrossSection ( proj_dp , targ_ele , aTemp ); 158 //G4double xs_0 = theXS->GetCrossSection ( << 159 //110822 << 160 117 >> 118 //G4double xs_0 = genspaXS->GetCrossSection ( proj_dp , targ_ele , aTemp ); 161 G4double bmax_0 = std::sqrt( xs_0 / pi ); 119 G4double bmax_0 = std::sqrt( xs_0 / pi ); 162 //std::cout << "bmax_0 in fm (fermi) " << 120 //std::cout << "bmax_0 in fm (fermi) " << bmax_0/fermi << std::endl; 163 121 164 //delete proj_dp; 122 //delete proj_dp; 165 123 166 G4bool elastic = true; 124 G4bool elastic = true; 167 125 168 std::vector< G4QMDNucleus* > nucleuses; // 126 std::vector< G4QMDNucleus* > nucleuses; // Secondary nuceluses 169 G4ThreeVector boostToReac; // ReactionSyste 127 G4ThreeVector boostToReac; // ReactionSystem (CM or NN); 170 G4ThreeVector boostBackToLAB; // Reaction S 128 G4ThreeVector boostBackToLAB; // Reaction System to LAB; 171 129 172 G4LorentzVector targ4p( G4ThreeVector( 0.0 130 G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ_pd->GetPDGMass()/GeV ); 173 G4ThreeVector boostLABtoCM = targ4p.findBoo 131 G4ThreeVector boostLABtoCM = targ4p.findBoostToCM( proj_dp->Get4Momentum()/GeV ); // CM of target and proj; 174 132 175 G4double p1 = proj_dp->GetMomentum().mag()/ 133 G4double p1 = proj_dp->GetMomentum().mag()/GeV/proj_A; 176 G4double m1 = proj_dp->GetDefinition()->Get 134 G4double m1 = proj_dp->GetDefinition()->GetPDGMass()/GeV/proj_A; 177 G4double e1 = std::sqrt( p1*p1 + m1*m1 ); 135 G4double e1 = std::sqrt( p1*p1 + m1*m1 ); 178 G4double e2 = targ_pd->GetPDGMass()/GeV/tar 136 G4double e2 = targ_pd->GetPDGMass()/GeV/targ_A; 179 G4double beta_nn = -p1 / ( e1+e2 ); 137 G4double beta_nn = -p1 / ( e1+e2 ); 180 138 181 G4ThreeVector boostLABtoNN ( 0. , 0. , beta 139 G4ThreeVector boostLABtoNN ( 0. , 0. , beta_nn ); // CM of NN; 182 140 183 G4double beta_nncm = ( - boostLABtoCM.beta( 141 G4double beta_nncm = ( - boostLABtoCM.beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.beta() * boostLABtoNN.beta() ) ; 184 142 185 //std::cout << targ4p << std::endl; 143 //std::cout << targ4p << std::endl; 186 //std::cout << proj_dp->Get4Momentum()<< st 144 //std::cout << proj_dp->Get4Momentum()<< std::endl; 187 //std::cout << beta_nncm << std::endl; 145 //std::cout << beta_nncm << std::endl; 188 G4ThreeVector boostNNtoCM( 0. , 0. , beta_n 146 G4ThreeVector boostNNtoCM( 0. , 0. , beta_nncm ); // 189 G4ThreeVector boostCMtoNN( 0. , 0. , -beta_ 147 G4ThreeVector boostCMtoNN( 0. , 0. , -beta_nncm ); // 190 148 191 boostToReac = boostLABtoNN; 149 boostToReac = boostLABtoNN; 192 boostBackToLAB = -boostLABtoNN; 150 boostBackToLAB = -boostLABtoNN; 193 151 194 delete proj_dp; 152 delete proj_dp; 195 153 196 G4int icounter = 0; << 154 while ( elastic ) 197 G4int icounter_max = 1024; << 155 { 198 while ( elastic ) // Loop checking, 11.03.2 << 199 { << 200 icounter++; << 201 if ( icounter > icounter_max ) { << 202 G4cout << "Loop-counter exceeded the thresh << 203 break; << 204 } << 205 156 206 // impact parameter 157 // impact parameter 207 //G4double bmax = 1.05*(bmax_0/fermi); 158 //G4double bmax = 1.05*(bmax_0/fermi); // 10% for Peripheral reactions 208 G4double bmax = envelopF*(bmax_0/fermi); 159 G4double bmax = envelopF*(bmax_0/fermi); 209 G4double b = bmax * std::sqrt ( G4Unifor 160 G4double b = bmax * std::sqrt ( G4UniformRand() ); 210 //071112 161 //071112 211 //G4double b = 0; 162 //G4double b = 0; 212 //G4double b = bmax; 163 //G4double b = bmax; 213 //G4double b = bmax/1.05 * 0.7 * G4Unifo 164 //G4double b = bmax/1.05 * 0.7 * G4UniformRand(); 214 165 215 //G4cout << "G4QMDRESULT bmax_0 = " << b 166 //G4cout << "G4QMDRESULT bmax_0 = " << bmax_0/fermi << " fm, bmax = " << bmax << " fm , b = " << b << " fm " << G4endl; 216 167 217 G4double plab = projectile.GetTotalMomen 168 G4double plab = projectile.GetTotalMomentum()/GeV; 218 G4double elab = ( projectile.GetKineticE 169 G4double elab = ( projectile.GetKineticEnergy() + proj_pd->GetPDGMass() + targ_pd->GetPDGMass() )/GeV; 219 170 220 calcOffSetOfCollision( b , proj_pd , tar 171 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN ); 221 172 222 // Projectile 173 // Projectile 223 G4LorentzVector proj4pLAB = projectile.G 174 G4LorentzVector proj4pLAB = projectile.Get4Momentum()/GeV; 224 175 225 G4QMDGroundStateNucleus* proj(NULL); 176 G4QMDGroundStateNucleus* proj(NULL); 226 if ( projectile.GetDefinition()->GetPart 177 if ( projectile.GetDefinition()->GetParticleType() == "nucleus" 227 || projectile.GetDefinition()->GetPart 178 || projectile.GetDefinition()->GetParticleName() == "proton" 228 || projectile.GetDefinition()->GetPart 179 || projectile.GetDefinition()->GetParticleName() == "neutron" ) 229 { 180 { 230 181 231 proj_Z = proj_pd->GetAtomicNumber(); 182 proj_Z = proj_pd->GetAtomicNumber(); 232 proj_A = proj_pd->GetAtomicMass(); 183 proj_A = proj_pd->GetAtomicMass(); 233 184 234 proj = new G4QMDGroundStateNucleus( p 185 proj = new G4QMDGroundStateNucleus( proj_Z , proj_A ); 235 //proj->ShowParticipants(); 186 //proj->ShowParticipants(); 236 187 237 188 238 meanField->SetSystem ( proj ); 189 meanField->SetSystem ( proj ); 239 proj->SetTotalPotential( meanField->G 190 proj->SetTotalPotential( meanField->GetTotalPotential() ); 240 proj->CalEnergyAndAngularMomentumInCM 191 proj->CalEnergyAndAngularMomentumInCM(); 241 192 242 } 193 } 243 194 244 // Target 195 // Target 245 //G4int iz = int ( target.GetZ() ); << 196 G4int iz = int ( target.GetZ() ); 246 //G4int ia = int ( target.GetN() ); << 197 G4int ia = int ( target.GetN() ); 247 //migrate to integer A and Z (GetN_asInt << 248 G4int iz = int ( target.GetZ_asInt() ); << 249 G4int ia = int ( target.GetA_asInt() ); << 250 198 251 G4QMDGroundStateNucleus* targ = new G4QM 199 G4QMDGroundStateNucleus* targ = new G4QMDGroundStateNucleus( iz , ia ); 252 200 253 meanField->SetSystem (targ ); 201 meanField->SetSystem (targ ); 254 targ->SetTotalPotential( meanField->GetT 202 targ->SetTotalPotential( meanField->GetTotalPotential() ); 255 targ->CalEnergyAndAngularMomentumInCM(); 203 targ->CalEnergyAndAngularMomentumInCM(); 256 204 257 //G4LorentzVector targ4p( G4ThreeVector( 205 //G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ->GetNuclearMass()/GeV ); 258 // Boost Vector to CM 206 // Boost Vector to CM 259 //boostToCM = targ4p.findBoostToCM( proj 207 //boostToCM = targ4p.findBoostToCM( proj4pLAB ); 260 208 261 // Target 209 // Target 262 for ( G4int i = 0 ; i < targ->GetTotalNu 210 for ( G4int i = 0 ; i < targ->GetTotalNumberOfParticipant() ; i++ ) 263 { 211 { 264 212 265 G4ThreeVector p0 = targ->GetParticipa 213 G4ThreeVector p0 = targ->GetParticipant( i )->GetMomentum(); 266 G4ThreeVector r0 = targ->GetParticipa 214 G4ThreeVector r0 = targ->GetParticipant( i )->GetPosition(); 267 215 268 G4ThreeVector p ( p0.x() + coulomb_co 216 G4ThreeVector p ( p0.x() + coulomb_collision_px_targ 269 , p0.y() 217 , p0.y() 270 , p0.z() * coulomb_co 218 , p0.z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ ); 271 219 272 G4ThreeVector r ( r0.x() + coulomb_co 220 G4ThreeVector r ( r0.x() + coulomb_collision_rx_targ 273 , r0.y() 221 , r0.y() 274 , r0.z() / coulomb_co 222 , r0.z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ ); 275 223 276 system->SetParticipant( new G4QMDPart 224 system->SetParticipant( new G4QMDParticipant( targ->GetParticipant( i )->GetDefinition() , p , r ) ); 277 system->GetParticipant( i )->SetTarge 225 system->GetParticipant( i )->SetTarget(); 278 226 279 } 227 } 280 228 281 G4LorentzVector proj4pCM = CLHEP::boostO 229 G4LorentzVector proj4pCM = CLHEP::boostOf ( proj4pLAB , boostToReac ); 282 G4LorentzVector targ4pCM = CLHEP::boostO 230 G4LorentzVector targ4pCM = CLHEP::boostOf ( targ4p , boostToReac ); 283 231 284 // Projectile 232 // Projectile 285 //G4cout << "proj : " << proj << G4endl; << 233 if ( proj != NULL ) 286 //if ( proj != NULL ) << 287 if ( proj_A != 1 ) << 288 { 234 { 289 235 290 // projectile is nucleus 236 // projectile is nucleus 291 237 292 for ( G4int i = 0 ; i < proj->GetTota 238 for ( G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ ) 293 { 239 { 294 240 295 G4ThreeVector p0 = proj->GetPartic 241 G4ThreeVector p0 = proj->GetParticipant( i )->GetMomentum(); 296 G4ThreeVector r0 = proj->GetPartic 242 G4ThreeVector r0 = proj->GetParticipant( i )->GetPosition(); 297 243 298 G4ThreeVector p ( p0.x() + coulomb 244 G4ThreeVector p ( p0.x() + coulomb_collision_px_proj 299 , p0.y() 245 , p0.y() 300 , p0.z() * coulomb 246 , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj ); 301 247 302 G4ThreeVector r ( r0.x() + coulomb 248 G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj 303 , r0.y() 249 , r0.y() 304 , r0.z() / coulomb 250 , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj ); 305 251 306 system->SetParticipant( new G4QMDP 252 system->SetParticipant( new G4QMDParticipant( proj->GetParticipant( i )->GetDefinition() , p , r ) ); 307 system->GetParticipant ( i + targ- 253 system->GetParticipant ( i + targ->GetTotalNumberOfParticipant() )->SetProjectile(); 308 } 254 } 309 255 310 } 256 } 311 else 257 else 312 { 258 { 313 259 314 // projectile is particle 260 // projectile is particle 315 261 316 // avoid multiple set in "elastic" lo 262 // avoid multiple set in "elastic" loop 317 //G4cout << "system Total Participant << 318 if ( system->GetTotalNumberOfParticip 263 if ( system->GetTotalNumberOfParticipant() == targ->GetTotalNumberOfParticipant() ) 319 { 264 { 320 265 321 G4int i = targ->GetTotalNumberOfPa 266 G4int i = targ->GetTotalNumberOfParticipant(); 322 267 323 G4ThreeVector p0( 0 ); 268 G4ThreeVector p0( 0 ); 324 G4ThreeVector r0( 0 ); 269 G4ThreeVector r0( 0 ); 325 270 326 G4ThreeVector p ( p0.x() + coulomb 271 G4ThreeVector p ( p0.x() + coulomb_collision_px_proj 327 , p0.y() 272 , p0.y() 328 , p0.z() * coulomb 273 , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj ); 329 274 330 G4ThreeVector r ( r0.x() + coulomb 275 G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj 331 , r0.y() 276 , r0.y() 332 , r0.z() / coulomb 277 , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj ); 333 278 334 system->SetParticipant( new G4QMDP 279 system->SetParticipant( new G4QMDParticipant( (G4ParticleDefinition*)projectile.GetDefinition() , p , r ) ); 335 // This is not important becase on 280 // This is not important becase only 1 projectile particle. 336 system->GetParticipant ( i )->SetP 281 system->GetParticipant ( i )->SetProjectile(); 337 } 282 } 338 283 339 } 284 } 340 //system->ShowParticipants(); 285 //system->ShowParticipants(); 341 286 342 delete targ; 287 delete targ; 343 delete proj; 288 delete proj; 344 289 345 meanField->SetSystem ( system ); 290 meanField->SetSystem ( system ); 346 collision->SetMeanField ( meanField ); 291 collision->SetMeanField ( meanField ); 347 292 348 // Time Evolution 293 // Time Evolution 349 //std::cout << "Start time evolution " << s 294 //std::cout << "Start time evolution " << std::endl; 350 //system->ShowParticipants(); 295 //system->ShowParticipants(); 351 for ( G4int i = 0 ; i < maxTime ; i++ ) 296 for ( G4int i = 0 ; i < maxTime ; i++ ) 352 { 297 { 353 //G4cout << " do Paropagate " << i << " 298 //G4cout << " do Paropagate " << i << " th time step. " << G4endl; 354 meanField->DoPropagation( deltaT ); 299 meanField->DoPropagation( deltaT ); 355 //system->ShowParticipants(); 300 //system->ShowParticipants(); 356 collision->CalKinematicsOfBinaryCollisio 301 collision->CalKinematicsOfBinaryCollisions( deltaT ); 357 302 358 if ( i / 10 * 10 == i ) 303 if ( i / 10 * 10 == i ) 359 { 304 { 360 //G4cout << i << " th time step. " << 305 //G4cout << i << " th time step. " << G4endl; 361 //system->ShowParticipants(); 306 //system->ShowParticipants(); 362 } 307 } 363 //system->ShowParticipants(); 308 //system->ShowParticipants(); 364 } 309 } 365 //system->ShowParticipants(); 310 //system->ShowParticipants(); 366 311 367 312 368 //std::cout << "Doing Cluster Judgment " << 313 //std::cout << "Doing Cluster Judgment " << std::endl; 369 314 370 nucleuses = meanField->DoClusterJudgment(); 315 nucleuses = meanField->DoClusterJudgment(); 371 316 372 // Elastic Judgment 317 // Elastic Judgment 373 318 374 G4int numberOfSecondary = int ( nucleuses.s 319 G4int numberOfSecondary = int ( nucleuses.size() ) + system->GetTotalNumberOfParticipant(); 375 320 376 G4int sec_a_Z = 0; 321 G4int sec_a_Z = 0; 377 G4int sec_a_A = 0; 322 G4int sec_a_A = 0; 378 const G4ParticleDefinition* sec_a_pd = NULL << 323 G4ParticleDefinition* sec_a_pd = NULL; 379 G4int sec_b_Z = 0; 324 G4int sec_b_Z = 0; 380 G4int sec_b_A = 0; 325 G4int sec_b_A = 0; 381 const G4ParticleDefinition* sec_b_pd = NULL << 326 G4ParticleDefinition* sec_b_pd = NULL; 382 327 383 if ( numberOfSecondary == 2 ) 328 if ( numberOfSecondary == 2 ) 384 { 329 { 385 330 386 G4bool elasticLike_system = false; 331 G4bool elasticLike_system = false; 387 if ( nucleuses.size() == 2 ) 332 if ( nucleuses.size() == 2 ) 388 { 333 { 389 334 390 sec_a_Z = nucleuses[0]->GetAtomicNumb 335 sec_a_Z = nucleuses[0]->GetAtomicNumber(); 391 sec_a_A = nucleuses[0]->GetMassNumber 336 sec_a_A = nucleuses[0]->GetMassNumber(); 392 sec_b_Z = nucleuses[1]->GetAtomicNumb 337 sec_b_Z = nucleuses[1]->GetAtomicNumber(); 393 sec_b_A = nucleuses[1]->GetMassNumber 338 sec_b_A = nucleuses[1]->GetMassNumber(); 394 339 395 if ( ( sec_a_Z == proj_Z && sec_a_A = 340 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A ) 396 || ( sec_a_Z == targ_Z && sec_a_A = 341 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) ) 397 { 342 { 398 elasticLike_system = true; 343 elasticLike_system = true; 399 } 344 } 400 345 401 } 346 } 402 else if ( nucleuses.size() == 1 ) 347 else if ( nucleuses.size() == 1 ) 403 { 348 { 404 349 405 sec_a_Z = nucleuses[0]->GetAtomicNumb 350 sec_a_Z = nucleuses[0]->GetAtomicNumber(); 406 sec_a_A = nucleuses[0]->GetMassNumber 351 sec_a_A = nucleuses[0]->GetMassNumber(); 407 sec_b_pd = system->GetParticipant( 0 352 sec_b_pd = system->GetParticipant( 0 )->GetDefinition(); 408 353 409 if ( ( sec_a_Z == proj_Z && sec_a_A = 354 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd ) 410 || ( sec_a_Z == targ_Z && sec_a_A = 355 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) ) 411 { 356 { 412 elasticLike_system = true; 357 elasticLike_system = true; 413 } 358 } 414 359 415 } 360 } 416 else 361 else 417 { 362 { 418 363 419 sec_a_pd = system->GetParticipant( 0 364 sec_a_pd = system->GetParticipant( 0 )->GetDefinition(); 420 sec_b_pd = system->GetParticipant( 1 365 sec_b_pd = system->GetParticipant( 1 )->GetDefinition(); 421 366 422 if ( ( sec_a_pd == proj_pd && sec_b_p 367 if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd ) 423 || ( sec_a_pd == targ_pd && sec_b_p 368 || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) ) 424 { 369 { 425 elasticLike_system = true; 370 elasticLike_system = true; 426 } 371 } 427 372 428 } 373 } 429 374 430 if ( elasticLike_system == true ) 375 if ( elasticLike_system == true ) 431 { 376 { 432 377 433 G4bool elasticLike_energy = true; 378 G4bool elasticLike_energy = true; 434 // Cal ExcitationEnergy 379 // Cal ExcitationEnergy 435 for ( G4int i = 0 ; i < int ( nucleus 380 for ( G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ ) 436 { 381 { 437 382 438 //meanField->SetSystem( nucleuses[ 383 //meanField->SetSystem( nucleuses[i] ); 439 meanField->SetNucleus( nucleuses[i 384 meanField->SetNucleus( nucleuses[i] ); 440 //nucleuses[i]->SetTotalPotential( 385 //nucleuses[i]->SetTotalPotential( meanField->GetTotalPotential() ); 441 //nucleuses[i]->CalEnergyAndAngula 386 //nucleuses[i]->CalEnergyAndAngularMomentumInCM(); 442 387 443 if ( nucleuses[i]->GetExcitationEn 388 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false; 444 389 445 } 390 } 446 391 447 // Check Collision 392 // Check Collision 448 G4bool withCollision = true; 393 G4bool withCollision = true; 449 if ( system->GetNOCollision() == 0 ) 394 if ( system->GetNOCollision() == 0 ) withCollision = false; 450 395 451 // Final judegement for Inelasitc or Elasti 396 // Final judegement for Inelasitc or Elastic; 452 // 397 // 453 // ElasticLike without Collision 398 // ElasticLike without Collision 454 //if ( elasticLike_energy == true && 399 //if ( elasticLike_energy == true && withCollision == false ) elastic = true; // ielst = 0 455 // ElasticLike with Collision 400 // ElasticLike with Collision 456 //if ( elasticLike_energy == true && 401 //if ( elasticLike_energy == true && withCollision == true ) elastic = true; // ielst = 1 457 // InelasticLike without Collision 402 // InelasticLike without Collision 458 //if ( elasticLike_energy == false ) 403 //if ( elasticLike_energy == false ) elastic = false; // ielst = 2 459 if ( frag == true ) 404 if ( frag == true ) 460 if ( elasticLike_energy == false ) 405 if ( elasticLike_energy == false ) elastic = false; 461 // InelasticLike with Collision 406 // InelasticLike with Collision 462 if ( elasticLike_energy == false && w 407 if ( elasticLike_energy == false && withCollision == true ) elastic = false; // ielst = 3 463 408 464 } 409 } 465 410 466 } 411 } 467 else 412 else 468 { 413 { 469 414 470 // numberOfSecondary != 2 415 // numberOfSecondary != 2 471 elastic = false; 416 elastic = false; 472 417 473 } 418 } 474 419 475 //071115 420 //071115 476 //G4cout << elastic << G4endl; 421 //G4cout << elastic << G4endl; 477 // if elastic is true try again from sam 422 // if elastic is true try again from sampling of impact parameter 478 423 479 if ( elastic == true ) 424 if ( elastic == true ) 480 { 425 { 481 // delete this nucleues 426 // delete this nucleues 482 for ( std::vector< G4QMDNucleus* >::i 427 for ( std::vector< G4QMDNucleus* >::iterator 483 it = nucleuses.begin() ; it != 428 it = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 484 { 429 { 485 delete *it; 430 delete *it; 486 } 431 } 487 nucleuses.clear(); 432 nucleuses.clear(); 488 } 433 } 489 << 490 } 434 } 491 435 492 436 493 // Statical Decay Phase 437 // Statical Decay Phase 494 438 495 for ( std::vector< G4QMDNucleus* >::iterato 439 for ( std::vector< G4QMDNucleus* >::iterator it 496 = nucleuses.begin() ; it != nucleuses.e 440 = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 497 { 441 { 498 442 499 /* 443 /* 500 G4cout << "G4QMDRESULT " << 444 std::cout << "G4QMDRESULT " 501 << (*it)->GetAtomicNumber() << 445 << (*it)->GetAtomicNumber() 502 << " " << 446 << " " 503 << (*it)->GetMassNumber() << 447 << (*it)->GetMassNumber() 504 << " " << 448 << " " 505 << (*it)->Get4Momentum() << 449 << (*it)->Get4Momentum() 506 << " " << 450 << " " 507 << (*it)->Get4Momentum().vect() << 451 << (*it)->Get4Momentum().vect() 508 << " " << 452 << " " 509 << (*it)->Get4Momentum().restMass << 453 << (*it)->Get4Momentum().restMass() 510 << " " << 454 << " " 511 << (*it)->GetNuclearMass()/GeV << 455 << (*it)->GetNuclearMass()/GeV 512 << G4endl; << 456 << std::endl; 513 */ 457 */ 514 458 515 meanField->SetNucleus ( *it ); 459 meanField->SetNucleus ( *it ); 516 460 517 if ( (*it)->GetAtomicNumber() == 0 // n 461 if ( (*it)->GetAtomicNumber() == 0 // neutron cluster 518 || (*it)->GetAtomicNumber() == (*it)-> 462 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() ) // proton cluster 519 { 463 { 520 // push back system 464 // push back system 521 for ( G4int i = 0 ; i < (*it)->GetTot 465 for ( G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ ) 522 { 466 { 523 G4QMDParticipant* aP = new G4QMDPa 467 G4QMDParticipant* aP = new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() ); 524 system->SetParticipant ( aP ); 468 system->SetParticipant ( aP ); 525 } 469 } 526 continue; 470 continue; 527 } 471 } 528 472 529 G4double nucleus_e = std::sqrt ( G4Pow:: << 473 G4double nucleus_e = std::sqrt ( std::pow ( (*it)->GetNuclearMass()/GeV , 2 ) + std::pow ( (*it)->Get4Momentum().vect().mag() , 2 ) ); 530 G4LorentzVector nucleus_p4CM ( (*it)->Ge 474 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e ); 531 475 532 // std::cout << "G4QMDRESULT nucleus delt 476 // std::cout << "G4QMDRESULT nucleus deltaQ " << deltaQ << std::endl; 533 477 534 G4int ia = (*it)->GetMassNumber(); 478 G4int ia = (*it)->GetMassNumber(); 535 G4int iz = (*it)->GetAtomicNumber(); 479 G4int iz = (*it)->GetAtomicNumber(); 536 480 537 G4LorentzVector lv ( G4ThreeVector( 0.0 << 481 G4LorentzVector lv ( G4ThreeVector( 0.0 ) , (*it)->GetExcitationEnergy()*GeV + G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass( iz , ia ) ); 538 482 539 G4Fragment* aFragment = new G4Fragment( 483 G4Fragment* aFragment = new G4Fragment( ia , iz , lv ); 540 484 541 G4ReactionProductVector* rv; 485 G4ReactionProductVector* rv; 542 rv = excitationHandler->BreakItUp( *aFra 486 rv = excitationHandler->BreakItUp( *aFragment ); 543 G4bool notBreak = true; 487 G4bool notBreak = true; 544 for ( G4ReactionProductVector::iterator 488 for ( G4ReactionProductVector::iterator itt 545 = rv->begin() ; itt != rv->end() ; i 489 = rv->begin() ; itt != rv->end() ; itt++ ) 546 { 490 { 547 491 548 notBreak = false; 492 notBreak = false; 549 // Secondary from this nucleus (*it) 493 // Secondary from this nucleus (*it) 550 const G4ParticleDefinition* pd = (*i << 494 G4ParticleDefinition* pd = (*itt)->GetDefinition(); 551 495 552 G4LorentzVector p4 ( (*itt)->GetMome 496 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV ); //in nucleus(*it) rest system 553 G4LorentzVector p4_CM = CLHEP::boost 497 G4LorentzVector p4_CM = CLHEP::boostOf( p4 , -nucleus_p4CM.findBoostToCM() ); // Back to CM 554 G4LorentzVector p4_LAB = CLHEP::boos 498 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB 555 499 556 500 557 //090122 501 //090122 558 //theParticleChange.AddSecondary( dp 502 //theParticleChange.AddSecondary( dp ); 559 if ( !( pd->GetAtomicNumber() == 4 & 503 if ( !( pd->GetAtomicNumber() == 4 && pd->GetAtomicMass() == 8 ) ) 560 { 504 { 561 //G4cout << "pd out of notBreak l << 562 G4DynamicParticle* dp = new G4Dyn 505 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 563 theParticleChange.AddSecondary( d 506 theParticleChange.AddSecondary( dp ); 564 } 507 } 565 else 508 else 566 { 509 { 567 //Be8 -> Alpha + Alpha + Q 510 //Be8 -> Alpha + Alpha + Q 568 G4ThreeVector randomized_directio 511 G4ThreeVector randomized_direction( G4UniformRand() , G4UniformRand() , G4UniformRand() ); 569 randomized_direction = randomized 512 randomized_direction = randomized_direction.unit(); 570 G4double q_decay = (*itt)->GetMas 513 G4double q_decay = (*itt)->GetMass() - 2*G4Alpha::Alpha()->GetPDGMass(); 571 G4double p_decay = std::sqrt ( G4 << 514 G4double p_decay = std::sqrt ( std::pow(G4Alpha::Alpha()->GetPDGMass()+q_decay/2,2) - std::pow(G4Alpha::Alpha()->GetPDGMass() , 2 ) ); 572 G4LorentzVector p4_a1 ( p_decay*r 515 G4LorentzVector p4_a1 ( p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 ); //in Be8 rest system 573 516 574 G4LorentzVector p4_a1_Be8 = CLHEP 517 G4LorentzVector p4_a1_Be8 = CLHEP::boostOf ( p4_a1/GeV , -p4.findBoostToCM() ); 575 G4LorentzVector p4_a1_CM = CLHEP: 518 G4LorentzVector p4_a1_CM = CLHEP::boostOf ( p4_a1_Be8 , -nucleus_p4CM.findBoostToCM() ); 576 G4LorentzVector p4_a1_LAB = CLHEP 519 G4LorentzVector p4_a1_LAB = CLHEP::boostOf ( p4_a1_CM , boostBackToLAB ); 577 520 578 G4LorentzVector p4_a2 ( -p_decay* 521 G4LorentzVector p4_a2 ( -p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 ); //in Be8 rest system 579 522 580 G4LorentzVector p4_a2_Be8 = CLHEP 523 G4LorentzVector p4_a2_Be8 = CLHEP::boostOf ( p4_a2/GeV , -p4.findBoostToCM() ); 581 G4LorentzVector p4_a2_CM = CLHEP: 524 G4LorentzVector p4_a2_CM = CLHEP::boostOf ( p4_a2_Be8 , -nucleus_p4CM.findBoostToCM() ); 582 G4LorentzVector p4_a2_LAB = CLHEP 525 G4LorentzVector p4_a2_LAB = CLHEP::boostOf ( p4_a2_CM , boostBackToLAB ); 583 526 584 G4DynamicParticle* dp1 = new G4Dy 527 G4DynamicParticle* dp1 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a1_LAB*GeV ); 585 G4DynamicParticle* dp2 = new G4Dy 528 G4DynamicParticle* dp2 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a2_LAB*GeV ); 586 theParticleChange.AddSecondary( d 529 theParticleChange.AddSecondary( dp1 ); 587 theParticleChange.AddSecondary( d 530 theParticleChange.AddSecondary( dp2 ); 588 } 531 } 589 //090122 532 //090122 590 533 591 /* 534 /* 592 G4cout << 535 std::cout 593 << "Regist Secondary " 536 << "Regist Secondary " 594 << (*itt)->GetDefinition()->Ge 537 << (*itt)->GetDefinition()->GetParticleName() 595 << " " 538 << " " 596 << (*itt)->GetMomentum()/GeV 539 << (*itt)->GetMomentum()/GeV 597 << " " 540 << " " 598 << (*itt)->GetKineticEnergy()/ 541 << (*itt)->GetKineticEnergy()/GeV 599 << " " 542 << " " 600 << (*itt)->GetMass()/GeV 543 << (*itt)->GetMass()/GeV 601 << " " 544 << " " 602 << (*itt)->GetTotalEnergy()/Ge 545 << (*itt)->GetTotalEnergy()/GeV 603 << " " 546 << " " 604 << (*itt)->GetTotalEnergy()/Ge 547 << (*itt)->GetTotalEnergy()/GeV * (*itt)->GetTotalEnergy()/GeV 605 - (*itt)->GetMomentum()/GeV * 548 - (*itt)->GetMomentum()/GeV * (*itt)->GetMomentum()/GeV 606 << " " 549 << " " 607 << nucleus_p4CM.findBoostToCM( 550 << nucleus_p4CM.findBoostToCM() 608 << " " 551 << " " 609 << p4 552 << p4 610 << " " 553 << " " 611 << p4_CM 554 << p4_CM 612 << " " 555 << " " 613 << p4_LAB 556 << p4_LAB 614 << G4endl; << 557 << std::endl; 615 */ 558 */ 616 559 617 } 560 } 618 if ( notBreak == true ) 561 if ( notBreak == true ) 619 { 562 { 620 563 621 const G4ParticleDefinition* pd = G4Io << 564 G4ParticleDefinition* pd = G4ParticleTable::GetParticleTable()->GetIon( (*it)->GetAtomicNumber() , (*it)->GetMassNumber(), (*it)->GetExcitationEnergy()*GeV ); 622 //G4cout << "pd in notBreak loop << 623 G4LorentzVector p4_CM = nucleus_p4CM; 565 G4LorentzVector p4_CM = nucleus_p4CM; 624 G4LorentzVector p4_LAB = CLHEP::boost 566 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB 625 G4DynamicParticle* dp = new G4Dynamic 567 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 626 theParticleChange.AddSecondary( dp ); 568 theParticleChange.AddSecondary( dp ); 627 569 628 } 570 } 629 571 630 for ( G4ReactionProductVector::iterator 572 for ( G4ReactionProductVector::iterator itt 631 = rv->begin() ; itt != rv->end() ; i 573 = rv->begin() ; itt != rv->end() ; itt++ ) 632 { 574 { 633 delete *itt; 575 delete *itt; 634 } 576 } 635 delete rv; 577 delete rv; 636 578 637 delete aFragment; 579 delete aFragment; 638 580 639 } 581 } 640 582 641 583 642 584 643 for ( G4int i = 0 ; i < system->GetTotalNum 585 for ( G4int i = 0 ; i < system->GetTotalNumberOfParticipant() ; i++ ) 644 { 586 { >> 587 645 // Secondary particles 588 // Secondary particles 646 589 647 const G4ParticleDefinition* pd = system- << 590 G4ParticleDefinition* pd = system->GetParticipant( i )->GetDefinition(); 648 G4LorentzVector p4_CM = system->GetParti 591 G4LorentzVector p4_CM = system->GetParticipant( i )->Get4Momentum(); 649 G4LorentzVector p4_LAB = CLHEP::boostOf( 592 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); 650 G4DynamicParticle* dp = new G4DynamicPar 593 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 651 theParticleChange.AddSecondary( dp ); 594 theParticleChange.AddSecondary( dp ); 652 //G4cout << "In the last theParticleChan << 653 595 654 /* 596 /* 655 G4cout << "G4QMDRESULT " 597 G4cout << "G4QMDRESULT " 656 << "r" << i << " " << system->GetPartici 598 << "r" << i << " " << system->GetParticipant ( i ) -> GetPosition() << " " 657 << "p" << i << " " << system->GetPartici 599 << "p" << i << " " << system->GetParticipant ( i ) -> Get4Momentum() 658 << G4endl; 600 << G4endl; 659 */ 601 */ 660 602 661 } 603 } 662 604 663 for ( std::vector< G4QMDNucleus* >::iterato 605 for ( std::vector< G4QMDNucleus* >::iterator it 664 = nucleuses.begin() ; it != nucleuses.e 606 = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 665 { 607 { 666 delete *it; // delete nulceuse 608 delete *it; // delete nulceuse 667 } 609 } 668 nucleuses.clear(); 610 nucleuses.clear(); 669 611 670 system->Clear(); 612 system->Clear(); 671 delete system; 613 delete system; 672 614 673 theParticleChange.SetStatusChange( stopAndK 615 theParticleChange.SetStatusChange( stopAndKill ); 674 616 675 for (G4int i = 0; i < G4int(theParticleChan << 676 { << 677 //G4cout << "Particle : " << theParticleC << 678 //G4cout << "KEnergy : " << theParticleCh << 679 //G4cout << "modelID : " << theParticleCh << 680 theParticleChange.GetSecondary(i)->SetCre << 681 } << 682 << 683 return &theParticleChange; 617 return &theParticleChange; 684 618 685 } 619 } 686 620 687 621 688 622 689 void G4QMDReaction::calcOffSetOfCollision( G4d 623 void G4QMDReaction::calcOffSetOfCollision( G4double b , 690 const G4ParticleDefinition* pd_proj , << 624 G4ParticleDefinition* pd_proj , 691 const G4ParticleDefinition* pd_targ , << 625 G4ParticleDefinition* pd_targ , 692 G4double ptot , G4double etot , G4double bmax 626 G4double ptot , G4double etot , G4double bmax , G4ThreeVector boostToCM ) 693 { 627 { 694 628 695 G4double mass_proj = pd_proj->GetPDGMass()/ 629 G4double mass_proj = pd_proj->GetPDGMass()/GeV; 696 G4double mass_targ = pd_targ->GetPDGMass()/ 630 G4double mass_targ = pd_targ->GetPDGMass()/GeV; 697 631 698 G4double stot = std::sqrt ( etot*etot - pto 632 G4double stot = std::sqrt ( etot*etot - ptot*ptot ); 699 633 700 G4double pstt = std::sqrt ( ( stot*stot - ( 634 G4double pstt = std::sqrt ( ( stot*stot - ( mass_proj + mass_targ ) * ( mass_proj + mass_targ ) 701 ) * ( stot*stot - ( mass_pro 635 ) * ( stot*stot - ( mass_proj - mass_targ ) * ( mass_proj - mass_targ ) ) ) 702 / ( 2.0 * stot ); 636 / ( 2.0 * stot ); 703 637 704 G4double pzcc = pstt; 638 G4double pzcc = pstt; 705 G4double eccm = stot - ( mass_proj + mass_t 639 G4double eccm = stot - ( mass_proj + mass_targ ); 706 640 707 G4int zp = 1; 641 G4int zp = 1; 708 G4int ap = 1; 642 G4int ap = 1; 709 if ( pd_proj->GetParticleType() == "nucleus 643 if ( pd_proj->GetParticleType() == "nucleus" ) 710 { 644 { 711 zp = pd_proj->GetAtomicNumber(); 645 zp = pd_proj->GetAtomicNumber(); 712 ap = pd_proj->GetAtomicMass(); 646 ap = pd_proj->GetAtomicMass(); 713 } 647 } 714 else 648 else 715 { 649 { 716 // proton, neutron, mesons 650 // proton, neutron, mesons 717 zp = int ( pd_proj->GetPDGCharge()/eplus 651 zp = int ( pd_proj->GetPDGCharge()/eplus + 0.5 ); 718 // ap = 1; 652 // ap = 1; 719 } 653 } 720 654 721 655 722 G4int zt = pd_targ->GetAtomicNumber(); 656 G4int zt = pd_targ->GetAtomicNumber(); 723 G4int at = pd_targ->GetAtomicMass(); 657 G4int at = pd_targ->GetAtomicMass(); 724 658 725 659 726 // Check the ramx0 value << 727 //G4double rmax0 = 8.0; // T.K dicide para 660 //G4double rmax0 = 8.0; // T.K dicide parameter value // for low energy 728 G4double rmax0 = bmax + 4.0; 661 G4double rmax0 = bmax + 4.0; 729 G4double rmax = std::sqrt( rmax0*rmax0 + b* 662 G4double rmax = std::sqrt( rmax0*rmax0 + b*b ); 730 663 731 G4double ccoul = 0.001439767; 664 G4double ccoul = 0.001439767; 732 G4double pcca = 1.0 - double ( zp * zt ) * 665 G4double pcca = 1.0 - double ( zp * zt ) * ccoul / eccm / rmax - ( b / rmax )*( b / rmax ); 733 666 734 G4double pccf = std::sqrt( pcca ); 667 G4double pccf = std::sqrt( pcca ); 735 668 736 //Fix for neutral particles 669 //Fix for neutral particles 737 G4double aas1 = 0.0; 670 G4double aas1 = 0.0; 738 G4double bbs = 0.0; 671 G4double bbs = 0.0; 739 672 740 if ( zp != 0 ) 673 if ( zp != 0 ) 741 { 674 { 742 G4double aas = 2.0 * eccm * b / double ( 675 G4double aas = 2.0 * eccm * b / double ( zp * zt ) / ccoul; 743 bbs = 1.0 / std::sqrt ( 1.0 + aas*aas ); 676 bbs = 1.0 / std::sqrt ( 1.0 + aas*aas ); 744 aas1 = ( 1.0 + aas * b / rmax ) * bbs; 677 aas1 = ( 1.0 + aas * b / rmax ) * bbs; 745 } 678 } 746 679 747 G4double cost = 0.0; 680 G4double cost = 0.0; 748 G4double sint = 0.0; 681 G4double sint = 0.0; 749 G4double thet1 = 0.0; 682 G4double thet1 = 0.0; 750 G4double thet2 = 0.0; 683 G4double thet2 = 0.0; 751 if ( 1.0 - aas1*aas1 <= 0 || 1.0 - bbs*bbs 684 if ( 1.0 - aas1*aas1 <= 0 || 1.0 - bbs*bbs <= 0.0 ) 752 { 685 { 753 cost = 1.0; 686 cost = 1.0; 754 sint = 0.0; 687 sint = 0.0; 755 } 688 } 756 else 689 else 757 { 690 { 758 G4double aat1 = aas1 / std::sqrt ( 1.0 - 691 G4double aat1 = aas1 / std::sqrt ( 1.0 - aas1*aas1 ); 759 G4double aat2 = bbs / std::sqrt ( 1.0 - 692 G4double aat2 = bbs / std::sqrt ( 1.0 - bbs*bbs ); 760 693 761 thet1 = std::atan ( aat1 ); 694 thet1 = std::atan ( aat1 ); 762 thet2 = std::atan ( aat2 ); 695 thet2 = std::atan ( aat2 ); 763 696 764 // TK enter to else block 697 // TK enter to else block 765 G4double theta = thet1 - thet2; 698 G4double theta = thet1 - thet2; 766 cost = std::cos( theta ); 699 cost = std::cos( theta ); 767 sint = std::sin( theta ); 700 sint = std::sin( theta ); 768 } 701 } 769 702 770 G4double rzpr = -rmax * cost * ( mass_targ 703 G4double rzpr = -rmax * cost * ( mass_targ ) / ( mass_proj + mass_targ ); 771 G4double rzta = rmax * cost * ( mass_proj 704 G4double rzta = rmax * cost * ( mass_proj ) / ( mass_proj + mass_targ ); 772 705 773 G4double rxpr = rmax / 2.0 * sint; 706 G4double rxpr = rmax / 2.0 * sint; 774 707 775 G4double rxta = -rxpr; 708 G4double rxta = -rxpr; 776 709 777 710 778 G4double pzpc = pzcc * ( cost * pccf + sin 711 G4double pzpc = pzcc * ( cost * pccf + sint * b / rmax ); 779 G4double pxpr = pzcc * ( -sint * pccf + cos 712 G4double pxpr = pzcc * ( -sint * pccf + cost * b / rmax ); 780 713 781 G4double pztc = - pzpc; 714 G4double pztc = - pzpc; 782 G4double pxta = - pxpr; 715 G4double pxta = - pxpr; 783 716 784 G4double epc = std::sqrt ( pzpc*pzpc + pxpr 717 G4double epc = std::sqrt ( pzpc*pzpc + pxpr*pxpr + mass_proj*mass_proj ); 785 G4double etc = std::sqrt ( pztc*pztc + pxta 718 G4double etc = std::sqrt ( pztc*pztc + pxta*pxta + mass_targ*mass_targ ); 786 719 787 G4double pzpr = pzpc; 720 G4double pzpr = pzpc; 788 G4double pzta = pztc; 721 G4double pzta = pztc; 789 G4double epr = epc; 722 G4double epr = epc; 790 G4double eta = etc; 723 G4double eta = etc; 791 724 792 // CM -> NN 725 // CM -> NN 793 G4double gammacm = boostToCM.gamma(); 726 G4double gammacm = boostToCM.gamma(); 794 //G4double betacm = -boostToCM.beta(); 727 //G4double betacm = -boostToCM.beta(); 795 G4double betacm = boostToCM.z(); 728 G4double betacm = boostToCM.z(); 796 pzpr = pzpc + betacm * gammacm * ( gammacm 729 pzpr = pzpc + betacm * gammacm * ( gammacm / ( 1. + gammacm ) * pzpc * betacm + epc ); 797 pzta = pztc + betacm * gammacm * ( gammacm 730 pzta = pztc + betacm * gammacm * ( gammacm / ( 1. + gammacm ) * pztc * betacm + etc ); 798 epr = gammacm * ( epc + betacm * pzpc ); 731 epr = gammacm * ( epc + betacm * pzpc ); 799 eta = gammacm * ( etc + betacm * pztc ); 732 eta = gammacm * ( etc + betacm * pztc ); 800 733 801 //G4double betpr = pzpr / epr; 734 //G4double betpr = pzpr / epr; 802 //G4double betta = pzta / eta; 735 //G4double betta = pzta / eta; 803 736 804 G4double gammpr = epr / ( mass_proj ); 737 G4double gammpr = epr / ( mass_proj ); 805 G4double gammta = eta / ( mass_targ ); 738 G4double gammta = eta / ( mass_targ ); 806 739 807 pzta = pzta / double ( at ); 740 pzta = pzta / double ( at ); 808 pxta = pxta / double ( at ); 741 pxta = pxta / double ( at ); 809 742 810 pzpr = pzpr / double ( ap ); 743 pzpr = pzpr / double ( ap ); 811 pxpr = pxpr / double ( ap ); 744 pxpr = pxpr / double ( ap ); 812 745 813 G4double zeroz = 0.0; 746 G4double zeroz = 0.0; 814 747 815 rzpr = rzpr -zeroz; 748 rzpr = rzpr -zeroz; 816 rzta = rzta -zeroz; 749 rzta = rzta -zeroz; 817 750 818 // Set results 751 // Set results 819 coulomb_collision_gamma_proj = gammpr; 752 coulomb_collision_gamma_proj = gammpr; 820 coulomb_collision_rx_proj = rxpr; 753 coulomb_collision_rx_proj = rxpr; 821 coulomb_collision_rz_proj = rzpr; 754 coulomb_collision_rz_proj = rzpr; 822 coulomb_collision_px_proj = pxpr; 755 coulomb_collision_px_proj = pxpr; 823 coulomb_collision_pz_proj = pzpr; 756 coulomb_collision_pz_proj = pzpr; 824 757 825 coulomb_collision_gamma_targ = gammta; 758 coulomb_collision_gamma_targ = gammta; 826 coulomb_collision_rx_targ = rxta; 759 coulomb_collision_rx_targ = rxta; 827 coulomb_collision_rz_targ = rzta; 760 coulomb_collision_rz_targ = rzta; 828 coulomb_collision_px_targ = pxta; 761 coulomb_collision_px_targ = pxta; 829 coulomb_collision_pz_targ = pzta; 762 coulomb_collision_pz_targ = pzta; 830 763 831 } 764 } 832 765 >> 766 >> 767 833 void G4QMDReaction::setEvaporationCh() 768 void G4QMDReaction::setEvaporationCh() 834 { 769 { 835 //fEvaporation - 8 default channels << 836 //fCombined - 8 default + 60 GEM << 837 //fGEM - 2 default + 66 GEM << 838 G4DeexChannelType ctype = gem ? fGEM : fComb << 839 excitationHandler->SetDeexChannelsType(ctype << 840 } << 841 770 842 void G4QMDReaction::ModelDescription(std::ostr << 771 if ( gem == true ) 843 { << 772 evaporation->SetGEMChannel(); 844 outFile << "Lorentz covarianted Quantum Mol << 773 else >> 774 evaporation->SetDefaultChannel(); >> 775 845 } 776 } 846 777