39 #include "Test30HadronProduction.hh"
40 #include "Test30VSecondaryGenerator.hh"
43 #include "G4ParticleDefinition.hh"
44 #include "G4ParticleTable.hh"
45 #include "G4DynamicParticle.hh"
46 #include "G4VPhysicalVolume.hh"
47 #include "G4LogicalVolume.hh"
48 #include "G4VSolid.hh"
50 #include "Randomize.hh"
51 #include "G4LorentzVector.hh"
52 #include "G4ParticleChange.hh"
56 Test30HadronProduction::Test30HadronProduction(
const G4String& aName)
57 :G4VDiscreteProcess(aName),
65 void Test30HadronProduction::InitializeMe()
70 Test30HadronProduction::~Test30HadronProduction()
72 if(theGenerator)
delete theGenerator;
77 G4double Test30HadronProduction::PostStepGetPhysicalInteractionLength(
80 G4ForceCondition* condition)
83 *condition = NotForced;
91 void Test30HadronProduction::SetSecondaryGenerator(Test30VSecondaryGenerator* gen)
93 if(theGenerator)
delete theGenerator;
99 G4VParticleChange* Test30HadronProduction::PostStepDoIt(
100 const G4Track&
track,
103 G4HadFinalState* result = theGenerator->Secondaries(track);
105 ClearNumberOfInteractionLengthLeft();
106 theChange.Initialize(track);
108 G4int ns = result->GetNumberOfSecondaries();
110 if(result->GetStatusChange() == isAlive) nb++;
112 theChange.ProposeTrackStatus(fStopAndKill);
113 theChange.SetNumberOfSecondaries(nb);
115 for(G4int
i=0;
i<ns;
i++) {
116 G4Track*
tr =
new G4Track(result->GetSecondary(
i)->GetParticle(),
117 track.GetGlobalTime(),
118 track.GetPosition());
119 theChange.AddSecondary(tr);
122 if(result->GetStatusChange() == isAlive) {
123 G4DynamicParticle* dp =
new G4DynamicParticle(*(track.GetDynamicParticle()));
124 G4Track* tr =
new G4Track(dp,track.GetGlobalTime(),track.GetPosition());
125 tr->SetKineticEnergy(result->GetEnergyChange());
126 tr->SetMomentumDirection(result->GetMomentumChange());
127 theChange.AddSecondary(tr);