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.7)


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