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

Last change on this file since 836 was 825, checked in by garnier, 16 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.