Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ParticleHPInelastic Class Reference

#include <G4ParticleHPInelastic.hh>

+ Inheritance diagram for G4ParticleHPInelastic:

Public Member Functions

 G4ParticleHPInelastic (G4ParticleDefinition *p=G4Neutron::Neutron(), const char *name="NeutronHPInelastic")
 
 ~G4ParticleHPInelastic () override
 
G4HadFinalStateApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &aTargetNucleus) override
 
const std::pair< G4double, G4doubleGetFatalEnergyCheckLevels () const override
 
void BuildPhysicsTable (const G4ParticleDefinition &) override
 
void ModelDescription (std::ostream &outFile) const override
 
 G4ParticleHPInelastic (G4ParticleHPInelastic &)=delete
 
G4ParticleHPInelasticoperator= (const G4ParticleHPInelastic &right)=delete
 
- Public Member Functions inherited from G4HadronicInteraction
 G4HadronicInteraction (const G4String &modelName="HadronicModel")
 
virtual ~G4HadronicInteraction ()
 
virtual G4double SampleInvariantT (const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
 
virtual G4bool IsApplicable (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
 
G4double GetMinEnergy () const
 
G4double GetMinEnergy (const G4Material *aMaterial, const G4Element *anElement) const
 
void SetMinEnergy (G4double anEnergy)
 
void SetMinEnergy (G4double anEnergy, const G4Element *anElement)
 
void SetMinEnergy (G4double anEnergy, const G4Material *aMaterial)
 
G4double GetMaxEnergy () const
 
G4double GetMaxEnergy (const G4Material *aMaterial, const G4Element *anElement) const
 
void SetMaxEnergy (const G4double anEnergy)
 
void SetMaxEnergy (G4double anEnergy, const G4Element *anElement)
 
void SetMaxEnergy (G4double anEnergy, const G4Material *aMaterial)
 
G4int GetVerboseLevel () const
 
void SetVerboseLevel (G4int value)
 
const G4StringGetModelName () const
 
void DeActivateFor (const G4Material *aMaterial)
 
void ActivateFor (const G4Material *aMaterial)
 
void DeActivateFor (const G4Element *anElement)
 
void ActivateFor (const G4Element *anElement)
 
G4bool IsBlocked (const G4Material *aMaterial) const
 
G4bool IsBlocked (const G4Element *anElement) const
 
void SetRecoilEnergyThreshold (G4double val)
 
G4double GetRecoilEnergyThreshold () const
 
virtual std::pair< G4double, G4doubleGetEnergyMomentumCheckLevels () const
 
void SetEnergyMomentumCheckLevels (G4double relativeLevel, G4double absoluteLevel)
 
virtual void InitialiseModel ()
 
 G4HadronicInteraction (const G4HadronicInteraction &right)=delete
 
const G4HadronicInteractionoperator= (const G4HadronicInteraction &right)=delete
 
G4bool operator== (const G4HadronicInteraction &right) const =delete
 
G4bool operator!= (const G4HadronicInteraction &right) const =delete
 

Protected Attributes

G4ParticleHPManagerfManager
 
G4String dirName
 
G4int numEle {0}
 
G4int indexP
 
- Protected Attributes inherited from G4HadronicInteraction
G4HadFinalState theParticleChange
 
G4int verboseLevel
 
G4double theMinEnergy
 
G4double theMaxEnergy
 
G4bool isBlocked
 

Static Protected Attributes

static std::vector< G4ParticleHPChannelList * > * theInelastic [6] = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}
 

Additional Inherited Members

- Protected Member Functions inherited from G4HadronicInteraction
void SetModelName (const G4String &nam)
 
G4bool IsBlocked () const
 
void Block ()
 

Detailed Description

Definition at line 49 of file G4ParticleHPInelastic.hh.

Constructor & Destructor Documentation

◆ G4ParticleHPInelastic() [1/2]

G4ParticleHPInelastic::G4ParticleHPInelastic ( G4ParticleDefinition * p = G4Neutron::Neutron(),
const char * name = "NeutronHPInelastic" )

Definition at line 95 of file G4ParticleHPInelastic.cc.

96 : G4HadronicInteraction(name), theProjectile(p)
97{
99 dirName = fManager->GetParticleHPPath(theProjectile) + "/Inelastic";
100 indexP = fManager->GetPHPIndex(theProjectile);
101
102#ifdef G4VERBOSE
103 if (fManager->GetVerboseLevel() > 1)
104 G4cout << "@@@ G4ParticleHPInelastic instantiated for "
105 << p->GetParticleName() << " indexP=" << indexP
106 << "/n data directory " << dirName << G4endl;
107#endif
108}
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
G4HadronicInteraction(const G4String &modelName="HadronicModel")
const G4String & GetParticleName() const
G4ParticleHPManager * fManager
const G4String & GetParticleHPPath(const G4ParticleDefinition *) const
G4int GetPHPIndex(const G4ParticleDefinition *) const
static G4ParticleHPManager * GetInstance()

◆ ~G4ParticleHPInelastic()

G4ParticleHPInelastic::~G4ParticleHPInelastic ( )
override

Definition at line 110 of file G4ParticleHPInelastic.cc.

111{
112 // Vector is shared, only one delete
113 if (isFirst) {
114 ClearData();
115 }
116}

◆ G4ParticleHPInelastic() [2/2]

G4ParticleHPInelastic::G4ParticleHPInelastic ( G4ParticleHPInelastic & )
delete

Member Function Documentation

◆ ApplyYourself()

G4HadFinalState * G4ParticleHPInelastic::ApplyYourself ( const G4HadProjectile & aTrack,
G4Nucleus & aTargetNucleus )
overridevirtual

Reimplemented from G4HadronicInteraction.

Definition at line 129 of file G4ParticleHPInelastic.cc.

131{
133 const G4Material* theMaterial = aTrack.GetMaterial();
134 auto n = (G4int)theMaterial->GetNumberOfElements();
135 auto elm = theMaterial->GetElement(0);
136 std::size_t index = elm->GetIndex();
137 G4int it = 0;
138 /*
139 G4cout << "G4ParticleHPInelastic::ApplyYourself n=" << n << " index=" << index
140 << " indexP=" << indexP << " "
141 << aTrack.GetDefinition()->GetParticleName() << G4endl;
142 */
143 if (n != 1) {
144 auto xSec = new G4double[n];
145 G4double sum = 0;
146 G4int i;
147 const G4double* NumAtomsPerVolume = theMaterial->GetVecNbOfAtomsPerVolume();
148 G4double rWeight;
149 G4double xs;
150 G4ParticleHPThermalBoost aThermalE;
151 for (i = 0; i < n; ++i) {
152 elm = theMaterial->GetElement(i);
153 index = elm->GetIndex();
154 /*
155 G4cout << "i=" << i << " index=" << index << " " << elm->GetName()
156 << " " << (*(theInelastic[indexP]))[index] << G4endl;
157 */
158 rWeight = NumAtomsPerVolume[i];
159 if (aTrack.GetDefinition() == G4Neutron::Neutron()) {
160 xs = (*(theInelastic[indexP]))[index]->GetXsec(aThermalE.GetThermalEnergy(aTrack, elm,
161 theMaterial->GetTemperature()));
162 }
163 else {
164 xs = (*(theInelastic[indexP]))[index]->GetXsec(aTrack.GetKineticEnergy());
165 }
166 xs *= rWeight;
167 sum += xs;
168 xSec[i] = sum;
169#ifdef G4VERBOSE
170 if (fManager->GetDEBUG())
171 G4cout << " G4ParticleHPInelastic XSEC ELEM " << i << " = " << xSec[i] << G4endl;
172#endif
173 }
174 sum *= G4UniformRand();
175 for (it = 0; it < n; ++it) {
176 elm = theMaterial->GetElement(it);
177 index = elm->GetIndex();
178 if (sum <= xSec[it]) break;
179 }
180 delete[] xSec;
181 }
182
183#ifdef G4VERBOSE
184 if (fManager->GetDEBUG())
185 G4cout << " G4ParticleHPInelastic: Elem it=" << it << " "
186 << elm->GetName() << " index=" << index
187 << " from material " << theMaterial->GetName()
188 << G4endl;
189#endif
190
191 G4HadFinalState* result =
192 (*(theInelastic[indexP]))[index]->ApplyYourself(elm, aTrack);
193
194 aNucleus.SetParameters(fManager->GetReactionWhiteBoard()->GetTargA(),
196
197 const G4Element* target_element = (*G4Element::GetElementTable())[index];
198 const G4Isotope* target_isotope = nullptr;
199 auto iele = (G4int)target_element->GetNumberOfIsotopes();
200 for (G4int j = 0; j != iele; ++j) {
201 target_isotope = target_element->GetIsotope(j);
202 if (target_isotope->GetN() == fManager->GetReactionWhiteBoard()->GetTargA())
203 break;
204 }
205 aNucleus.SetIsotope(target_isotope);
206
208
209 return result;
210}
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
#define G4UniformRand()
Definition Randomize.hh:52
static G4ElementTable * GetElementTable()
Definition G4Element.cc:389
const G4Isotope * GetIsotope(G4int iso) const
Definition G4Element.hh:151
size_t GetIndex() const
Definition G4Element.hh:159
size_t GetNumberOfIsotopes() const
Definition G4Element.hh:143
const G4Material * GetMaterial() const
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
G4int GetN() const
Definition G4Isotope.hh:83
G4double GetTemperature() const
const G4Element * GetElement(G4int iel) const
const G4double * GetVecNbOfAtomsPerVolume() const
std::size_t GetNumberOfElements() const
const G4String & GetName() const
static G4Neutron * Neutron()
Definition G4Neutron.cc:101
static std::vector< G4ParticleHPChannelList * > * theInelastic[6]
G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &aTargetNucleus) override
G4ParticleHPReactionWhiteBoard * GetReactionWhiteBoard()
G4double GetThermalEnergy(const G4HadProjectile &aP, const G4Element *anE, G4double aT)

Referenced by ApplyYourself().

◆ BuildPhysicsTable()

void G4ParticleHPInelastic::BuildPhysicsTable ( const G4ParticleDefinition & )
overridevirtual

Reimplemented from G4HadronicInteraction.

Definition at line 218 of file G4ParticleHPInelastic.cc.

219{
220 if (fLock[indexP]) {
221 G4AutoLock l(&theHPInelastic);
222 if (fLock[indexP]) {
223 isFirst = true;
224 fLock[indexP] = false;
225 }
226 l.unlock();
227 }
228
230 G4int n0 = numEle;
231 numEle = nelm;
232 if (!isFirst || nelm == n0) { return; }
233
234 // extra elements should be initialized
235 G4AutoLock l(&theHPInelastic);
236
237 if (nullptr == theInelastic[indexP]) {
238 theInelastic[indexP] = new std::vector<G4ParticleHPChannelList*>;
239 }
240
241 if (fManager->GetVerboseLevel() > 0 && isFirst) {
243 G4cout << "@@@ G4ParticleHPInelastic instantiated for particle "
244 << theProjectile->GetParticleName() << "/n data directory is "
245 << dirName << G4endl;
246 }
247
248 auto table = G4Element::GetElementTable();
249 for (G4int i = n0; i < nelm; ++i) {
250 auto clist = new G4ParticleHPChannelList(36, theProjectile);
251 theInelastic[indexP]->push_back(clist);
252 clist->Init((*table)[i], dirName, theProjectile);
253 clist->Register(new G4ParticleHPNInelasticFS, "F01/"); // has
254 clist->Register(new G4ParticleHPNXInelasticFS, "F02/");
255 clist->Register(new G4ParticleHP2NDInelasticFS, "F03/");
256 clist->Register(new G4ParticleHP2NInelasticFS, "F04/"); // has, E Done
257 clist->Register(new G4ParticleHP3NInelasticFS, "F05/"); // has, E Done
258 clist->Register(new G4ParticleHPNAInelasticFS, "F06/");
259 clist->Register(new G4ParticleHPN3AInelasticFS, "F07/");
260 clist->Register(new G4ParticleHP2NAInelasticFS, "F08/");
261 clist->Register(new G4ParticleHP3NAInelasticFS, "F09/");
262 clist->Register(new G4ParticleHPNPInelasticFS, "F10/");
263 clist->Register(new G4ParticleHPN2AInelasticFS, "F11/");
264 clist->Register(new G4ParticleHP2N2AInelasticFS, "F12/");
265 clist->Register(new G4ParticleHPNDInelasticFS, "F13/");
266 clist->Register(new G4ParticleHPNTInelasticFS, "F14/");
267 clist->Register(new G4ParticleHPNHe3InelasticFS, "F15/");
268 clist->Register(new G4ParticleHPND2AInelasticFS, "F16/");
269 clist->Register(new G4ParticleHPNT2AInelasticFS, "F17/");
270 clist->Register(new G4ParticleHP4NInelasticFS, "F18/"); // has, E Done
271 clist->Register(new G4ParticleHP2NPInelasticFS, "F19/");
272 clist->Register(new G4ParticleHP3NPInelasticFS, "F20/");
273 clist->Register(new G4ParticleHPN2PInelasticFS, "F21/");
274 clist->Register(new G4ParticleHPNPAInelasticFS, "F22/");
275 clist->Register(new G4ParticleHPPInelasticFS, "F23/");
276 clist->Register(new G4ParticleHPDInelasticFS, "F24/");
277 clist->Register(new G4ParticleHPTInelasticFS, "F25/");
278 clist->Register(new G4ParticleHPHe3InelasticFS, "F26/");
279 clist->Register(new G4ParticleHPAInelasticFS, "F27/");
280 clist->Register(new G4ParticleHP2AInelasticFS, "F28/");
281 clist->Register(new G4ParticleHP3AInelasticFS, "F29/");
282 clist->Register(new G4ParticleHP2PInelasticFS, "F30/");
283 clist->Register(new G4ParticleHPPAInelasticFS, "F31/");
284 clist->Register(new G4ParticleHPD2AInelasticFS, "F32/");
285 clist->Register(new G4ParticleHPT2AInelasticFS, "F33/");
286 clist->Register(new G4ParticleHPPDInelasticFS, "F34/");
287 clist->Register(new G4ParticleHPPTInelasticFS, "F35/");
288 clist->Register(new G4ParticleHPDAInelasticFS, "F36/");
289#ifdef G4VERBOSE
290 if (fManager->GetVerboseLevel() > 1) {
291 G4cout << "ParticleHP::Inelastic for "
292 << theProjectile->GetParticleName() << " off "
293 << (*table)[i]->GetName() << G4endl;
294 }
295#endif
296 }
297 l.unlock();
298}
static size_t GetNumberOfElements()
Definition G4Element.cc:393

◆ GetFatalEnergyCheckLevels()

const std::pair< G4double, G4double > G4ParticleHPInelastic::GetFatalEnergyCheckLevels ( ) const
overridevirtual

Reimplemented from G4HadronicInteraction.

Definition at line 212 of file G4ParticleHPInelastic.cc.

213{
214 // max energy non-conservation is mass of heavy nucleus
215 return std::pair<G4double, G4double>(10.0 * perCent, 350.0 * CLHEP::GeV);
216}

◆ ModelDescription()

void G4ParticleHPInelastic::ModelDescription ( std::ostream & outFile) const
overridevirtual

Reimplemented from G4HadronicInteraction.

Definition at line 300 of file G4ParticleHPInelastic.cc.

301{
302 outFile << "High Precision (HP) model for inelastic reaction of "
303 << theProjectile->GetParticleName() << " below 20MeV\n";
304}

◆ operator=()

G4ParticleHPInelastic & G4ParticleHPInelastic::operator= ( const G4ParticleHPInelastic & right)
delete

Member Data Documentation

◆ dirName

G4String G4ParticleHPInelastic::dirName
protected

Definition at line 82 of file G4ParticleHPInelastic.hh.

Referenced by BuildPhysicsTable(), and G4ParticleHPInelastic().

◆ fManager

G4ParticleHPManager* G4ParticleHPInelastic::fManager
protected

◆ indexP

G4int G4ParticleHPInelastic::indexP
protected

◆ numEle

G4int G4ParticleHPInelastic::numEle {0}
protected

Definition at line 83 of file G4ParticleHPInelastic.hh.

83{0};

Referenced by BuildPhysicsTable().

◆ theInelastic

std::vector< G4ParticleHPChannelList * > * G4ParticleHPInelastic::theInelastic = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}
staticprotected

