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
G4ErrorSurfaceTrajState.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//
27// ------------------------------------------------------------
28// GEANT 4 class implementation file
29// ------------------------------------------------------------
30//
31
34
36#include "G4SystemOfUnits.hh"
37#include "G4Field.hh"
38#include "G4FieldManager.hh"
40
41#include "G4ErrorMatrix.hh"
42
43#include <iomanip>
44
45//------------------------------------------------------------------------
47 const G4String& partType, const G4Point3D& pos, const G4Vector3D& mom,
48 const G4Vector3D& vecU, const G4Vector3D& vecV, const G4ErrorTrajErr& errmat)
49 : G4ErrorTrajState(partType, pos, mom, errmat)
50{
51 Init();
52 fTrajParam = G4ErrorSurfaceTrajParam(pos, mom, vecU, vecV);
53}
54
55//------------------------------------------------------------------------
57 const G4Point3D& pos,
58 const G4Vector3D& mom,
59 const G4Plane3D& plane,
60 const G4ErrorTrajErr& errmat)
61 : G4ErrorTrajState(partType, pos, mom, errmat)
62{
63 Init();
64 fTrajParam = G4ErrorSurfaceTrajParam(pos, mom, plane);
65}
66
67//------------------------------------------------------------------------
69 const G4Plane3D& plane)
70 : G4ErrorTrajState(tpSC.GetParticleType(), tpSC.GetPosition(),
71 tpSC.GetMomentum())
72{
73 // fParticleType = tpSC.GetParticleType();
74 // fPosition = tpSC.GetPosition();
75 // fMomentum = tpSC.GetMomentum();
76 fTrajParam = G4ErrorSurfaceTrajParam(fPosition, fMomentum, plane);
77 Init();
78
79 //----- Get the error matrix in SC coordinates
81}
82
83//------------------------------------------------------------------------
85 const G4Vector3D& vecU,
86 const G4Vector3D& vecV,
87 G4ErrorMatrix& transfM)
88 : G4ErrorTrajState(tpSC.GetParticleType(), tpSC.GetPosition(),
89 tpSC.GetMomentum())
90{
91 Init(); // needed to define charge sign
92 fTrajParam = G4ErrorSurfaceTrajParam(fPosition, fMomentum, vecU, vecV);
93 //----- Get the error matrix in SC coordinates
94 transfM = BuildErrorMatrix(tpSC, vecU, vecV);
95}
96
97//------------------------------------------------------------------------
99 G4ErrorFreeTrajState& tpSC, const G4Vector3D&, const G4Vector3D&)
100{
101 G4double sclambda = tpSC.GetParameters().GetLambda();
102 G4double scphi = tpSC.GetParameters().GetPhi();
105 {
106 sclambda *= -1;
107 scphi += CLHEP::pi;
108 }
109 G4double cosLambda = std::cos(sclambda);
110 G4double sinLambda = std::sin(sclambda);
111 G4double sinPhi = std::sin(scphi);
112 G4double cosPhi = std::cos(scphi);
113
114#ifdef G4EVERBOSE
115 if(iverbose >= 4)
116 G4cout << " PM " << fMomentum.mag() << " pLambda " << sclambda << " pPhi "
117 << scphi << G4endl;
118#endif
119
120 G4ThreeVector vTN(cosLambda * cosPhi, cosLambda * sinPhi, sinLambda);
121 G4ThreeVector vUN(-sinPhi, cosPhi, 0.);
122 G4ThreeVector vVN(-vTN.z() * vUN.y(), vTN.z() * vUN.x(), cosLambda);
123
124#ifdef G4EVERBOSE
125 if(iverbose >= 4)
126 G4cout << " SC2SD: vTN " << vTN << " vUN " << vUN << " vVN " << vVN
127 << G4endl;
128#endif
129 G4double UJ = vUN * GetVectorV();
130 G4double UK = vUN * GetVectorW();
131 G4double VJ = vVN * GetVectorV();
132 G4double VK = vVN * GetVectorW();
133
134 //--- Get transformation first
135 G4ErrorMatrix transfM(5, 5, 0);
136 //--- Get magnetic field
140
141 G4Vector3D vectorU = GetVectorV().cross(GetVectorW());
142 G4double T1R = 1. / (vTN * vectorU);
143
144#ifdef G4EVERBOSE
145 if(iverbose >= 4)
146 G4cout << "surf vectors:U,V,W " << vectorU << " " << GetVectorV() << " "
147 << GetVectorW() << " T1R:" << T1R << G4endl;
148#endif
149
150 if(fCharge != 0 && field)
151 {
152 G4double pos[3];
153 pos[0] = fPosition.x() * cm;
154 pos[1] = fPosition.y() * cm;
155 pos[2] = fPosition.z() * cm;
156 G4double Hd[3];
157 field->GetFieldValue(pos, Hd);
158 G4ThreeVector H =
159 G4ThreeVector(Hd[0], Hd[1], Hd[2]) / tesla * 10.; // in kilogauus
160 G4double magH = H.mag();
161 G4double invP = 1. / (fMomentum.mag() / GeV);
162 G4double magHM = magH * invP;
163 if(magH != 0.)
164 {
165 G4double magHM2 = fCharge / magH;
166 G4double Q = -magHM * c_light / (km / ns);
167#ifdef G4EVERBOSE
168 if(iverbose >= 4)
169 G4cout << GeV << " Q " << Q << " magHM " << magHM << " c_light/(km/ns) "
170 << c_light / (km / ns) << G4endl;
171#endif
172
173 G4double sinz = -H * vUN * magHM2;
174 G4double cosz = H * vVN * magHM2;
175 G4double T3R = Q * std::pow(T1R, 3);
176 G4double UI = vUN * vectorU;
177 G4double VI = vVN * vectorU;
178#ifdef G4EVERBOSE
179 if(iverbose >= 4)
180 {
181 G4cout << " T1R " << T1R << " T3R " << T3R << G4endl;
182 G4cout << " UI " << UI << " VI " << VI << " vectorU " << vectorU
183 << G4endl;
184 G4cout << " UJ " << UJ << " VJ " << VJ << G4endl;
185 G4cout << " UK " << UK << " VK " << VK << G4endl;
186 }
187#endif
188
189 transfM[1][3] = -UI * (VK * cosz - UK * sinz) * T3R;
190 transfM[1][4] = -VI * (VK * cosz - UK * sinz) * T3R;
191 transfM[2][3] = UI * (VJ * cosz - UJ * sinz) * T3R;
192 transfM[2][4] = VI * (VJ * cosz - UJ * sinz) * T3R;
193 }
194 }
195
196 G4double T2R = T1R * T1R;
197 transfM[0][0] = 1.;
198 transfM[1][1] = -UK * T2R;
199 transfM[1][2] = VK * cosLambda * T2R;
200 transfM[2][1] = UJ * T2R;
201 transfM[2][2] = -VJ * cosLambda * T2R;
202 transfM[3][3] = VK * T1R;
203 transfM[3][4] = -UK * T1R;
204 transfM[4][3] = -VJ * T1R;
205 transfM[4][4] = UJ * T1R;
206
207#ifdef G4EVERBOSE
208 if(iverbose >= 4)
209 G4cout << " SC2SD transf matrix A= " << transfM << G4endl;
210#endif
211 fError = G4ErrorTrajErr(tpSC.GetError().similarity(transfM));
212
213#ifdef G4EVERBOSE
214 if(iverbose >= 1)
215 G4cout << "G4EP: error matrix SC2SD " << fError << G4endl;
216 if(iverbose >= 4)
217 G4cout << "G4ErrorSurfaceTrajState from SC " << *this << G4endl;
218#endif
219
220 return transfM; // want to use trasnfM for the reverse transform
221}
222
223//------------------------------------------------------------------------
224void G4ErrorSurfaceTrajState::Init()
225{
227 BuildCharge();
228}
229
230//------------------------------------------------------------------------
231void G4ErrorSurfaceTrajState::Dump(std::ostream& out) const { out << *this; }
232
233//------------------------------------------------------------------------
234std::ostream& operator<<(std::ostream& out, const G4ErrorSurfaceTrajState& ts)
235{
236 std::ios::fmtflags oldFlags = out.flags();
237 out.setf(std::ios::fixed, std::ios::floatfield);
238
239 ts.DumpPosMomError(out);
240
241 out << " G4ErrorSurfaceTrajState: Params: " << ts.fTrajParam << G4endl;
242 out.flags(oldFlags);
243 return out;
244}
@ G4ErrorMode_PropBackwards
std::ostream & operator<<(std::ostream &out, const G4ErrorSurfaceTrajState &ts)
G4ErrorSymMatrix G4ErrorTrajErr
@ G4eTS_OS
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
double z() const
double x() const
double y() const
double mag() const
G4double GetLambda() const
G4ErrorFreeTrajParam GetParameters() const
static G4ErrorPropagatorData * GetErrorPropagatorData()
G4ErrorMatrix BuildErrorMatrix(G4ErrorFreeTrajState &tpSC, const G4Vector3D &vecV, const G4Vector3D &vecW)
virtual void Dump(std::ostream &out=G4cout) const
G4ErrorSurfaceTrajState(const G4String &partType, const G4Point3D &pos, const G4Vector3D &mom, const G4Plane3D &plane, const G4ErrorTrajErr &errmat=G4ErrorTrajErr(5, 0))
G4ErrorSymMatrix similarity(const G4ErrorMatrix &m1) const
void DumpPosMomError(std::ostream &out=G4cout) const
G4ErrorTrajErr fError
G4ErrorTrajErr GetError() const
const G4Field * GetDetectorField() const
virtual void GetFieldValue(const G4double Point[4], G4double *fieldArr) const =0
static G4TransportationManager * GetTransportationManager()
G4FieldManager * GetFieldManager() const
BasicVector3D< T > cross(const BasicVector3D< T > &v) const
#define ns(x)
Definition: xmltok.c:1649