Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/polarisation/src/G4PolarizationHelper.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 ]

  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:     G4PolarizationHelper
 29 //
 30 // Author:        Andreas Schaelicke
 31 //
 32 // Class Description:
 33 //   Provides some basic polarization transformation routines.
 34 
 35 #include "G4PolarizationHelper.hh"
 36 
 37 #include "G4PhysicalConstants.hh"
 38 #include "G4StokesVector.hh"
 39 #include "Randomize.hh"
 40 
 41 G4ThreeVector G4PolarizationHelper::GetFrame(const G4ThreeVector& mom1,
 42                                              const G4ThreeVector& mom2)
 43 {
 44   G4ThreeVector normal = (mom1.cross(mom2)).unit();
 45   return normal;
 46 }
 47 
 48 G4ThreeVector G4PolarizationHelper::GetParticleFrameY(const G4ThreeVector& uZ)
 49 {
 50   if(uZ.x() == 0. && uZ.y() == 0.)
 51   {
 52     return G4ThreeVector(0., 1., 0.);
 53   }
 54 
 55   G4double invPerp = 1. / std::sqrt(sqr(uZ.x()) + sqr(uZ.y()));
 56   return G4ThreeVector(-uZ.y() * invPerp, uZ.x() * invPerp, 0);
 57 }
 58 
 59 G4ThreeVector G4PolarizationHelper::GetParticleFrameX(const G4ThreeVector& uZ)
 60 {
 61   if(uZ.x() == 0. && uZ.y() == 0.)
 62   {
 63     if(uZ.z() >= 0.)
 64       return G4ThreeVector(1., 0., 0.);
 65     return G4ThreeVector(-1., 0., 0.);
 66   }
 67 
 68   G4double perp    = std::sqrt(sqr(uZ.x()) + sqr(uZ.y()));
 69   G4double invPerp = uZ.z() / perp;
 70   return G4ThreeVector(uZ.x() * invPerp, uZ.y() * invPerp, -perp);
 71 }
 72 
 73 G4ThreeVector G4PolarizationHelper::GetRandomFrame(const G4ThreeVector& mom1)
 74 {
 75   G4double phi = 2. * pi * G4UniformRand();
 76   G4ThreeVector normal =
 77     std::cos(phi) * GetParticleFrameX(mom1) +
 78     std::sin(phi) * G4PolarizationHelper::GetParticleFrameY(mom1);
 79   return normal;
 80 }
 81 
 82 G4ThreeVector G4PolarizationHelper::GetSpinInPRF(const G4ThreeVector& uZ,
 83                                                  const G4ThreeVector& spin)
 84 {
 85   if(uZ.x() == 0. && uZ.y() == 0.)
 86   {
 87     if(uZ.z() >= 0.)
 88       return spin;
 89     return G4ThreeVector(-spin.x(), spin.y(), -spin.z());
 90   }
 91 
 92   G4double perp    = std::sqrt(sqr(uZ.x()) + sqr(uZ.y()));
 93   G4double invPerp = 1. / perp;
 94 
 95   G4ThreeVector uX(uZ.x() * uZ.z() * invPerp, uZ.y() * uZ.z() * invPerp, -perp);
 96   G4ThreeVector uY(-uZ.y() * invPerp, uZ.x() * invPerp, 0);
 97 
 98   return G4ThreeVector(spin * uX, spin * uY, spin * uZ);
 99 }
100 
101 void G4PolarizationHelper::TestPolarizationTransformations()
102 {
103   G4double theta = 0.;
104   G4cout << "========================================\n\n";
105   for(G4int i = 0; i <= 10; ++i)
106   {
107     theta               = pi * i / 10.;
108     G4ThreeVector zAxis = G4ThreeVector(std::sin(theta), 0., std::cos(theta));
109     if(i == 5)
110       zAxis = G4ThreeVector(1., 0., 0.);
111     if(i == 10)
112       zAxis = G4ThreeVector(0., 0., -1.);
113     G4ThreeVector yAxis = GetParticleFrameY(zAxis);
114 
115     G4cout << zAxis << " " << zAxis.mag() << "\n";
116     G4cout << yAxis << " " << yAxis.mag() << "\n";
117     G4ThreeVector xAxis = yAxis.cross(zAxis);
118     G4cout << xAxis << " " << xAxis.mag() << "\n\n";
119   }
120 
121   G4cout << "========================================\n\n";
122 
123   for(G4int i = 0; i <= 10; ++i)
124   {
125     theta               = pi * i / 10.;
126     G4ThreeVector zAxis = G4ThreeVector(0., std::sin(theta), std::cos(theta));
127     if(i == 5)
128       zAxis = G4ThreeVector(0., 1., 0.);
129     if(i == 10)
130       zAxis = G4ThreeVector(0., 0., -1.);
131     G4ThreeVector yAxis = GetParticleFrameY(zAxis);
132 
133     G4cout << zAxis << " " << zAxis.mag() << "\n";
134     G4cout << yAxis << " " << yAxis.mag() << "\n";
135     G4ThreeVector xAxis = yAxis.cross(zAxis);
136     G4cout << xAxis << " " << xAxis.mag() << "\n\n";
137 
138     G4cout << "spat : " << xAxis * yAxis.cross(zAxis) << "\n\n";
139   }
140   G4cout << "========================================\n\n";
141 }
142 
143 void G4PolarizationHelper::TestInteractionFrame()
144 {
145   // check transformation procedure for polarisation transfer
146   // calculation in scattering processes
147   //  a) transfer target polarisation in beam particle reference frame (PRF)
148   //  b) calc correct asymmetry w.r.t. scattering plane
149   //  c) determine incoming polarisation in interaction frame (IF)
150   //  d) transfer outgoing polarisation from IF to PRF
151   G4cout << "========================================\n\n";
152 
153   G4double theta = 0.;
154 
155   G4ThreeVector dir0 = G4ThreeVector(0., 0., 1.);
156   G4ThreeVector dir2 = G4ThreeVector(std::sin(theta), 0., std::cos(theta));
157 
158   G4StokesVector pol0 = G4StokesVector::P3;
159   G4StokesVector pol1 = G4StokesVector::P3;
160 
161   pol1.rotateUz(dir0);
162 
163   G4cout << "========================================\n\n";
164 }
165