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
00027
00028
00029
00030
00031
00032
00033
00034 #include "G4CascadeDeexcitation.hh"
00035 #include "globals.hh"
00036 #include "G4BigBanger.hh"
00037 #include "G4EquilibriumEvaporator.hh"
00038 #include "G4NonEquilibriumEvaporator.hh"
00039 #include "G4InuclNuclei.hh"
00040 #include "G4InuclParticle.hh"
00041
00042
00043
00044
00045 G4CascadeDeexcitation::G4CascadeDeexcitation()
00046 : G4VCascadeDeexcitation("G4CascadeDeexcitation"),
00047 theBigBanger(new G4BigBanger),
00048 theNonEquilibriumEvaporator(new G4NonEquilibriumEvaporator),
00049 theEquilibriumEvaporator(new G4EquilibriumEvaporator) {}
00050
00051 G4CascadeDeexcitation::~G4CascadeDeexcitation() {
00052 delete theBigBanger;
00053 delete theNonEquilibriumEvaporator;
00054 delete theEquilibriumEvaporator;
00055 }
00056
00057
00058
00059
00060 void G4CascadeDeexcitation::deExcite(G4Fragment* fragment,
00061 G4CollisionOutput& globalOutput) {
00062 if (verboseLevel > 1) {
00063 G4cout << " >>> G4CascadeDeexcitation::deExcite" << G4endl;
00064 }
00065
00066 if (!fragment) {
00067 if (verboseLevel > 1) G4cerr << " NULL pointer fragment" << G4endl;
00068 return;
00069 }
00070
00071 if (verboseLevel > 1) G4cout << *fragment << G4endl;
00072
00073 G4InuclNuclei target(*fragment);
00074 collide(0, &target, globalOutput);
00075 }
00076
00077
00078
00079
00080 void G4CascadeDeexcitation::collide(G4InuclParticle* ,
00081 G4InuclParticle* target,
00082 G4CollisionOutput& globalOutput) {
00083 if (verboseLevel > 1) {
00084 G4cout << " >>> G4CascadeDeexcitation::collide" << G4endl;
00085 }
00086
00087
00088 theBigBanger->setVerboseLevel(verboseLevel);
00089 theNonEquilibriumEvaporator->setVerboseLevel(verboseLevel);
00090 theEquilibriumEvaporator->setVerboseLevel(verboseLevel);
00091
00092
00093 G4InuclNuclei* ntarget = dynamic_cast<G4InuclNuclei*>(target);
00094 if (!ntarget) {
00095 G4cerr << " G4CascadeDeexcitation ERROR: target must be G4InuclNuclei"
00096 << G4endl;
00097 return;
00098 }
00099
00100
00101 if (explosion(ntarget)) {
00102 if (verboseLevel > 1) G4cout << " big bang after cascade " << G4endl;
00103
00104
00105 theBigBanger->collide(0, target, globalOutput);
00106 return;
00107 }
00108
00109
00110 output.reset();
00111 theNonEquilibriumEvaporator->collide(0, target, output);
00112
00113 if (verboseLevel > 1) {
00114 G4cout << " After NonEquilibriumEvaporator " << G4endl;
00115 }
00116
00117
00118 globalOutput.addOutgoingParticles(output.getOutgoingParticles());
00119
00120
00121
00122 G4InuclNuclei exciton = output.getOutgoingNuclei()[0];
00123
00124 output.reset();
00125 theEquilibriumEvaporator->collide(0, &exciton, output);
00126
00127 if (verboseLevel > 1) {
00128 G4cout << " After EquilibriumEvaporator " << G4endl;
00129 }
00130
00131 globalOutput.add(output);
00132 }
00133