Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/utils/src/G4EmMultiModel.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/electromagnetic/utils/src/G4EmMultiModel.cc (Version 11.3.0) and /processes/electromagnetic/utils/src/G4EmMultiModel.cc (Version 8.3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
                                                   >>  26 // $Id: G4EmMultiModel.cc,v 1.5 2006/06/29 19:55:03 gunter Exp $
                                                   >>  27 // GEANT4 tag $Name: geant4-08-02 $
 26 //                                                 28 //
 27 // -------------------------------------------     29 // -------------------------------------------------------------------
 28 //                                                 30 //
 29 // GEANT4 Class file                               31 // GEANT4 Class file
 30 //                                                 32 //
 31 //                                                 33 //
 32 // File name:   G4EmMultiModel                     34 // File name:   G4EmMultiModel
 33 //                                                 35 //
 34 // Author:        Vladimir Ivanchenko              36 // Author:        Vladimir Ivanchenko
 35 //                                                 37 // 
 36 // Creation date: 03.05.2004                       38 // Creation date: 03.05.2004
 37 //                                                 39 //
 38 // Modifications:                                  40 // Modifications: 
 39 // 15-04-05 optimize internal interface (V.Iva     41 // 15-04-05 optimize internal interface (V.Ivanchenko)
 40 // 04-07-10 updated interfaces according to g4 <<  42 //
                                                   >>  43 
                                                   >>  44 // Class Description:
                                                   >>  45 //
                                                   >>  46 // Energy loss model using several G4VEmModels
                                                   >>  47 
                                                   >>  48 // -------------------------------------------------------------------
 41 //                                                 49 //
 42                                                    50 
 43                                                    51 
 44 //....oooOO0OOooo........oooOO0OOooo........oo     52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 45 //....oooOO0OOooo........oooOO0OOooo........oo     53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 46                                                    54 
 47 #include "G4EmMultiModel.hh"                       55 #include "G4EmMultiModel.hh"
 48 #include "Randomize.hh"                            56 #include "Randomize.hh"
 49 #include "G4EmParameters.hh"                   << 
 50                                                    57 
 51 //....oooOO0OOooo........oooOO0OOooo........oo     58 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 52                                                    59 
 53 G4EmMultiModel::G4EmMultiModel(const G4String&     60 G4EmMultiModel::G4EmMultiModel(const G4String& nam)
 54   : G4VEmModel(nam)                            <<  61   : G4VEmModel(nam),
                                                   >>  62   nModels(0)
 55 {                                                  63 {
 56   model.clear();                                   64   model.clear();
                                                   >>  65   tsecmin.clear();
 57   cross_section.clear();                           66   cross_section.clear();
 58 }                                                  67 }
 59                                                    68 
 60 //....oooOO0OOooo........oooOO0OOooo........oo     69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 61                                                    70 
 62 G4EmMultiModel::~G4EmMultiModel() = default;   <<  71 G4EmMultiModel::~G4EmMultiModel()
 63                                                << 
 64 //....oooOO0OOooo........oooOO0OOooo........oo << 
 65                                                << 
 66 void G4EmMultiModel::AddModel(G4VEmModel* p)   << 
 67 {                                                  72 {
 68   cross_section.push_back(0.0);                <<  73   if(nModels) {
 69   model.push_back(p);                          <<  74     for(G4int i=0; i<nModels; i++) {
 70   ++nModels;                                   <<  75       delete model[i];
                                                   >>  76     }
                                                   >>  77   }
 71 }                                                  78 }
 72                                                    79 
 73 //....oooOO0OOooo........oooOO0OOooo........oo     80 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 74                                                    81 
 75 void G4EmMultiModel::Initialise(const G4Partic     82 void G4EmMultiModel::Initialise(const G4ParticleDefinition* p, 
 76                                 const G4DataVe     83                                 const G4DataVector& cuts)
 77 {                                                  84 {
 78   G4EmParameters* param = G4EmParameters::Inst <<  85   if(nModels) {
 79   G4int verb = IsMaster() ? param->Verbose() : <<  86     for(G4int i=0; i<nModels; i++) {
 80   if(verb > 0) {                               <<  87       (model[i])->Initialise(p, cuts);
 81     G4cout << "### Initialisation of EM MultiM <<  88     }
 82      << " including following list of " << nMo << 
 83   }                                            << 
 84   for(G4int i=0; i<nModels; ++i) {             << 
 85     G4cout << "    " << (model[i])->GetName(); << 
 86     (model[i])->SetParticleChange(pParticleCha << 
 87     (model[i])->Initialise(p, cuts);           << 
 88   }                                                89   }
 89   if(verb > 0) { G4cout << G4endl; }           << 
 90 }                                                  90 }
 91                                                    91 
 92 //....oooOO0OOooo........oooOO0OOooo........oo     92 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 93                                                    93 
 94 G4double G4EmMultiModel::ComputeDEDXPerVolume( <<  94 G4double G4EmMultiModel::MinEnergyCut(const G4ParticleDefinition* p,
 95                 const G4ParticleDefinition* p, <<  95                                       const G4MaterialCutsCouple* couple)
 96                 G4double kineticEnergy,        <<  96 {
 97                 G4double cutEnergy)            <<  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 
                                                   >> 106 G4double G4EmMultiModel::ComputeDEDX(const G4MaterialCutsCouple* couple,
                                                   >> 107                                      const G4ParticleDefinition* p,
                                                   >> 108                                            G4double kineticEnergy,
                                                   >> 109                                            G4double cutEnergy)
 98 {                                                 110 {
 99   G4double dedx = 0.0;                         << 111   G4double dedx  = 0.0;
100   for(G4int i=0; i<nModels; ++i) {             << 112 
101     dedx += (model[i])->ComputeDEDXPerVolume(m << 113   if(nModels) {
                                                   >> 114     dedx =  (model[0])->ComputeDEDX(couple, p, cutEnergy, kineticEnergy);
102   }                                               115   } 
103                                                   116 
104   return dedx;                                    117   return dedx;
105 }                                                 118 }
106                                                   119 
107 //....oooOO0OOooo........oooOO0OOooo........oo    120 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
108                                                   121 
109 G4double G4EmMultiModel::ComputeCrossSectionPe << 122 G4double G4EmMultiModel::CrossSection(const G4MaterialCutsCouple* couple,
110                                                << 123                                       const G4ParticleDefinition* p,
111                                                << 124                                             G4double kineticEnergy,
112                                                << 125                                             G4double cutEnergy,
113                                                << 126                                             G4double maxKinEnergy)
114                                                << 127 {
115 {                                              << 128   G4double cross     = 0.0;
116   G4double cross = 0.0;                        << 129   G4double t1        = cutEnergy;
117   for(G4int i=0; i<nModels; ++i) {             << 130   G4double t2        = cutEnergy;
118     (model[i])->SetCurrentCouple(CurrentCouple << 131   if(nModels) {
119     cross += (model[i])->ComputeCrossSectionPe << 132     for(G4int i=0; i<nModels; i++) {
120                 cutEnergy, maxEnergy);         << 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     }
121   }                                               137   } 
122   return cross;                                   138   return cross;
123 }                                                 139 }
124                                                   140 
125 //....oooOO0OOooo........oooOO0OOooo........oo    141 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
126                                                   142 
127 void G4EmMultiModel::SampleSecondaries(std::ve << 143 std::vector<G4DynamicParticle*>* G4EmMultiModel::SampleSecondaries(
128                                        const G << 144                              const G4MaterialCutsCouple* couple,
129                                        const G << 145                              const G4DynamicParticle* dp,
130                                        G4doubl << 146                                    G4double tmin,
131                                        G4doubl << 147                                    G4double maxEnergy)
132 {                                                 148 {
133   SetCurrentCouple(couple);                    << 149   std::vector<G4DynamicParticle*>* vdp = 0;
134   if(nModels > 0) {                            << 150 
                                                   >> 151   if(nModels) {
135     G4int i;                                      152     G4int i;
136     G4double cross = 0.0;                         153     G4double cross = 0.0;
137     for(i=0; i<nModels; ++i) {                 << 154     G4double t1    = tmin;
138       cross += (model[i])->CrossSection(couple << 155     G4double t2    = tmin;
139                                         dp->Ge << 156     for(i=0; i<nModels; i++) {
                                                   >> 157       t1 = std::max(t2, tsecmin[i]);
                                                   >> 158       t2 = std::min(maxEnergy, tsecmin[i+1]);
                                                   >> 159       cross += (model[i])->CrossSection(couple, dp->GetDefinition(), 
                                                   >> 160                                         dp->GetKineticEnergy(), t1, t2);
140       cross_section[i] = cross;                   161       cross_section[i] = cross;
141     }                                             162     }
142                                                   163 
143     cross *= G4UniformRand();                     164     cross *= G4UniformRand();
                                                   >> 165     t2 = tmin;
144                                                   166 
145     for(i=0; i<nModels; ++i) {                 << 167     for(i=0; i<nModels; i++) {
                                                   >> 168       t1 = std::max(t2, tsecmin[i]);
                                                   >> 169       t2 = std::min(maxEnergy, tsecmin[i+1]);
146       if(cross <= cross_section[i]) {             170       if(cross <= cross_section[i]) {
147         (model[i])->SampleSecondaries(vdp, cou << 171         vdp = (model[i])->SampleSecondaries(couple, dp, t1, t2);
148         return;                                << 172         break;
                                                   >> 173       }
                                                   >> 174     }
                                                   >> 175   } 
                                                   >> 176 
                                                   >> 177   return vdp;
                                                   >> 178 }
                                                   >> 179 
                                                   >> 180 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 181 
                                                   >> 182 G4double G4EmMultiModel:: MaxSecondaryEnergy(const G4ParticleDefinition*,
                                                   >> 183                      G4double kinEnergy)
                                                   >> 184 {
                                                   >> 185   G4cout << "Warning! G4EmMultiModel::"
                                                   >> 186          << "MaxSecondaryEnergy(const G4ParticleDefinition*,G4double kinEnergy)"
                                                   >> 187          << " should not be used!" << G4endl;
                                                   >> 188   return kinEnergy;
                                                   >> 189 }
                                                   >> 190 
                                                   >> 191 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 192 
                                                   >> 193 void G4EmMultiModel::DefineForRegion(const G4Region* r)
                                                   >> 194 {
                                                   >> 195   if(nModels) {
                                                   >> 196     for(G4int i=0; i<nModels; i++) {(model[i])->DefineForRegion(r);}
                                                   >> 197   } 
                                                   >> 198 }
                                                   >> 199 
                                                   >> 200 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 201 
                                                   >> 202 void G4EmMultiModel::AddModel(G4VEmModel* p, G4double tmin, G4double tmax)
                                                   >> 203 {
                                                   >> 204   if(tmin < tmax && 0.0 < tmin) {
                                                   >> 205 
                                                   >> 206     if(nModels == 0) {
                                                   >> 207       tsecmin.push_back(tmin);
                                                   >> 208       tsecmin.push_back(tmax);
                                                   >> 209       cross_section.push_back(0.0);
                                                   >> 210       model.push_back(p);
                                                   >> 211       nModels++;
                                                   >> 212 
                                                   >> 213     } else {
                                                   >> 214       G4int i, j;
                                                   >> 215       G4bool increment = false;
                                                   >> 216       for(i=0; i<nModels; i++) {
                                                   >> 217 
                                                   >> 218         if(tmin < tsecmin[i]) {
                                                   >> 219           G4double t2 = std::min(tsecmin[i+1],tmax);
                                                   >> 220           if(tmin < t2) {
                                                   >> 221             tsecmin.push_back(0.0);
                                                   >> 222             cross_section.push_back(0.0);
                                                   >> 223             model.push_back(0);
                                                   >> 224             for(j=nModels; j>i; j--) {
                                                   >> 225               model[j] = model[j-1];
                                                   >> 226               tsecmin[j+1] = tsecmin[j];
                                                   >> 227       } 
                                                   >> 228             model[i] = p;
                                                   >> 229             tsecmin[i+1] = t2;
                                                   >> 230             tsecmin[i]   = tmin;
                                                   >> 231             increment = true;
                                                   >> 232     }
                                                   >> 233     } else if(i == nModels-1) {
                                                   >> 234           G4double t1 = std::min(tsecmin[i+1],tmin);
                                                   >> 235           G4double t2 = std::max(tsecmin[i+1],tmax);
                                                   >> 236           if(t1 < t2) {
                                                   >> 237             tsecmin.push_back(t2);
                                                   >> 238             cross_section.push_back(0.0);
                                                   >> 239             model.push_back(p);
                                                   >> 240             increment = true;
                                                   >> 241           }
                                                   >> 242   }
149       }                                           243       }
                                                   >> 244       if(increment) nModels++;
150     }                                             245     }
151   }                                               246   } 
152 }                                                 247 }
153                                                   248 
154 //....oooOO0OOooo........oooOO0OOooo........oo    249 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
155                                                   250 
156                                                   251