00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef G4ParaFissionModel_h
00027 #define G4ParaFissionModel_h 1
00028
00029 #include "G4CompetitiveFission.hh"
00030 #include "G4ExcitationHandler.hh"
00031 #include "G4HadronicInteraction.hh"
00032 #include "G4NucleiProperties.hh"
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 class G4ParaFissionModel : public G4HadronicInteraction
00045 {
00046 public:
00047
00048 G4ParaFissionModel()
00049 {
00050 SetMinEnergy( 0.0 );
00051 SetMaxEnergy( 60.*MeV );
00052 }
00053
00054 virtual ~G4ParaFissionModel() {};
00055
00056 virtual G4HadFinalState* ApplyYourself(const G4HadProjectile& aTrack,
00057 G4Nucleus& theNucleus)
00058 {
00059 theParticleChange.Clear();
00060 theParticleChange.SetStatusChange( stopAndKill );
00061 theParticleChange.SetEnergyChange( 0.0 );
00062
00063
00064
00065 G4int A = theNucleus.GetA_asInt();
00066 G4int Z = theNucleus.GetZ_asInt();
00067 G4double nucMass = G4NucleiProperties::GetNuclearMass(A, Z);
00068
00069 G4int numberOfEx = aTrack.GetDefinition()->GetBaryonNumber();
00070 G4int numberOfCh = G4int(aTrack.GetDefinition()->GetPDGCharge() + 0.5);
00071 G4int numberOfHoles = 0;
00072
00073 A += numberOfEx;
00074 Z += numberOfCh;
00075
00076 G4LorentzVector v = aTrack.Get4Momentum() + G4LorentzVector(0.0,0.0,0.0,nucMass);
00077 G4Fragment anInitialState(A,Z,v);
00078 anInitialState.SetNumberOfExcitedParticle(numberOfEx,numberOfCh);
00079 anInitialState.SetNumberOfHoles(0,0);
00080
00081
00082 G4FragmentVector * theFissionResult = theFission.BreakUp(anInitialState);
00083
00084
00085
00086 G4int ll = theFissionResult->size();
00087 for(G4int i=0; i<ll; i++)
00088 {
00089 G4ReactionProductVector* theExcitationResult = 0;
00090 G4Fragment* aFragment = (*theFissionResult)[i];
00091 if(aFragment->GetExcitationEnergy() > keV)
00092 {
00093 theExcitationResult = theHandler.BreakItUp(*aFragment);
00094
00095
00096 for(G4int j = 0; j < G4int(theExcitationResult->size()); j++)
00097 {
00098 G4ReactionProduct* rp0 = (*theExcitationResult)[j];
00099 G4DynamicParticle* p0 =
00100 new G4DynamicParticle(rp0->GetDefinition(),rp0->GetMomentum());
00101 theParticleChange.AddSecondary(p0);
00102 delete rp0;
00103 }
00104 delete theExcitationResult;
00105 }
00106 else
00107 {
00108
00109 G4DynamicParticle* p0 =
00110 new G4DynamicParticle(aFragment->GetParticleDefinition(),
00111 aFragment->GetMomentum());
00112 theParticleChange.AddSecondary(p0);
00113 }
00114 delete aFragment;
00115 }
00116
00117 delete theFissionResult;
00118
00119 return &theParticleChange;
00120 }
00121 private:
00122
00123 G4CompetitiveFission theFission;
00124 G4ExcitationHandler theHandler;
00125
00126 G4HadFinalState theParticleChange;
00127 };
00128 #endif