source: trunk/source/physics_lists/builders/src/G4HadronProcessStore.cc@ 883

Last change on this file since 883 was 825, checked in by garnier, 17 years ago

import all except CVS

File size: 11.1 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: G4HadronProcessStore.cc,v 1.1 2006/10/31 11:35:02 gunter Exp $
27// GEANT4 tag $Name: $
28//
29// -------------------------------------------------------------------
30//
31// GEANT4 Class file
32//
33//
34// File name: G4HadronProcessStore
35//
36// Author: Vladimir Ivanchenko
37//
38// Creation date: 03.05.2006
39//
40// Modifications:
41// 04.08.06 V.Ivanchenko add computation of cross sections
42//
43//
44// Class Description:
45//
46// -------------------------------------------------------------------
47//
48//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
49//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
50
51#include "G4HadronProcessStore.hh"
52#include "G4Element.hh"
53#include "G4ProcessManager.hh"
54#include "G4Electron.hh"
55#include "G4Proton.hh"
56
57G4HadronProcessStore* G4HadronProcessStore::theInstance = 0;
58
59//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
60
61G4HadronProcessStore* G4HadronProcessStore::Instance()
62{
63 if(0 == theInstance) {
64 static G4HadronProcessStore manager;
65 theInstance = &manager;
66 }
67 return theInstance;
68}
69
70//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
71
72G4HadronProcessStore::~G4HadronProcessStore()
73{
74 for (G4int i=0; i<n_proc; i++) {
75 if( process[i] ) delete process[i];
76 }
77 // for (G4int j=0; j<n_model; j++) {
78 // if( model[j] ) delete model[j];
79 // }
80}
81
82//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
83
84G4HadronProcessStore::G4HadronProcessStore()
85{
86 n_proc = 0;
87 n_part = 0;
88 n_model= 0;
89 currentProcess = 0;
90 currentParticle = 0;
91 verbose = 1;
92}
93
94//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
95
96G4double G4HadronProcessStore::GetInelasticCrossSectionPerVolume(
97 const G4ParticleDefinition *aParticle,
98 G4double kineticEnergy,
99 const G4Material *material)
100{
101 G4double cross = 0.0;
102 const G4ElementVector* theElementVector = material->GetElementVector();
103 const G4double* theAtomNumDensityVector = material->GetVecNbOfAtomsPerVolume();
104 size_t nelm = material->GetNumberOfElements();
105 for (size_t i=0; i<nelm; i++) {
106 const G4Element* elm = (*theElementVector)[i];
107 cross += theAtomNumDensityVector[i]*
108 GetInelasticCrossSectionPerAtom(aParticle,kineticEnergy,elm);
109 }
110 return cross;
111}
112
113//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
114
115G4double G4HadronProcessStore::GetInelasticCrossSectionPerAtom(
116 const G4ParticleDefinition *aParticle,
117 G4double kineticEnergy,
118 const G4Element *anElement)
119{
120 G4HadronicProcess* hp = FindInelasticProcess(aParticle);
121 localDP.SetDefinition(const_cast<G4ParticleDefinition*>(aParticle));
122 localDP.SetKineticEnergy(kineticEnergy);
123 G4double cross = 0.0;
124 if(hp) cross = hp->GetMicroscopicCrossSection(&localDP,
125 anElement,
126 STP_Temperature);
127 return cross;
128}
129
130//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
131
132G4double G4HadronProcessStore::GetInelasticCrossSectionPerIsotope(
133 const G4ParticleDefinition *,
134 G4double,
135 G4int, G4int)
136{
137 return 0.0;
138}
139
140//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
141
142G4double G4HadronProcessStore::GetElasticCrossSectionPerVolume(
143 const G4ParticleDefinition *aParticle,
144 G4double kineticEnergy,
145 const G4Material *material)
146{
147 G4double cross = 0.0;
148 const G4ElementVector* theElementVector = material->GetElementVector();
149 const G4double* theAtomNumDensityVector = material->GetVecNbOfAtomsPerVolume();
150 size_t nelm = material->GetNumberOfElements();
151 for (size_t i=0; i<nelm; i++) {
152 const G4Element* elm = (*theElementVector)[i];
153 cross += theAtomNumDensityVector[i]*
154 GetElasticCrossSectionPerAtom(aParticle,kineticEnergy,elm);
155 }
156 return cross;
157}
158
159//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
160
161G4double G4HadronProcessStore::GetElasticCrossSectionPerAtom(
162 const G4ParticleDefinition *aParticle,
163 G4double kineticEnergy,
164 const G4Element *anElement)
165{
166 G4HadronicProcess* hp = FindElasticProcess(aParticle);
167 localDP.SetKineticEnergy(kineticEnergy);
168 G4double cross = 0.0;
169 if(hp) cross = hp->GetMicroscopicCrossSection(&localDP,
170 anElement,
171 STP_Temperature);
172 return cross;
173}
174
175//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
176
177G4double G4HadronProcessStore::GetElasticCrossSectionPerIsotope(
178 const G4ParticleDefinition*,
179 G4double,
180 G4int, G4int)
181{
182 return 0.0;
183}
184
185//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
186
187void G4HadronProcessStore::Register(G4HadronicProcess* proc,
188 const G4ParticleDefinition* part,
189 G4HadronicInteraction* mod,
190 const G4String& name)
191{
192 G4int i=0;
193 for(; i<n_proc; i++) {if(process[i] == proc) break;}
194 G4int j=0;
195 for(; j<n_part; j++) {if(particle[j] == part) break;}
196 G4int k=0;
197 for(; k<n_model; k++) {if(model[k] == mod) break;}
198
199 if(i == n_proc || j == n_part)
200 p_map.insert(std::multimap<PD,HP>::value_type(part,proc));
201
202 m_map.insert(std::multimap<HP,HI>::value_type(proc,mod));
203
204 if(i == n_proc) {
205 n_proc++;
206 process.push_back(proc);
207 }
208 if(j == n_part) {
209 n_part++;
210 particle.push_back(part);
211 }
212 if(k == n_model) {
213 n_model++;
214 model.push_back(mod);
215 modelName.push_back(name);
216 }
217}
218
219//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
220
221void G4HadronProcessStore::Print(const G4ParticleDefinition* part)
222{
223 G4cout<<G4endl;
224 G4cout << " Hadronic Processes for "
225 <<part->GetParticleName() << G4endl;
226 HP hp = 0;
227 HI hi = 0;
228 G4bool first;
229 std::multimap<PD,HP,std::less<PD> >::iterator it;
230 std::multimap<HP,HI,std::less<HP> >::iterator ih;
231 for(it=p_map.lower_bound(part); it!=p_map.upper_bound(part); ++it) {
232 if(it->first == part) {
233 hp = it->second;
234 G4cout << std::setw(10) << hp->GetProcessName()
235 << " Models: ";
236 first = true;
237 for(ih=m_map.lower_bound(hp); ih!=m_map.upper_bound(hp); ++ih) {
238 if(ih->first == hp) {
239 hi = ih->second;
240 G4int i=0;
241 for(; i<n_model; i++) {
242 if(model[i] == hi) break;
243 }
244 if(!first) G4cout << " ";
245 first = false;
246 G4cout << std::setw(10) << modelName[i]
247 << " Emin(GeV)= "
248 << std::setw(5) << hi->GetMinEnergy()/GeV
249 << " Emax(GeV)= "
250 << std::setw(7) << hi->GetMaxEnergy()/GeV
251 << G4endl;
252 }
253 }
254 }
255 }
256}
257
258//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
259
260void G4HadronProcessStore::Dump(G4int level)
261{
262 if(level > 0)
263 G4cout << "=============================================================="
264 << "============================="
265 << G4endl;
266 for(G4int i=0; i<n_part; i++) {
267 G4String pname = (particle[i])->GetParticleName();
268 G4bool yes = false;
269 if(level >= 2) yes = true;
270 else if(level == 1 && (pname == "proton" ||
271 pname == "neutron" ||
272 pname == "pi+" ||
273 pname == "pi-" ||
274 pname == "kaon+" ||
275 pname == "kaon-" ||
276 pname == "lambda" ||
277 pname == "anti_neutron" ||
278 pname == "anti_proton")) yes = true;
279 if(yes) Print(particle[i]);
280 }
281 if(level > 0)
282 G4cout << "=============================================================="
283 << "============================="
284 << G4endl;
285}
286
287//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
288
289void G4HadronProcessStore::SetVerbose(G4int val)
290{
291 verbose = val;
292 G4int i;
293 for(i=0; i<n_proc; i++) {
294 if(process[i]) process[i]->SetVerboseLevel(val);
295 }
296 for(i=0; i<n_model; i++) {
297 if(model[i]) model[i]->SetVerboseLevel(val);
298 }
299}
300
301//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
302
303G4int G4HadronProcessStore::GetVerbose()
304{
305 return verbose;
306}
307
308//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
309
310G4HadronicProcess* G4HadronProcessStore::FindElasticProcess(
311 const G4ParticleDefinition* part)
312{
313 bool isNew = false;
314 G4HadronicProcess* hp = 0;
315
316 if(part != currentParticle) {
317 isNew = true;
318 currentParticle = part;
319 localDP.SetDefinition(const_cast<G4ParticleDefinition*>(part));
320 } else if(!currentProcess) {
321 isNew = true;
322 } else if(currentProcess->GetProcessName() == "hElastic") {
323 hp = currentProcess;
324 } else {
325 isNew = true;
326 }
327
328 if(isNew) {
329 std::multimap<PD,HP,std::less<PD> >::iterator it;
330 for(it=p_map.lower_bound(part); it!=p_map.upper_bound(part); ++it) {
331 if(it->first == part && (it->second)->GetProcessName() == "hElastic") {
332 hp = it->second;
333 break;
334 }
335 }
336 currentProcess = hp;
337 }
338
339 return hp;
340}
341
342//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
343
344G4HadronicProcess* G4HadronProcessStore::FindInelasticProcess(
345 const G4ParticleDefinition* part)
346{
347 bool isNew = false;
348 G4HadronicProcess* hp = 0;
349
350 if(part != currentParticle) {
351 isNew = true;
352 currentParticle = part;
353 localDP.SetDefinition(const_cast<G4ParticleDefinition*>(part));
354 } else if(!currentProcess) {
355 isNew = true;
356 } else if(currentProcess->GetProcessName() == "hInelastic") {
357 hp = currentProcess;
358 } else {
359 isNew = true;
360 }
361
362 if(isNew) {
363 std::multimap<PD,HP,std::less<PD> >::iterator it;
364 for(it=p_map.lower_bound(part); it!=p_map.upper_bound(part); ++it) {
365 if(it->first == part && (it->second)->GetProcessName() == "hInelastic") {
366 hp = it->second;
367 break;
368 }
369 }
370 currentProcess = hp;
371 }
372
373 return hp;
374}
375
376//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
Note: See TracBrowser for help on using the repository browser.