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 "G4HadronInelasticQBBC.hh"
00040
00041 #include "G4SystemOfUnits.hh"
00042
00043 #include "G4HadronInelasticProcess.hh"
00044 #include "G4HadronicInteraction.hh"
00045
00046 #include "G4ParticleDefinition.hh"
00047 #include "G4ProcessManager.hh"
00048
00049 #include "G4BGGNucleonInelasticXS.hh"
00050 #include "G4BGGPionInelasticXS.hh"
00051
00052 #include "G4NeutronInelasticXS.hh"
00053 #include "G4NeutronCaptureXS.hh"
00054
00055 #include "G4QInelastic.hh"
00056 #include "G4HadronicProcessStore.hh"
00057
00058 #include "G4CrossSectionInelastic.hh"
00059 #include "G4ProtonInelasticCrossSection.hh"
00060 #include "G4NeutronInelasticCrossSection.hh"
00061 #include "G4PiNuclearCrossSection.hh"
00062 #include "G4ComponentAntiNuclNuclearXS.hh"
00063 #include "G4CrossSectionPairGG.hh"
00064 #include "G4PiNuclearCrossSection.hh"
00065
00066 #include "G4QGSBuilder.hh"
00067 #include "G4FTFBuilder.hh"
00068
00069 #include "G4ChipsKaonMinusInelasticXS.hh"
00070 #include "G4ChipsKaonPlusInelasticXS.hh"
00071 #include "G4ChipsKaonZeroInelasticXS.hh"
00072 #include "G4ChipsHyperonInelasticXS.hh"
00073 #include "G4CrossSectionDataSetRegistry.hh"
00074
00075 #include "G4CascadeInterface.hh"
00076 #include "G4BinaryCascade.hh"
00077 #include "G4LCapture.hh"
00078 #include "G4NeutronRadCapture.hh"
00079
00080 #include "G4PreCompoundModel.hh"
00081 #include "G4ExcitationHandler.hh"
00082 #include "G4Evaporation.hh"
00083 #include "G4HadronicInteractionRegistry.hh"
00084
00085
00086 #include "G4PhysicsConstructorFactory.hh"
00087
00088 G4_DECLARE_PHYSCONSTR_FACTORY(G4HadronInelasticQBBC);
00089
00090 G4HadronInelasticQBBC::G4HadronInelasticQBBC(G4int ver)
00091 : G4VHadronPhysics("hInelastic"),verbose(ver),wasActivated(false)
00092 {
00093 htype = "QBBC";
00094 theAntiNuclXS = 0;
00095 }
00096
00097 G4HadronInelasticQBBC::G4HadronInelasticQBBC(const G4String& name, G4int ver,
00098 G4bool, G4bool,G4bool, G4bool, G4bool)
00099 : G4VHadronPhysics("hInelastic"),verbose(ver),wasActivated(false)
00100 {
00101 htype = name;
00102 theAntiNuclXS = 0;
00103 }
00104
00105 G4HadronInelasticQBBC::~G4HadronInelasticQBBC()
00106 {
00107 delete theAntiNuclXS;
00108 }
00109
00110 void G4HadronInelasticQBBC::ConstructProcess()
00111 {
00112 if(wasActivated) return;
00113 wasActivated = true;
00114
00115 if(verbose > 1) {
00116 G4cout << "### HadronInelasticQBBC Construct Process with type <"
00117 << htype << ">" << G4endl;
00118 }
00119
00120 G4double emax = 100.*TeV;
00121
00122
00123
00124
00125
00126 G4PreCompoundModel* thePreCompound = 0;
00127 G4HadronicInteraction* p =
00128 G4HadronicInteractionRegistry::Instance()->FindModel("PRECO");
00129 thePreCompound = static_cast<G4PreCompoundModel*>(p);
00130 if(!thePreCompound) { thePreCompound = new G4PreCompoundModel(); }
00131
00132
00133
00134
00135
00136 G4HadronicInteraction* theFTFP =
00137 BuildModel(new G4FTFBuilder("FTFP",thePreCompound),3.0*GeV,emax);
00138 G4HadronicInteraction* theFTFP1 =
00139 BuildModel(new G4FTFBuilder("FTFP",thePreCompound),3.0*GeV,emax);
00140 G4HadronicInteraction* theFTFP2 =
00141 BuildModel(new G4FTFBuilder("FTFP",thePreCompound),0.0,emax);
00142
00143 G4HadronicInteraction* theBERT =
00144 NewModel(new G4CascadeInterface(),1.0*GeV,12.0*GeV);
00145 G4HadronicInteraction* theBERT1 =
00146 NewModel(new G4CascadeInterface(),0.0*GeV,12.0*GeV);
00147
00148
00149 G4BinaryCascade* bic = new G4BinaryCascade(thePreCompound);
00150 G4HadronicInteraction* theBIC = NewModel(bic,0.0,1.5*GeV);
00151
00152 G4QInelastic* theCHIPS = new G4QInelastic();
00153 G4HadronicProcessStore* store = G4HadronicProcessStore::Instance();
00154 store->RegisterExtraProcess(theCHIPS);
00155
00156
00157 theAntiNuclXS = new G4ComponentAntiNuclNuclearXS();
00158 G4CrossSectionInelastic* anucxs =
00159 new G4CrossSectionInelastic(theAntiNuclXS);
00160
00161
00162 theParticleIterator->reset();
00163 while( (*theParticleIterator)() ) {
00164 G4ParticleDefinition* particle = theParticleIterator->value();
00165 G4String pname = particle->GetParticleName();
00166
00167 if(verbose > 1) {
00168 G4cout << "### HadronInelasticQBBC: " << pname << G4endl;
00169 }
00170
00171
00172
00173
00174 if(pname == "proton") {
00175 G4HadronicProcess* hp = FindInelasticProcess(particle);
00176 hp->AddDataSet(new G4BGGNucleonInelasticXS(particle));
00177
00178
00179 hp->RegisterMe(theFTFP);
00180 hp->RegisterMe(theBERT);
00181 hp->RegisterMe(theBIC);
00182
00183 } else if(pname == "neutron") {
00184 G4HadronicProcess* hp = FindInelasticProcess(particle);
00185 hp->AddDataSet(new G4NeutronInelasticXS());
00186
00187 hp->RegisterMe(theFTFP);
00188
00189 G4HadronicProcess* capture = FindCaptureProcess();
00190 capture->AddDataSet(new G4NeutronCaptureXS());
00191 hp->RegisterMe(theBERT);
00192 hp->RegisterMe(theBIC);
00193 capture->RegisterMe(new G4NeutronRadCapture());
00194
00195 } else if(pname == "pi-" || pname == "pi+") {
00196 G4HadronicProcess* hp = FindInelasticProcess(particle);
00197
00198 hp->AddDataSet(new G4CrossSectionPairGG(new G4PiNuclearCrossSection(), 91*GeV));
00199
00200 hp->RegisterMe(theFTFP);
00201 hp->RegisterMe(theBERT1);
00202
00203 } else if(pname == "kaon-" ) {
00204 G4HadronicProcess* hp = FindInelasticProcess(particle);
00205 hp->RegisterMe(theFTFP1);
00206 hp->RegisterMe(theBERT1);
00207 hp->AddDataSet(G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonMinusInelasticXS::Default_Name()));
00208
00209 } else if(pname == "kaon+" ) {
00210 G4HadronicProcess* hp = FindInelasticProcess(particle);
00211 hp->RegisterMe(theFTFP1);
00212 hp->RegisterMe(theBERT1);
00213 hp->AddDataSet(G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonPlusInelasticXS::Default_Name()));
00214
00215 } else if(pname == "kaon0S" ||
00216 pname == "kaon0L") {
00217 G4HadronicProcess* hp = FindInelasticProcess(particle);
00218 hp->RegisterMe(theFTFP1);
00219 hp->RegisterMe(theBERT1);
00220 hp->AddDataSet(G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonZeroInelasticXS::Default_Name()));
00221
00222 } else if(pname == "lambda" ||
00223 pname == "omega-" ||
00224 pname == "sigma-" ||
00225 pname == "sigma+" ||
00226 pname == "sigma0" ||
00227 pname == "xi-" ||
00228 pname == "xi0") {
00229 G4HadronicProcess* hp = FindInelasticProcess(particle);
00230 hp->RegisterMe(theFTFP1);
00231 hp->RegisterMe(theBERT1);
00232 hp->AddDataSet(G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsHyperonInelasticXS::Default_Name()));
00233
00234 } else if(pname == "anti_alpha" ||
00235 pname == "anti_deuteron"||
00236 pname == "anti_He3" ||
00237 pname == "anti_proton" ||
00238 pname == "anti_triton" ||
00239 pname == "anti_lambda" ||
00240 pname == "anti_neutron" ||
00241 pname == "anti_omega-" ||
00242 pname == "anti_sigma-" ||
00243 pname == "anti_sigma+" ||
00244 pname == "anti_xi-" ||
00245 pname == "anti_xi0"
00246 ) {
00247
00248 G4HadronicProcess* hp = FindInelasticProcess(particle);
00249 hp->RegisterMe(theFTFP2);
00250 hp->AddDataSet(anucxs);
00251
00252
00253
00254 }
00255 }
00256 }