Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4LightIonQMDReaction Class Reference

#include <G4LightIonQMDReaction.hh>

Inheritance diagram for G4LightIonQMDReaction:

Public Member Functions

 G4LightIonQMDReaction ()
 ~G4LightIonQMDReaction () override
std::vector< G4QMDSystem * > GetFinalStates ()
G4HadFinalStateApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus) override
G4ExcitationHandlerGetExcitationHandler ()
void UnUseGEM ()
void UseFRAG ()
void SetTMAX (G4int i)
void SetDT (G4double t)
void SetEF (G4double x)
void ModelDescription (std::ostream &outFile) const override
 G4LightIonQMDReaction (const G4LightIonQMDReaction &right)=delete
const G4LightIonQMDReactionoperator= (const G4LightIonQMDReaction &right)=delete
Public Member Functions inherited from G4HadronicInteraction
 G4HadronicInteraction (const G4String &modelName="HadronicModel")
virtual ~G4HadronicInteraction ()
virtual G4double SampleInvariantT (const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
virtual G4bool IsApplicable (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
G4double GetMinEnergy () const
G4double GetMinEnergy (const G4Material *aMaterial, const G4Element *anElement) const
void SetMinEnergy (G4double anEnergy)
void SetMinEnergy (G4double anEnergy, const G4Element *anElement)
void SetMinEnergy (G4double anEnergy, const G4Material *aMaterial)
G4double GetMaxEnergy () const
G4double GetMaxEnergy (const G4Material *aMaterial, const G4Element *anElement) const
void SetMaxEnergy (const G4double anEnergy)
void SetMaxEnergy (G4double anEnergy, const G4Element *anElement)
void SetMaxEnergy (G4double anEnergy, const G4Material *aMaterial)
G4int GetVerboseLevel () const
void SetVerboseLevel (G4int value)
const G4StringGetModelName () const
void DeActivateFor (const G4Material *aMaterial)
void ActivateFor (const G4Material *aMaterial)
void DeActivateFor (const G4Element *anElement)
void ActivateFor (const G4Element *anElement)
G4bool IsBlocked (const G4Material *aMaterial) const
G4bool IsBlocked (const G4Element *anElement) const
void SetRecoilEnergyThreshold (G4double val)
G4double GetRecoilEnergyThreshold () const
virtual const std::pair< G4double, G4doubleGetFatalEnergyCheckLevels () const
virtual std::pair< G4double, G4doubleGetEnergyMomentumCheckLevels () const
void SetEnergyMomentumCheckLevels (G4double relativeLevel, G4double absoluteLevel)
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
virtual void InitialiseModel ()
 G4HadronicInteraction (const G4HadronicInteraction &right)=delete
const G4HadronicInteractionoperator= (const G4HadronicInteraction &right)=delete
G4bool operator== (const G4HadronicInteraction &right) const =delete
G4bool operator!= (const G4HadronicInteraction &right) const =delete

Additional Inherited Members

Protected Member Functions inherited from G4HadronicInteraction
void SetModelName (const G4String &nam)
G4bool IsBlocked () const
void Block ()
Protected Attributes inherited from G4HadronicInteraction
G4HadFinalState theParticleChange
G4int verboseLevel
G4double theMinEnergy
G4double theMaxEnergy
G4bool isBlocked

Detailed Description

Definition at line 59 of file G4LightIonQMDReaction.hh.

Constructor & Destructor Documentation

◆ G4LightIonQMDReaction() [1/2]

G4LightIonQMDReaction::G4LightIonQMDReaction ( )

Definition at line 70 of file G4LightIonQMDReaction.cc.

71: G4HadronicInteraction("LightIonQMDModel")
72, system ( NULL )
73, deltaT ( 1 ) // in fsec (c=1)
74, maxTime ( 100 ) // will have maxTime-th time step
75, envelopF ( 1.05 ) // 10% for Peripheral reactions
76, gem ( true )
77, frag ( false )
78, secID( -1 )
79{
80 G4cout << "G4LightIonQMDReaction::G4LightIonQMDReaction" << G4endl;
81 G4cout << "Recommended Energy of LightIonQMD: 30MeV/u - 500MeV/u" << G4endl;
82
83 theXS = new G4CrossSectionInelastic( new G4ComponentGGNuclNuclXsc );
84 pipElNucXS = new G4BGGPionElasticXS(G4PionPlus::PionPlus() );
85 pipElNucXS->BuildPhysicsTable(*(G4PionPlus::PionPlus() ) );
86
87 pimElNucXS = new G4BGGPionElasticXS(G4PionMinus::PionMinus() );
88 pimElNucXS->BuildPhysicsTable(*(G4PionMinus::PionMinus() ) );
89
90 pipInelNucXS = new G4BGGPionInelasticXS(G4PionPlus::PionPlus() );
91 pipInelNucXS->BuildPhysicsTable(*(G4PionPlus::PionPlus() ) );
92
93 pimInelNucXS = new G4BGGPionInelasticXS(G4PionMinus::PionMinus() );
94 pimInelNucXS->BuildPhysicsTable(*(G4PionMinus::PionMinus() ) );
95
96 meanField = new G4LightIonQMDMeanField();
97 collision = new G4LightIonQMDCollision();
98
99 excitationHandler = new G4ExcitationHandler();
100 setEvaporationCh();
101
102 coulomb_collision_gamma_proj = 0.0;
103 coulomb_collision_rx_proj = 0.0;
104 coulomb_collision_rz_proj = 0.0;
105 coulomb_collision_px_proj = 0.0;
106 coulomb_collision_pz_proj = 0.0;
107
108 coulomb_collision_gamma_targ = 0.0;
109 coulomb_collision_rx_targ = 0.0;
110 coulomb_collision_rz_targ = 0.0;
111 coulomb_collision_px_targ = 0.0;
112 coulomb_collision_pz_targ = 0.0;
113
114 secID = G4PhysicsModelCatalog::GetModelID( "model_LightIonQMDModel" );
115}
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
G4HadronicInteraction(const G4String &modelName="HadronicModel")
static G4int GetModelID(const G4int modelIndex)
static G4PionMinus * PionMinus()
static G4PionPlus * PionPlus()
Definition G4PionPlus.cc:93

Referenced by G4LightIonQMDReaction(), and operator=().

◆ ~G4LightIonQMDReaction()

G4LightIonQMDReaction::~G4LightIonQMDReaction ( )
override

Definition at line 118 of file G4LightIonQMDReaction.cc.

119{
120 delete excitationHandler;
121 delete collision;
122 delete meanField;
123}

◆ G4LightIonQMDReaction() [2/2]

G4LightIonQMDReaction::G4LightIonQMDReaction ( const G4LightIonQMDReaction & right)
delete

Member Function Documentation

◆ ApplyYourself()

G4HadFinalState * G4LightIonQMDReaction::ApplyYourself ( const G4HadProjectile & aTrack,
G4Nucleus & targetNucleus )
overridevirtual

Reimplemented from G4HadronicInteraction.

Definition at line 126 of file G4LightIonQMDReaction.cc.

127{
128 //G4cout << "G4LightIonQMDReaction::ApplyYourself" << G4endl;
129
130 theParticleChange.Clear();
131
132 system = new G4QMDSystem;
133
134 G4int proj_Z = 0;
135 G4int proj_A = 0;
136 const G4ParticleDefinition* proj_pd = ( const G4ParticleDefinition* ) projectile.GetDefinition();
137 if ( proj_pd->GetParticleType() == "nucleus" )
138 {
139 proj_Z = proj_pd->GetAtomicNumber();
140 proj_A = proj_pd->GetAtomicMass();
141 }
142 else
143 {
144 proj_Z = (int)( proj_pd->GetPDGCharge()/eplus );
145 proj_A = 1;
146 }
147 //G4int targ_Z = int ( target.GetZ() + 0.5 );
148 //G4int targ_A = int ( target.GetN() + 0.5 );
149 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this)
150 G4int targ_Z = target.GetZ_asInt();
151 G4int targ_A = target.GetA_asInt();
152 const G4ParticleDefinition* targ_pd = G4IonTable::GetIonTable()->GetIon( targ_Z , targ_A , 0.0 );
153
154
155 //G4NistManager* nistMan = G4NistManager::Instance();
156// G4Element* G4NistManager::FindOrBuildElement( targ_Z );
157
158 const G4DynamicParticle* proj_dp = new G4DynamicParticle ( proj_pd , projectile.Get4Momentum() );
159 //const G4Element* targ_ele = nistMan->FindOrBuildElement( targ_Z );
160 //G4double aTemp = projectile.GetMaterial()->GetTemperature();
161
162 // Glauber-Gribov nucleus-nucleus cross section does not have GetIsoCrossSection,
163 // therefore call GetElementCrossSection instead.
164 //G4double xs_0 = theXS->GetIsoCrossSection ( proj_dp , targ_Z , targ_A );
165 G4double xs_0 = theXS->GetElementCrossSection( proj_dp , targ_Z , projectile.GetMaterial() );
166
167 // When the projectile is a pion
168 if (proj_pd == G4PionPlus::PionPlus() ) {
169 xs_0 = pipElNucXS->GetElementCrossSection(proj_dp, targ_Z, projectile.GetMaterial() ) +
170 pipInelNucXS->GetElementCrossSection(proj_dp, targ_Z, projectile.GetMaterial() );
171 } else if (proj_pd == G4PionMinus::PionMinus() ) {
172 xs_0 = pimElNucXS->GetElementCrossSection(proj_dp, targ_Z, projectile.GetMaterial() ) +
173 pimInelNucXS->GetElementCrossSection(proj_dp, targ_Z, projectile.GetMaterial() );
174 }
175
176 //G4double xs_0 = genspaXS->GetCrossSection ( proj_dp , targ_ele , aTemp );
177 //G4double xs_0 = theXS->GetCrossSection ( proj_dp , targ_ele , aTemp );
178 //110822
179
180 G4double bmax_0 = std::sqrt( xs_0 / pi );
181 //std::cout << "bmax_0 in fm (fermi) " << bmax_0/fermi << std::endl;
182
183 //delete proj_dp;
184
185 G4bool elastic = true;
186
187 std::vector< G4LightIonQMDNucleus* > nucleuses; // Secondary nuceluses
188 G4ThreeVector boostToReac; // ReactionSystem (CM or NN);
189 G4ThreeVector boostBackToLAB; // Reaction System to LAB;
190
191 G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ_pd->GetPDGMass()/GeV );
192 G4ThreeVector boostLABtoCM = targ4p.findBoostToCM( proj_dp->Get4Momentum()/GeV ); // CM of target and proj;
193
194 G4double p1 = proj_dp->GetMomentum().mag()/GeV/proj_A;
195 G4double m1 = proj_dp->GetDefinition()->GetPDGMass()/GeV/proj_A;
196 G4double e1 = std::sqrt( p1*p1 + m1*m1 );
197 G4double e2 = targ_pd->GetPDGMass()/GeV/targ_A;
198 G4double beta_nn = -p1 / ( e1+e2 );
199
200 G4ThreeVector boostLABtoNN ( 0. , 0. , beta_nn ); // CM of NN;
201
202 G4double beta_nncm = ( - boostLABtoCM.beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.beta() * boostLABtoNN.beta() ) ;
203
204 //std::cout << targ4p << std::endl;
205 //std::cout << proj_dp->Get4Momentum()<< std::endl;
206 //std::cout << beta_nncm << std::endl;
207 G4ThreeVector boostNNtoCM( 0. , 0. , beta_nncm ); //
208 G4ThreeVector boostCMtoNN( 0. , 0. , -beta_nncm ); //
209
210 boostToReac = boostLABtoNN;
211 boostBackToLAB = -boostLABtoNN;
212
213 delete proj_dp;
214 G4int icounter = 0;
215 G4int icounter_max = 1024;
216 while ( elastic ) // Loop checking, 11.03.2015, T. Koi
217 {
218 icounter++;
219 if ( icounter > icounter_max ) {
220 G4cout << "Loop-counter exceeded the threshold value at " << __LINE__ << "th line of " << __FILE__ << "." << G4endl;
221 break;
222 }
223
224// impact parameter
225 //G4double bmax = 1.05*(bmax_0/fermi); // 10% for Peripheral reactions
226 G4double bmax = envelopF*(bmax_0/fermi);
227 G4double b = bmax * std::sqrt ( G4UniformRand() );
228//071112
229 //G4double b = 0;
230 //G4double b = bmax;
231 //G4double b = bmax/1.05 * 0.7 * G4UniformRand();
232
233 //G4cout << "G4QMDRESULT bmax_0 = " << bmax_0/fermi << " fm, bmax = " << bmax << " fm , b = " << b << " fm " << G4endl;
234
235 G4double plab = projectile.GetTotalMomentum()/GeV;
236 G4double elab = ( projectile.GetKineticEnergy() + proj_pd->GetPDGMass() + targ_pd->GetPDGMass() )/GeV;
237
238 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN );
239
240// Projectile
241 G4LorentzVector proj4pLAB = projectile.Get4Momentum()/GeV;
242
243 G4LightIonQMDGroundStateNucleus* proj(NULL);
244 if ( projectile.GetDefinition()->GetParticleType() == "nucleus"
245 || projectile.GetDefinition()->GetParticleName() == "proton"
246 || projectile.GetDefinition()->GetParticleName() == "neutron" )
247 {
248
249 proj_Z = proj_pd->GetAtomicNumber();
250 proj_A = proj_pd->GetAtomicMass();
251 proj = new G4LightIonQMDGroundStateNucleus( proj_Z , proj_A );
252 //proj->ShowParticipants();
253
254
255 meanField->SetSystem ( proj );
256 if ( proj_A != 1 )
257 {
258 proj->SetTotalPotential( meanField->GetTotalPotential() );
259 proj->CalEnergyAndAngularMomentumInCM();
260 }
261 }
262
263// Target
264 //G4int iz = int ( target.GetZ() );
265 //G4int ia = int ( target.GetN() );
266 //migrate to integer A and Z (GetN_asInt returns number of neutrons in the nucleus since this)
267 G4int iz = int ( target.GetZ_asInt() );
268 G4int ia = int ( target.GetA_asInt() );
269 G4LightIonQMDGroundStateNucleus* targ = new G4LightIonQMDGroundStateNucleus( iz , ia );
270
271 meanField->SetSystem (targ );
272 if ( ia != 1 )
273 {
274 targ->SetTotalPotential( meanField->GetTotalPotential() );
276 }
277
278 //G4LorentzVector targ4p( G4ThreeVector( 0.0 ) , targ->GetNuclearMass()/GeV );
279// Boost Vector to CM
280 //boostToCM = targ4p.findBoostToCM( proj4pLAB );
281
282// Target
283 for ( G4int i = 0 ; i < targ->GetTotalNumberOfParticipant() ; i++ )
284 {
285
286 G4ThreeVector p0 = targ->GetParticipant( i )->GetMomentum();
287 G4ThreeVector r0 = targ->GetParticipant( i )->GetPosition();
288
289 G4ThreeVector p ( p0.x() + coulomb_collision_px_targ
290 , p0.y()
291 , p0.z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ );
292
293 G4ThreeVector r ( r0.x() + coulomb_collision_rx_targ
294 , r0.y()
295 , r0.z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ );
296
297 system->SetParticipant( new G4QMDParticipant( targ->GetParticipant( i )->GetDefinition() , p , r ) );
298 system->GetParticipant( i )->SetTarget();
299
300 }
301
302 G4LorentzVector proj4pCM = CLHEP::boostOf ( proj4pLAB , boostToReac );
303 G4LorentzVector targ4pCM = CLHEP::boostOf ( targ4p , boostToReac );
304
305// Projectile
306 //G4cout << "proj : " << proj << G4endl;
307 //if ( proj != NULL )
308 if ( proj_A != 1 )
309 {
310
311// projectile is nucleus
312
313 for ( G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ )
314 {
315
316 G4ThreeVector p0 = proj->GetParticipant( i )->GetMomentum();
317 G4ThreeVector r0 = proj->GetParticipant( i )->GetPosition();
318
319 G4ThreeVector p ( p0.x() + coulomb_collision_px_proj
320 , p0.y()
321 , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
322
323 G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj
324 , r0.y()
325 , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
326
327 system->SetParticipant( new G4QMDParticipant( proj->GetParticipant( i )->GetDefinition() , p , r ) );
328 system->GetParticipant ( i + targ->GetTotalNumberOfParticipant() )->SetProjectile();
329 }
330
331 }
332 else
333 {
334
335// projectile is particle
336
337 // avoid multiple set in "elastic" loop
338 //G4cout << "system Total Participants : " << system->GetTotalNumberOfParticipant() << ", target : " << targ->GetTotalNumberOfParticipant() << G4endl;
339 if ( system->GetTotalNumberOfParticipant() == targ->GetTotalNumberOfParticipant() )
340 {
341
343
344 G4ThreeVector p0( 0 );
345 G4ThreeVector r0( 0 );
346
347 G4ThreeVector p ( p0.x() + coulomb_collision_px_proj
348 , p0.y()
349 , p0.z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
350
351 G4ThreeVector r ( r0.x() + coulomb_collision_rx_proj
352 , r0.y()
353 , r0.z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
354
355 system->SetParticipant( new G4QMDParticipant( (G4ParticleDefinition*)projectile.GetDefinition() , p , r ) );
356 // This is not important becase only 1 projectile particle.
357 system->GetParticipant ( i )->SetProjectile();
358 }
359
360 }
361 //system->ShowParticipants();
362
363 delete targ;
364 delete proj;
365
366 meanField->SetSystem ( system );
367 collision->SetMeanField ( meanField );
368
369// Time Evolution
370 //std::cout << "Start time evolution " << std::endl;
371 //system->ShowParticipants();
372 for ( G4int i = 0 ; i < maxTime ; i++ )
373 {
374 //G4cout << " do Paropagate " << i << " th time step. " << G4endl;
375 meanField->DoPropagation( deltaT );
376 //system->ShowParticipants();
377 collision->CalKinematicsOfBinaryCollisions( deltaT );
378
379 //if ( i / 10 * 10 == i )
380 //{
381 //G4cout << i << " th time step. " << G4endl;
382 //system->ShowParticipants();
383 //}
384 //system->ShowParticipants();
385 }
386 //system->ShowParticipants();
387
388
389 //std::cout << "Doing Cluster Judgment " << std::endl;
390
391 nucleuses = meanField->DoClusterJudgment();
392
393// Elastic Judgment
394
395 G4int numberOfSecondary = int ( nucleuses.size() ) + system->GetTotalNumberOfParticipant();
396
397 G4int sec_a_Z = 0;
398 G4int sec_a_A = 0;
399 const G4ParticleDefinition* sec_a_pd = NULL;
400 G4int sec_b_Z = 0;
401 G4int sec_b_A = 0;
402 const G4ParticleDefinition* sec_b_pd = NULL;
403
404 if ( numberOfSecondary == 2 )
405 {
406
407 G4bool elasticLike_system = false;
408 if ( nucleuses.size() == 2 )
409 {
410
411 sec_a_Z = nucleuses[0]->GetAtomicNumber();
412 sec_a_A = nucleuses[0]->GetMassNumber();
413 sec_b_Z = nucleuses[1]->GetAtomicNumber();
414 sec_b_A = nucleuses[1]->GetMassNumber();
415
416 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A )
417 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) )
418 {
419 elasticLike_system = true;
420 }
421
422 }
423 else if ( nucleuses.size() == 1 )
424 {
425
426 sec_a_Z = nucleuses[0]->GetAtomicNumber();
427 sec_a_A = nucleuses[0]->GetMassNumber();
428 sec_b_pd = system->GetParticipant( 0 )->GetDefinition();
429
430 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd )
431 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) )
432 {
433 elasticLike_system = true;
434 }
435
436 }
437 else
438 {
439
440 sec_a_pd = system->GetParticipant( 0 )->GetDefinition();
441 sec_b_pd = system->GetParticipant( 1 )->GetDefinition();
442
443 if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd )
444 || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) )
445 {
446 elasticLike_system = true;
447 }
448 // QMD should be inelastic collision, so that nucleon-nucleon collision should also be inelastic in this phase. by Y-H. S and A. H, Mar. 6, 2023.
449 if ( (proj_pd->GetParticleName() == "proton" && targ_pd->GetParticleName() == "proton")
450 || (proj_pd->GetParticleName() == "neutron" && targ_pd->GetParticleName() == "proton")
451 || (proj_pd->GetParticleName() == "pi+" && targ_pd->GetParticleName() == "proton")
452 || (proj_pd->GetParticleName() == "pi-" && targ_pd->GetParticleName() == "proton"))
453 {
454 elasticLike_system = false;
455 //G4cout << "elasticLike_system = false proton NOCollision " << system->GetNOCollision() << G4endl;
456 if ( system->GetNOCollision() == 1 || icounter+900 > icounter_max) elastic = false;
457 }
458 // Addition -- end
459 }
460
461 if ( elasticLike_system == true )
462 {
463
464 G4bool elasticLike_energy = true;
465// Cal ExcitationEnergy
466 for ( G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ )
467 {
468
469 //meanField->SetSystem( nucleuses[i] );
470 meanField->SetNucleus( nucleuses[i] );
471 //nucleuses[i]->SetTotalPotential( meanField->GetTotalPotential() );
472 //nucleuses[i]->CalEnergyAndAngularMomentumInCM();
473
474 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false;
475
476 }
477
478// Check Collision
479 G4bool withCollision = true;
480 if ( system->GetNOCollision() == 0 ) withCollision = false;
481
482// Final judegement for Inelasitc or Elastic;
483//
484// ElasticLike without Collision
485 //if ( elasticLike_energy == true && withCollision == false ) elastic = true; // ielst = 0
486// ElasticLike with Collision
487 //if ( elasticLike_energy == true && withCollision == true ) elastic = true; // ielst = 1
488// InelasticLike without Collision
489 //if ( elasticLike_energy == false ) elastic = false; // ielst = 2
490 if ( frag == true )
491 if ( elasticLike_energy == false ) elastic = false;
492// InelasticLike with Collision
493 if ( elasticLike_energy == false && withCollision == true ) elastic = false; // ielst = 3
494
495 }
496
497 }
498 else
499 {
500
501// numberOfSecondary != 2
502 elastic = false;
503
504 }
505
506//071115
507 //G4cout << elastic << G4endl;
508 // if elastic is true try again from sampling of impact parameter
509
510 if ( elastic == true )
511 {
512 // delete this nucleues
513 for ( std::vector< G4LightIonQMDNucleus* >::iterator
514 it = nucleuses.begin() ; it != nucleuses.end() ; it++ )
515 {
516 delete *it;
517 }
518 nucleuses.clear();
519 // system->Clear() should be included here. Otherwise, the nucleon is repeatedly regstered if the nucleon is the projectile. by Y-H. S. and A. H, Mar. 6, 2023.
520 system->Clear();
521 }
522
523 }
524
525// random rotation
526 G4double randAzimuthAngle = CLHEP::twopi*G4UniformRand();
527 G4ThreeVector zAxis(0.,0.,1.);
528
529// Statical Decay Phase
530
531 for ( std::vector< G4LightIonQMDNucleus* >::iterator it
532 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
533 {
534
535/*
536 G4cout << "G4QMDRESULT "
537 << (*it)->GetAtomicNumber()
538 << " "
539 << (*it)->GetMassNumber()
540 << " "
541 << (*it)->Get4Momentum()
542 << " "
543 << (*it)->Get4Momentum().vect()
544 << " "
545 << (*it)->Get4Momentum().restMass()
546 << " "
547 << (*it)->GetNuclearMass()/GeV
548 << G4endl;
549*/
550
551 meanField->SetNucleus ( *it );
552
553 if ( (*it)->GetAtomicNumber() == 0 // neutron cluster
554 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() ) // proton cluster
555 {
556 // push back system
557 for ( G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ )
558 {
559 G4QMDParticipant* aP = new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() );
560 system->SetParticipant ( aP );
561 }
562 continue;
563 }
564
565 G4double nucleus_e = std::sqrt ( G4Pow::GetInstance()->powN ( (*it)->GetNuclearMass()/GeV , 2 ) + G4Pow::GetInstance()->powN ( (*it)->Get4Momentum().vect().mag() , 2 ) );
566 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e );
567
568// std::cout << "G4QMDRESULT nucleus deltaQ " << deltaQ << std::endl;
569
570 G4int ia = (*it)->GetMassNumber();
571 G4int iz = (*it)->GetAtomicNumber();
572
573 G4LorentzVector lv ( G4ThreeVector( 0.0 ) , (*it)->GetExcitationEnergy()*GeV + G4IonTable::GetIonTable()->GetIonMass( iz , ia ) );
574
575 G4Fragment* aFragment = new G4Fragment( ia , iz , lv );
576
578 rv = excitationHandler->BreakItUp( *aFragment );
579 G4bool notBreak = true;
580 for ( G4ReactionProductVector::iterator itt
581 = rv->begin() ; itt != rv->end() ; itt++ )
582 {
583
584 notBreak = false;
585 // Secondary from this nucleus (*it)
586 const G4ParticleDefinition* pd = (*itt)->GetDefinition();
587
588 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV ); //in nucleus(*it) rest system
589 G4LorentzVector p4_CM = CLHEP::boostOf( p4 , -nucleus_p4CM.findBoostToCM() ); // Back to CM
590 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB
591 p4_LAB.rotate(randAzimuthAngle, zAxis); // random rotation
592
593//090122
594 //theParticleChange.AddSecondary( dp );
595 if ( !( pd->GetAtomicNumber() == 4 && pd->GetAtomicMass() == 8 ) )
596 {
597 //G4cout << "pd out of notBreak loop : " << pd->GetParticleName() << G4endl;
598 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV );
599 theParticleChange.AddSecondary( dp );
600 }
601 else
602 {
603 //Be8 -> Alpha + Alpha + Q
604 G4ThreeVector randomized_direction( G4UniformRand() , G4UniformRand() , G4UniformRand() );
605 randomized_direction = randomized_direction.unit();
606 G4double q_decay = (*itt)->GetMass() - 2*G4Alpha::Alpha()->GetPDGMass();
607 G4double p_decay = std::sqrt ( G4Pow::GetInstance()->powN(G4Alpha::Alpha()->GetPDGMass()+q_decay/2,2) - G4Pow::GetInstance()->powN(G4Alpha::Alpha()->GetPDGMass() , 2 ) );
608 G4LorentzVector p4_a1 ( p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 ); //in Be8 rest system
609
610 G4LorentzVector p4_a1_Be8 = CLHEP::boostOf ( p4_a1/GeV , -p4.findBoostToCM() );
611 G4LorentzVector p4_a1_CM = CLHEP::boostOf ( p4_a1_Be8 , -nucleus_p4CM.findBoostToCM() );
612 G4LorentzVector p4_a1_LAB = CLHEP::boostOf ( p4_a1_CM , boostBackToLAB );
613 p4_a1_LAB.rotate(randAzimuthAngle, zAxis); // random rotation
614
615 G4LorentzVector p4_a2 ( -p_decay*randomized_direction , G4Alpha::Alpha()->GetPDGMass()+q_decay/2 ); //in Be8 rest system
616
617 G4LorentzVector p4_a2_Be8 = CLHEP::boostOf ( p4_a2/GeV , -p4.findBoostToCM() );
618 G4LorentzVector p4_a2_CM = CLHEP::boostOf ( p4_a2_Be8 , -nucleus_p4CM.findBoostToCM() );
619 G4LorentzVector p4_a2_LAB = CLHEP::boostOf ( p4_a2_CM , boostBackToLAB );
620 p4_a2_LAB.rotate(randAzimuthAngle, zAxis); // random rotation
621
622 G4DynamicParticle* dp1 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a1_LAB*GeV );
623 G4DynamicParticle* dp2 = new G4DynamicParticle( G4Alpha::Alpha() , p4_a2_LAB*GeV );
624 theParticleChange.AddSecondary( dp1 );
625 theParticleChange.AddSecondary( dp2 );
626 }
627//090122
628
629/*
630 G4cout
631 << "Regist Secondary "
632 << (*itt)->GetDefinition()->GetParticleName()
633 << " "
634 << (*itt)->GetMomentum()/GeV
635 << " "
636 << (*itt)->GetKineticEnergy()/GeV
637 << " "
638 << (*itt)->GetMass()/GeV
639 << " "
640 << (*itt)->GetTotalEnergy()/GeV
641 << " "
642 << (*itt)->GetTotalEnergy()/GeV * (*itt)->GetTotalEnergy()/GeV
643 - (*itt)->GetMomentum()/GeV * (*itt)->GetMomentum()/GeV
644 << " "
645 << nucleus_p4CM.findBoostToCM()
646 << " "
647 << p4
648 << " "
649 << p4_CM
650 << " "
651 << p4_LAB
652 << G4endl;
653*/
654
655 }
656 if ( notBreak == true )
657 {
658
659 const G4ParticleDefinition* pd = G4IonTable::GetIonTable()->GetIon( (*it)->GetAtomicNumber() , (*it)->GetMassNumber(), (*it)->GetExcitationEnergy()*GeV );
660 //G4cout << "pd in notBreak loop : " << pd->GetParticleName() << G4endl;
661 G4LorentzVector p4_CM = nucleus_p4CM;
662 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB ); // Back to LAB
663 p4_LAB.rotate(randAzimuthAngle, zAxis); // random rotation
664 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV );
665 theParticleChange.AddSecondary( dp );
666
667 }
668
669 for ( G4ReactionProductVector::iterator itt
670 = rv->begin() ; itt != rv->end() ; itt++ )
671 {
672 delete *itt;
673 }
674 delete rv;
675
676 delete aFragment;
677
678 }
679
680
681
682 for ( G4int i = 0 ; i < system->GetTotalNumberOfParticipant() ; i++ )
683 {
684 // Secondary particles
685
686 const G4ParticleDefinition* pd = system->GetParticipant( i )->GetDefinition();
687 G4LorentzVector p4_CM = system->GetParticipant( i )->Get4Momentum();
688 G4LorentzVector p4_LAB = CLHEP::boostOf( p4_CM , boostBackToLAB );
689 p4_LAB.rotate(randAzimuthAngle, zAxis); // random rotation
690 G4DynamicParticle* dp = new G4DynamicParticle( pd , p4_LAB*GeV );
691 theParticleChange.AddSecondary( dp );
692 //G4cout << "In the last theParticleChange loop : " << pd->GetParticleName() << G4endl;
693
694/*
695 G4cout << "G4QMDRESULT "
696 << "r" << i << " " << system->GetParticipant ( i ) -> GetPosition() << " "
697 << "p" << i << " " << system->GetParticipant ( i ) -> Get4Momentum()
698 << G4endl;
699*/
700
701 }
702
703 for ( std::vector< G4LightIonQMDNucleus* >::iterator it
704 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
705 {
706 delete *it; // delete nulceuse
707 }
708 nucleuses.clear();
709
710 system->Clear();
711 delete system;
712
713 theParticleChange.SetStatusChange( stopAndKill );
714
715 for (G4int i = 0; i < G4int(theParticleChange.GetNumberOfSecondaries() ); i++)
716 {
717 //G4cout << "Particle : " << theParticleChange.GetSecondary(i)->GetParticle()->GetParticleDefinition()->GetParticleName() << G4endl;
718 //G4cout << "KEnergy : " << theParticleChange.GetSecondary(i)->GetParticle()->GetKineticEnergy() << G4endl;
719 //G4cout << "modelID : " << theParticleChange.GetSecondary(i)->GetCreatorModelID() << G4endl;
720 theParticleChange.GetSecondary(i)->SetCreatorModelID(secID);
721 }
722
723 return &theParticleChange;
724
725}
@ stopAndKill
CLHEP::HepLorentzVector G4LorentzVector
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4UniformRand()
Definition Randomize.hh:52
double beta() const
double z() const
double x() const
double y() const
double mag() const
HepLorentzVector & rotate(double, const Hep3Vector &)
static G4Alpha * Alpha()
Definition G4Alpha.cc:83
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4ThreeVector GetMomentum() const
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4IonTable * GetIonTable()
G4double GetIonMass(G4int Z, G4int A, G4int nL=0, G4int lvl=0) const
void SetTotalPotential(G4double x)
G4int GetAtomicNumber() const
const G4String & GetParticleType() const
G4int GetAtomicMass() const
const G4String & GetParticleName() const
static G4Pow * GetInstance()
Definition G4Pow.cc:41
G4double powN(G4double x, G4int n) const
Definition G4Pow.cc:162
G4ThreeVector GetPosition()
const G4ParticleDefinition * GetDefinition()
G4ThreeVector GetMomentum()
G4QMDParticipant * GetParticipant(G4int i)
G4int GetTotalNumberOfParticipant()
void SetSystem(G4QMDSystem *, G4ThreeVector, G4ThreeVector)
HepLorentzVector boostOf(const HepLorentzVector &vec, const Hep3Vector &betaVector)
G4double elastic(Particle const *const p1, Particle const *const p2)

