ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4WentzelVIRelModel.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4WentzelVIRelModel.cc
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 //
27 // -------------------------------------------------------------------
28 //
29 // GEANT4 Class file
30 //
31 //
32 // File name: G4WentzelVIRelModel
33 //
34 // Author: V.Ivanchenko
35 //
36 // Creation date: 08.06.2012 from G4WentzelVIRelModel
37 //
38 // Modifications:
39 //
40 // Class Description:
41 //
42 // Implementation of the model of multiple scattering based on
43 // G.Wentzel, Z. Phys. 40 (1927) 590.
44 // H.W.Lewis, Phys Rev 78 (1950) 526.
45 // J.M. Fernandez-Varea et al., NIM B73 (1993) 447.
46 // L.Urban, CERN-OPEN-2006-077.
47 
48 // -------------------------------------------------------------------
49 //
50 
51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
53 
54 #include "G4WentzelVIRelModel.hh"
57 #include "G4PhysicalConstants.hh"
58 #include "G4SystemOfUnits.hh"
59 #include "G4Material.hh"
60 #include "G4ElementVector.hh"
61 #include "G4ProductionCutsTable.hh"
62 #include "G4NistManager.hh"
63 #include "G4EmParameters.hh"
64 
65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
66 
67 std::vector<G4double> G4WentzelVIRelModel::effMass;
68 
69 #ifdef G4MULTITHREADED
70 G4Mutex G4WentzelVIRelModel::WentzelVIRelModelMutex;
71 #endif
72 
74  G4WentzelVIModel(true, "WentzelVIRel")
75 {
78  SetWVICrossSection(static_cast<G4WentzelOKandVIxSection*>(ptr));
79 }
80 
81 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
82 
84 {
85 }
86 
87 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
88 
90  const G4DataVector& cuts)
91 {
92  // Access to materials
93  const G4ProductionCutsTable* theCoupleTable =
95  if(theCoupleTable->GetTableSize() != effMass.size()) {
97  }
98 
100 }
101 
102 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
103 
105 {
106  if(cup != currentCouple) {
107  currentCouple = cup;
108  SetCurrentCouple(cup);
109  currentMaterial = cup->GetMaterial();
112  }
113 }
114 
115 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
116 
118  const G4ParticleDefinition* p,
119  G4double kinEnergy,
121  G4double cutEnergy, G4double)
122 {
123  G4double cross = 0.0;
124  if(p != particle) { SetupParticle(p); }
125  if(kinEnergy < lowEnergyLimit) { return cross; }
126  if(!CurrentCouple()) {
127  G4Exception("G4WentzelVIRelModel::ComputeCrossSectionPerAtom", "em0011",
128  FatalException, " G4MaterialCutsCouple is not defined");
129  return cross;
130  }
132  G4int iz = G4lrint(Z);
133  G4double tmass = (1 == iz) ? CLHEP::proton_mass_c2
135  wokvi->SetTargetMass(tmass);
137  if(cosTetMaxNuc < 1.0) {
138  G4double cost = wokvi->SetupTarget(iz, cutEnergy);
140  /*
141  //if(p->GetParticleName() == "e-")
142  G4cout << "G4WentzelVIRelModel::CS: Z= " << G4int(Z)
143  << " e(MeV)= " << kinEnergy
144  << " 1-cosN= " << 1 - cosTetMaxNuc << " cross(bn)= " << cross/barn
145  << " " << particle->GetParticleName() << G4endl;
146  */
147  }
148  return cross;
149 }
150 
151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
152 
154 {
155 #ifdef G4MULTITHREADED
156  G4MUTEXLOCK(&G4WentzelVIRelModel::WentzelVIRelModelMutex);
157 #endif
158  const G4ProductionCutsTable* theCoupleTable =
160  size_t ncouples = theCoupleTable->GetTableSize();
161  if(ncouples != effMass.size()) {
162  effMass.resize(ncouples, 0.0);
163  for(size_t i=0; i<ncouples; ++i) {
164  const G4Material* mat =
165  theCoupleTable->GetMaterialCutsCouple(i)->GetMaterial();
166  const G4ElementVector* elmVector = mat->GetElementVector();
167  G4int nelm = mat->GetNumberOfElements();
168  G4double sum = 0.0;
169  G4double norm= 0.0;
170  for(G4int j=0; j<nelm; ++j) {
171  G4int Z = (*elmVector)[j]->GetZasInt();
173  G4int Z2 = Z*Z;
174  sum += mass*Z2;
175  norm += Z2;
176  }
177  effMass[i] = sum/norm;
178  }
179  }
180 #ifdef G4MULTITHREADED
181  G4MUTEXUNLOCK(&G4WentzelVIRelModel::WentzelVIRelModelMutex);
182 #endif
183 }
184 
185 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......