Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4HadronicProcess.hh
Go to the documentation of this file.
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$
27 //
28 // -------------------------------------------------------------------
29 //
30 // GEANT4 Class header file
31 //
32 // G4HadronicProcess
33 //
34 // This is the top level Hadronic Process class
35 // The inelastic, elastic, capture, and fission processes
36 // should derive from this class
37 //
38 // original by H.P.Wellisch
39 // J.L. Chuma, TRIUMF, 10-Mar-1997
40 // Last modified: 04-Apr-1997
41 // 19-May-2008 V.Ivanchenko cleanup and added comments
42 // 05-Jul-2010 V.Ivanchenko cleanup commented lines
43 // 28-Jul-2012 M.Maire add function GetTargetDefinition()
44 // 14-Sep-2012 Inherit from RestDiscrete, use subtype code (now in ctor) to
45 // configure base-class
46 // 28-Sep-2012 M. Kelsey -- Undo inheritance change, keep new ctor
47 
48 #ifndef G4HadronicProcess_h
49 #define G4HadronicProcess_h 1
50 
51 #include "globals.hh"
52 #include "G4VDiscreteProcess.hh"
53 #include "G4EnergyRangeManager.hh"
54 #include "G4Nucleus.hh"
55 #include "G4ReactionProduct.hh"
56 #include <vector>
59 
61 #include "G4HadronicProcessType.hh"
62 
63 class G4Track;
64 class G4Step;
65 class G4Element;
66 class G4ParticleChange;
67 
68 
70 {
71 public:
72  G4HadronicProcess(const G4String& processName="Hadronic",
73  G4ProcessType procType=fHadronic);
74 
75  // Preferred signature for subclasses, specifying their subtype here
76  G4HadronicProcess(const G4String& processName,
77  G4HadronicProcessType subType);
78 
79  virtual ~G4HadronicProcess();
80 
81  // register generator of secondaries
83 
84  // get cross section per element
85  inline
87  const G4Element * elm,
88  const G4Material* mat = 0)
89  {
90  G4double x = theCrossSectionDataStore->GetCrossSection(part, elm, mat);
91  if(x < 0.0) { x = 0.0; }
92  return x;
93  }
94 
95  // obsolete method to get cross section per element
96  inline
98  const G4Element * elm,
99  const G4Material* mat = 0)
100  { return GetElementCrossSection(part, elm, mat); }
101 
102  // generic PostStepDoIt recommended for all derived classes
103  virtual G4VParticleChange* PostStepDoIt(const G4Track& aTrack,
104  const G4Step& aStep);
105 
106  // initialisation of physics tables and G4HadronicProcessStore
107  virtual void PreparePhysicsTable(const G4ParticleDefinition&);
108 
109  // build physics tables and print out the configuration of the process
110  virtual void BuildPhysicsTable(const G4ParticleDefinition&);
111 
112  // dump physics tables
114  { theCrossSectionDataStore->DumpPhysicsTable(p); }
115 
116  // add cross section data set
117  inline void AddDataSet(G4VCrossSectionDataSet * aDataSet)
118  { theCrossSectionDataStore->AddDataSet(aDataSet);}
119 
120  // access to the manager
122  { return &theEnergyRangeManager; }
123 
124  // get inverse cross section per volume
125  G4double GetMeanFreePath(const G4Track &aTrack, G4double,
126  G4ForceCondition *);
127 
128  // access to the target nucleus
129  inline const G4Nucleus* GetTargetNucleus() const
130  { return &targetNucleus; }
131 
132  // G4ParticleDefinition* GetTargetDefinition();
133  inline const G4Isotope* GetTargetIsotope()
134  { return targetNucleus.GetIsotope(); }
135 
136  virtual void ProcessDescription(std::ostream& outFile) const;
137 
138 protected:
139 
140  // generic method to choose secondary generator
141  // recommended for all derived classes
143  G4double kineticEnergy, G4Material* aMaterial, G4Element* anElement)
144  { return theEnergyRangeManager.GetHadronicInteraction(kineticEnergy,
145  aMaterial,anElement);
146  }
147 
148  // access to the target nucleus
150  { return &targetNucleus; }
151 
152 public:
153 
154  void BiasCrossSectionByFactor(G4double aScale);
155 
156  // Energy-momentum non-conservation limits and reporting
157  inline void SetEpReportLevel(G4int level)
158  { epReportLevel = level; }
159 
160  inline void SetEnergyMomentumCheckLevels(G4double relativeLevel, G4double absoluteLevel)
161  { epCheckLevels.first = relativeLevel;
162  epCheckLevels.second = absoluteLevel;
163  levelsSetByProcess = true;
164  }
165 
166  inline std::pair<G4double, G4double> GetEnergyMomentumCheckLevels() const
167  { return epCheckLevels; }
168 
169  // access to the cross section data store
171  {return theCrossSectionDataStore;}
172 
173  inline void MultiplyCrossSectionBy(G4double factor)
174  { aScaleFactor = factor; }
175 
176 protected:
177 
178  void DumpState(const G4Track&, const G4String&, G4ExceptionDescription&);
179 
180  // obsolete method will be removed
182  { return theEnergyRangeManager; }
183 
184  // obsolete method will be removed
186  { theEnergyRangeManager = value; }
187 
188  // access to the chosen generator
190  { return theInteraction; }
191 
192  // access to the cross section data set
194  { return theLastCrossSection; }
195 
196  // fill result
197  void FillResult(G4HadFinalState* aR, const G4Track& aT);
198 
199  // Check the result for catastrophic energy non-conservation
201  const G4Nucleus& targetNucleus,
202  G4HadFinalState* result) const;
203 
204  // Check 4-momentum balance
206 
207 private:
208  G4double XBiasSurvivalProbability();
209  G4double XBiasSecondaryWeight();
210 
211  // hide assignment operator as private
212  G4HadronicProcess& operator=(const G4HadronicProcess& right);
214 
215  // Set E/p conservation check levels from environment variables
216  void GetEnergyMomentumCheckEnvvars();
217 
218 protected:
219 
221 
223 
225 
226 private:
227 
228  G4EnergyRangeManager theEnergyRangeManager;
229 
230  G4HadronicInteraction* theInteraction;
231 
232  G4CrossSectionDataStore* theCrossSectionDataStore;
233 
234  G4Nucleus targetNucleus;
235 
236  bool G4HadronicProcess_debug_flag;
237 
238  // Energy-momentum checking
239  std::pair<G4double, G4double> epCheckLevels;
240  G4bool levelsSetByProcess;
241 
242  std::vector<G4VLeadingParticleBiasing *> theBias;
243 
244  G4double theInitialNumberOfInteractionLength;
245 
246  G4double aScaleFactor;
247  G4bool xBiasOn;
248  G4double theLastCrossSection;
249 };
250 
251 #endif
252