source: trunk/source/physics_lists/lists/src/G4HadronInelasticQBBC.cc@ 826

Last change on this file since 826 was 825, checked in by garnier, 17 years ago

import all except CVS

File size: 11.2 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id: G4HadronInelasticQBBC.cc,v 1.7 2007/11/26 19:31:16 vnivanch Exp $
27// GEANT4 tag $Name: $
28//
29//---------------------------------------------------------------------------
30//
31// ClassName: G4HadronInelasticQBBC
32//
33// Author: 11 April 2006 V. Ivanchenko
34//
35// Modified:
36// 05.07.2006 V.Ivanchenko fix problem of initialisation of HP
37// 15.04.2007 V.Ivanchenko include quasi-elastic and change FTF low energy
38//
39//----------------------------------------------------------------------------
40//
41
42#include "G4HadronInelasticQBBC.hh"
43
44#include "G4HadronInelasticProcess.hh"
45
46#include "G4ParticleDefinition.hh"
47#include "G4ProcessManager.hh"
48
49#include "G4MesonConstructor.hh"
50#include "G4BaryonConstructor.hh"
51
52#include "G4PiNuclearCrossSection.hh"
53#include "G4BGGNucleonInelasticXS.hh"
54#include "G4BGGPionInelasticXS.hh"
55
56#include "G4TheoFSGenerator.hh"
57#include "G4QStringChipsParticleLevelInterface.hh"
58#include "G4StringChipsInterface.hh"
59#include "G4QGSMFragmentation.hh"
60#include "G4LundStringFragmentation.hh"
61#include "G4ExcitedStringDecay.hh"
62
63#include "G4BinaryCascade.hh"
64#include "G4HadronFissionProcess.hh"
65#include "G4HadronCaptureProcess.hh"
66#include "G4LFission.hh"
67#include "G4LCapture.hh"
68
69#include "G4NeutronHPInelastic.hh"
70#include "G4NeutronHPFission.hh"
71#include "G4NeutronHPCapture.hh"
72
73#include "G4HadronProcessStore.hh"
74#include "G4UInelasticCrossSection.hh"
75
76G4HadronInelasticQBBC::G4HadronInelasticQBBC(const G4String& name,
77 G4int ver, G4bool ftf, G4bool bert, G4bool chips, G4bool hp, G4bool glauber)
78 : G4VPhysicsConstructor(name), verbose(ver), ftfFlag(ftf), bertFlag(bert),
79 chipsFlag(chips), hpFlag(hp), glFlag(glauber), wasActivated(false)
80{
81 if(verbose > -1) G4cout << "### HadronInelasticQBBC" << G4endl;
82 store = G4HadronProcessStore::Instance();
83 theHPXSecI = 0;
84 theHPXSecC = 0;
85 theHPXSecF = 0;
86 theCascade = 0;
87 theCHIPSCascade = 0;
88 theQuasiElastic = 0;
89 theQGStringDecay = 0;
90 theQGStringModel = 0;
91 theFTFStringDecay = 0;
92 theFTFStringModel = 0;
93}
94
95G4HadronInelasticQBBC::~G4HadronInelasticQBBC()
96{
97 delete theCascade;
98 delete theCHIPSCascade;
99 delete theQuasiElastic;
100 delete theQGStringDecay;
101 delete theQGStringModel;
102 delete theFTFStringDecay;
103 delete theFTFStringModel;
104 delete theHPXSecI;
105 delete theHPXSecC;
106 delete theHPXSecF;
107}
108
109void G4HadronInelasticQBBC::ConstructParticle()
110{
111 G4MesonConstructor pMesonConstructor;
112 pMesonConstructor.ConstructParticle();
113
114 G4BaryonConstructor pBaryonConstructor;
115 pBaryonConstructor.ConstructParticle();
116}
117
118void G4HadronInelasticQBBC::ConstructProcess()
119{
120 if(wasActivated) return;
121 wasActivated = true;
122
123 if(verbose > 1)
124 G4cout << "### HadronInelasticQBBC Construct Process" << G4endl;
125
126 G4double minEstring = 6.0*GeV;
127 G4double maxEcascade = 9.0*GeV;
128 // G4double minFtf = 7.5*GeV;
129
130 //Binary
131 G4HadronicInteraction* theBIC = new G4BinaryCascade();
132 theBIC->SetMinEnergy(0.0);
133 theBIC->SetMaxEnergy(maxEcascade);
134
135 //Bertini
136 G4HadronicInteraction* theBERT = new G4CascadeInterface();
137 theBERT->SetMinEnergy(0.0);
138 theBERT->SetMaxEnergy(maxEcascade);
139
140 //CHIPS
141 G4HadronicInteraction* theCHIPS = new G4StringChipsInterface();
142 theCHIPS->SetMinEnergy(0.0);
143 theCHIPS->SetMaxEnergy(maxEcascade);
144
145 //QGS
146 //theCascade = new G4BinaryCascade;
147 theCHIPSCascade = new G4QStringChipsParticleLevelInterface;
148 G4TheoFSGenerator* theQGSModel = new G4TheoFSGenerator();
149 theQGStringModel = new G4QGSModel< G4QGSParticipants >;
150 theQGStringDecay = new G4ExcitedStringDecay(new G4QGSMFragmentation());
151 theQGStringModel->SetFragmentationModel(theQGStringDecay);
152 theQGSModel->SetTransport(theCHIPSCascade);
153
154 theQuasiElastic = new G4QuasiElasticChannel;
155 theQGSModel->SetQuasiElasticChannel(theQuasiElastic);
156 theQGSModel->SetHighEnergyGenerator(theQGStringModel);
157 theQGSModel->SetMinEnergy(minEstring);
158 theQGSModel->SetMaxEnergy(100*TeV);
159
160 //FTF
161 G4TheoFSGenerator* theFTFModel = new G4TheoFSGenerator();
162 theFTFStringModel = new G4FTFModel();
163 theFTFStringDecay = new G4ExcitedStringDecay(new G4LundStringFragmentation());
164 theFTFStringModel->SetFragmentationModel(theFTFStringDecay);
165 theFTFModel->SetTransport(theCHIPSCascade);
166 //theFTFModel->SetTransport(theCascade);
167 theFTFModel->SetHighEnergyGenerator(theFTFStringModel);
168 theFTFModel->SetMinEnergy(minEstring);
169 theFTFModel->SetMaxEnergy(100*TeV);
170 theFTFModel->SetQuasiElasticChannel(theQuasiElastic);
171
172 theParticleIterator->reset();
173 while( (*theParticleIterator)() ) {
174 G4ParticleDefinition* particle = theParticleIterator->value();
175 G4String pname = particle->GetParticleName();
176 if(verbose > 1) G4cout << "### HadronInelasticQBBC: " << pname << G4endl;
177 if(pname == "anti_lambda" ||
178 pname == "anti_neutron" ||
179 pname == "anti_omega-" ||
180 pname == "anti_proton" ||
181 pname == "anti_sigma-" ||
182 pname == "anti_sigma+" ||
183 pname == "anti_xi-" ||
184 pname == "anti_xi0" ||
185 pname == "kaon-" ||
186 pname == "kaon+" ||
187 pname == "kaon0S" ||
188 pname == "kaon0L" ||
189 pname == "lambda" ||
190 pname == "neutron" ||
191 pname == "omega-" ||
192 pname == "pi-" ||
193 pname == "pi+" ||
194 pname == "proton" ||
195 pname == "sigma-" ||
196 pname == "sigma+" ||
197 pname == "xi-" ||
198 pname == "xi0") {
199
200 G4ProcessManager* pmanager = particle->GetProcessManager();
201 G4HadronInelasticProcess* hp =
202 new G4HadronInelasticProcess("hInelastic", particle);
203 pmanager->AddDiscreteProcess(hp);
204
205 if(pname == "proton") {
206 hp->AddDataSet(&theXSecP);
207 if(ftfFlag) Register(particle,hp,theFTFModel,"FTF");
208 else Register(particle,hp,theQGSModel,"QGS");
209
210 if(bertFlag) Register(particle,hp,theBERT,"Bertini");
211 else Register(particle,hp,theBIC,"Binary");
212
213 if(glFlag)
214 hp->AddDataSet(new G4BGGNucleonInelasticXS(particle));
215
216 } else if(pname == "neutron") {
217 hp->AddDataSet(&theXSecN);
218 if(ftfFlag) Register(particle,hp,theFTFModel,"FTF");
219 else Register(particle,hp,theQGSModel,"QGS");
220
221 G4HadronCaptureProcess* theNeutronCapture =
222 new G4HadronCaptureProcess("nCapture");
223 G4HadronFissionProcess* theNeutronFission =
224 new G4HadronFissionProcess("nFission");
225 pmanager->AddDiscreteProcess(theNeutronCapture);
226 pmanager->AddDiscreteProcess(theNeutronFission);
227
228 G4double emin = 0.0;
229 if(hpFlag) {
230 emin = 19.5*MeV;
231 theHPXSecI = new G4NeutronHPInelasticData;
232 theHPXSecC = new G4NeutronHPCaptureData;
233 theHPXSecF = new G4NeutronHPFissionData;
234 hp->AddDataSet(theHPXSecI);
235 theNeutronCapture->AddDataSet(theHPXSecC);
236 theNeutronFission->AddDataSet(theHPXSecF);
237 G4NeutronHPInelastic* hpi = new G4NeutronHPInelastic();
238 G4NeutronHPCapture* hpc = new G4NeutronHPCapture();
239 G4NeutronHPFission* hpf = new G4NeutronHPFission();
240 Register(particle,hp,hpi,"HP");
241 Register(particle,theNeutronCapture,hpc,"HP");
242 Register(particle,theNeutronFission,hpf,"HP");
243 }
244
245 G4HadronicInteraction* theB;
246 G4String s;
247 if(bertFlag) {
248 theB = new G4CascadeInterface();
249 s = "Bertini";
250 } else {
251 theB = new G4BinaryCascade();
252 s = "Binary";
253 }
254 theB->SetMinEnergy(emin);
255 theB->SetMaxEnergy(maxEcascade);
256 Register(particle,hp,theB,s);
257
258 if(glFlag)
259 hp->AddDataSet(new G4BGGNucleonInelasticXS(particle));
260
261 G4HadronicInteraction* theC = new G4LCapture();
262 theC->SetMinEnergy(emin);
263 Register(particle,theNeutronCapture,theC,"LCapture");
264
265 G4HadronicInteraction* theF = new G4LFission();
266 theF->SetMinEnergy(emin);
267 Register(particle,theNeutronFission,theF,"LFission");
268
269 } else if(pname == "pi-" || pname == "pi+") {
270 hp->AddDataSet(&thePiCross);
271 if(ftfFlag) Register(particle,hp,theFTFModel,"FTF");
272 else Register(particle,hp,theQGSModel,"QGS");
273
274 Register(particle,hp,theBERT,"Bertini");
275 //if(bertFlag) Register(particle,hp,theBERT,"Bertini");
276 //else Register(particle,hp,theBIC,"Binary");
277
278 if(glFlag)
279 hp->AddDataSet(new G4BGGPionInelasticXS(particle));
280
281 } else if(pname == "kaon-" ||
282 pname == "kaon+" ||
283 pname == "kaon0S" ||
284 pname == "kaon0L") {
285 Register(particle,hp,theFTFModel,"FTF");
286 Register(particle,hp,theBERT,"Bertini");
287 //hp->AddDataSet(new G4UInelasticCrossSection(particle));
288
289 } else if(pname == "lambda" ||
290 pname == "sigma-" ||
291 pname == "sigma+" ||
292 pname == "xi-" ||
293 pname == "xi0") {
294
295 Register(particle,hp,theFTFModel,"FTF");
296 Register(particle,hp,theBERT,"Bertini");
297 //hp->AddDataSet(new G4UInelasticCrossSection(particle));
298
299 } else if(pname == "anti_proton" || pname == "anti_neutron") {
300 Register(particle,hp,theFTFModel,"FTF");
301 Register(particle,hp,theCHIPS,"CHIPS");
302 //hp->AddDataSet(new G4UInelasticCrossSection(particle));
303
304 } else {
305 Register(particle,hp,theFTFModel,"FTF");
306 Register(particle,hp,theCHIPS,"CHIPS");
307 //hp->AddDataSet(new G4UInelasticCrossSection(particle));
308 }
309
310 if(verbose > 1)
311 G4cout << "### HadronInelasticQBBC: " << hp->GetProcessName()
312 << " added for " << pname << G4endl;
313 }
314 }
315 store->Dump(verbose);
316}
317
318void G4HadronInelasticQBBC::Register(G4ParticleDefinition* p,
319 G4HadronicProcess* hp,
320 G4HadronicInteraction* hi,
321 const G4String& m)
322{
323 hp->RegisterMe(hi);
324 store->Register(hp,p,hi,m);
325 if(verbose > 1)
326 G4cout << "### QBBC: Register new model " << m
327 << " for " << p->GetParticleName() << " and " << hp->GetProcessName()
328 << " E(GeV) " << hi->GetMinEnergy()/GeV
329 << " - " << hi->GetMaxEnergy()/GeV << G4endl;
330}
Note: See TracBrowser for help on using the repository browser.