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 ]

Diff markup

Differences between /processes/electromagnetic/polarisation/src/G4PolarizationHelper.cc (Version 11.3.0) and /processes/electromagnetic/polarisation/src/G4PolarizationHelper.cc (Version 10.2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 // Geant4 Class file                           <<  26 // $Id: G4PolarizationHelper.cc 68046 2013-03-13 14:31:38Z gcosmo $
                                                   >>  27 //
                                                   >>  28 // GEANT4 Class file
                                                   >>  29 //
 27 //                                                 30 //
 28 // File name:     G4PolarizationHelper             31 // File name:     G4PolarizationHelper
 29 //                                                 32 //
 30 // Author:        Andreas Schaelicke               33 // Author:        Andreas Schaelicke
 31 //                                                 34 //
                                                   >>  35 // Creation date: 12.08.2006
                                                   >>  36 //
                                                   >>  37 // Modifications:
                                                   >>  38 //
 32 // Class Description:                              39 // Class Description:
 33 //   Provides some basic polarization transfor <<  40 //
 34                                                <<  41 // Provides some basic polarization transformation routines.
                                                   >>  42 //
 35 #include "G4PolarizationHelper.hh"                 43 #include "G4PolarizationHelper.hh"
 36                                                << 
 37 #include "G4PhysicalConstants.hh"                  44 #include "G4PhysicalConstants.hh"
 38 #include "G4StokesVector.hh"                       45 #include "G4StokesVector.hh"
 39 #include "Randomize.hh"                        << 
 40                                                    46 
 41 G4ThreeVector G4PolarizationHelper::GetFrame(c <<  47 
 42                                              c <<  48 G4ThreeVector G4PolarizationHelper::GetFrame(const G4ThreeVector & mom1, const G4ThreeVector & mom2)
 43 {                                                  49 {
 44   G4ThreeVector normal = (mom1.cross(mom2)).un     50   G4ThreeVector normal = (mom1.cross(mom2)).unit();
 45   return normal;                                   51   return normal;
                                                   >>  52   //  return 1./normal.mag()*normal;
 46 }                                                  53 }
 47                                                    54 
 48 G4ThreeVector G4PolarizationHelper::GetParticl <<  55 G4ThreeVector G4PolarizationHelper::GetParticleFrameY(const G4ThreeVector &uZ)
 49 {                                                  56 {
 50   if(uZ.x() == 0. && uZ.y() == 0.)             <<  57   // compare also G4ThreeVector::rotateUz()
 51   {                                            <<  58 
 52     return G4ThreeVector(0., 1., 0.);          <<  59   if (uZ.x()==0. && uZ.y()==0.) {
                                                   >>  60     return G4ThreeVector(0.,1.,0.);
 53   }                                                61   }
 54                                                    62 
 55   G4double invPerp = 1. / std::sqrt(sqr(uZ.x() <<  63   G4double invPerp = 1./std::sqrt(sqr(uZ.x())+sqr(uZ.y()));
 56   return G4ThreeVector(-uZ.y() * invPerp, uZ.x <<  64   return G4ThreeVector(-uZ.y()*invPerp,uZ.x()*invPerp,0);
 57 }                                                  65 }
 58                                                    66 
 59 G4ThreeVector G4PolarizationHelper::GetParticl <<  67 G4ThreeVector G4PolarizationHelper::GetParticleFrameX(const G4ThreeVector &uZ)
 60 {                                                  68 {
 61   if(uZ.x() == 0. && uZ.y() == 0.)             <<  69   // compare also G4ThreeVector::rotateUz()
 62   {                                            <<  70 
 63     if(uZ.z() >= 0.)                           <<  71   if (uZ.x()==0. && uZ.y()==0.) {
 64       return G4ThreeVector(1., 0., 0.);        <<  72     if (uZ.z()>=0.) return G4ThreeVector(1.,0.,0.);
 65     return G4ThreeVector(-1., 0., 0.);         <<  73     return G4ThreeVector(-1.,0.,0.);
 66   }                                                74   }
 67                                                    75 
 68   G4double perp    = std::sqrt(sqr(uZ.x()) + s <<  76   G4double perp    = std::sqrt(sqr(uZ.x())+sqr(uZ.y()));
 69   G4double invPerp = uZ.z() / perp;            <<  77   G4double invPerp = uZ.z()/perp;
 70   return G4ThreeVector(uZ.x() * invPerp, uZ.y( <<  78   return G4ThreeVector(uZ.x()*invPerp,uZ.y()*invPerp,-perp);
 71 }                                                  79 }
 72                                                    80 
 73 G4ThreeVector G4PolarizationHelper::GetRandomF <<  81 G4ThreeVector G4PolarizationHelper::GetRandomFrame(const G4ThreeVector & mom1)
 74 {                                                  82 {
 75   G4double phi = 2. * pi * G4UniformRand();    <<  83   G4double phi     =2.*pi*G4UniformRand();
 76   G4ThreeVector normal =                       <<  84   G4ThreeVector normal = std::cos(phi)*GetParticleFrameX(mom1) 
 77     std::cos(phi) * GetParticleFrameX(mom1) +  <<  85     + std::sin(phi)*G4PolarizationHelper::GetParticleFrameY(mom1);
 78     std::sin(phi) * G4PolarizationHelper::GetP << 
 79   return normal;                                   86   return normal;
 80 }                                                  87 }
 81                                                    88 
 82 G4ThreeVector G4PolarizationHelper::GetSpinInP <<  89 
 83                                                <<  90 G4ThreeVector G4PolarizationHelper::GetSpinInPRF(const G4ThreeVector &uZ, const G4ThreeVector & spin)
 84 {                                                  91 {
 85   if(uZ.x() == 0. && uZ.y() == 0.)             <<  92   // compare also G4ThreeVector::rotateUz()
 86   {                                            << 
 87     if(uZ.z() >= 0.)                           << 
 88       return spin;                             << 
 89     return G4ThreeVector(-spin.x(), spin.y(),  << 
 90   }                                            << 
 91                                                    93 
 92   G4double perp    = std::sqrt(sqr(uZ.x()) + s <<  94   if (uZ.x()==0. && uZ.y()==0.) {
 93   G4double invPerp = 1. / perp;                <<  95     if (uZ.z()>=0.) return spin;
                                                   >>  96     return G4ThreeVector(-spin.x(),spin.y(),-spin.z());
                                                   >>  97   }
 94                                                    98 
 95   G4ThreeVector uX(uZ.x() * uZ.z() * invPerp,  <<  99   G4double perp    = std::sqrt(sqr(uZ.x())+sqr(uZ.y()));
 96   G4ThreeVector uY(-uZ.y() * invPerp, uZ.x() * << 100   G4double invPerp = 1./perp;
 97                                                   101 
 98   return G4ThreeVector(spin * uX, spin * uY, s << 102   G4ThreeVector uX(uZ.x()*uZ.z()*invPerp,uZ.y()*uZ.z()*invPerp,-perp);
                                                   >> 103   G4ThreeVector uY(-uZ.y()*invPerp,uZ.x()*invPerp,0); 
                                                   >> 104   
                                                   >> 105   return G4ThreeVector(spin*uX,spin*uY,spin*uZ);
 99 }                                                 106 }
100                                                   107 
101 void G4PolarizationHelper::TestPolarizationTra    108 void G4PolarizationHelper::TestPolarizationTransformations()
102 {                                                 109 {
103   G4double theta = 0.;                         << 110   G4double theta=0.;
104   G4cout << "================================= << 111   G4cout<<"========================================\n\n";
105   for(G4int i = 0; i <= 10; ++i)               << 112   for (G4int i=0; i<=10; ++i) {
106   {                                            << 113     theta=pi*i/10.;
107     theta               = pi * i / 10.;        << 114     G4ThreeVector zAxis = G4ThreeVector(std::sin(theta),0.,std::cos(theta));
108     G4ThreeVector zAxis = G4ThreeVector(std::s << 115     if (i==5) zAxis = G4ThreeVector(1.,0.,0.);
109     if(i == 5)                                 << 116     if (i==10) zAxis = G4ThreeVector(0.,0.,-1.);
110       zAxis = G4ThreeVector(1., 0., 0.);       << 
111     if(i == 10)                                << 
112       zAxis = G4ThreeVector(0., 0., -1.);      << 
113     G4ThreeVector yAxis = GetParticleFrameY(zA    117     G4ThreeVector yAxis = GetParticleFrameY(zAxis);
114                                                   118 
115     G4cout << zAxis << " " << zAxis.mag() << " << 119     G4cout<<zAxis<<" "<<zAxis.mag()<<"\n";
116     G4cout << yAxis << " " << yAxis.mag() << " << 120     G4cout<<yAxis<<" "<<yAxis.mag()<<"\n";
117     G4ThreeVector xAxis = yAxis.cross(zAxis);     121     G4ThreeVector xAxis = yAxis.cross(zAxis);
118     G4cout << xAxis << " " << xAxis.mag() << " << 122     G4cout<<xAxis<<" "<<xAxis.mag()<<"\n\n";
119   }                                               123   }
120                                                   124 
121   G4cout << "================================= << 125   G4cout<<"========================================\n\n";
122                                                   126 
123   for(G4int i = 0; i <= 10; ++i)               << 127   for (G4int i=0; i<=10; ++i) {
124   {                                            << 128     theta=pi*i/10.;
125     theta               = pi * i / 10.;        << 129     G4ThreeVector zAxis = G4ThreeVector(0.,std::sin(theta),std::cos(theta));
126     G4ThreeVector zAxis = G4ThreeVector(0., st << 130     if (i==5) zAxis = G4ThreeVector(0.,1.,0.);
127     if(i == 5)                                 << 131     if (i==10) zAxis = G4ThreeVector(0.,0.,-1.);
128       zAxis = G4ThreeVector(0., 1., 0.);       << 
129     if(i == 10)                                << 
130       zAxis = G4ThreeVector(0., 0., -1.);      << 
131     G4ThreeVector yAxis = GetParticleFrameY(zA    132     G4ThreeVector yAxis = GetParticleFrameY(zAxis);
132                                                   133 
133     G4cout << zAxis << " " << zAxis.mag() << " << 134     G4cout<<zAxis<<" "<<zAxis.mag()<<"\n";
134     G4cout << yAxis << " " << yAxis.mag() << " << 135     G4cout<<yAxis<<" "<<yAxis.mag()<<"\n";
135     G4ThreeVector xAxis = yAxis.cross(zAxis);     136     G4ThreeVector xAxis = yAxis.cross(zAxis);
136     G4cout << xAxis << " " << xAxis.mag() << " << 137     G4cout<<xAxis<<" "<<xAxis.mag()<<"\n\n";
137                                                   138 
138     G4cout << "spat : " << xAxis * yAxis.cross << 139     G4cout<<"spat : "<<xAxis*yAxis.cross(zAxis)<<"\n\n";
139   }                                               140   }
140   G4cout << "================================= << 141   G4cout<<"========================================\n\n";
141 }                                                 142 }
142                                                   143 
143 void G4PolarizationHelper::TestInteractionFram    144 void G4PolarizationHelper::TestInteractionFrame()
144 {                                                 145 {
145   // check transformation procedure for polari << 146   // check transformation procedure for polarisation transfer 
146   // calculation in scattering processes          147   // calculation in scattering processes
147   //  a) transfer target polarisation in beam     148   //  a) transfer target polarisation in beam particle reference frame (PRF)
148   //  b) calc correct asymmetry w.r.t. scatter    149   //  b) calc correct asymmetry w.r.t. scattering plane
149   //  c) determine incoming polarisation in in << 150   //  c) determine incomming polarisation in interaction frame (IF)
150   //  d) transfer outgoing polarisation from I    151   //  d) transfer outgoing polarisation from IF to PRF
151   G4cout << "================================= << 152   G4cout<<"========================================\n\n";
152                                                << 
153   G4double theta = 0.;                         << 
154                                                   153 
155   G4ThreeVector dir0 = G4ThreeVector(0., 0., 1 << 154   G4double theta=0.;
156   G4ThreeVector dir2 = G4ThreeVector(std::sin( << 
157                                                   155 
158   G4StokesVector pol0 = G4StokesVector::P3;    << 156   G4ThreeVector dir0=G4ThreeVector(0.,0.,1.);
159   G4StokesVector pol1 = G4StokesVector::P3;    << 157   G4ThreeVector dir2=G4ThreeVector(std::sin(theta),0.,std::cos(theta));
                                                   >> 158   
                                                   >> 159   G4StokesVector pol0=G4ThreeVector(0.,0.,1.);
                                                   >> 160   G4StokesVector pol1=G4ThreeVector(0.,0.,1.); 
160                                                   161 
161   pol1.rotateUz(dir0);                            162   pol1.rotateUz(dir0);
162                                                   163 
163   G4cout << "================================= << 164   G4cout<<"========================================\n\n";
                                                   >> 165 
                                                   >> 166 
164 }                                                 167 }
165                                                   168