127{
128
129
131
133
138 {
141 }
142 else
143 {
145 proj_A = 1;
146 }
147
148
149
150 G4int targ_Z = target.GetZ_asInt();
151 G4int targ_A = target.GetA_asInt();
153
154
155
156
157
159
160
161
162
163
164
166
167
174 }
175
176
177
178
179
180 G4double bmax_0 = std::sqrt( xs_0 / pi );
181
182
183
184
186
187 std::vector< G4LightIonQMDNucleus* > nucleuses;
190
193
196 G4double e1 = std::sqrt( p1*p1 + m1*m1 );
199
201
202 G4double beta_nncm = ( - boostLABtoCM.
beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.
beta() * boostLABtoNN.beta() ) ;
203
204
205
206
209
210 boostToReac = boostLABtoNN;
211 boostBackToLAB = -boostLABtoNN;
212
213 delete proj_dp;
215 G4int icounter_max = 1024;
216 while ( elastic )
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
225
226 G4double bmax = envelopF*(bmax_0/fermi);
228
229
230
231
232
233
234
235 G4double plab = projectile.GetTotalMomentum()/GeV;
237
238 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN );
239
240
242
244 if ( projectile.GetDefinition()->GetParticleType() == "nucleus"
245 || projectile.GetDefinition()->GetParticleName() == "proton"
246 || projectile.GetDefinition()->GetParticleName() == "neutron" )
247 {
248
252
253
254
256 if ( proj_A != 1 )
257 {
259 proj->CalEnergyAndAngularMomentumInCM();
260 }
261 }
262
263
264
265
266
267 G4int iz = int ( target.GetZ_asInt() );
268 G4int ia = int ( target.GetA_asInt() );
270
272 if ( ia != 1 )
273 {
276 }
277
278
279
280
281
282
284 {
285
288
291 , p0.
z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ );
292
295 , r0.
z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ );
296
299
300 }
301
304
305
306
307
308 if ( proj_A != 1 )
309 {
310
311
312
313 for (
G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ )
314 {
315
318
321 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
322
325 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
326
329 }
330
331 }
332 else
333 {
334
335
336
337
338
340 {
341
343
346
349 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
350
353 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
354
356
358 }
359
360 }
361
362
363 delete targ;
364 delete proj;
365
368
369
370
371
372 for (
G4int i = 0 ; i < maxTime ; i++ )
373 {
374
376
378
379
380
381
382
383
384
385 }
386
387
388
389
390
392
393
394
396
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();
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
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
453 {
454 elasticLike_system = false;
455
457 }
458
459 }
460
461 if ( elasticLike_system == true )
462 {
463
464 G4bool elasticLike_energy =
true;
465
466 for (
G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ )
467 {
468
469
471
472
473
474 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false;
475
476 }
477
478
479 G4bool withCollision =
true;
481
482
483
484
485
486
487
488
489
490 if ( frag == true )
491 if ( elasticLike_energy ==
false )
elastic =
false;
492
493 if ( elasticLike_energy ==
false && withCollision ==
true )
elastic =
false;
494
495 }
496
497 }
498 else
499 {
500
501
503
504 }
505
506
507
508
509
510 if ( elastic == true )
511 {
512
513 for ( std::vector< G4LightIonQMDNucleus* >::iterator
514 it = nucleuses.begin() ; it != nucleuses.end() ; it++ )
515 {
516 delete *it;
517 }
518 nucleuses.clear();
519
521 }
522
523 }
524
525
526
527
528 for ( std::vector< G4LightIonQMDNucleus* >::iterator it
529 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
530 {
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
549
550 if ( (*it)->GetAtomicNumber() == 0
551 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() )
552 {
553
554 for (
G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ )
555 {
556 G4QMDParticipant* aP =
new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() );
558 }
559 continue;
560 }
561
563 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e );
564
565
566
567 G4int ia = (*it)->GetMassNumber();
568 G4int iz = (*it)->GetAtomicNumber();
569
571
573
575 rv = excitationHandler->
BreakItUp( *aFragment );
577 for ( G4ReactionProductVector::iterator itt
578 = rv->begin() ; itt != rv->end() ; itt++ )
579 {
580
581 notBreak = false;
582
584
585 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV );
588
589
590
591
593 {
594
597 }
598 else
599 {
600
602 randomized_direction = randomized_direction.unit();
606
610
612
616
621 }
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650 }
651 if ( notBreak == true )
652 {
653
655
660
661 }
662
663 for ( G4ReactionProductVector::iterator itt
664 = rv->begin() ; itt != rv->end() ; itt++ )
665 {
666 delete *itt;
667 }
668 delete rv;
669
670 delete aFragment;
671
672 }
673
674
675
677 {
678
679
685
686
687
688
689
690
691
692
693
694 }
695
696 for ( std::vector< G4LightIonQMDNucleus* >::iterator it
697 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
698 {
699 delete *it;
700 }
701 nucleuses.clear();
702
704 delete system;
705
707
709 {
710
711
712
714 }
715
717
718}
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
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
void CalKinematicsOfBinaryCollisions(G4double)
void SetMeanField(G4LightIonQMDMeanField *meanfield)
void DoPropagation(G4double)
void SetNucleus(G4LightIonQMDNucleus *aSystem)
G4double GetTotalPotential()
void SetSystem(G4QMDSystem *aSystem)
std::vector< G4LightIonQMDNucleus * > DoClusterJudgment()
void CalEnergyAndAngularMomentumInCM()
void SetTotalPotential(G4double x)
G4int GetAtomicNumber() const
const G4String & GetParticleType() const
G4double GetPDGMass() const
G4int GetAtomicMass() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
static G4Pow * GetInstance()
G4double powN(G4double x, G4int n) const
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)