source: trunk/examples/advanced/composite_calorimeter/src/CCalRotationMatrixFactory.cc @ 1321

Last change on this file since 1321 was 807, checked in by garnier, 16 years ago

update

File size: 9.7 KB
Line 
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// File: CCalRotationMatrixFactory.cc
28// Description: CCalRotationFactory is a factory class to define all rotation
29//              matrices used in geometry building
30///////////////////////////////////////////////////////////////////////////////
31#include "CCalRotationMatrixFactory.hh"
32
33#include "CCalutils.hh"
34
35#include <fstream>
36#include <stdlib.h>
37
38//#define debug
39//#define ddebug
40
41CCalRotationMatrixFactory * CCalRotationMatrixFactory::instance = 0;
42G4String CCalRotationMatrixFactory::file="";
43
44CCalRotationMatrixFactory* CCalRotationMatrixFactory::getInstance(const G4String & rotfile){
45  if (rotfile=="" || rotfile==file)
46    return getInstance();
47  else if (file="") {
48    file=rotfile;
49    return getInstance();
50  } else {
51    G4cerr << "ERROR: Trying to get Rotation Matrices from " << rotfile
52         << " when previously were retrieved from " << file <<"." << G4endl;
53    return 0;
54  }
55}
56
57
58CCalRotationMatrixFactory* CCalRotationMatrixFactory::getInstance(){
59  if (file=="") {
60    G4cerr << "ERROR: You haven't defined which file to use for materials in "
61         << "CCalRotationMatrixFactory::getInstance(G4String)" << G4endl;
62    return 0;
63  }
64
65  if (instance==0) {
66    instance = new CCalRotationMatrixFactory;
67    return instance;
68  }
69  else
70    return instance;
71}
72
73void CCalRotationMatrixFactory::setFileName(const G4String& rotfile) {
74  if (rotfile!=file && file!="") {
75    G4cerr << "ERROR: Trying to change Rotation Matrices file name to " 
76         << rotfile << "." << G4endl;
77    G4cerr << "       Using previous file: " << file << G4endl;
78  }
79  file=rotfile;
80}
81
82CCalRotationMatrixFactory::~CCalRotationMatrixFactory(){
83  G4RotationMatrixTableIterator i;
84  for(i=theMatrices.begin(); i != theMatrices.end(); ++i) {
85    delete (*i).second;
86  };
87  theMatrices.clear();
88}
89
90G4RotationMatrix* CCalRotationMatrixFactory::findMatrix(const G4String & rot) {
91  G4RotationMatrix* retrot=0;
92  //Rotation :NULL is no rotation so a null pointer is returned
93  if (rot != ":NULL") {
94    //retrot untouched if rot not found!!!
95    G4RotationMatrixTableIterator it = theMatrices.find(rot);
96    if (it != theMatrices.end())
97      retrot = (*it).second;
98  }
99 
100  return retrot; //!!!Maybe a treatment on not-found case needed.
101}
102
103G4RotationMatrix* CCalRotationMatrixFactory::AddMatrix(const G4String& name, 
104                                                       G4double th1, 
105                                                       G4double phi1, 
106                                                       G4double th2, 
107                                                       G4double phi2, 
108                                                       G4double th3, 
109                                                       G4double phi3){
110  G4double sinth1, sinth2,  sinth3, costh1, costh2, costh3;
111  G4double sinph1, sinph2, sinph3, cosph1, cosph2, cosph3;
112  G4double TH1 = th1/deg, TH2 = th2/deg, TH3 = th3/deg;
113  G4double PH1 = phi1/deg, PH2 = phi2/deg, PH3 = phi3/deg;
114               
115  if (TH1 == 0.0 || TH1 == 360) {
116    sinth1 = 0.0; costh1 = 1.0;
117  } else if (TH1 == 90.0 || TH1 == -270) {
118    sinth1 = 1.0; costh1 = 0.0;
119  } else if (TH1 == 180.0 || TH1 == -180.0) {
120    sinth1 = 0.0; costh1 = -1.0;
121  } else if (TH1 == 270.0 || TH1 == -90.0) {
122    sinth1 = -1.0; costh1 = 0.0;
123  } else {
124    sinth1 = std::sin(th1); costh1 = std::cos(th1);
125  }
126 
127  if (TH2 == 0.0 || TH2 == 360) {
128    sinth2 = 0.0; costh2 = 1.0;
129  } else if (TH2 == 90.0 || TH2 == -270) {
130    sinth2 = 1.0; costh2 = 0.0;
131  } else if (TH2 == 180.0 || TH2 == -180.0) {
132    sinth2 = 0.0; costh2 = -1.0;
133  } else if (TH2 == 270.0 || TH2 == -90.0) {
134    sinth2 = -1.0; costh2 = 0.0;
135  } else {
136    sinth2 = std::sin(th2); costh2 = std::cos(th2);
137  }
138               
139  if (TH3 == 0.0 || TH3 == 360) {
140    sinth3 = 0.0; costh3 = 1.0;
141  } else if (TH3 == 90.0 || TH2 == -270) {
142    sinth3 = 1.0; costh3 = 0.0;
143  } else if (TH3 == 180.0 || TH3 == -180.0) {
144    sinth3 = 0.0; costh3 = -1.0;
145  } else if (TH3 == 270.0 || TH3 == -90.0) {
146    sinth3 = -1.0; costh3 = 0.0;
147  } else {
148    sinth3 = std::sin(th3); costh3 = std::cos(th3);
149  }
150     
151  if (PH1 == 0.0 || PH1 == 360) {
152    sinph1 = 0.0; cosph1 = 1.0;
153  } else if (PH1 == 90.0 || PH1 == -270) {
154    sinph1 = 1.0; cosph1 = 0.0;
155  } else if (PH1 == 180.0 || PH1 == -180.0) {
156    sinph1 = 0.0; cosph1 = -1.0;
157  } else if (PH1 == 270.0 || PH1 == -90.0) {
158    sinph1 = -1.0; cosph1 = 0.0;
159  } else {
160    sinph1 = std::sin(phi1); cosph1 = std::cos(phi1);
161  }
162
163  if (PH2 == 0.0 || PH2 == 360) {
164    sinph2 = 0.0; cosph2 = 1.0;
165  } else if (PH2 == 90.0 || PH2 == -270) {
166    sinph2 = 1.0; cosph2 = 0.0;
167  } else if (PH2 == 180.0 || PH2 == -180.0) {
168    sinph2 = 0.0; cosph2 = -1.0;
169  } else if (PH2 == 270.0 || PH2 == -90.0) {
170    sinph2 = -1.0; cosph2 = 0.0;
171  } else {
172    sinph2 = std::sin(phi2); cosph2 = std::cos(phi2);
173  }
174               
175  if (PH3 == 0.0 || PH3 == 360) {
176    sinph3 = 0.0; cosph3 = 1.0;
177  } else if (PH3 == 90.0 || PH3 == -270) {
178    sinph3 = 1.0; cosph3 = 0.0;
179  } else if (PH3 == 180.0 || PH3 == -180.0) {
180    sinph3 = 0.0; cosph3 = -1.0;
181  } else if (PH3 == 270.0 || PH3 == -90.0) {
182    sinph3 = -1.0; cosph3 = 0.0;
183  } else {
184    sinph3 = std::sin(phi3); cosph3 = std::cos(phi3);
185  }
186                                   
187  //xprime axis coordinates
188  CLHEP::Hep3Vector xprime(sinth1*cosph1,sinth1*sinph1,costh1);
189  //yprime axis coordinates
190  CLHEP::Hep3Vector yprime(sinth2*cosph2,sinth2*sinph2,costh2);
191  //zprime axis coordinates
192  CLHEP::Hep3Vector zprime(sinth3*cosph3,sinth3*sinph3,costh3);
193
194#ifdef ddebug
195  G4cout << xprime << '\t';    G4cout << yprime << '\t';    G4cout << zprime << G4endl;
196#endif
197  G4RotationMatrix *rotMat = new G4RotationMatrix();
198  rotMat->rotateAxes(xprime, yprime, zprime);
199  if (*rotMat == G4RotationMatrix()) {
200    // G4cerr << "WARNING: Matrix " << name << " will not be created as a rotation matrix."
201    // G4cerr << "WARNING: Matrix " << name << " is = identity matrix. It will not be created as a rotation matrix." << G4endl;
202    delete rotMat;
203    rotMat=0;
204  } else {
205    rotMat->invert();
206    theMatrices[name]=rotMat;
207#ifdef ddebug
208    G4cout << *rotMat << G4endl;
209#endif
210  }
211
212  return rotMat;
213}
214
215CCalRotationMatrixFactory::CCalRotationMatrixFactory():theMatrices(){
216 
217  G4String path = getenv("CCAL_GLOBALPATH");
218  G4cout << " ==> Opening file " << file << "..." << G4endl;
219  std::ifstream is;
220  bool ok = openGeomFile(is, path, file);
221  if (!ok) {
222    G4cerr << "ERROR: Could not open file " << file << " ... Exiting!" << G4endl;
223    exit(-1);
224  }
225
226  //////////////////////////////////////////////////
227  // Find *DO ROTM
228  findDO(is, G4String("ROTM"));
229
230  char rubish[256];
231  G4String name;
232
233#ifdef debug
234  G4cout << "     ==> Reading Rotation Matrices... " << G4endl;
235  G4cout << "       Name\tTheta1\tPhi1\tTheta2\tPhi2\tTheta3\tPhi3"<< G4endl;
236#endif
237 
238  is >> name;
239  while(name!="*ENDDO") { 
240    if (name.index("#.")==0) { //It is a comment.Skip line.
241      is.getline(rubish,256,'\n');
242    } else {
243#ifdef debug
244      G4cout << "       " << name <<'\t';
245#endif
246      G4double th1, phi1, th2, phi2, th3, phi3;
247      //Get xprime axis angles
248      is >> th1 >> phi1;
249#ifdef debug
250      G4cout << th1 << '\t' << phi1 << '\t';
251#endif
252      //Get yprime axis angles
253      is >> th2 >> phi2;
254#ifdef debug
255      G4cout << th2 << '\t' << phi2 << '\t';
256#endif
257      //Get zprime axis angles
258      is >> th3 >> phi3;
259#ifdef debug
260      G4cout << th3 << '\t' << phi3 << '\t';
261#endif
262
263      is.getline(rubish,256,'\n');
264#ifdef debug
265      G4cout << rubish << G4endl;
266#endif
267
268      AddMatrix(name, th1*deg, phi1*deg, th2*deg, phi2*deg, th3*deg, phi3*deg);
269    }
270
271    is >> name;
272  };
273
274  is.close();
275  G4cout << "       "  << theMatrices.size() << " rotation matrices read in." << G4endl;
276}
277
278
279// 29-Jan-2004 A.R. : commented to avoid clashes with CLHEP.
280//                    Streaming operators for rotation matrices are
281//                    already defined in CLHEP::HepRotation.
282// std::ostream& operator<<(std::ostream& os , const G4RotationMatrix & rot){
283//   //  os << "( " << rot.xx() << tab << rot.xy() << tab << rot.xz() << " )" << G4endl;
284//   //  os << "( " << rot.yx() << tab << rot.yy() << tab << rot.yz() << " )" << G4endl;
285//   //  os << "( " << rot.zx() << tab << rot.zy() << tab << rot.zz() << " )" << G4endl;
286//
287//   os << "["
288//      << rot.thetaX()/deg << tab << rot.phiX()/deg << tab
289//      << rot.thetaY()/deg << tab << rot.phiY()/deg << tab
290//      << rot.thetaZ()/deg << tab << rot.phiZ()/deg << "]"
291//      << G4endl;
292//
293//   return os;
294// }
Note: See TracBrowser for help on using the repository browser.