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


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