Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4PiMinusAbsorptionAtRest.cc
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// File name: G4PiMinusAbsorptionAtRest.hh
27//
28// Author: Maria Grazia Pia (pia@genova.infn.it)
29//
30// Creation date: 8 May 1998
31//
32// Modifications:
33// MGP 4 Jul 1998 Changed excitation energy calculation
34// MGP 14 Sep 1998 Fixed excitation energy calculation
35//
36// -------------------------------------------------------------------
37
38#include "G4ios.hh"
39
41
42#include "G4SystemOfUnits.hh"
43#include "G4PiMinusStopLi.hh"
44#include "G4PiMinusStopC.hh"
45#include "G4PiMinusStopN.hh"
46#include "G4PiMinusStopO.hh"
47#include "G4PiMinusStopAl.hh"
48#include "G4PiMinusStopCu.hh"
49#include "G4PiMinusStopCo.hh"
50#include "G4PiMinusStopTa.hh"
51#include "G4PiMinusStopPb.hh"
54#include "G4DynamicParticle.hh"
56#include "Randomize.hh"
57#include "G4ThreeVector.hh"
58#include "G4LorentzVector.hh"
61
62
63// Constructor
64
65G4PiMinusAbsorptionAtRest::G4PiMinusAbsorptionAtRest(const G4String& processName,
66 G4ProcessType aType) :
67 G4VRestProcess (processName, aType)
68{
69 G4HadronicDeprecate("G4PiMinusAbsorptionAtRest");
70
72
73 _indexDeexcitation = 0;
74
75 if (verboseLevel>0)
76 { G4cout << GetProcessName() << " is created "<< G4endl; }
78}
79
80
81// Destructor
82
84{
86}
87
89{
91}
92
94{
96}
97
99{
100 const G4DynamicParticle* stoppedHadron = track.GetDynamicParticle();
101
102 // Check applicability
103 if (! IsApplicable(*(stoppedHadron->GetDefinition())))
104 {
105 G4cerr
106 << "G4PiMinusAbsorptionAtRest: ERROR, particle must be a pion minus!"
107 << G4endl;
108 return NULL;
109 }
110
111 // Get the current material
112 const G4Material* material = track.GetMaterial();
113
114 G4double A=-1;
115 G4double Z=-1;
116 G4double random = G4UniformRand();
117 const G4ElementVector* theElementVector = material->GetElementVector();
118 unsigned int i;
119 G4double sum = 0;
120 G4double totalsum=0;
121 for(i=0; i<material->GetNumberOfElements(); ++i)
122 {
123 if((*theElementVector)[i]->GetZ()!=1) totalsum+=material->GetFractionVector()[i];
124 }
125 for (i = 0; i<material->GetNumberOfElements(); ++i)
126 {
127 if((*theElementVector)[i]->GetZ()!=1) sum += material->GetFractionVector()[i];
128 if ( sum/totalsum > random )
129 {
130 A = (*theElementVector)[i]->GetA()*mole/g;
131 Z = (*theElementVector)[i]->GetZ();
132 break;
133 }
134 }
135
136 // Do the interaction with the nucleon cluster
137
138 G4PiMinusStopMaterial* algorithm = LoadAlgorithm(static_cast<G4int>(Z));
139 G4PiMinusStopAbsorption stopAbsorption(algorithm,Z,A);
140 stopAbsorption.SetVerboseLevel(verboseLevel);
141
142 G4DynamicParticleVector* absorptionProducts = stopAbsorption.DoAbsorption();
143
144 // Deal with the leftover nucleus
145
146 G4double pionEnergy = stoppedHadron->GetTotalEnergy();
147 G4double excitation = pionEnergy - stopAbsorption.Energy();
148 if (excitation < 0.)
149 {
150 G4Exception("G4PiMinusAbsorptionAtRest::AtRestDoIt()", "HAD_STOP_0000",
151 FatalException, "Excitation energy < 0");
152 }
153 if (verboseLevel>0) { G4cout << " excitation " << excitation << G4endl; }
154
155 G4StopDeexcitationAlgorithm* nucleusAlgorithm = LoadNucleusAlgorithm();
156 G4StopDeexcitation stopDeexcitation(nucleusAlgorithm);
157
158 G4double newZ = Z - stopAbsorption.NProtons();
159 G4double newN = A - Z - stopAbsorption.NNeutrons();
160 G4double newA = newZ + newN;
161 G4ReactionProductVector* fragmentationProducts = stopDeexcitation.DoBreakUp(newA,newZ,excitation,stopAbsorption.RecoilMomentum());
162
163 unsigned int nAbsorptionProducts = 0;
164 if (absorptionProducts != 0)
165 { nAbsorptionProducts = absorptionProducts->size(); }
166
167 unsigned int nFragmentationProducts = 0;
168 if (fragmentationProducts != 0)
169 { nFragmentationProducts = fragmentationProducts->size(); }
170
171 if (verboseLevel>0)
172 {
173 G4cout << "nAbsorptionProducts = " << nAbsorptionProducts
174 << " nFragmentationProducts = " << nFragmentationProducts
175 << G4endl;
176 }
177
178 // Deal with ParticleChange final state
179
181 aParticleChange.SetNumberOfSecondaries(G4int(nAbsorptionProducts + nFragmentationProducts));
182
183 for (i = 0; i<nAbsorptionProducts; i++)
184 { aParticleChange.AddSecondary((*absorptionProducts)[i]); }
185
186// for (i = 0; i<nFragmentationProducts; i++)
187// { aParticleChange.AddSecondary(fragmentationProducts->at(i)); }
188 for(i=0; i<nFragmentationProducts; i++)
189 {
190 G4DynamicParticle * aNew =
191 new G4DynamicParticle((*fragmentationProducts)[i]->GetDefinition(),
192 (*fragmentationProducts)[i]->GetMomentum());
193 G4double newTime = aParticleChange.GetGlobalTime((*fragmentationProducts)[i]->GetFormationTime());
194 aParticleChange.AddSecondary(aNew, newTime);
195 delete (*fragmentationProducts)[i];
196 }
197
198 if (fragmentationProducts != 0) delete fragmentationProducts;
199
200 if (_indexDeexcitation == 1) aParticleChange.ProposeLocalEnergyDeposit(excitation);
201
202 // Kill the absorbed pion
204
205 return &aParticleChange;
206
207}
208
209G4PiMinusStopMaterial* G4PiMinusAbsorptionAtRest::LoadAlgorithm(int Z)
210{
211 if (verboseLevel>0)
212 {
213 G4cout << "Load material algorithm " << Z << G4endl;
214 }
215
216 G4int index = 0;
217 if (Z > 0 && Z < 4) {index = 3;}
218 if (Z > 3 && Z < 7) {index = 6;}
219 if (Z == 7) {index = 7;}
220 if (Z >= 8 && Z<= 11) {index = 8;}
221 if (Z >= 12 && Z<= 18) {index = 13;}
222 if (Z >=19 && Z<= 27) {index = 27;}
223 if (Z >= 28 && Z<= 51) {index = 29;}
224 if (Z >=52 ) {index = 73;}
225
226 switch (index)
227 {
228 case 3:
229 if (verboseLevel>0)
230 { G4cout << " =================== Load Li algorithm " << G4endl; }
231 return new G4PiMinusStopLi();
232 case 6:
233 if (verboseLevel>0)
234 { G4cout << " =================== Load C algorithm " << G4endl; }
235 return new G4PiMinusStopC();
236 case 7:
237 if (verboseLevel>0)
238 { G4cout << " =================== Load N algorithm " << G4endl; }
239 return new G4PiMinusStopN();
240 case 8:
241 if (verboseLevel>0)
242 { G4cout << " =================== Load O algorithm " << G4endl; }
243 return new G4PiMinusStopO();
244 case 13:
245 if (verboseLevel>0)
246 { G4cout << " =================== Load Al algorithm " << G4endl; }
247 return new G4PiMinusStopAl();
248 case 27:
249 if (verboseLevel>0)
250 { G4cout << " =================== Load Cu algorithm " << G4endl; }
251 return new G4PiMinusStopCu();
252 case 29:
253 if (verboseLevel>0)
254 { G4cout << " =================== Load Co algorithm " << G4endl; }
255 return new G4PiMinusStopCo();
256 case 73:
257 if (verboseLevel>0)
258 { G4cout << " =================== Load Ta algorithm " << G4endl; }
259 return new G4PiMinusStopTa();
260 default:
261 if (verboseLevel>0)
262 { G4cout << " =================== Load default material algorithm " << G4endl; }
263 return new G4PiMinusStopC();
264 }
265}
266
267G4StopDeexcitationAlgorithm* G4PiMinusAbsorptionAtRest::LoadNucleusAlgorithm()
268{
269
270 switch (_indexDeexcitation)
271 {
272 case 0:
273 if (verboseLevel>0)
274 { G4cout << " =================== Load Theo deexcitation " << G4endl; }
275 return new G4StopTheoDeexcitation();
276 case 1:
277 if (verboseLevel>0)
278 { G4cout << " =================== Load Dummy deexcitation " << G4endl; }
279 return new G4StopDummyDeexcitation();
280 default:
281 if (verboseLevel>0)
282 { G4cout << " =================== Load default deexcitation " << G4endl; }
283 return new G4StopTheoDeexcitation();
284 }
285}
286
288{
289 _indexDeexcitation = index;
290}
std::vector< G4DynamicParticle * > G4DynamicParticleVector
std::vector< G4Element * > G4ElementVector
@ FatalException
#define G4HadronicDeprecate(name)
@ fHadronAtRest
G4ProcessType
std::vector< G4ReactionProduct * > G4ReactionProductVector
@ fStopAndKill
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
G4ParticleDefinition * GetDefinition() const
G4double GetTotalEnergy() const
void DeRegisterExtraProcess(G4VProcess *)
void RegisterExtraProcess(G4VProcess *)
void RegisterParticleForExtraProcess(G4VProcess *, const G4ParticleDefinition *)
static G4HadronicProcessStore * Instance()
void PrintInfo(const G4ParticleDefinition *)
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:189
const G4double * GetFractionVector() const
Definition: G4Material.hh:193
size_t GetNumberOfElements() const
Definition: G4Material.hh:185
void AddSecondary(G4Track *aSecondary)
virtual void Initialize(const G4Track &)
G4double GetGlobalTime(G4double timeDelay=0.0) const
void BuildPhysicsTable(const G4ParticleDefinition &)
G4VParticleChange * AtRestDoIt(const G4Track &aTrack, const G4Step &aStep)
G4bool IsApplicable(const G4ParticleDefinition &particle)
void PreparePhysicsTable(const G4ParticleDefinition &)
G4DynamicParticleVector * DoAbsorption()
Definition: G4Step.hh:78
G4ReactionProductVector * DoBreakUp(G4double A, G4double Z, G4double excitation, const G4ThreeVector &p) const
G4Material * GetMaterial() const
const G4DynamicParticle * GetDynamicParticle() const
void ProposeTrackStatus(G4TrackStatus status)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
void SetNumberOfSecondaries(G4int totSecondaries)
G4ParticleChange aParticleChange
Definition: G4VProcess.hh:289
G4int verboseLevel
Definition: G4VProcess.hh:368
void SetProcessSubType(G4int)
Definition: G4VProcess.hh:403
const G4String & GetProcessName() const
Definition: G4VProcess.hh:379
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41