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