source: trunk/source/processes/electromagnetic/utils/src/G4EmMultiModel.cc@ 1065

Last change on this file since 1065 was 1007, checked in by garnier, 17 years ago

update to geant4.9.2

File size: 7.6 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: G4EmMultiModel.cc,v 1.6 2007/05/22 17:31:58 vnivanch Exp $
27// GEANT4 tag $Name: geant4-09-02 $
28//
29// -------------------------------------------------------------------
30//
31// GEANT4 Class file
32//
33//
34// File name: G4EmMultiModel
35//
36// Author: Vladimir Ivanchenko
37//
38// Creation date: 03.05.2004
39//
40// Modifications:
41// 15-04-05 optimize internal interface (V.Ivanchenko)
42//
43
44// Class Description:
45//
46// Energy loss model using several G4VEmModels
47
48// -------------------------------------------------------------------
49//
50
51
52//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
53//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
54
55#include "G4EmMultiModel.hh"
56#include "Randomize.hh"
57
58//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
59
60G4EmMultiModel::G4EmMultiModel(const G4String& nam)
61 : G4VEmModel(nam),
62 nModels(0)
63{
64 model.clear();
65 tsecmin.clear();
66 cross_section.clear();
67}
68
69//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
70
71G4EmMultiModel::~G4EmMultiModel()
72{
73 if(nModels) {
74 for(G4int i=0; i<nModels; i++) {
75 delete model[i];
76 }
77 }
78}
79
80//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
81
82void G4EmMultiModel::Initialise(const G4ParticleDefinition* p,
83 const G4DataVector& cuts)
84{
85 if(nModels) {
86 for(G4int i=0; i<nModels; i++) {
87 (model[i])->Initialise(p, cuts);
88 }
89 }
90}
91
92//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
93
94G4double G4EmMultiModel::MinEnergyCut(const G4ParticleDefinition* p,
95 const G4MaterialCutsCouple* couple)
96{
97 G4double cut = DBL_MAX;
98 if(nModels) {
99 cut = (model[0])->MinEnergyCut(p, couple);
100 }
101 return cut;
102}
103
104//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
105
106G4double G4EmMultiModel::ComputeDEDX(const G4MaterialCutsCouple* couple,
107 const G4ParticleDefinition* p,
108 G4double kineticEnergy,
109 G4double cutEnergy)
110{
111 G4double dedx = 0.0;
112
113 if(nModels) {
114 dedx = (model[0])->ComputeDEDX(couple, p, cutEnergy, kineticEnergy);
115 }
116
117 return dedx;
118}
119
120//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
121
122G4double G4EmMultiModel::CrossSection(const G4MaterialCutsCouple* couple,
123 const G4ParticleDefinition* p,
124 G4double kineticEnergy,
125 G4double cutEnergy,
126 G4double maxKinEnergy)
127{
128 G4double cross = 0.0;
129 G4double t1 = cutEnergy;
130 G4double t2 = cutEnergy;
131 if(nModels) {
132 for(G4int i=0; i<nModels; i++) {
133 t1 = std::max(t2, tsecmin[i]);
134 t2 = std::min(maxKinEnergy, tsecmin[i+1]);
135 cross += (model[i])->CrossSection(couple, p, kineticEnergy, t1, t2);
136 }
137 }
138 return cross;
139}
140
141//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
142
143void G4EmMultiModel::SampleSecondaries(std::vector<G4DynamicParticle*>* vdp,
144 const G4MaterialCutsCouple* couple,
145 const G4DynamicParticle* dp,
146 G4double tmin,
147 G4double maxEnergy)
148{
149 if(nModels > 0) {
150 G4int i;
151 G4double cross = 0.0;
152 G4double t1 = tmin;
153 G4double t2 = tmin;
154 for(i=0; i<nModels; i++) {
155 t1 = std::max(t2, tsecmin[i]);
156 t2 = std::min(maxEnergy, tsecmin[i+1]);
157 cross += (model[i])->CrossSection(couple, dp->GetDefinition(),
158 dp->GetKineticEnergy(), t1, t2);
159 cross_section[i] = cross;
160 }
161
162 cross *= G4UniformRand();
163 t2 = tmin;
164
165 for(i=0; i<nModels; i++) {
166 t1 = std::max(t2, tsecmin[i]);
167 t2 = std::min(maxEnergy, tsecmin[i+1]);
168 if(cross <= cross_section[i]) {
169 (model[i])->SampleSecondaries(vdp, couple, dp, t1, t2);
170 break;
171 }
172 }
173 }
174}
175
176//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
177
178G4double G4EmMultiModel:: MaxSecondaryEnergy(const G4ParticleDefinition*,
179 G4double kinEnergy)
180{
181 G4cout << "Warning! G4EmMultiModel::"
182 << "MaxSecondaryEnergy(const G4ParticleDefinition*,G4double kinEnergy)"
183 << " should not be used!" << G4endl;
184 return kinEnergy;
185}
186
187//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
188
189void G4EmMultiModel::DefineForRegion(const G4Region* r)
190{
191 if(nModels) {
192 for(G4int i=0; i<nModels; i++) {(model[i])->DefineForRegion(r);}
193 }
194}
195
196//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
197
198void G4EmMultiModel::AddModel(G4VEmModel* p, G4double tmin, G4double tmax)
199{
200 if(tmin < tmax && 0.0 < tmin) {
201
202 if(nModels == 0) {
203 tsecmin.push_back(tmin);
204 tsecmin.push_back(tmax);
205 cross_section.push_back(0.0);
206 model.push_back(p);
207 nModels++;
208
209 } else {
210 G4int i, j;
211 G4bool increment = false;
212 for(i=0; i<nModels; i++) {
213
214 if(tmin < tsecmin[i]) {
215 G4double t2 = std::min(tsecmin[i+1],tmax);
216 if(tmin < t2) {
217 tsecmin.push_back(0.0);
218 cross_section.push_back(0.0);
219 model.push_back(0);
220 for(j=nModels; j>i; j--) {
221 model[j] = model[j-1];
222 tsecmin[j+1] = tsecmin[j];
223 }
224 model[i] = p;
225 tsecmin[i+1] = t2;
226 tsecmin[i] = tmin;
227 increment = true;
228 }
229 } else if(i == nModels-1) {
230 G4double t1 = std::min(tsecmin[i+1],tmin);
231 G4double t2 = std::max(tsecmin[i+1],tmax);
232 if(t1 < t2) {
233 tsecmin.push_back(t2);
234 cross_section.push_back(0.0);
235 model.push_back(p);
236 increment = true;
237 }
238 }
239 }
240 if(increment) nModels++;
241 }
242 }
243}
244
245//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
246
Note: See TracBrowser for help on using the repository browser.