Geant4 Cross Reference |
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 31 #include "G4tgbRotationMatrix.hh" 32 #include "G4RotationMatrix.hh" 33 #include "G4tgrMessenger.hh" 34 #include "G4tgrUtils.hh" 35 #include "G4UIcommand.hh" 36 37 // -------------------------------------------------------------------- 38 G4tgbRotationMatrix::G4tgbRotationMatrix() 39 { 40 } 41 42 // -------------------------------------------------------------------- 43 G4tgbRotationMatrix::~G4tgbRotationMatrix() 44 { 45 } 46 47 // -------------------------------------------------------------------- 48 G4tgbRotationMatrix::G4tgbRotationMatrix(G4tgrRotationMatrix* tgr) 49 : theTgrRM(tgr) 50 { 51 } 52 53 // ------------------------------------------------------------------------- 54 G4RotationMatrix* G4tgbRotationMatrix::BuildG4RotMatrix() 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 // -------------------------------------------------------------------- 82 G4RotationMatrix* 83 G4tgbRotationMatrix::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 92 if(G4tgrMessenger::GetVerboseLevel() >= 1) 93 { 94 G4cout << " Constructing new G4RotationMatrix from 3 numbers " << GetName() 95 << " : " << *rotMat << G4endl; 96 } 97 #endif 98 99 return rotMat; 100 } 101 102 // -------------------------------------------------------------------- 103 G4RotationMatrix* 104 G4tgbRotationMatrix::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 132 if(G4tgrMessenger::GetVerboseLevel() >= 1) 133 { 134 G4cout << " Constructing new G4RotationMatrix from 6 numbers " << GetName() 135 << " : " << *rotMat << G4endl; 136 } 137 #endif 138 139 return rotMat; 140 } 141 142 // -------------------------------------------------------------------- 143 G4RotationMatrix* 144 G4tgbRotationMatrix::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 162 if(G4tgrMessenger::GetVerboseLevel() >= 1) 163 { 164 G4cout << " Constructing new G4RotationMatrix from 9 numbers " << GetName() 165 << " : " << *rotMat << G4endl; 166 } 167 #endif 168 169 return rotMat; 170 } 171