Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4PolarizationHelper.cc
Go to the documentation of this file.
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
36
38#include "G4StokesVector.hh"
39#include "Randomize.hh"
40
42 const G4ThreeVector& mom2)
43{
44 G4ThreeVector normal = (mom1.cross(mom2)).unit();
45 return normal;
46}
47
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
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
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
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
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
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
160
161 pol1.rotateUz(dir0);
162
163 G4cout << "========================================\n\n";
164}
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
double z() const
double x() const
double y() const
Hep3Vector cross(const Hep3Vector &) const
double mag() const
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:33
static G4ThreeVector GetSpinInPRF(const G4ThreeVector &uZ, const G4ThreeVector &spin)
static void TestPolarizationTransformations()
static void TestInteractionFrame()
static G4ThreeVector GetParticleFrameY(const G4ThreeVector &)
static G4ThreeVector GetFrame(const G4ThreeVector &, const G4ThreeVector &)
static G4ThreeVector GetParticleFrameX(const G4ThreeVector &)
static G4ThreeVector GetRandomFrame(const G4ThreeVector &)
static const G4StokesVector P3
T sqr(const T &x)
Definition: templates.hh:128