Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 ////////////////////////////////////////////// 28 // 29 // File G4OpMieHG.hh 30 // Description: Discrete Process -- Mie Scatte 31 // Created: 2010-07-03 32 // Author: Xin Qian 33 // Based on work from Vlasios Vasileiou 34 // 35 // This subroutine will mimic the Mie scatteri 36 // Henyey-Greenstein phase function 37 // Forward and backward angles are treated sep 38 // 39 ////////////////////////////////////////////// 40 41 #include "G4OpMieHG.hh" 42 #include "G4PhysicalConstants.hh" 43 #include "G4OpticalParameters.hh" 44 #include "G4OpProcessSubType.hh" 45 46 //....oooOO0OOooo........oooOO0OOooo........oo 47 G4OpMieHG::G4OpMieHG(const G4String& processNa 48 : G4VDiscreteProcess(processName, type) 49 { 50 Initialise(); 51 if(verboseLevel > 0) 52 { 53 G4cout << GetProcessName() << " is created 54 } 55 SetProcessSubType(fOpMieHG); 56 } 57 58 //....oooOO0OOooo........oooOO0OOooo........oo 59 G4OpMieHG::~G4OpMieHG() = default; 60 61 //....oooOO0OOooo........oooOO0OOooo........oo 62 void G4OpMieHG::PreparePhysicsTable(const G4Pa 63 { 64 Initialise(); 65 } 66 67 //....oooOO0OOooo........oooOO0OOooo........oo 68 void G4OpMieHG::Initialise() 69 { 70 SetVerboseLevel(G4OpticalParameters::Instanc 71 } 72 73 //....oooOO0OOooo........oooOO0OOooo........oo 74 G4VParticleChange* G4OpMieHG::PostStepDoIt(con 75 con 76 { 77 aParticleChange.Initialize(aTrack); 78 79 const G4DynamicParticle* aParticle = aTrack. 80 const G4MaterialPropertiesTable* MPT = 81 aTrack.GetMaterial()->GetMaterialPropertie 82 83 G4double forwardRatio = MPT->GetConstPropert 84 85 if(verboseLevel > 1) 86 { 87 G4cout << "OpMie Scattering Photon!" << G4 88 << " Old Momentum Direction: " << a 89 << G4endl 90 << " MIE Old Polarization: " << aPa 91 << G4endl; 92 } 93 94 G4double gg; 95 G4int direction; 96 if(G4UniformRand() <= forwardRatio) 97 { 98 gg = MPT->GetConstProperty(kMIEHG_F 99 direction = 1; 100 } 101 else 102 { 103 gg = MPT->GetConstProperty(kMIEHG_B 104 direction = -1; 105 } 106 107 G4double r = G4UniformRand(); 108 109 // sample the direction 110 G4double theta; 111 if(gg != 0.) 112 { 113 theta = std::acos(2. * r * (1. + gg) * (1. 114 ((1. - gg + 2. * gg * 115 1.); 116 } 117 else 118 { 119 theta = std::acos(2. * r - 1.); 120 } 121 G4double phi = G4UniformRand() * twopi; 122 123 if(direction == -1) 124 theta = pi - theta; // backward scatterin 125 126 G4ThreeVector newMomDir, oldMomDir; 127 G4ThreeVector newPol, oldPol; 128 129 G4double sinth = std::sin(theta); 130 newMomDir.set(sinth * std::cos(phi), sinth * 131 oldMomDir = aParticle->GetMomentumDirection( 132 newMomDir.rotateUz(oldMomDir); 133 newMomDir = newMomDir.unit(); 134 135 oldPol = aParticle->GetPolarization(); 136 newPol = newMomDir - oldPol / newMomDir.dot( 137 newPol = newPol.unit(); 138 139 if(newPol.mag() == 0.) 140 { 141 r = G4UniformRand() * twopi; 142 newPol.set(std::cos(r), std::sin(r), 0.); 143 newPol.rotateUz(newMomDir); 144 } 145 else 146 { 147 // There are two directions perpendicular 148 if(G4UniformRand() < 0.5) 149 newPol = -newPol; 150 } 151 152 aParticleChange.ProposePolarization(newPol); 153 aParticleChange.ProposeMomentumDirection(new 154 155 if(verboseLevel > 1) 156 { 157 G4cout << "OpMie New Polarization: " << ne 158 << " Polarization Change: " << *(aP 159 << G4endl << " New Momentum Directi 160 << " Momentum Change: " << *(aParti 161 << G4endl; 162 } 163 164 return G4VDiscreteProcess::PostStepDoIt(aTra 165 } 166 167 //....oooOO0OOooo........oooOO0OOooo........oo 168 G4double G4OpMieHG::GetMeanFreePath(const G4Tr 169 G4ForceCon 170 { 171 G4double attLength = DBL_MAX; 172 G4MaterialPropertiesTable* MPT = 173 aTrack.GetMaterial()->GetMaterialPropertie 174 if(MPT) 175 { 176 G4MaterialPropertyVector* attVector = MPT- 177 if(attVector) 178 { 179 attLength = attVector->Value( 180 aTrack.GetDynamicParticle()->GetTotalE 181 } 182 } 183 return attLength; 184 } 185 186 //....oooOO0OOooo........oooOO0OOooo........oo 187 void G4OpMieHG::SetVerboseLevel(G4int verbose) 188 { 189 verboseLevel = verbose; 190 G4OpticalParameters::Instance()->SetMieVerbo 191 } 192