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 <iomanip>
00040
00041 #include "HadronPhysicsFTFP_BERT_TRV.hh"
00042
00043 #include "globals.hh"
00044 #include "G4ios.hh"
00045 #include "G4SystemOfUnits.hh"
00046 #include "G4ParticleDefinition.hh"
00047 #include "G4ParticleTable.hh"
00048
00049 #include "G4MesonConstructor.hh"
00050 #include "G4BaryonConstructor.hh"
00051 #include "G4ShortLivedConstructor.hh"
00052 #include "G4HadronCaptureProcess.hh"
00053 #include "G4NeutronRadCapture.hh"
00054 #include "G4HadronFissionProcess.hh"
00055 #include "G4LFission.hh"
00056 #include "G4ChipsKaonMinusInelasticXS.hh"
00057 #include "G4ChipsKaonPlusInelasticXS.hh"
00058 #include "G4ChipsKaonZeroInelasticXS.hh"
00059 #include "G4CrossSectionDataSetRegistry.hh"
00060 #include "G4NeutronInelasticXS.hh"
00061 #include "G4NeutronCaptureXS.hh"
00062
00063 #include "G4PhysListUtil.hh"
00064
00065
00066 #include "G4PhysicsConstructorFactory.hh"
00067
00068 G4_DECLARE_PHYSCONSTR_FACTORY(HadronPhysicsFTFP_BERT_TRV);
00069
00070 HadronPhysicsFTFP_BERT_TRV::HadronPhysicsFTFP_BERT_TRV(G4int)
00071 : G4VPhysicsConstructor("hInelastic FTFP_BERT_TRV")
00072 , theNeutrons(0)
00073 , theBertiniNeutron(0)
00074 , theFTFPNeutron(0)
00075 , thePiK(0)
00076 , theBertiniPiK(0)
00077 , theFTFPPiK(0)
00078 , thePro(0)
00079 , theBertiniPro(0)
00080 , theFTFPPro(0)
00081 , theHyperon(0)
00082 , theAntiBaryon(0)
00083 , theFTFPAntiBaryon(0)
00084 , QuasiElastic(false)
00085 , ChipsKaonMinus(0)
00086 , ChipsKaonPlus(0)
00087 , ChipsKaonZero(0)
00088 , xsNeutronInelasticXS(0)
00089 , xsNeutronCaptureXS(0)
00090 {}
00091
00092 HadronPhysicsFTFP_BERT_TRV::HadronPhysicsFTFP_BERT_TRV(const G4String& name, G4bool quasiElastic)
00093 : G4VPhysicsConstructor(name)
00094 , theNeutrons(0)
00095 , theBertiniNeutron(0)
00096 , theFTFPNeutron(0)
00097 , thePiK(0)
00098 , theBertiniPiK(0)
00099 , theFTFPPiK(0)
00100 , thePro(0)
00101 , theBertiniPro(0)
00102 , theFTFPPro(0)
00103 , theHyperon(0)
00104 , theAntiBaryon(0)
00105 , theFTFPAntiBaryon(0)
00106 , QuasiElastic(quasiElastic)
00107 , ChipsKaonMinus(0)
00108 , ChipsKaonPlus(0)
00109 , ChipsKaonZero(0)
00110 , xsNeutronInelasticXS(0)
00111 , xsNeutronCaptureXS(0)
00112 {}
00113
00114
00115 void HadronPhysicsFTFP_BERT_TRV::CreateModels()
00116 {
00117 G4double minFTFP= 3.0 * GeV;
00118 G4double maxBERT= 12.0 * GeV;
00119
00120 G4cout << " Revised FTFTP_BERT_TRV - new threshold between BERT and FTFP "
00121 << " is over the interval " << minFTFP/GeV << " to " << maxBERT/GeV
00122 << " GeV. " << G4endl;
00123 G4cout << " -- quasiElastic was asked to be " << QuasiElastic
00124 << " and it is reset to " << false << G4endl;
00125 QuasiElastic= false;
00126
00127 theNeutrons=new G4NeutronBuilder;
00128 theNeutrons->RegisterMe(theBertiniNeutron=new G4BertiniNeutronBuilder);
00129 theBertiniNeutron->SetMinEnergy(0.0*GeV);
00130 theBertiniNeutron->SetMaxEnergy(maxBERT);
00131 theFTFPNeutron=new G4FTFPNeutronBuilder(QuasiElastic);
00132 theNeutrons->RegisterMe(theFTFPNeutron);
00133 theFTFPNeutron->SetMinEnergy(minFTFP);
00134
00135 thePro=new G4ProtonBuilder;
00136 theFTFPPro=new G4FTFPProtonBuilder(QuasiElastic);
00137 thePro->RegisterMe(theFTFPPro);
00138 thePro->RegisterMe(theBertiniPro=new G4BertiniProtonBuilder);
00139 theFTFPPro->SetMinEnergy(minFTFP);
00140 theBertiniPro->SetMaxEnergy(maxBERT);
00141
00142 thePiK=new G4PiKBuilder;
00143 theFTFPPiK=new G4FTFPPiKBuilder(QuasiElastic);
00144 thePiK->RegisterMe(theFTFPPiK);
00145 thePiK->RegisterMe(theBertiniPiK=new G4BertiniPiKBuilder);
00146 theFTFPPiK->SetMinEnergy(minFTFP);
00147 theBertiniPiK->SetMaxEnergy(maxBERT);
00148
00149 theHyperon=new G4HyperonFTFPBuilder;
00150
00151 theAntiBaryon=new G4AntiBarionBuilder;
00152 theAntiBaryon->RegisterMe(theFTFPAntiBaryon=new G4FTFPAntiBarionBuilder(QuasiElastic));
00153 }
00154
00155 HadronPhysicsFTFP_BERT_TRV::~HadronPhysicsFTFP_BERT_TRV()
00156 {
00157 delete theNeutrons;
00158 delete theBertiniNeutron;
00159 delete theFTFPNeutron;
00160
00161 delete thePiK;
00162 delete theBertiniPiK;
00163 delete theFTFPPiK;
00164
00165 delete thePro;
00166 delete theBertiniPro;
00167 delete theFTFPPro;
00168
00169 delete theHyperon;
00170 delete theAntiBaryon;
00171 delete theFTFPAntiBaryon;
00172
00173 delete xsNeutronInelasticXS;
00174 delete xsNeutronCaptureXS;
00175 }
00176
00177 void HadronPhysicsFTFP_BERT_TRV::ConstructParticle()
00178 {
00179 G4MesonConstructor pMesonConstructor;
00180 pMesonConstructor.ConstructParticle();
00181
00182 G4BaryonConstructor pBaryonConstructor;
00183 pBaryonConstructor.ConstructParticle();
00184
00185 G4ShortLivedConstructor pShortLivedConstructor;
00186 pShortLivedConstructor.ConstructParticle();
00187 }
00188
00189 #include "G4ProcessManager.hh"
00190 void HadronPhysicsFTFP_BERT_TRV::ConstructProcess()
00191 {
00192 CreateModels();
00193 theNeutrons->Build();
00194 thePro->Build();
00195 thePiK->Build();
00196
00197 theHyperon->Build();
00198 theAntiBaryon->Build();
00199
00200
00201
00202 ChipsKaonMinus = G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonMinusInelasticXS::Default_Name());
00203 ChipsKaonPlus = G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonPlusInelasticXS::Default_Name());
00204 ChipsKaonZero = G4CrossSectionDataSetRegistry::Instance()->GetCrossSectionDataSet(G4ChipsKaonZeroInelasticXS::Default_Name());
00205
00206 G4PhysListUtil::FindInelasticProcess(G4KaonMinus::KaonMinus())->AddDataSet(ChipsKaonMinus);
00207 G4PhysListUtil::FindInelasticProcess(G4KaonPlus::KaonPlus())->AddDataSet(ChipsKaonPlus);
00208 G4PhysListUtil::FindInelasticProcess(G4KaonZeroShort::KaonZeroShort())->AddDataSet(ChipsKaonZero);
00209 G4PhysListUtil::FindInelasticProcess(G4KaonZeroLong::KaonZeroLong())->AddDataSet(ChipsKaonZero);
00210
00211
00212
00213
00214 xsNeutronInelasticXS = new G4NeutronInelasticXS();
00215 G4PhysListUtil::FindInelasticProcess(G4Neutron::Neutron())->AddDataSet(xsNeutronInelasticXS);
00216
00217 G4HadronicProcess* capture = 0;
00218 G4HadronicProcess* fission = 0;
00219 G4ProcessManager* pmanager = G4Neutron::Neutron()->GetProcessManager();
00220 G4ProcessVector* pv = pmanager->GetProcessList();
00221 for ( size_t i=0; i < static_cast<size_t>(pv->size()); ++i ) {
00222 if ( fCapture == ((*pv)[i])->GetProcessSubType() ) {
00223 capture = static_cast<G4HadronicProcess*>((*pv)[i]);
00224 } else if ( fFission == ((*pv)[i])->GetProcessSubType() ) {
00225 fission = static_cast<G4HadronicProcess*>((*pv)[i]);
00226 }
00227 }
00228 if ( ! capture ) {
00229 capture = new G4HadronCaptureProcess("nCapture");
00230 pmanager->AddDiscreteProcess(capture);
00231 }
00232 xsNeutronCaptureXS = new G4NeutronCaptureXS();
00233 capture->AddDataSet(xsNeutronCaptureXS);
00234 capture->RegisterMe(new G4NeutronRadCapture());
00235 if ( ! fission ) {
00236 fission = new G4HadronFissionProcess("nFission");
00237 pmanager->AddDiscreteProcess(fission);
00238 }
00239 fission->RegisterMe(new G4LFission());
00240
00241 }
00242