Geant4 Cross Reference |
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 // Geant4 Class file 27 // 28 // File name: G4StokesVector 29 // 30 // Author: Andreas Schaelicke 31 // 32 // Class Description: 33 // Provides Stokes vector representation employed in polarized processes. 34 35 #include "G4StokesVector.hh" 36 37 #include "G4PolarizationHelper.hh" 38 #include "Randomize.hh" 39 40 const G4StokesVector G4StokesVector::ZERO = 41 G4StokesVector(G4ThreeVector(0., 0., 0.)); 42 const G4StokesVector G4StokesVector::P1 = 43 G4StokesVector(G4ThreeVector(1., 0., 0.)); 44 const G4StokesVector G4StokesVector::P2 = 45 G4StokesVector(G4ThreeVector(0., 1., 0.)); 46 const G4StokesVector G4StokesVector::P3 = 47 G4StokesVector(G4ThreeVector(0., 0., 1.)); 48 const G4StokesVector G4StokesVector::M1 = 49 G4StokesVector(G4ThreeVector(-1., 0., 0.)); 50 const G4StokesVector G4StokesVector::M2 = 51 G4StokesVector(G4ThreeVector(0., -1., 0.)); 52 const G4StokesVector G4StokesVector::M3 = 53 G4StokesVector(G4ThreeVector(0., 0., -1.)); 54 55 G4StokesVector::G4StokesVector() 56 : G4ThreeVector() 57 , fIsPhoton(false) 58 {} 59 60 G4StokesVector::G4StokesVector(const G4ThreeVector& v) 61 : G4ThreeVector(v) 62 , fIsPhoton(false) 63 {} 64 65 G4bool G4StokesVector::IsZero() const { return *this == ZERO; } 66 67 void G4StokesVector::RotateAz(G4ThreeVector nInteractionFrame, 68 G4ThreeVector particleDirection) 69 { 70 G4ThreeVector yParticleFrame = 71 G4PolarizationHelper::GetParticleFrameY(particleDirection); 72 73 G4double cosphi = yParticleFrame * nInteractionFrame; 74 if(cosphi > (1. + 1.e-8) || cosphi < (-1. - 1.e-8)) 75 { 76 G4ExceptionDescription ed; 77 ed << " warning G4StokesVector::RotateAz cosphi>1 or cosphi<-1\n" 78 << " cosphi=" << cosphi << "\n" 79 << " zAxis=" << particleDirection << " (" << particleDirection.mag() 80 << ")\n" 81 << " yAxis=" << yParticleFrame << " (" << yParticleFrame.mag() << ")\n" 82 << " nAxis=" << nInteractionFrame << " (" << nInteractionFrame.mag() 83 << ")\n"; 84 G4Exception("G4StokesVector::RotateAz", "pol030", JustWarning, ed); 85 } 86 if(cosphi > 1.) 87 cosphi = 1.; 88 else if(cosphi < -1.) 89 cosphi = -1.; 90 91 G4double hel = 92 (yParticleFrame.cross(nInteractionFrame) * particleDirection) > 0. ? 1. 93 : -1.; 94 95 G4double sinphi = hel * std::sqrt(1. - cosphi * cosphi); 96 97 RotateAz(cosphi, sinphi); 98 } 99 100 void G4StokesVector::InvRotateAz(G4ThreeVector nInteractionFrame, 101 G4ThreeVector particleDirection) 102 { 103 // note if incoming particle is on z-axis, 104 // we might encounter some nummerical problems, since 105 // nInteratonFrame and yParticleFrame are actually (almost) the same momentum 106 // and the normalization is only good to 10^-12 ! 107 108 G4ThreeVector yParticleFrame = 109 G4PolarizationHelper::GetParticleFrameY(particleDirection); 110 G4double cosphi = yParticleFrame * nInteractionFrame; 111 112 if(cosphi > 1. + 1.e-8 || cosphi < -1. - 1.e-8) 113 { 114 G4ExceptionDescription ed; 115 ed << " warning G4StokesVector::RotateAz cosphi>1 or cosphi<-1\n"; 116 G4Exception("G4StokesVector::InvRotateAz", "pol030", JustWarning, ed); 117 } 118 if(cosphi > 1.) 119 cosphi = 1.; 120 else if(cosphi < -1.) 121 cosphi = -1.; 122 123 // check sign once more! 124 G4double hel = 125 (yParticleFrame.cross(nInteractionFrame) * particleDirection) > 0. ? 1. 126 : -1.; 127 G4double sinphi = hel * std::sqrt(std::fabs(1. - cosphi * cosphi)); 128 RotateAz(cosphi, -sinphi); 129 } 130 131 void G4StokesVector::RotateAz(G4double cosphi, G4double sinphi) 132 { 133 if(!fIsPhoton) 134 { 135 G4double xsi1 = cosphi * p1() + sinphi * p2(); 136 G4double xsi2 = -sinphi * p1() + cosphi * p2(); 137 setX(xsi1); 138 setY(xsi2); 139 return; 140 } 141 142 G4double sin2phi = 2. * cosphi * sinphi; 143 G4double cos2phi = cosphi * cosphi - sinphi * sinphi; 144 145 G4double xsi1 = cos2phi * p1() + sin2phi * p2(); 146 G4double xsi2 = -sin2phi * p1() + cos2phi * p2(); 147 setX(xsi1); 148 setY(xsi2); 149 } 150 151 G4double G4StokesVector::GetBeta() 152 { 153 G4double bet = getPhi(); 154 if(fIsPhoton) 155 { 156 bet *= 0.5; 157 } 158 return bet; 159 } 160 161 void G4StokesVector::DiceUniform() 162 { 163 G4double costheta = 2. * G4UniformRand() - 1.; 164 G4double sintheta = std::sqrt(1. - costheta * costheta); 165 G4double aphi = 2. * CLHEP::pi * G4UniformRand(); 166 setX(std::sin(aphi) * sintheta); 167 setY(std::cos(aphi) * sintheta); 168 setZ(costheta); 169 } 170 171 void G4StokesVector::DiceP1() 172 { 173 if(G4UniformRand() > 0.5) 174 setX(1.); 175 else 176 setX(-1.); 177 setY(0.); 178 setZ(0.); 179 } 180 181 void G4StokesVector::DiceP2() 182 { 183 setX(0.); 184 if(G4UniformRand() > 0.5) 185 setY(1.); 186 else 187 setY(-1.); 188 setZ(0.); 189 } 190 191 void G4StokesVector::DiceP3() 192 { 193 setX(0.); 194 setY(0.); 195 if(G4UniformRand() > 0.5) 196 setZ(1.); 197 else 198 setZ(-1.); 199 } 200 201 void G4StokesVector::FlipP3() { setZ(-z()); } 202 203 G4ThreeVector G4StokesVector::PolError(const G4StokesVector& sum2, long n) 204 { 205 // delta x = sqrt[ ( <x^2> - <x>^2 )/(n-1) ] 206 G4ThreeVector mean = (1. / n) * G4ThreeVector(*this); 207 G4ThreeVector polsqr = G4StokesVector(mean).PolSqr(); 208 G4ThreeVector result = 209 G4StokesVector((1. / (n - 1.) * ((1. / n) * sum2 - polsqr))).PolSqrt(); 210 return result; 211 } 212 213 G4ThreeVector G4StokesVector::PolDiv(const G4StokesVector& b) 214 { 215 return G4ThreeVector(b.x() != 0. ? x() / b.x() : 11111., 216 b.y() != 0. ? y() / b.y() : 11111., 217 b.z() != 0. ? z() / b.z() : 11111.); 218 } 219