81{
82
83
85
87
92 {
95 }
96 else
97 {
99 proj_A = 1;
100 }
101
102
103
104 G4int targ_Z = target.GetZ_asInt();
105 G4int targ_A = target.GetA_asInt();
107
108
109
110
111
113
114
115
116
117
119
121
122
123
124
126
127 G4double bmax_0 = std::sqrt( xs_0 / pi );
128
129
130
131
133
134 std::vector< G4QMDNucleus* > nucleuses;
137
140
143 G4double e1 = std::sqrt( p1*p1 + m1*m1 );
146
148
149 G4double beta_nncm = ( - boostLABtoCM.
beta() + boostLABtoNN.beta() ) / ( 1 - boostLABtoCM.
beta() * boostLABtoNN.beta() ) ;
150
151
152
153
156
157 boostToReac = boostLABtoNN;
158 boostBackToLAB = -boostLABtoNN;
159
160 delete proj_dp;
161
162 while ( elastic )
163 {
164
165
166
167 G4double bmax = envelopF*(bmax_0/fermi);
169
170
171
172
173
174
175
176 G4double plab = projectile.GetTotalMomentum()/GeV;
178
179 calcOffSetOfCollision( b , proj_pd , targ_pd , plab , elab , bmax , boostCMtoNN );
180
181
183
185 if ( projectile.GetDefinition()->GetParticleType() == "nucleus"
186 || projectile.GetDefinition()->GetParticleName() == "proton"
187 || projectile.GetDefinition()->GetParticleName() == "neutron" )
188 {
189
192
194
195
196
199 proj->CalEnergyAndAngularMomentumInCM();
200
201 }
202
203
204
205
206
207 G4int iz = int ( target.GetZ_asInt() );
208 G4int ia = int ( target.GetA_asInt() );
209
211
215
216
217
218
219
220
222 {
223
226
229 , p0.
z() * coulomb_collision_gamma_targ + coulomb_collision_pz_targ );
230
233 , r0.
z() / coulomb_collision_gamma_targ + coulomb_collision_rz_targ );
234
237
238 }
239
242
243
244 if ( proj != NULL )
245 {
246
247
248
249 for (
G4int i = 0 ; i < proj->GetTotalNumberOfParticipant() ; i++ )
250 {
251
254
257 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
258
261 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
262
265 }
266
267 }
268 else
269 {
270
271
272
273
275 {
276
278
281
284 , p0.
z() * coulomb_collision_gamma_proj + coulomb_collision_pz_proj );
285
288 , r0.
z() / coulomb_collision_gamma_proj + coulomb_collision_rz_proj );
289
291
293 }
294
295 }
296
297
298 delete targ;
299 delete proj;
300
303
304
305
306
307 for (
G4int i = 0 ; i < maxTime ; i++ )
308 {
309
311
313
314 if ( i / 10 * 10 == i )
315 {
316
317
318 }
319
320 }
321
322
323
324
325
327
328
329
331
338
339 if ( numberOfSecondary == 2 )
340 {
341
342 G4bool elasticLike_system =
false;
343 if ( nucleuses.size() == 2 )
344 {
345
347 sec_a_A = nucleuses[0]->GetMassNumber();
348 sec_b_Z = nucleuses[1]->GetAtomicNumber();
349 sec_b_A = nucleuses[1]->GetMassNumber();
350
351 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_Z == targ_Z && sec_b_A == targ_A )
352 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_Z == proj_Z && sec_b_A == proj_A ) )
353 {
354 elasticLike_system = true;
355 }
356
357 }
358 else if ( nucleuses.size() == 1 )
359 {
360
361 sec_a_Z = nucleuses[0]->GetAtomicNumber();
362 sec_a_A = nucleuses[0]->GetMassNumber();
364
365 if ( ( sec_a_Z == proj_Z && sec_a_A == proj_A && sec_b_pd == targ_pd )
366 || ( sec_a_Z == targ_Z && sec_a_A == targ_A && sec_b_pd == proj_pd ) )
367 {
368 elasticLike_system = true;
369 }
370
371 }
372 else
373 {
374
377
378 if ( ( sec_a_pd == proj_pd && sec_b_pd == targ_pd )
379 || ( sec_a_pd == targ_pd && sec_b_pd == proj_pd ) )
380 {
381 elasticLike_system = true;
382 }
383
384 }
385
386 if ( elasticLike_system == true )
387 {
388
389 G4bool elasticLike_energy =
true;
390
391 for (
G4int i = 0 ; i < int ( nucleuses.size() ) ; i++ )
392 {
393
394
396
397
398
399 if ( nucleuses[i]->GetExcitationEnergy()*GeV > 1.0*MeV ) elasticLike_energy = false;
400
401 }
402
403
404 G4bool withCollision =
true;
406
407
408
409
410
411
412
413
414
415 if ( frag == true )
416 if ( elasticLike_energy == false ) elastic = false;
417
418 if ( elasticLike_energy == false && withCollision == true ) elastic = false;
419
420 }
421
422 }
423 else
424 {
425
426
427 elastic = false;
428
429 }
430
431
432
433
434
435 if ( elastic == true )
436 {
437
438 for ( std::vector< G4QMDNucleus* >::iterator
439 it = nucleuses.begin() ; it != nucleuses.end() ; it++ )
440 {
441 delete *it;
442 }
443 nucleuses.clear();
444 }
445 }
446
447
448
449
450 for ( std::vector< G4QMDNucleus* >::iterator it
451 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
452 {
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
471
472 if ( (*it)->GetAtomicNumber() == 0
473 || (*it)->GetAtomicNumber() == (*it)->GetMassNumber() )
474 {
475
476 for (
G4int i = 0 ; i < (*it)->GetTotalNumberOfParticipant() ; i++ )
477 {
478 G4QMDParticipant* aP =
new G4QMDParticipant( ( (*it)->GetParticipant( i ) )->GetDefinition() , ( (*it)->GetParticipant( i ) )->GetMomentum() , ( (*it)->GetParticipant( i ) )->GetPosition() );
480 }
481 continue;
482 }
483
484 G4double nucleus_e = std::sqrt ( std::pow ( (*it)->GetNuclearMass()/GeV , 2 ) + std::pow ( (*it)->Get4Momentum().vect().mag() , 2 ) );
485 G4LorentzVector nucleus_p4CM ( (*it)->Get4Momentum().vect() , nucleus_e );
486
487
488
489 G4int ia = (*it)->GetMassNumber();
490 G4int iz = (*it)->GetAtomicNumber();
491
493
495
497 rv = excitationHandler->
BreakItUp( *aFragment );
499 for ( G4ReactionProductVector::iterator itt
500 = rv->begin() ; itt != rv->end() ; itt++ )
501 {
502
503 notBreak = false;
504
506
507 G4LorentzVector p4 ( (*itt)->GetMomentum()/GeV , (*itt)->GetTotalEnergy()/GeV );
510
511
512
513
515 {
518 }
519 else
520 {
521
523 randomized_direction = randomized_direction.unit();
527
531
533
537
542 }
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571 }
572 if ( notBreak == true )
573 {
574
580
581 }
582
583 for ( G4ReactionProductVector::iterator itt
584 = rv->begin() ; itt != rv->end() ; itt++ )
585 {
586 delete *itt;
587 }
588 delete rv;
589
590 delete aFragment;
591
592 }
593
594
595
597 {
598
599
600
606
607
608
609
610
611
612
613
614 }
615
616 for ( std::vector< G4QMDNucleus* >::iterator it
617 = nucleuses.begin() ; it != nucleuses.end() ; it++ )
618 {
619 delete *it;
620 }
621 nucleuses.clear();
622
624 delete system;
625
627
629
630}
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4ThreeVector GetMomentum() const
G4ReactionProductVector * BreakItUp(const G4Fragment &theInitialState) const
void SetStatusChange(G4HadFinalStateStatus aS)
void AddSecondary(G4DynamicParticle *aP)
G4HadFinalState theParticleChange
G4double GetIonMass(G4int Z, G4int A, G4int L=0) const
!! Only ground states are supported now
G4int GetAtomicNumber() const
const G4String & GetParticleType() const
G4double GetPDGMass() const
G4int GetAtomicMass() const
G4double GetPDGCharge() const
static G4ParticleTable * GetParticleTable()
G4IonTable * GetIonTable()
G4ParticleDefinition * GetIon(G4int atomicNumber, G4int atomicMass, G4double excitationEnergy)
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()
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=0, const G4Element *elm=0, const G4Material *mat=0)
HepLorentzVector boostOf(const HepLorentzVector &vec, const Hep3Vector &betaVector)