◆ GetExcitationHandler()

G4ExcitationHandler * G4LightIonQMDReaction::GetExcitationHandler ( )
inline

Definition at line 70 of file G4LightIonQMDReaction.hh.

70{return excitationHandler;};

◆ GetFinalStates()

std::vector< G4QMDSystem * > G4LightIonQMDReaction::GetFinalStates ( )

◆ ModelDescription()

void G4LightIonQMDReaction::ModelDescription ( std::ostream & outFile) const
overridevirtual

Reimplemented from G4HadronicInteraction.

Definition at line 882 of file G4LightIonQMDReaction.cc.

883{
884 outFile << "Lorentz covarianted Quantum Molecular Dynamics model for nucleus (particle) vs nucleus reactions\n";
885}

◆ operator=()

const G4LightIonQMDReaction & G4LightIonQMDReaction::operator= ( const G4LightIonQMDReaction & right)
delete

◆ SetDT()

void G4LightIonQMDReaction::SetDT ( G4double t)
inline

Definition at line 76 of file G4LightIonQMDReaction.hh.

76{ deltaT = t; };

◆ SetEF()

void G4LightIonQMDReaction::SetEF ( G4double x)
inline

Definition at line 77 of file G4LightIonQMDReaction.hh.

77{ envelopF = x; };

◆ SetTMAX()

void G4LightIonQMDReaction::SetTMAX ( G4int i)
inline

Definition at line 75 of file G4LightIonQMDReaction.hh.

75{ maxTime = i; };

◆ UnUseGEM()

void G4LightIonQMDReaction::UnUseGEM ( )
inline

Definition at line 72 of file G4LightIonQMDReaction.hh.

72{gem = false; setEvaporationCh();};

◆ UseFRAG()

void G4LightIonQMDReaction::UseFRAG ( )
inline

Definition at line 73 of file G4LightIonQMDReaction.hh.

73{frag = true;};

The documentation for this class was generated from the following files: