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
G4tgbRotationMatrix.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// G4tgbRotationMatrix implementation
27//
28// Author: P.Arce, CIEMAT (November 2007)
29// --------------------------------------------------------------------
30
32#include "G4RotationMatrix.hh"
33#include "G4tgrMessenger.hh"
34#include "G4tgrUtils.hh"
35#include "G4UIcommand.hh"
36
37// --------------------------------------------------------------------
39{
40}
41
42// --------------------------------------------------------------------
44{
45}
46
47// --------------------------------------------------------------------
49 : theTgrRM(tgr)
50{
51}
52
53// -------------------------------------------------------------------------
55{
56 std::vector<G4double> values = theTgrRM->GetValues();
57
58 if(values.size() == 3)
59 {
60 return BuildG4RotMatrixFrom3(values);
61 }
62 else if(values.size() == 6)
63 {
64 return BuildG4RotMatrixFrom6(values);
65 }
66 else if(values.size() == 9)
67 {
68 return BuildG4RotMatrixFrom9(values);
69 }
70 else
71 {
72 G4String ErrMessage = "Number of values is: " +
73 G4UIcommand::ConvertToString(G4int(values.size())) +
74 G4String(". It should be 3, 6, or 9 !");
75 G4Exception("G4tgbRotationMatrix::BuildG4RotMatrix()", "InvalidData",
76 FatalException, ErrMessage);
77 }
78 return nullptr;
79}
80
81// --------------------------------------------------------------------
83G4tgbRotationMatrix::BuildG4RotMatrixFrom3(std::vector<G4double>& values)
84{
85 G4RotationMatrix* rotMat = new G4RotationMatrix();
86
87 rotMat->rotateX(values[0]);
88 rotMat->rotateY(values[1]);
89 rotMat->rotateZ(values[2]);
90
91#ifdef G4VERBOSE
93 {
94 G4cout << " Constructing new G4RotationMatrix from 3 numbers " << GetName()
95 << " : " << *rotMat << G4endl;
96 }
97#endif
98
99 return rotMat;
100}
101
102// --------------------------------------------------------------------
104G4tgbRotationMatrix::BuildG4RotMatrixFrom6(std::vector<G4double>& values)
105{
106 G4double thetaX = values[0];
107 G4double phiX = values[1];
108 G4double thetaY = values[2];
109 G4double phiY = values[3];
110 G4double thetaZ = values[4];
111 G4double phiZ = values[5];
112
113 // build the 3 axis from the values
114 G4ThreeVector colx(std::sin(thetaX) * std::cos(phiX),
115 std::sin(thetaX) * std::sin(phiX), std::cos(thetaX));
116 G4ThreeVector coly(std::sin(thetaY) * std::cos(phiY),
117 std::sin(thetaY) * std::sin(phiY), std::cos(thetaY));
118 G4ThreeVector colz(std::sin(thetaZ) * std::cos(phiZ),
119 std::sin(thetaZ) * std::sin(phiZ), std::cos(thetaZ));
120
121 // Now create a G4RotationMatrix (HepRotation), which can be left handed.
122 // This is not foreseen in CLHEP, but can be achieved using the
123 // constructor which does not check its input arguments!
124
125 G4Rep3x3 rottemp(colx.x(), coly.x(), colz.x(), // matrix representation
126 colx.y(), coly.y(), colz.y(), // (inverted)
127 colx.z(), coly.z(), colz.z());
128
129 G4RotationMatrix* rotMat = new G4RotationMatrix(rottemp);
130
131#ifdef G4VERBOSE
133 {
134 G4cout << " Constructing new G4RotationMatrix from 6 numbers " << GetName()
135 << " : " << *rotMat << G4endl;
136 }
137#endif
138
139 return rotMat;
140}
141
142// --------------------------------------------------------------------
144G4tgbRotationMatrix::BuildG4RotMatrixFrom9(std::vector<G4double>& values)
145{
146 // build the 3 axis from the values
147 G4ThreeVector colx(values[0], values[1], values[2]);
148 G4ThreeVector coly(values[3], values[4], values[5]);
149 G4ThreeVector colz(values[6], values[7], values[8]);
150
151 // Now create a G4RotationMatrix (HepRotation), which can be left handed.
152 // This is not foreseen in CLHEP, but can be achieved using the
153 // constructor which does not check its input arguments!
154
155 G4Rep3x3 rottemp(colx.x(), coly.x(), colz.x(), // matrix representation
156 colx.y(), coly.y(), colz.y(), // (inverted)
157 colx.z(), coly.z(), colz.z());
158
159 G4RotationMatrix* rotMat = new G4RotationMatrix(rottemp);
160
161#ifdef G4VERBOSE
163 {
164 G4cout << " Constructing new G4RotationMatrix from 9 numbers " << GetName()
165 << " : " << *rotMat << G4endl;
166 }
167#endif
168
169 return rotMat;
170}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
CLHEP::HepRotation G4RotationMatrix
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
double z() const
double x() const
double y() const
HepRotation & rotateX(double delta)
Definition: Rotation.cc:61
HepRotation & rotateZ(double delta)
Definition: Rotation.cc:87
HepRotation & rotateY(double delta)
Definition: Rotation.cc:74
static G4String ConvertToString(G4bool boolVal)
Definition: G4UIcommand.cc:446
G4RotationMatrix * BuildG4RotMatrix()
const G4String & GetName()
G4RotationMatrix * BuildG4RotMatrixFrom9(std::vector< G4double > &values)
G4RotationMatrix * BuildG4RotMatrixFrom6(std::vector< G4double > &values)
G4RotationMatrix * BuildG4RotMatrixFrom3(std::vector< G4double > &values)
static G4int GetVerboseLevel()
std::vector< G4double > & GetValues()