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 9.1.p1)


  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.6 2007/05/22 17:31:58 vnivanch Exp $
                                                   >>  27 // GEANT4 tag $Name: geant4-09-01-patch-01 $
 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 void G4EmMultiModel::SampleSecondaries(std::vector<G4DynamicParticle*>* vdp,
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);                    << 
134   if(nModels > 0) {                               149   if(nModels > 0) {
135     G4int i;                                      150     G4int i;
136     G4double cross = 0.0;                         151     G4double cross = 0.0;
137     for(i=0; i<nModels; ++i) {                 << 152     G4double t1    = tmin;
138       cross += (model[i])->CrossSection(couple << 153     G4double t2    = tmin;
139                                         dp->Ge << 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);
140       cross_section[i] = cross;                   159       cross_section[i] = cross;
141     }                                             160     }
142                                                   161 
143     cross *= G4UniformRand();                     162     cross *= G4UniformRand();
                                                   >> 163     t2 = tmin;
144                                                   164 
145     for(i=0; i<nModels; ++i) {                 << 165     for(i=0; i<nModels; i++) {
                                                   >> 166       t1 = std::max(t2, tsecmin[i]);
                                                   >> 167       t2 = std::min(maxEnergy, tsecmin[i+1]);
146       if(cross <= cross_section[i]) {             168       if(cross <= cross_section[i]) {
147         (model[i])->SampleSecondaries(vdp, cou << 169         (model[i])->SampleSecondaries(vdp, couple, dp, t1, t2);
148         return;                                << 170         break;
                                                   >> 171       }
                                                   >> 172     }
                                                   >> 173   } 
                                                   >> 174 }
                                                   >> 175 
                                                   >> 176 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 177 
                                                   >> 178 G4double 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 
                                                   >> 189 void 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 
                                                   >> 198 void 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   }
149       }                                           239       }
                                                   >> 240       if(increment) nModels++;
150     }                                             241     }
151   }                                               242   } 
152 }                                                 243 }
153                                                   244 
154 //....oooOO0OOooo........oooOO0OOooo........oo    245 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
155                                                   246 
156                                                   247