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

Last change on this file since 1199 was 988, checked in by garnier, 15 years ago

fichiers manquants

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.16 2009/02/19 12:45:42 vnivanch Exp $
27// GEANT4 tag $Name: geant4-09-02-ref-02 $
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 "G4StringChipsParticleLevelInterface.hh"
59#include "G4GeneratorPrecompoundInterface.hh"
60#include "G4QGSMFragmentation.hh"
61#include "G4LundStringFragmentation.hh"
62#include "G4ExcitedStringDecay.hh"
63
64#include "G4BinaryCascade.hh"
65#include "G4HadronFissionProcess.hh"
66#include "G4HadronCaptureProcess.hh"
67#include "G4LFission.hh"
68#include "G4LCapture.hh"
69
70#include "G4NeutronHPInelastic.hh"
71#include "G4NeutronHPFission.hh"
72#include "G4NeutronHPCapture.hh"
73
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 bertFlag= " 
82                         <<  bertFlag <<G4endl;
83  theHPXSecI = 0;
84  theHPXSecC = 0;
85  theHPXSecF = 0;
86  theCascade = 0;
87  preCompound = 0;
88  theCHIPSCascade   = 0;
89  theQuasiElastic   = 0;
90  theQGStringDecay  = 0;
91  theQGStringModel  = 0;
92  theFTFBStringDecay = 0;
93  theFTFBStringModel = 0;
94  theFTFCStringDecay = 0;
95  theFTFCStringModel = 0;
96}
97
98G4HadronInelasticQBBC::~G4HadronInelasticQBBC()
99{
100  delete theCascade;
101  delete preCompound;
102  delete theCHIPSCascade;
103  delete theQuasiElastic;
104  delete theQGStringDecay;
105  delete theQGStringModel;
106  delete theFTFBStringDecay;
107  delete theFTFCStringDecay;
108  delete theFTFBStringModel;
109  delete theFTFCStringModel;
110  delete theHPXSecI;
111  delete theHPXSecC;
112  delete theHPXSecF;
113}
114
115void G4HadronInelasticQBBC::ConstructParticle()
116{
117  G4MesonConstructor pMesonConstructor;
118  pMesonConstructor.ConstructParticle();
119
120  G4BaryonConstructor pBaryonConstructor;
121  pBaryonConstructor.ConstructParticle();
122}
123
124void G4HadronInelasticQBBC::ConstructProcess()
125{
126  if(wasActivated) return;
127  wasActivated = true;
128
129  if(verbose > 1) {
130    G4cout << "### HadronInelasticQBBC Construct Process"
131           << " ftfFlag= " << ftfFlag << "  bertFlag= " << bertFlag
132           << G4endl;
133  }
134  G4double minEstring  = 9.5*GeV;
135  G4double maxEcascade = 7.5*GeV;
136  G4double minFTF      = 4.5*GeV;
137  G4double maxFTF      = 25.*GeV;
138
139  //Binary
140  G4HadronicInteraction* theBIC = new G4BinaryCascade();
141  theBIC->SetMinEnergy(0.0);
142  theBIC->SetMaxEnergy(maxEcascade);
143
144  //Bertini
145  G4HadronicInteraction* theBERT = new G4CascadeInterface();
146  theBERT->SetMinEnergy(0.0);
147  theBERT->SetMaxEnergy(maxEcascade);
148
149  //CHIPS
150  G4HadronicInteraction* theCHIPS = new G4StringChipsParticleLevelInterface();
151  theCHIPS->SetMinEnergy(0.0);
152  theCHIPS->SetMaxEnergy(maxEcascade);
153
154  //QGS
155  theCascade = new G4BinaryCascade();
156  preCompound = new G4GeneratorPrecompoundInterface();
157
158  theCHIPSCascade = new G4QStringChipsParticleLevelInterface;
159  G4TheoFSGenerator* theQGSModel = new G4TheoFSGenerator("QGSP");
160  theQGStringModel  = new G4QGSModel< G4QGSParticipants >;
161  theQGStringDecay  = new G4ExcitedStringDecay(new G4QGSMFragmentation());
162  theQGStringModel->SetFragmentationModel(theQGStringDecay);
163  theQGSModel->SetTransport(preCompound);
164
165  theQuasiElastic = new G4QuasiElasticChannel();
166  theQGSModel->SetQuasiElasticChannel(theQuasiElastic);
167  theQGSModel->SetHighEnergyGenerator(theQGStringModel);
168  theQGSModel->SetMinEnergy(minEstring);
169  theQGSModel->SetMaxEnergy(100*TeV);
170
171  //FTFB
172  G4TheoFSGenerator* theFTFBModel = new G4TheoFSGenerator("FTFP");
173  theFTFBStringModel = new G4FTFModel();
174  theFTFBStringDecay = new G4ExcitedStringDecay(new G4LundStringFragmentation());
175  theFTFBStringModel->SetFragmentationModel(theFTFBStringDecay);
176
177  //  theFTFBModel->SetTransport(theCascade);
178  theFTFBModel->SetTransport(preCompound);
179  theFTFBModel->SetHighEnergyGenerator(theFTFBStringModel);
180  theFTFBModel->SetMinEnergy(minFTF);
181  theFTFBModel->SetMaxEnergy(100*TeV);
182
183  //FTFP
184  G4TheoFSGenerator* theFTFCModel = new G4TheoFSGenerator("FTFP");
185  theFTFCStringModel = new G4FTFModel();
186  theFTFCStringDecay = new G4ExcitedStringDecay(new G4LundStringFragmentation());
187  theFTFCStringModel->SetFragmentationModel(theFTFCStringDecay);
188
189  theFTFCModel->SetTransport(preCompound);
190  theFTFCModel->SetHighEnergyGenerator(theFTFCStringModel);
191  theFTFCModel->SetMinEnergy(minFTF);
192  theFTFCModel->SetMaxEnergy(maxFTF);
193
194  theParticleIterator->reset();
195  while( (*theParticleIterator)() ) {
196    G4ParticleDefinition* particle = theParticleIterator->value();
197    G4String pname = particle->GetParticleName();
198    if(verbose > 1) G4cout << "### HadronInelasticQBBC:  " << pname << G4endl;
199    if(pname == "anti_lambda"  ||
200       pname == "anti_neutron" ||
201       pname == "anti_omega-"  || 
202       pname == "anti_proton"  || 
203       pname == "anti_sigma-"  || 
204       pname == "anti_sigma+"  || 
205       pname == "anti_xi-"  || 
206       pname == "anti_xi0"  || 
207       pname == "kaon-"     || 
208       pname == "kaon+"     || 
209       pname == "kaon0S"    || 
210       pname == "kaon0L"    || 
211       pname == "lambda"    || 
212       pname == "neutron"   || 
213       pname == "omega-"    || 
214       pname == "pi-"       || 
215       pname == "pi+"       || 
216       pname == "proton"    || 
217       pname == "sigma-"    || 
218       pname == "sigma+"    || 
219       pname == "xi-"       || 
220       pname == "xi0") {
221     
222      G4ProcessManager* pmanager = particle->GetProcessManager();
223      G4HadronInelasticProcess* hp = 
224        new G4HadronInelasticProcess("hInelastic", particle);
225      pmanager->AddDiscreteProcess(hp);
226
227      if(pname == "proton") {
228        hp->AddDataSet(&theXSecP);
229
230        hp->RegisterMe(theQGSModel);
231        hp->RegisterMe(theFTFCModel);
232        //if(ftfFlag) hp->RegisterMe(theFTFCModel);
233        //else        hp->RegisterMe(theQGSModel);
234 
235        if(bertFlag) hp->RegisterMe(theBERT);
236        else         hp->RegisterMe(theBIC);
237     
238        if(glFlag)
239          hp->AddDataSet(new G4BGGNucleonInelasticXS(particle));
240
241      } else if(pname == "neutron") {
242        hp->AddDataSet(&theXSecN);
243        hp->RegisterMe(theQGSModel);
244        hp->RegisterMe(theFTFCModel);
245        //if(ftfFlag) hp->RegisterMe(theFTFCModel);
246        //else        hp->RegisterMe(theQGSModel);
247
248        G4HadronCaptureProcess* theNeutronCapture = 
249          new G4HadronCaptureProcess("nCapture");
250        G4HadronFissionProcess* theNeutronFission = 
251          new G4HadronFissionProcess("nFission");
252        pmanager->AddDiscreteProcess(theNeutronCapture);
253        pmanager->AddDiscreteProcess(theNeutronFission);
254
255        G4double emin = 0.0;
256        if(hpFlag) {
257          emin = 19.5*MeV;
258          theHPXSecI = new G4NeutronHPInelasticData;
259          theHPXSecC = new G4NeutronHPCaptureData;
260          theHPXSecF = new G4NeutronHPFissionData;
261          hp->AddDataSet(theHPXSecI);
262          theNeutronCapture->AddDataSet(theHPXSecC);
263          theNeutronFission->AddDataSet(theHPXSecF);
264          hp->RegisterMe(new G4NeutronHPInelastic());
265          theNeutronCapture->RegisterMe(new G4NeutronHPCapture());
266          theNeutronFission->RegisterMe(new G4NeutronHPFission());
267        }
268
269        G4HadronicInteraction* theB;
270        if(bertFlag) theB = new G4CascadeInterface();
271        else         theB = new G4BinaryCascade();
272        theB->SetMinEnergy(emin);
273        theB->SetMaxEnergy(maxEcascade);
274        hp->RegisterMe(theB);
275
276        if(glFlag)
277          hp->AddDataSet(new G4BGGNucleonInelasticXS(particle));
278
279        G4HadronicInteraction* theC = new G4LCapture();         
280        theC->SetMinEnergy(emin);
281        theNeutronCapture->RegisterMe(theC);
282
283        G4HadronicInteraction* theF = new G4LFission();
284        theF->SetMinEnergy(emin);
285        theNeutronFission->RegisterMe(theF);
286
287      } else if(pname == "pi-" || pname == "pi+") {
288        hp->AddDataSet(&thePiCross);
289        hp->RegisterMe(theQGSModel);
290        hp->RegisterMe(theFTFCModel);
291        //if(ftfFlag) hp->RegisterMe(theFTFCModel);
292        //else        hp->RegisterMe(theQGSModel);
293
294        hp->RegisterMe(theBERT);
295        //if(bertFlag) hp->RegisterMe(theBERT);
296        //else         hp->RegisterMe(theBIC);
297
298        if(glFlag) 
299          hp->AddDataSet(new G4BGGPionInelasticXS(particle));
300
301      } else if(pname == "kaon-"     || 
302                pname == "kaon+"     || 
303                pname == "kaon0S"    || 
304                pname == "kaon0L") {
305        hp->RegisterMe(theFTFBModel);
306        hp->RegisterMe(theBERT);
307        //hp->AddDataSet(new G4UInelasticCrossSection(particle));
308
309      } else if(pname == "lambda"    || 
310                pname == "sigma-"    || 
311                pname == "sigma+"    || 
312                pname == "xi-"       || 
313                pname == "xi0") {
314
315        hp->RegisterMe(theFTFBModel);
316        hp->RegisterMe(theBERT);
317        //hp->AddDataSet(new G4UInelasticCrossSection(particle));
318
319      } else if(pname == "anti_proton" || pname == "anti_neutron") {
320        hp->RegisterMe(theFTFBModel);
321        hp->RegisterMe(theCHIPS);
322        //hp->AddDataSet(new G4UInelasticCrossSection(particle));
323
324      } else {
325        hp->RegisterMe(theFTFBModel);
326        hp->RegisterMe(theCHIPS);
327        //hp->AddDataSet(new G4UInelasticCrossSection(particle));
328      }
329
330      if(verbose > 1)
331        G4cout << "### HadronInelasticQBBC: " << hp->GetProcessName()
332               << " added for " << pname << G4endl;
333    }
334  }
335}
Note: See TracBrowser for help on using the repository browser.