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
00035
00036
00037
00038
00039 #include "G4IonINCLXXPhysics.hh"
00040
00041 #include "G4SystemOfUnits.hh"
00042 #include "G4DeuteronInelasticProcess.hh"
00043 #include "G4TritonInelasticProcess.hh"
00044 #include "G4AlphaInelasticProcess.hh"
00045 #include "G4HadronInelasticProcess.hh"
00046
00047 #include "G4INCLXXInterface.hh"
00048 #include "G4TripathiCrossSection.hh"
00049 #include "G4TripathiLightCrossSection.hh"
00050 #include "G4IonsShenCrossSection.hh"
00051
00052 #include "G4ParticleDefinition.hh"
00053 #include "G4ParticleTable.hh"
00054 #include "G4ProcessManager.hh"
00055
00056
00057 #include "G4IonConstructor.hh"
00058 #include "G4BuilderType.hh"
00059
00060
00061 #include "G4PhysicsConstructorFactory.hh"
00062
00063 G4_DECLARE_PHYSCONSTR_FACTORY(G4IonINCLXXPhysics);
00064
00065
00066 G4IonINCLXXPhysics::G4IonINCLXXPhysics(G4int ver) :
00067 G4VPhysicsConstructor("IonINCLXX"),
00068 fINCLXXIons(NULL),
00069 fTripathi(NULL),
00070 fTripathiLight(NULL),
00071 fShen(NULL),
00072 fLEDModel(NULL),
00073 fLETModel(NULL),
00074 fLEAModel(NULL),
00075 verbose(ver), wasActivated(false)
00076 {
00077
00078 emax_d = 2 * 3.0 * GeV;
00079 emax_t = 3 * 3.0 * GeV;
00080 emax_he3 = 3 * 3.0 * GeV;
00081 emax_alpha = 4 * 3.0 * GeV;
00082 emax = 16 * 3.0 * GeV;
00083 emaxLHEP = 1.*TeV;
00084 emin = 0.*MeV;
00085 SetPhysicsType(bIons);
00086 if(verbose > 1) G4cout << "### G4IonINCLXXPhysics" << G4endl;
00087 }
00088
00089 G4IonINCLXXPhysics::G4IonINCLXXPhysics(const G4String& name,
00090 G4int ver)
00091 : G4VPhysicsConstructor(name),
00092 fINCLXXIons(NULL),
00093 fTripathi(NULL),
00094 fTripathiLight(NULL),
00095 fShen(NULL),
00096 fLEDModel(NULL),
00097 fLETModel(NULL),
00098 fLEAModel(NULL),
00099 verbose(ver), wasActivated(false)
00100 {
00101
00102 emax_d = 2 * 3.0 * GeV;
00103 emax_t = 3 * 3.0 * GeV;
00104 emax_he3 = 3 * 3.0 * GeV;
00105 emax_alpha = 4 * 3.0 * GeV;
00106 emax = 16 * 3.0 * GeV;
00107 emaxLHEP = 1.*TeV;
00108 emin = 0.*MeV;
00109 SetPhysicsType(bIons);
00110 if(verbose > 1) G4cout << "### G4IonINCLXXPhysics" << G4endl;
00111 }
00112
00113 G4IonINCLXXPhysics::~G4IonINCLXXPhysics()
00114 {
00115 if(wasActivated) {
00116 delete fTripathi;
00117 delete fTripathiLight;
00118 delete fShen;
00119 delete fLEDModel;
00120 delete fLETModel;
00121 delete fLEAModel;
00122 G4int i;
00123 G4int n = p_list.size();
00124 for(i=0; i<n; i++) {delete p_list[i];}
00125 delete fINCLXXIons;
00126 }
00127 }
00128
00129 void G4IonINCLXXPhysics::ConstructProcess()
00130 {
00131 if(wasActivated) return;
00132 wasActivated = true;
00133
00134 fINCLXXIons= new G4INCLXXInterface();
00135 fShen = new G4IonsShenCrossSection;
00136 fTripathi = new G4TripathiCrossSection;
00137 fTripathiLight = new G4TripathiLightCrossSection;
00138
00139 fLEDModel = new G4LEDeuteronInelastic();
00140 fLETModel = new G4LETritonInelastic();
00141 fLEAModel = new G4LEAlphaInelastic();
00142
00143 AddProcess("dInelastic", G4Deuteron::Deuteron(), fINCLXXIons, fLEDModel, emax_d);
00144 AddProcess("tInelastic",G4Triton::Triton(), fINCLXXIons, fLETModel, emax_t);
00145 AddProcess("He3Inelastic",G4He3::He3(), fINCLXXIons, 0, emax_he3);
00146 AddProcess("alphaInelastic", G4Alpha::Alpha(), fINCLXXIons, fLEAModel, emax_alpha);
00147 AddProcess("ionInelastic",G4GenericIon::GenericIon(), fINCLXXIons, 0, emax);
00148 }
00149
00150 void G4IonINCLXXPhysics::AddProcess(const G4String& name,
00151 G4ParticleDefinition* p,
00152 G4HadronicInteraction* hmodel,
00153 G4HadronicInteraction* lmodel,
00154 const G4double inclxxEnergyUpperLimit = 3.0 * GeV)
00155 {
00156 G4HadronInelasticProcess* hadi = new G4HadronInelasticProcess(name, p);
00157 p_list.push_back(hadi);
00158 G4ProcessManager* pManager = p->GetProcessManager();
00159 pManager->AddDiscreteProcess(hadi);
00160 hadi->AddDataSet(fShen);
00161 hadi->AddDataSet(fTripathi);
00162 hadi->AddDataSet(fTripathiLight);
00163 hmodel->SetMinEnergy(emin);
00164 hmodel->SetMaxEnergy(inclxxEnergyUpperLimit);
00165 hadi->RegisterMe(hmodel);
00166 if(lmodel) {
00167 lmodel->SetMinEnergy(inclxxEnergyUpperLimit - MeV);
00168 lmodel->SetMaxEnergy(emaxLHEP);
00169 hadi->RegisterMe(lmodel);
00170 }
00171 if(verbose > 1) {
00172 G4cout << "Register " << hadi->GetProcessName()
00173 << " for " << p->GetParticleName()
00174 << " INCLXX/G4DeexcitationHandler for E(MeV)= " << emin << " - " << inclxxEnergyUpperLimit;
00175 if(lmodel) {
00176 G4cout << " LHEP for E(MeV)= " << inclxxEnergyUpperLimit-MeV << " - " << emaxLHEP;
00177 }
00178 G4cout << G4endl;
00179 }
00180 }
00181
00182 void G4IonINCLXXPhysics::ConstructParticle()
00183 {
00184
00185 G4IonConstructor pConstructor;
00186 pConstructor.ConstructParticle();
00187 }