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

Last change on this file since 1312 was 1228, checked in by garnier, 15 years ago

update geant4.9.3 tag

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-03 $
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.