115{
116
117
119
121
126 {
129 }
130 else
131 {
133 proj_A = 1;
134 }
135
136
137
138 G4int targ_Z = target.GetZ_asInt();
139 G4int targ_A = target.GetA_asInt();
141
142
143
144
145
147
148
149
150
151
152
154
155
162 }
163
164
165
166
167
168 G4double bmax_0 = std::sqrt( xs_0 / pi );
169
170
171
172
174
175 std::vector< G4QMDNucleus* > nucleuses;
178
181
184 G4double e1 = std::sqrt( p1*p1 + m1*m1 );
187
189
190 G4double beta_nncm = ( - boostLABtoCM.
beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.
beta() * boostLABtoNN.beta() ) ;
191
192
193
194
197
198 boostToReac = boostLABtoNN;
199 boostBackToLAB = -boostLABtoNN;
200
201 delete proj_dp;
202
204 G4int icounter_max = 1024;
205 while ( elastic )
206 {
207 icounter++;
208 if ( icounter > icounter_max ) {
209 G4cout <<
"Loop-counter exceeded the threshold value at " << __LINE__ <<
"th line of " << __FILE__ <<
"." <<
G4endl;
210 break;
211 }
212
213
214
215 G4double bmax = envelopF*(bmax_0/fermi);
217
218
219
220
221
222
223
224 G4double plab = projectile.GetTotalMomentum()/GeV;
226
227 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN );
228
229
231
233 if ( projectile.GetDefinition()->GetParticleType() == "nucleus"
234 || projectile.GetDefinition()->GetParticleName() == "proton"
235 || projectile.GetDefinition()->GetParticleName() == "neutron" )
236 {
237
240
242
243
244
247 proj->CalEnergyAndAngularMomentumInCM();
248
249 }
250
251
252
253
254
255 G4int iz = int ( target.GetZ_asInt() );
256 G4int ia = int ( target.GetA_asInt() );
257
259
263
264
265
266
267
268
270 {
271
274
277 , p0.
z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ );
278
281 , r0.
z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ );
282
285
286 }
287
290
291
292
293
294 if ( proj_A != 1 )
295 {
296
297
298
299 for (
G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ )
300 {
301
304
307 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
308
311 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
312
315 }
316
317 }
318 else
319 {
320
321
322
323
324
326 {
327
329
332
335 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
336
339 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
340
342
344 }
345
346 }
347
348
349 delete targ;
350 delete proj;
351
354
355
356
357
358 for (
G4int i = 0 ; i < maxTime ; i++ )
359 {
360
362
364
365 if ( i / 10 * 10 == i )
366 {
367
368
369 }
370
371 }
372
373
374
375
376
378
379
380
382
389
390 if ( numberOfSecondary == 2 )
391 {
392
393 G4bool elasticLike_system =
false;
394 if ( nucleuses.size() == 2 )
395 {
396
398 sec_a_A = nucleuses[0]->GetMassNumber();
399 sec_b_Z = nucleuses[1]->GetAtomicNumber();
400 sec_b_A = nucleuses[1]->GetMassNumber();
401
402 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A )
403 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) )
404 {
405 elasticLike_system = true;
406 }
407
408 }
409 else if ( nucleuses.size() == 1 )
410 {
411
412 sec_a_Z = nucleuses[0]->GetAtomicNumber();
413 sec_a_A = nucleuses[0]->GetMassNumber();
415
416 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd )
417 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) )
418 {
419 elasticLike_system = true;
420 }
421
422 }
423 else
424 {
425
428
429 if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd )
430 || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) )
431 {
432 elasticLike_system = true;
433 }
434
435 }
436
437 if ( elasticLike_system == true )
438 {
439
440 G4bool elasticLike_energy =
true;
441
442 for (
G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ )
443 {
444
445
447
448
449
450 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false;
451
452 }
453
454
455 G4bool withCollision =
true;
457
458
459
460
461
462
463
464
465
466 if ( frag == true )
467 if ( elasticLike_energy ==
false )
elastic =
false;
468
469 if ( elasticLike_energy ==
false && withCollision ==
true )
elastic =
false;
470
471 }
472
473 }
474 else
475 {
476
477
479
480 }
481
482
483
484
485
486 if ( elastic == true )
487 {
488
489 for ( std::vector< G4QMDNucleus* >::iterator
490 it = nucleuses.begin() ; it != nucleuses.end() ; it++ )
491 {
492 delete *it;
493 }
494 nucleuses.clear();
495 }
496
497 }
498
499
500
501
502 for ( std::vector< G4QMDNucleus* >::iterator it
503 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
504 {
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
523
524 if ( (*it)->GetAtomicNumber() == 0
525 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() )
526 {
527
528 for (
G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ )
529 {
530 G4QMDParticipant* aP =
new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() );
532 }
533 continue;
534 }
535
537 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e );
538
539
540
541 G4int ia = (*it)->GetMassNumber();
542 G4int iz = (*it)->GetAtomicNumber();
543
545
547
549 rv = excitationHandler->
BreakItUp( *aFragment );
551 for ( G4ReactionProductVector::iterator itt
552 = rv->begin() ; itt != rv->end() ; itt++ )
553 {
554
555 notBreak = false;
556
558
559 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV );
562
563
564
565
567 {
568
571 }
572 else
573 {
574
576 randomized_direction = randomized_direction.unit();
580
584
586
590
595 }
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624 }
625 if ( notBreak == true )
626 {
627
629
634
635 }
636
637 for ( G4ReactionProductVector::iterator itt
638 = rv->begin() ; itt != rv->end() ; itt++ )
639 {
640 delete *itt;
641 }
642 delete rv;
643
644 delete aFragment;
645
646 }
647
648
649
651 {
652
653
659
660
661
662
663
664
665
666
667
668 }
669
670 for ( std::vector< G4QMDNucleus* >::iterator it
671 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
672 {
673 delete *it;
674 }
675 nucleuses.clear();
676
678 delete system;
679
681
683 {
684
685
686
688 }
689
691
692}
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat) final
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4ThreeVector GetMomentum() const
G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState)
void SetStatusChange(G4HadFinalStateStatus aS)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
std::size_t GetNumberOfSecondaries() const
G4HadSecondary * GetSecondary(size_t i)
void SetCreatorModelID(G4int id)
G4HadFinalState theParticleChange
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
G4int GetAtomicNumber() const
const G4String & GetParticleType() const
G4double GetPDGMass() const
G4int GetAtomicMass() const
G4double GetPDGCharge() const
static G4Pow * GetInstance()
G4double powN(G4double x, G4int n) const
void SetMeanField(G4QMDMeanField *meanfield)
void CalKinematicsOfBinaryCollisions(G4double)
G4double GetTotalPotential()
void SetNucleus(G4QMDNucleus *aSystem)
void DoPropagation(G4double)
std::vector< G4QMDNucleus * > DoClusterJudgment()
void SetSystem(G4QMDSystem *aSystem)
void SetTotalPotential(G4double x)
void CalEnergyAndAngularMomentumInCM()
G4ThreeVector GetPosition()
const G4ParticleDefinition * GetDefinition()
G4LorentzVector Get4Momentum()
G4ThreeVector GetMomentum()
G4QMDParticipant * GetParticipant(G4int i)
G4int GetTotalNumberOfParticipant()
void SetParticipant(G4QMDParticipant *particle)
virtual G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat=nullptr)
HepLorentzVector boostOf(const HepLorentzVector &vec, const Hep3Vector &betaVector)
G4double elastic(Particle const *const p1, Particle const *const p2)