111{
112
113
115
117
122 {
125 }
126 else
127 {
129 proj_A = 1;
130 }
131
132
133
134 G4int targ_Z = target.GetZ_asInt();
135 G4int targ_A = target.GetA_asInt();
137
138
139
140
141
143
144
145
146
147
149
151
152
159 }
160
161
162
163
164
165 G4double bmax_0 = std::sqrt( xs_0 / pi );
166
167
168
169
171
172 std::vector< G4QMDNucleus* > nucleuses;
175
178
181 G4double e1 = std::sqrt( p1*p1 + m1*m1 );
184
186
187 G4double beta_nncm = ( - boostLABtoCM.
beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.
beta() * boostLABtoNN.beta() ) ;
188
189
190
191
194
195 boostToReac = boostLABtoNN;
196 boostBackToLAB = -boostLABtoNN;
197
198 delete proj_dp;
199
201 G4int icounter_max = 1024;
202 while ( elastic )
203 {
204 icounter++;
205 if ( icounter > icounter_max ) {
206 G4cout <<
"Loop-counter exceeded the threshold value at " << __LINE__ <<
"th line of " << __FILE__ <<
"." <<
G4endl;
207 break;
208 }
209
210
211
212 G4double bmax = envelopF*(bmax_0/fermi);
214
215
216
217
218
219
220
221 G4double plab = projectile.GetTotalMomentum()/GeV;
223
224 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN );
225
226
228
230 if ( projectile.GetDefinition()->GetParticleType() == "nucleus"
231 || projectile.GetDefinition()->GetParticleName() == "proton"
232 || projectile.GetDefinition()->GetParticleName() == "neutron" )
233 {
234
237
239
240
241
244 proj->CalEnergyAndAngularMomentumInCM();
245
246 }
247
248
249
250
251
252 G4int iz = int ( target.GetZ_asInt() );
253 G4int ia = int ( target.GetA_asInt() );
254
256
260
261
262
263
264
265
267 {
268
271
274 , p0.
z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ );
275
278 , r0.
z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ );
279
282
283 }
284
287
288
289
290
291 if ( proj_A != 1 )
292 {
293
294
295
296 for (
G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ )
297 {
298
301
304 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
305
308 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
309
312 }
313
314 }
315 else
316 {
317
318
319
320
321
323 {
324
326
329
332 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
333
336 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
337
339
341 }
342
343 }
344
345
346 delete targ;
347 delete proj;
348
351
352
353
354
355 for (
G4int i = 0 ; i < maxTime ; i++ )
356 {
357
359
361
362 if ( i / 10 * 10 == i )
363 {
364
365
366 }
367
368 }
369
370
371
372
373
375
376
377
379
386
387 if ( numberOfSecondary == 2 )
388 {
389
390 G4bool elasticLike_system =
false;
391 if ( nucleuses.size() == 2 )
392 {
393
395 sec_a_A = nucleuses[0]->GetMassNumber();
396 sec_b_Z = nucleuses[1]->GetAtomicNumber();
397 sec_b_A = nucleuses[1]->GetMassNumber();
398
399 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A )
400 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) )
401 {
402 elasticLike_system = true;
403 }
404
405 }
406 else if ( nucleuses.size() == 1 )
407 {
408
409 sec_a_Z = nucleuses[0]->GetAtomicNumber();
410 sec_a_A = nucleuses[0]->GetMassNumber();
412
413 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd )
414 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) )
415 {
416 elasticLike_system = true;
417 }
418
419 }
420 else
421 {
422
425
426 if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd )
427 || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) )
428 {
429 elasticLike_system = true;
430 }
431
432 }
433
434 if ( elasticLike_system == true )
435 {
436
437 G4bool elasticLike_energy =
true;
438
439 for (
G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ )
440 {
441
442
444
445
446
447 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false;
448
449 }
450
451
452 G4bool withCollision =
true;
454
455
456
457
458
459
460
461
462
463 if ( frag == true )
464 if ( elasticLike_energy ==
false )
elastic =
false;
465
466 if ( elasticLike_energy ==
false && withCollision ==
true )
elastic =
false;
467
468 }
469
470 }
471 else
472 {
473
474
476
477 }
478
479
480
481
482
483 if ( elastic == true )
484 {
485
486 for ( std::vector< G4QMDNucleus* >::iterator
487 it = nucleuses.begin() ; it != nucleuses.end() ; it++ )
488 {
489 delete *it;
490 }
491 nucleuses.clear();
492 }
493
494 }
495
496
497
498
499 for ( std::vector< G4QMDNucleus* >::iterator it
500 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
501 {
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
520
521 if ( (*it)->GetAtomicNumber() == 0
522 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() )
523 {
524
525 for (
G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ )
526 {
527 G4QMDParticipant* aP =
new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() );
529 }
530 continue;
531 }
532
534 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e );
535
536
537
538 G4int ia = (*it)->GetMassNumber();
539 G4int iz = (*it)->GetAtomicNumber();
540
542
544
546 rv = excitationHandler->
BreakItUp( *aFragment );
548 for ( G4ReactionProductVector::iterator itt
549 = rv->begin() ; itt != rv->end() ; itt++ )
550 {
551
552 notBreak = false;
553
555
556 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV );
559
560
561
562
564 {
565
568 }
569 else
570 {
571
573 randomized_direction = randomized_direction.unit();
577
581
583
587
592 }
593
594
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 if ( notBreak == true )
623 {
624
626
631
632 }
633
634 for ( G4ReactionProductVector::iterator itt
635 = rv->begin() ; itt != rv->end() ; itt++ )
636 {
637 delete *itt;
638 }
639 delete rv;
640
641 delete aFragment;
642
643 }
644
645
646
648 {
649
650
656
657
658
659
660
661
662
663
664
665 }
666
667 for ( std::vector< G4QMDNucleus* >::iterator it
668 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
669 {
670 delete *it;
671 }
672 nucleuses.clear();
673
675 delete system;
676
678
680 {
681
682
683
685 }
686
688
689}
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 SetCreatorModelType(G4int idx)
G4HadFinalState theParticleChange
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
G4double GetIonMass(G4int Z, G4int A, G4int L=0, G4int lvl=0) const
static G4IonTable * GetIonTable()
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 GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=nullptr, const G4Element *elm=nullptr, const G4Material *mat=nullptr)
HepLorentzVector boostOf(const HepLorentzVector &vec, const Hep3Vector &betaVector)
G4double elastic(Particle const *const p1, Particle const *const p2)