Definition at line 88 of file G4ParticleHPInelastic.hh.

137{
138public:
140 const char* name = "NeutronHPInelastic");
141
142 ~G4ParticleHPInelastic() override;
143
145 G4Nucleus& aTargetNucleus) override;
146
147 const std::pair<G4double, G4double>
148 GetFatalEnergyCheckLevels() const override;
149
150 void BuildPhysicsTable(const G4ParticleDefinition&) override;
151 void ModelDescription(std::ostream& outFile) const override;
152
154 G4ParticleHPInelastic & operator=
155 (const G4ParticleHPInelastic &right) = delete;
156
157private:
158
159 void ClearData();
160
161 G4ParticleDefinition* theProjectile;
162 G4bool isFirst{false};
163 static G4bool fLock[6];
164
165protected:
166 // one List per element
167 static std::vector<G4ParticleHPChannelList*>* theInelastic[6];
170 G4int numEle{0};
172};
173
174#endif
bool G4bool
Definition G4Types.hh:86
void ModelDescription(std::ostream &outFile) const override
void BuildPhysicsTable(const G4ParticleDefinition &) override
const std::pair< G4double, G4double > GetFatalEnergyCheckLevels() const override
G4ParticleHPInelastic(G4ParticleDefinition *p=G4Neutron::Neutron(), const char *name="NeutronHPInelastic")

Referenced by ApplyYourself(), and BuildPhysicsTable().


The documentation for this class was generated from the following files: