#include <G4QMDReaction.hh>
Inheritance diagram for G4QMDReaction:
Public Member Functions | |
G4QMDReaction () | |
~G4QMDReaction () | |
std::vector< G4QMDSystem * > | GetFinalStates () |
G4HadFinalState * | ApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus) |
void | UnUseGEM () |
void | UseFRAG () |
void | EnableFermiG () |
void | SetTMAX (G4int i) |
void | SetDT (G4double t) |
void | SetEF (G4double x) |
Definition at line 60 of file G4QMDReaction.hh.
G4QMDReaction::G4QMDReaction | ( | ) |
Definition at line 45 of file G4QMDReaction.cc.
References G4ExcitationHandler::SetEvaporation().
00046 : G4HadronicInteraction("QMDModel") 00047 , system ( NULL ) 00048 , deltaT ( 1 ) // in fsec (c=1) 00049 , maxTime ( 100 ) // will have maxTime-th time step 00050 , envelopF ( 1.05 ) // 10% for Peripheral reactions 00051 , gem ( true ) 00052 , frag ( false ) 00053 { 00054 00055 //090331 00056 shenXS = new G4IonsShenCrossSection(); 00057 //genspaXS = new G4GeneralSpaceNNCrossSection(); 00058 piNucXS = new G4PiNuclearCrossSection(); 00059 meanField = new G4QMDMeanField(); 00060 collision = new G4QMDCollision(); 00061 00062 excitationHandler = new G4ExcitationHandler; 00063 evaporation = new G4Evaporation; 00064 excitationHandler->SetEvaporation( evaporation ); 00065 setEvaporationCh(); 00066 }
G4QMDReaction::~G4QMDReaction | ( | ) |
Definition at line 70 of file G4QMDReaction.cc.
00071 { 00072 delete evaporation; 00073 delete excitationHandler; 00074 delete collision; 00075 delete meanField; 00076 }
G4HadFinalState * G4QMDReaction::ApplyYourself | ( | const G4HadProjectile & | aTrack, | |
G4Nucleus & | targetNucleus | |||
) | [virtual] |
Implements G4HadronicInteraction.
Definition at line 80 of file G4QMDReaction.cc.
References G4HadFinalState::AddSecondary(), G4Alpha::Alpha(), CLHEP::boostOf(), G4ExcitationHandler::BreakItUp(), G4QMDNucleus::CalEnergyAndAngularMomentumInCM(), G4QMDCollision::CalKinematicsOfBinaryCollisions(), G4QMDSystem::Clear(), G4HadFinalState::Clear(), G4QMDMeanField::DoClusterJudgment(), G4QMDMeanField::DoPropagation(), G4UniformRand, G4QMDParticipant::Get4Momentum(), G4DynamicParticle::Get4Momentum(), G4HadProjectile::Get4Momentum(), G4Nucleus::GetA_asInt(), G4ParticleDefinition::GetAtomicMass(), G4ParticleDefinition::GetAtomicNumber(), G4QMDParticipant::GetDefinition(), G4DynamicParticle::GetDefinition(), G4HadProjectile::GetDefinition(), G4ParticleTable::GetIon(), G4IonTable::GetIonMass(), G4ParticleTable::GetIonTable(), G4HadProjectile::GetKineticEnergy(), G4QMDParticipant::GetMomentum(), G4DynamicParticle::GetMomentum(), G4QMDSystem::GetNOCollision(), G4QMDSystem::GetParticipant(), G4ParticleDefinition::GetParticleName(), G4ParticleTable::GetParticleTable(), G4ParticleDefinition::GetParticleType(), G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGMass(), G4QMDParticipant::GetPosition(), G4HadProjectile::GetTotalMomentum(), G4QMDSystem::GetTotalNumberOfParticipant(), G4QMDMeanField::GetTotalPotential(), G4Nucleus::GetZ_asInt(), G4INCL::Math::pi, G4QMDCollision::SetMeanField(), G4QMDMeanField::SetNucleus(), G4QMDSystem::SetParticipant(), G4QMDParticipant::SetProjectile(), G4HadFinalState::SetStatusChange(), G4QMDMeanField::SetSystem(), G4QMDParticipant::SetTarget(), G4QMDNucleus::SetTotalPotential(), stopAndKill, and G4HadronicInteraction::theParticleChange.
00081 { 00082 //G4cout << "G4QMDReaction::ApplyYourself" << G4endl; 00083 00084 theParticleChange.Clear(); 00085 00086 system = new G4QMDSystem; 00087 00088 G4int proj_Z = 0; 00089 G4int proj_A = 0; 00090 G4ParticleDefinition* proj_pd = ( G4ParticleDefinition* ) projectile.GetDefinition(); 00091 if ( proj_pd->GetParticleType() == "nucleus" ) 00092 { 00093 proj_Z = proj_pd->GetAtomicNumber(); 00094 proj_A = proj_pd->GetAtomicMass(); 00095 } 00096 else 00097 { 00098 proj_Z = (int)( proj_pd->GetPDGCharge()/eplus ); 00099 proj_A = 1; 00100 } 00101 //G4int targ_Z = int ( target.GetZ() + 0.5 ); 00102 //G4int targ_A = int ( target.GetN() + 0.5 ); 00103 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this) 00104 G4int targ_Z = target.GetZ_asInt(); 00105 G4int targ_A = target.GetA_asInt(); 00106 G4ParticleDefinition* targ_pd = G4ParticleTable::GetParticleTable()->GetIon( targ_Z , targ_A , 0.0 ); 00107 00108 00109 //G4NistManager* nistMan = G4NistManager::Instance(); 00110 // G4Element* G4NistManager::FindOrBuildElement( targ_Z ); 00111 00112 const G4DynamicParticle* proj_dp = new G4DynamicParticle ( proj_pd , projectile.Get4Momentum() ); 00113 //const G4Element* targ_ele = nistMan->FindOrBuildElement( targ_Z ); 00114 //G4double aTemp = projectile.GetMaterial()->GetTemperature(); 00115 00116 //090331 00117 00118 G4VCrossSectionDataSet* theXS = shenXS; 00119 00120 if ( proj_pd->GetParticleType() == "meson" ) theXS = piNucXS; 00121 00122 //G4double xs_0 = genspaXS->GetCrossSection ( proj_dp , targ_ele , aTemp ); 00123 //G4double xs_0 = theXS->GetCrossSection ( proj_dp , targ_ele , aTemp ); 00124 //110822 00125 G4double xs_0 = theXS->GetIsoCrossSection ( proj_dp , targ_Z , targ_A ); 00126 00127 G4double bmax_0 = std::sqrt( xs_0 / pi ); 00128 //std::cout << "bmax_0 in fm (fermi) " << bmax_0/fermi << std::endl; 00129 00130 //delete proj_dp; 00131 00132 G4bool elastic = true; 00133 00134 std::vector< G4QMDNucleus* > nucleuses; // Secondary nuceluses 00135 G4ThreeVector boostToReac; // ReactionSystem (CM or NN); 00136 G4ThreeVector boostBackToLAB; // Reaction System to LAB; 00137 00138 G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ_pd->GetPDGMass()/GeV ); 00139 G4ThreeVector boostLABtoCM = targ4p.findBoostToCM( proj_dp->Get4Momentum()/GeV ); // CM of target and proj; 00140 00141 G4double p1 = proj_dp->GetMomentum().mag()/GeV/proj_A; 00142 G4double m1 = proj_dp->GetDefinition()->GetPDGMass()/GeV/proj_A; 00143 G4double e1 = std::sqrt( p1*p1 + m1*m1 ); 00144 G4double e2 = targ_pd->GetPDGMass()/GeV/targ_A; 00145 G4double beta_nn = -p1 / ( e1+e2 ); 00146 00147 G4ThreeVector boostLABtoNN ( 0. , 0. , beta_nn ); // CM of NN; 00148 00149 G4double beta_nncm = ( - boostLABtoCM.beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.beta() * boostLABtoNN.beta() ) ; 00150 00151 //std::cout << targ4p << std::endl; 00152 //std::cout << proj_dp->Get4Momentum()<< std::endl; 00153 //std::cout << beta_nncm << std::endl; 00154 G4ThreeVector boostNNtoCM( 0. , 0. , beta_nncm ); // 00155 G4ThreeVector boostCMtoNN( 0. , 0. , -beta_nncm ); // 00156 00157 boostToReac = boostLABtoNN; 00158 boostBackToLAB = -boostLABtoNN; 00159 00160 delete proj_dp; 00161 00162 while ( elastic ) 00163 { 00164 00165 // impact parameter 00166 //G4double bmax = 1.05*(bmax_0/fermi); // 10% for Peripheral reactions 00167 G4double bmax = envelopF*(bmax_0/fermi); 00168 G4double b = bmax * std::sqrt ( G4UniformRand() ); 00169 //071112 00170 //G4double b = 0; 00171 //G4double b = bmax; 00172 //G4double b = bmax/1.05 * 0.7 * G4UniformRand(); 00173 00174 //G4cout << "G4QMDRESULT bmax_0 = " << bmax_0/fermi << " fm, bmax = " << bmax << " fm , b = " << b << " fm " << G4endl; 00175 00176 G4double plab = projectile.GetTotalMomentum()/GeV; 00177 G4double elab = ( projectile.GetKineticEnergy() + proj_pd->GetPDGMass() + targ_pd->GetPDGMass() )/GeV; 00178 00179 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN ); 00180 00181 // Projectile 00182 G4LorentzVector proj4pLAB = projectile.Get4Momentum()/GeV; 00183 00184 G4QMDGroundStateNucleus* proj(NULL); 00185 if ( projectile.GetDefinition()->GetParticleType() == "nucleus" 00186 || projectile.GetDefinition()->GetParticleName() == "proton" 00187 || projectile.GetDefinition()->GetParticleName() == "neutron" ) 00188 { 00189 00190 proj_Z = proj_pd->GetAtomicNumber(); 00191 proj_A = proj_pd->GetAtomicMass(); 00192 00193 proj = new G4QMDGroundStateNucleus( proj_Z , proj_A ); 00194 //proj->ShowParticipants(); 00195 00196 00197 meanField->SetSystem ( proj ); 00198 proj->SetTotalPotential( meanField->GetTotalPotential() ); 00199 proj->CalEnergyAndAngularMomentumInCM(); 00200 00201 } 00202 00203 // Target 00204 //G4int iz = int ( target.GetZ() ); 00205 //G4int ia = int ( target.GetN() ); 00206 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this) 00207 G4int iz = int ( target.GetZ_asInt() ); 00208 G4int ia = int ( target.GetA_asInt() ); 00209 00210 G4QMDGroundStateNucleus* targ = new G4QMDGroundStateNucleus( iz , ia ); 00211 00212 meanField->SetSystem (targ ); 00213 targ->SetTotalPotential( meanField->GetTotalPotential() ); 00214 targ->CalEnergyAndAngularMomentumInCM(); 00215 00216 //G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ->GetNuclearMass()/GeV ); 00217 // Boost Vector to CM 00218 //boostToCM = targ4p.findBoostToCM( proj4pLAB ); 00219 00220 // Target 00221 for ( G4int i = 0 ; i < targ->GetTotalNumberOfParticipant() ; i++ ) 00222 { 00223 00224 G4ThreeVector p0 = targ->GetParticipant( i )->GetMomentum(); 00225 G4ThreeVector r0 = targ->GetParticipant( i )->GetPosition(); 00226 00227 G4ThreeVector p ( p0.x() + coulomb_collision_px_targ 00228 , p0.y() 00229 , p0.z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ ); 00230 00231 G4ThreeVector r ( r0.x() + coulomb_collision_rx_targ 00232 , r0.y() 00233 , r0.z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ ); 00234 00235 system->SetParticipant( new G4QMDParticipant( targ->GetParticipant( i )->GetDefinition() , p , r ) ); 00236 system->GetParticipant( i )->SetTarget(); 00237 00238 } 00239 00240 G4LorentzVector proj4pCM = CLHEP::boostOf ( proj4pLAB , boostToReac ); 00241 G4LorentzVector targ4pCM = CLHEP::boostOf ( targ4p , boostToReac ); 00242 00243 // Projectile 00244 if ( proj != NULL ) 00245 { 00246 00247 // projectile is nucleus 00248 00249 for ( G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ ) 00250 { 00251 00252 G4ThreeVector p0 = proj->GetParticipant( i )->GetMomentum(); 00253 G4ThreeVector r0 = proj->GetParticipant( i )->GetPosition(); 00254 00255 G4ThreeVector p ( p0.x() + coulomb_collision_px_proj 00256 , p0.y() 00257 , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj ); 00258 00259 G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj 00260 , r0.y() 00261 , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj ); 00262 00263 system->SetParticipant( new G4QMDParticipant( proj->GetParticipant( i )->GetDefinition() , p , r ) ); 00264 system->GetParticipant ( i + targ->GetTotalNumberOfParticipant() )->SetProjectile(); 00265 } 00266 00267 } 00268 else 00269 { 00270 00271 // projectile is particle 00272 00273 // avoid multiple set in "elastic" loop 00274 if ( system->GetTotalNumberOfParticipant() == targ->GetTotalNumberOfParticipant() ) 00275 { 00276 00277 G4int i = targ->GetTotalNumberOfParticipant(); 00278 00279 G4ThreeVector p0( 0 ); 00280 G4ThreeVector r0( 0 ); 00281 00282 G4ThreeVector p ( p0.x() + coulomb_collision_px_proj 00283 , p0.y() 00284 , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj ); 00285 00286 G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj 00287 , r0.y() 00288 , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj ); 00289 00290 system->SetParticipant( new G4QMDParticipant( (G4ParticleDefinition*)projectile.GetDefinition() , p , r ) ); 00291 // This is not important becase only 1 projectile particle. 00292 system->GetParticipant ( i )->SetProjectile(); 00293 } 00294 00295 } 00296 //system->ShowParticipants(); 00297 00298 delete targ; 00299 delete proj; 00300 00301 meanField->SetSystem ( system ); 00302 collision->SetMeanField ( meanField ); 00303 00304 // Time Evolution 00305 //std::cout << "Start time evolution " << std::endl; 00306 //system->ShowParticipants(); 00307 for ( G4int i = 0 ; i < maxTime ; i++ ) 00308 { 00309 //G4cout << " do Paropagate " << i << " th time step. " << G4endl; 00310 meanField->DoPropagation( deltaT ); 00311 //system->ShowParticipants(); 00312 collision->CalKinematicsOfBinaryCollisions( deltaT ); 00313 00314 if ( i / 10 * 10 == i ) 00315 { 00316 //G4cout << i << " th time step. " << G4endl; 00317 //system->ShowParticipants(); 00318 } 00319 //system->ShowParticipants(); 00320 } 00321 //system->ShowParticipants(); 00322 00323 00324 //std::cout << "Doing Cluster Judgment " << std::endl; 00325 00326 nucleuses = meanField->DoClusterJudgment(); 00327 00328 // Elastic Judgment 00329 00330 G4int numberOfSecondary = int ( nucleuses.size() ) + system->GetTotalNumberOfParticipant(); 00331 00332 G4int sec_a_Z = 0; 00333 G4int sec_a_A = 0; 00334 G4ParticleDefinition* sec_a_pd = NULL; 00335 G4int sec_b_Z = 0; 00336 G4int sec_b_A = 0; 00337 G4ParticleDefinition* sec_b_pd = NULL; 00338 00339 if ( numberOfSecondary == 2 ) 00340 { 00341 00342 G4bool elasticLike_system = false; 00343 if ( nucleuses.size() == 2 ) 00344 { 00345 00346 sec_a_Z = nucleuses[0]->GetAtomicNumber(); 00347 sec_a_A = nucleuses[0]->GetMassNumber(); 00348 sec_b_Z = nucleuses[1]->GetAtomicNumber(); 00349 sec_b_A = nucleuses[1]->GetMassNumber(); 00350 00351 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A ) 00352 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) ) 00353 { 00354 elasticLike_system = true; 00355 } 00356 00357 } 00358 else if ( nucleuses.size() == 1 ) 00359 { 00360 00361 sec_a_Z = nucleuses[0]->GetAtomicNumber(); 00362 sec_a_A = nucleuses[0]->GetMassNumber(); 00363 sec_b_pd = system->GetParticipant( 0 )->GetDefinition(); 00364 00365 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd ) 00366 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) ) 00367 { 00368 elasticLike_system = true; 00369 } 00370 00371 } 00372 else 00373 { 00374 00375 sec_a_pd = system->GetParticipant( 0 )->GetDefinition(); 00376 sec_b_pd = system->GetParticipant( 1 )->GetDefinition(); 00377 00378 if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd ) 00379 || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) ) 00380 { 00381 elasticLike_system = true; 00382 } 00383 00384 } 00385 00386 if ( elasticLike_system == true ) 00387 { 00388 00389 G4bool elasticLike_energy = true; 00390 // Cal ExcitationEnergy 00391 for ( G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ ) 00392 { 00393 00394 //meanField->SetSystem( nucleuses[i] ); 00395 meanField->SetNucleus( nucleuses[i] ); 00396 //nucleuses[i]->SetTotalPotential( meanField->GetTotalPotential() ); 00397 //nucleuses[i]->CalEnergyAndAngularMomentumInCM(); 00398 00399 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false; 00400 00401 } 00402 00403 // Check Collision 00404 G4bool withCollision = true; 00405 if ( system->GetNOCollision() == 0 ) withCollision = false; 00406 00407 // Final judegement for Inelasitc or Elastic; 00408 // 00409 // ElasticLike without Collision 00410 //if ( elasticLike_energy == true && withCollision == false ) elastic = true; // ielst = 0 00411 // ElasticLike with Collision 00412 //if ( elasticLike_energy == true && withCollision == true ) elastic = true; // ielst = 1 00413 // InelasticLike without Collision 00414 //if ( elasticLike_energy == false ) elastic = false; // ielst = 2 00415 if ( frag == true ) 00416 if ( elasticLike_energy == false ) elastic = false; 00417 // InelasticLike with Collision 00418 if ( elasticLike_energy == false && withCollision == true ) elastic = false; // ielst = 3 00419 00420 } 00421 00422 } 00423 else 00424 { 00425 00426 // numberOfSecondary != 2 00427 elastic = false; 00428 00429 } 00430 00431 //071115 00432 //G4cout << elastic << G4endl; 00433 // if elastic is true try again from sampling of impact parameter 00434 00435 if ( elastic == true ) 00436 { 00437 // delete this nucleues 00438 for ( std::vector< G4QMDNucleus* >::iterator 00439 it = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 00440 { 00441 delete *it; 00442 } 00443 nucleuses.clear(); 00444 } 00445 } 00446 00447 00448 // Statical Decay Phase 00449 00450 for ( std::vector< G4QMDNucleus* >::iterator it 00451 = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 00452 { 00453 00454 /* 00455 std::cout << "G4QMDRESULT " 00456 << (*it)->GetAtomicNumber() 00457 << " " 00458 << (*it)->GetMassNumber() 00459 << " " 00460 << (*it)->Get4Momentum() 00461 << " " 00462 << (*it)->Get4Momentum().vect() 00463 << " " 00464 << (*it)->Get4Momentum().restMass() 00465 << " " 00466 << (*it)->GetNuclearMass()/GeV 00467 << std::endl; 00468 */ 00469 00470 meanField->SetNucleus ( *it ); 00471 00472 if ( (*it)->GetAtomicNumber() == 0 // neutron cluster 00473 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() ) // proton cluster 00474 { 00475 // push back system 00476 for ( G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ ) 00477 { 00478 G4QMDParticipant* aP = new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() ); 00479 system->SetParticipant ( aP ); 00480 } 00481 continue; 00482 } 00483 00484 G4double nucleus_e = std::sqrt ( std::pow ( (*it)->GetNuclearMass()/GeV , 2 ) + std::pow ( (*it)->Get4Momentum().vect().mag() , 2 ) ); 00485 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e ); 00486 00487 // std::cout << "G4QMDRESULT nucleus deltaQ " << deltaQ << std::endl; 00488 00489 G4int ia = (*it)->GetMassNumber(); 00490 G4int iz = (*it)->GetAtomicNumber(); 00491 00492 G4LorentzVector lv ( G4ThreeVector( 0.0 ) , (*it)->GetExcitationEnergy()*GeV + G4ParticleTable::GetParticleTable()->GetIonTable()->GetIonMass( iz , ia ) ); 00493 00494 G4Fragment* aFragment = new G4Fragment( ia , iz , lv ); 00495 00496 G4ReactionProductVector* rv; 00497 rv = excitationHandler->BreakItUp( *aFragment ); 00498 G4bool notBreak = true; 00499 for ( G4ReactionProductVector::iterator itt 00500 = rv->begin() ; itt != rv->end() ; itt++ ) 00501 { 00502 00503 notBreak = false; 00504 // Secondary from this nucleus (*it) 00505 G4ParticleDefinition* pd = (*itt)->GetDefinition(); 00506 00507 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV ); //in nucleus(*it) rest system 00508 G4LorentzVector p4_CM = CLHEP::boostOf( p4 , -nucleus_p4CM.findBoostToCM() ); // Back to CM 00509 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB 00510 00511 00512 //090122 00513 //theParticleChange.AddSecondary( dp ); 00514 if ( !( pd->GetAtomicNumber() == 4 && pd->GetAtomicMass() == 8 ) ) 00515 { 00516 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 00517 theParticleChange.AddSecondary( dp ); 00518 } 00519 else 00520 { 00521 //Be8 -> Alpha + Alpha + Q 00522 G4ThreeVector randomized_direction( G4UniformRand() , G4UniformRand() , G4UniformRand() ); 00523 randomized_direction = randomized_direction.unit(); 00524 G4double q_decay = (*itt)->GetMass() - 2*G4Alpha::Alpha()->GetPDGMass(); 00525 G4double p_decay = std::sqrt ( std::pow(G4Alpha::Alpha()->GetPDGMass()+q_decay/2,2) - std::pow(G4Alpha::Alpha()->GetPDGMass() , 2 ) ); 00526 G4LorentzVector p4_a1 ( p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 ); //in Be8 rest system 00527 00528 G4LorentzVector p4_a1_Be8 = CLHEP::boostOf ( p4_a1/GeV , -p4.findBoostToCM() ); 00529 G4LorentzVector p4_a1_CM = CLHEP::boostOf ( p4_a1_Be8 , -nucleus_p4CM.findBoostToCM() ); 00530 G4LorentzVector p4_a1_LAB = CLHEP::boostOf ( p4_a1_CM , boostBackToLAB ); 00531 00532 G4LorentzVector p4_a2 ( -p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 ); //in Be8 rest system 00533 00534 G4LorentzVector p4_a2_Be8 = CLHEP::boostOf ( p4_a2/GeV , -p4.findBoostToCM() ); 00535 G4LorentzVector p4_a2_CM = CLHEP::boostOf ( p4_a2_Be8 , -nucleus_p4CM.findBoostToCM() ); 00536 G4LorentzVector p4_a2_LAB = CLHEP::boostOf ( p4_a2_CM , boostBackToLAB ); 00537 00538 G4DynamicParticle* dp1 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a1_LAB*GeV ); 00539 G4DynamicParticle* dp2 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a2_LAB*GeV ); 00540 theParticleChange.AddSecondary( dp1 ); 00541 theParticleChange.AddSecondary( dp2 ); 00542 } 00543 //090122 00544 00545 /* 00546 std::cout 00547 << "Regist Secondary " 00548 << (*itt)->GetDefinition()->GetParticleName() 00549 << " " 00550 << (*itt)->GetMomentum()/GeV 00551 << " " 00552 << (*itt)->GetKineticEnergy()/GeV 00553 << " " 00554 << (*itt)->GetMass()/GeV 00555 << " " 00556 << (*itt)->GetTotalEnergy()/GeV 00557 << " " 00558 << (*itt)->GetTotalEnergy()/GeV * (*itt)->GetTotalEnergy()/GeV 00559 - (*itt)->GetMomentum()/GeV * (*itt)->GetMomentum()/GeV 00560 << " " 00561 << nucleus_p4CM.findBoostToCM() 00562 << " " 00563 << p4 00564 << " " 00565 << p4_CM 00566 << " " 00567 << p4_LAB 00568 << std::endl; 00569 */ 00570 00571 } 00572 if ( notBreak == true ) 00573 { 00574 00575 G4ParticleDefinition* pd = G4ParticleTable::GetParticleTable()->GetIon( (*it)->GetAtomicNumber() , (*it)->GetMassNumber(), (*it)->GetExcitationEnergy()*GeV ); 00576 G4LorentzVector p4_CM = nucleus_p4CM; 00577 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB 00578 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 00579 theParticleChange.AddSecondary( dp ); 00580 00581 } 00582 00583 for ( G4ReactionProductVector::iterator itt 00584 = rv->begin() ; itt != rv->end() ; itt++ ) 00585 { 00586 delete *itt; 00587 } 00588 delete rv; 00589 00590 delete aFragment; 00591 00592 } 00593 00594 00595 00596 for ( G4int i = 0 ; i < system->GetTotalNumberOfParticipant() ; i++ ) 00597 { 00598 00599 // Secondary particles 00600 00601 G4ParticleDefinition* pd = system->GetParticipant( i )->GetDefinition(); 00602 G4LorentzVector p4_CM = system->GetParticipant( i )->Get4Momentum(); 00603 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); 00604 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV ); 00605 theParticleChange.AddSecondary( dp ); 00606 00607 /* 00608 G4cout << "G4QMDRESULT " 00609 << "r" << i << " " << system->GetParticipant ( i ) -> GetPosition() << " " 00610 << "p" << i << " " << system->GetParticipant ( i ) -> Get4Momentum() 00611 << G4endl; 00612 */ 00613 00614 } 00615 00616 for ( std::vector< G4QMDNucleus* >::iterator it 00617 = nucleuses.begin() ; it != nucleuses.end() ; it++ ) 00618 { 00619 delete *it; // delete nulceuse 00620 } 00621 nucleuses.clear(); 00622 00623 system->Clear(); 00624 delete system; 00625 00626 theParticleChange.SetStatusChange( stopAndKill ); 00627 00628 return &theParticleChange; 00629 00630 }
void G4QMDReaction::EnableFermiG | ( | ) | [inline] |
std::vector< G4QMDSystem* > G4QMDReaction::GetFinalStates | ( | ) |
void G4QMDReaction::SetDT | ( | G4double | t | ) | [inline] |
void G4QMDReaction::SetEF | ( | G4double | x | ) | [inline] |
void G4QMDReaction::SetTMAX | ( | G4int | i | ) | [inline] |
void G4QMDReaction::UnUseGEM | ( | ) | [inline] |
void G4QMDReaction::UseFRAG | ( | ) | [inline] |