FairRoot
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FairGeoNode.cxx
Go to the documentation of this file.
1 /********************************************************************************
2  * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
8 //*-- AUTHOR : Ilse Koenig
9 //*-- Created : 10/11/2003
10 //*---Modified: 21/06/2005 D.Bertini
11 
13 // FairGeoNode
14 //
15 // Class to hold the basic geometry properties of a GEANT volume
16 //
18 #include "FairGeoNode.h"
19 
20 #include "FairGeoRotation.h" // for FairGeoRotation
21 #include "FairGeoVector.h" // for FairGeoVector
22 
23 #include <TList.h> // for TList
24 #include <cmath> // IWYU pragma: keep for abs
25 // IWYU pragma: no_include <architecture/i386/math.h>
26 #include <cstdio> // for sscanf
27 #include <fstream>
28 #include <iostream> // for operator<<, basic_ostream, etc
29 
30 using std::cout;
31 using std::endl;
32 
34 
36  : FairGeoVolume()
37  , active(kFALSE)
38  , center(FairGeoTransform())
39  , volumeType(kFairGeoElement)
40  , created(kFALSE)
41  , copyNode(nullptr)
42  , rootVolume(nullptr)
43  , pShape(0)
44  , pMother(nullptr)
45  , medium(nullptr)
46  , labTransform(nullptr)
47  , fDaughterList(new TObjArray(5))
48  , fTruncName("")
49 {
50  // Constructor
51  clear();
52 }
53 
55  : FairGeoVolume(r)
56  , active(kFALSE)
57  , center(r.getCenterPosition())
58  , volumeType(r.getVolumeType())
59  , created(kFALSE)
60  , copyNode(r.getCopyNode())
61  , rootVolume(r.getRootVolume())
62  , pShape(nullptr)
63  , pMother(nullptr)
64  , medium(nullptr)
65  , labTransform(new FairGeoTransform(*(r.getLabTransform())))
66  , fDaughterList(new TObjArray(*(r.GetListOfDaughters())))
67  , fTruncName(r.getTruncName())
68 {
69  // Copy constructor
70  points = 0;
71  nPoints = 0;
72  fName = r.GetName();
73  setVolumePar(r);
74  if (r.isActive()) {
75  active = kTRUE;
76  }
77  if (r.isCreated()) {
78  created = kTRUE;
79  }
80 }
81 
83 {
84  // Destructor
85  if (points) {
86  for (Int_t i = 0; i < nPoints; i++) {
87  points->RemoveAt(i);
88  }
89  delete points;
90  points = 0;
91  }
92  if (labTransform) {
93  delete labTransform;
94  labTransform = 0;
95  }
96  if (fDaughterList) {
97  fDaughterList->Delete();
98  delete fDaughterList;
99  }
100 }
101 
103 {
104  // Copies all volume parameters except the name
106  medium = r.getMedium();
108  Int_t n = r.getNumPoints();
109  createPoints(n);
110  for (Int_t i = 0; i < nPoints; i++) {
111  setPoint(i, *(r.getPoint(i)));
112  }
113  transform = r.getTransform();
114 }
115 
117 {
118  // Clears the volume and deletes the points
119  /* pMother=0;
120  medium=0;
121  pShape=0;
122  volumeType=kFairGeoElement;
123  active=kFALSE;
124  created=kFALSE;
125  copyNode=0;
126  rootVolume=0;
127  */
128  if (labTransform) {
129  delete labTransform;
130  labTransform = 0;
131  }
133 }
134 
136 {
137  // Returns the copy number
138  Int_t n = 0;
139  if (fHadFormat == 1) {
140  Int_t l = fName.Length();
141  if (l > 4) {
142  TString s(fName);
143  s.Remove(0, 4);
144  sscanf(s.Data(), "%i", &n);
145  }
146  } else {
147 
148  Ssiz_t l = fName.Last('#');
149  if (l > 0) {
150  TString s(fName);
151  s.Remove(0, l + 1);
152  sscanf(s.Data(), "%i", &n);
153  }
154  }
155 
156  return n;
157 }
158 
160 {
161  // Returns the parameters to create a GEANT/ROOT volume
162  if (pShape) {
163  return pShape->calcVoluParam(this);
164  }
165  return 0;
166 }
167 
169 {
170  // Returns the transformation to position a volume in GEANT/ROOT
171  if (pShape && pMother) {
174  return pShape->getVoluPosition();
175  }
176  return 0;
177 }
178 
180 {
181  // Prints all parameters of a volume
182  cout << "//----------------------------------------------------------\n";
184  cout << "//----------------------------------------------------------\n";
185  return;
186 
187  /*
188  cout<<((const char*)fName)<<'\n';
189  if (pMother) { cout<<((const char*)mother)<<'\n'; }
190  else { cout<<"-- unknown mother --\n"; }
191  if (!copyNode) {
192  if (pShape) { cout<<((const char*)shape)<<'\n'; }
193  else { cout<<"-- unknown shape --\n"; }
194  if (medium) { cout<<medium->GetName()<<'\n'; }
195  else { cout<<"-- unknown medium --\n"; }
196  if (points && pShape) { pShape->printPoints(this); }
197  else { cout<<"-- no points --\n"; }
198  }
199  transform.getTransVector().print();
200  transform.getRotMatrix().print();
201  cout<<"//----------------------------------------------------------\n";
202  */
203 }
204 
205 Bool_t FairGeoNode::write(std::fstream& fout)
206 {
207  // Writes all parameters of a volume to file
208  fout << fName.Data() << '\n';
209  if (pMother) {
210  fout << (const_cast<const char*>(mother.Data())) << '\n';
211  } else {
212  Error("write", "Unknown mother for %s\n", fName.Data());
213  return kFALSE;
214  }
215  if (!copyNode) {
216  if (pShape) {
217  fout << (const_cast<const char*>(shape.Data())) << '\n';
218  } else {
219  Error("write", "Unknown shape for %s\n", fName.Data());
220  return kFALSE;
221  }
222  if (medium) {
223  fout << medium->GetName() << '\n';
224  } else {
225  Error("write", "Unknown medium for %s\n", fName.Data());
226  return kFALSE;
227  }
228  if (points && pShape) {
229  pShape->writePoints(&fout, this);
230  } else {
231  Error("write", "No points for %s\n", fName.Data());
232  return kFALSE;
233  }
234  }
237  fout.precision(3);
238  fout << v(0) << " " << v(1) << " " << v(2) << '\n';
239  fout.precision(7);
240  for (Int_t i = 0; i < 9; i++) {
241  fout << r(i) << " ";
242  }
243  fout << '\n';
244  fout << "//----------------------------------------------------------\n";
245  return kTRUE;
246 }
247 
249 {
250  // Returns the tree of the mother volumes
251  TList* tree = new TList();
252  FairGeoNode* v = this;
253  FairGeoNode* lmother;
254  do {
255  lmother = v->getMotherNode();
256  if (lmother) {
257  tree->Add(lmother);
258  }
259  v = lmother;
260  } while (v && !v->isTopNode());
261  return tree;
262 }
263 
265 {
266  // Returns the lab transformation
267  if (labTransform) {
268  return labTransform;
269  } else {
270  return calcLabTransform();
271  }
272 }
273 
275 {
276  // Calculates the lab transformation
277 
279 
280  if (!isTopNode()) {
281  if (!pMother) {
282  Error("calcLabTransform()", "Mother volume of %s not found!", GetName());
283  delete labTransform;
284  return 0;
285  }
287  if (!tm) {
288  ;
289  Error("calcLabTransform()", "Lab Transformation of mother volume of %s not found!", GetName());
290  delete labTransform;
291  return 0;
292  }
293  labTransform->transFrom(*tm);
294  }
295 
297  fMedium = *medium;
298  return labTransform;
299 }
300 
302 {
303  // Sets the lab transformation
304  if (!isTopNode()) {
305  if (labTransform) {
307  } else {
309  }
310  if (!pMother) {
311  Error("calcLabTransform()", "Mother volume of %s not found!", GetName());
312  delete labTransform;
313  return;
314  }
316  if (!tm) {
317  ;
318  Error("calcLabTransform()", "Lab Transformation of mother volume of %s not found!", GetName());
319  delete labTransform;
320  return;
321  }
322  transform = t;
323  transform.transTo(*tm);
324  }
325 }
326 
328 {
329  // Calculates the transformation relative to the detectors coordinate system
330  FairGeoNode* node = this;
331  modTransform = transform;
332  while (node && !node->isModule()) {
333  FairGeoNode* pm = node->getMotherNode();
334  if (!pm) {
335  Error("calcModuleTransform", "Mother volume of %s not found!", node->GetName());
336  return kFALSE;
337  }
338  modTransform.transFrom(pm->getTransform());
339  node = pm;
340  }
341  if (isTopNode()) {
342  return kFALSE;
343  } else {
344  return kTRUE;
345  }
346 }
347 
349 {
350  // Calculates the position in the detectors coordinate system
351  FairGeoNode* node = this;
352  refPos = center.getTransVector();
353  do {
354  refPos = node->getTransform().transFrom(refPos);
355  node = node->getMotherNode();
356  if (!node) {
357  Error("calcModuleTransform", "Mother of volume %s not found!", GetName());
358  return kFALSE;
359  }
360  } while (node && !node->isModule());
361  if (isTopNode()) {
362  return kFALSE;
363  } else {
364  return kTRUE;
365  }
366 }
367 
369 {
370  // Compares the volume with the volume rn and prints the diagnose
371  // Returns kTRUE if the volume parameters are the same
372  Int_t diff[] = {0, 0, 0, 0, 0, 0};
373  Int_t n = 0;
374  cout << fName << '\t';
375  if (mother.CompareTo(rn.getMother()) != 0) {
376  diff[0] = 1;
377  n++;
378  }
379  if (medium && rn.getMedium()) {
380  TString med = medium->GetName();
381  if (med.CompareTo(rn.getMedium()->GetName()) != 0) {
382  diff[1] = 1;
383  n++;
384  }
385  } else {
386  diff[1] = 1;
387  n++;
388  }
389  if (shape.CompareTo(rn.getShape()) != 0) {
390  diff[2] = 1;
391  n++;
392  }
393  Int_t np = rn.getNumPoints();
394  if (points && nPoints == np) {
395  for (Int_t i = 0; i < np; i++) {
396  FairGeoVector v1 = *(getPoint(i));
397  FairGeoVector v2 = *(rn.getPoint(i));
398  if (fabs(v1(0) - v2(0)) >= 0.001 || fabs(v1(1) - v2(1)) >= 0.001 || fabs(v1(1) - v2(1)) >= 0.001) {
399  diff[3] = 1;
400  n++;
401  break;
402  }
403  }
404  } else {
405  diff[3] = 1;
406  n++;
407  }
410  if (fabs(v1(0) - v2(0)) >= 0.001 || fabs(v1(1) - v2(1)) >= 0.001 || fabs(v1(1) - v2(1)) >= 0.001) {
411  diff[4] = 1;
412  n++;
413  }
416  for (Int_t i = 0; i < 9; i++) {
417  if (fabs(r1(i) - r2(i)) >= 1.e-7) {
418  diff[5] = 1;
419  n++;
420  break;
421  }
422  }
423  if (n > 0) {
424  for (Int_t i = 0; i < 6; i++) {
425  cout << " " << diff[i] << " ";
426  }
427  cout << '\n';
428  } else {
429  cout << " same\n";
430  }
431  return n;
432 }
FairGeoNode * copyNode
Definition: FairGeoNode.h:50
virtual void calcVoluPosition(FairGeoVolume *, const FairGeoTransform &)
FairGeoNode * getMotherNode()
Definition: FairGeoNode.h:73
Bool_t active
Definition: FairGeoNode.h:46
FairGeoTransform * calcLabTransform()
const TString & getMother() const
Definition: FairGeoVolume.h:47
TString mother
Definition: FairGeoVolume.h:32
virtual Bool_t writePoints(std::fstream *, FairGeoVolume *)
void setPoint(const Int_t, const Double_t, const Double_t, const Double_t)
Bool_t isActive()
Definition: FairGeoNode.h:75
TArrayD * getParameters()
virtual TArrayD * calcVoluParam(FairGeoVolume *)
Int_t getCopyNo()
FairGeoTransform & getCenterPosition()
Definition: FairGeoNode.h:76
FairGeoTransform * getVoluPosition()
ClassImp(FairEventBuilder)
Bool_t isCreated()
Definition: FairGeoNode.h:84
const FairGeoVector & getTransVector() const
TObjArray * fDaughterList
Definition: FairGeoNode.h:56
void setMother(FairGeoNode *s)
Definition: FairGeoNode.h:136
FairGeoVector transFrom(const FairGeoVector &p) const
FairGeoTransform fLabTransform
Definition: FairGeoVolume.h:35
void setShape(FairGeoBasicShape *s)
Definition: FairGeoNode.h:127
Bool_t calcModuleTransform(FairGeoTransform &)
FairGeoTransform center
Definition: FairGeoNode.h:47
Bool_t isTopNode()
Definition: FairGeoNode.h:67
const FairGeoRotation & getRotMatrix() const
void createPoints(const Int_t)
FairGeoVector transTo(const FairGeoVector &p) const
virtual ~FairGeoNode()
Definition: FairGeoNode.cxx:82
FairGeoTransform * getPosition()
Bool_t calcRefPos(FairGeoVector &)
Bool_t write(std::fstream &)
Bool_t created
Definition: FairGeoNode.h:49
FairGeoVector * getPoint(const Int_t n)
Definition: FairGeoVolume.h:85
void setVolumePar(FairGeoNode &)
FairGeoBasicShape * pShape
Definition: FairGeoNode.h:52
Int_t getNumPoints()
Definition: FairGeoVolume.h:51
virtual void clear()
TList * getTree()
void setLabTransform(FairGeoTransform &)
FairGeoMedium * getMedium()
Definition: FairGeoNode.h:74
FairGeoTransform transform
Definition: FairGeoVolume.h:34
FairGeoTransform * getCenterPosition()
Bool_t isModule()
Definition: FairGeoNode.h:70
FairGeoNode * pMother
Definition: FairGeoNode.h:53
FairGeoMedium fMedium
Definition: FairGeoVolume.h:36
FairGeoMedium * medium
/** pointer to the mother volume */
Definition: FairGeoNode.h:54
FairGeoTransform & getTransform()
Definition: FairGeoVolume.h:48
const TString & getShape() const
Definition: FairGeoVolume.h:46
virtual void print()
FairGeoTransform * getLabTransform()
FairGeoTransform * labTransform
Definition: FairGeoNode.h:55
Int_t compare(FairGeoNode &)
void setTransform(const FairGeoTransform &t)
FairGeoBasicShape * getShapePointer()
Definition: FairGeoNode.h:72
TObjArray * points
Definition: FairGeoVolume.h:33