GeoModel - GeoModelCore
GeoVolumeCursor.cxx
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "GeoModelKernel/GeoVolumeCursor.h"
6 #include "GeoModelKernel/GeoNameTag.h"
7 #include "GeoModelKernel/GeoSerialDenominator.h"
8 #include "GeoModelKernel/GeoSerialIdentifier.h"
9 #include "GeoModelKernel/GeoAlignableTransform.h"
10 #include <string>
11 
12 GeoVolumeCursor::GeoVolumeCursor (PVConstLink parent, GeoVAlignmentStore* store)
13  : m_parent(parent)
14  , m_transform(GeoTrf::Transform3D::Identity())
15  , m_defTransform(GeoTrf::Transform3D::Identity())
16  , m_majorIndex(0)
17  , m_minorIndex(0)
18  , m_minorLimit(0)
19  , m_serialTransformer(nullptr)
20  , m_nameTag(nullptr)
21  , m_serialDenominator(nullptr)
22  , m_idTag(nullptr)
23  , m_serialDenomPosition(0)
24  , m_serialIdentifier(nullptr)
25  , m_serialIdentPosition(0)
26  , m_volCount(0)
27  , m_hasAlignTrans(false)
28  , m_alignStore(store)
29 {
30  setDepthLimit(0);
31  next();
32 }
33 
34 GeoVolumeCursor::~GeoVolumeCursor()
35 {
36 }
37 
39  resuscitate();
40 
41  if (m_minorLimit) { // We are doing a serial transformer
42  m_minorIndex++;
43  if (m_minorIndex==m_minorLimit) {
44  m_minorIndex=0;
45  m_minorLimit=0;
46  m_majorIndex++;
47  next();
48  }
49  else {
50  m_volCount++;
51  }
52  }
53  else { // We are not doing a serial transformer
54  m_idTag = nullptr;
55  m_nameTag = nullptr;
56  m_serialTransformer = nullptr;
57  m_pendingTransformList.erase (m_pendingTransformList.begin (),
58  m_pendingTransformList.end ());
59  m_hasAlignTrans = false;
60  m_volume=nullptr;
61 
62  int N = m_parent->getNChildNodes();
63  if(N==0) return;
64  const GeoGraphNode * const *node = m_parent->getChildNode(m_majorIndex);
65  const GeoGraphNode * const *back = m_parent->getChildNode(N-1);
66  const GeoGraphNode * const *end = back+1;
67  while (node!=end) {
68  (*node)->exec(this);
69  if (m_minorLimit) { // We have stepped into ST
70  }
71  else { // We have not stepped into ST.
72  node++;
73  m_majorIndex++;
74  }
75  if (m_terminate) {
76  m_volCount++;
77  break;
78  }
79  }
80  }
81 }
82 
84  m_terminate = false;
85 }
86 
87 bool GeoVolumeCursor::atEnd() const {
88  return !m_volume;
89 }
90 
92 {
93  m_pendingTransformList.push_back (xform);
94  if(dynamic_cast<const GeoAlignableTransform*>(xform))
95  m_hasAlignTrans = true;
96 }
97 
99 {
100 
101  m_volume = vol;
102  unsigned int listSize = m_pendingTransformList.size ();
103  if (listSize == 0) {
104  m_transform = GeoTrf::Transform3D::Identity();
105  m_defTransform = GeoTrf::Transform3D::Identity();
106  }
107  else {
108  m_transform = m_pendingTransformList[0]->getTransform(m_alignStore);
109  m_defTransform = m_pendingTransformList[0]->getDefTransform(m_alignStore);
110  for (unsigned int t = 1; t < m_pendingTransformList.size (); t++) {
111  m_transform = m_transform * m_pendingTransformList[t]->getTransform(m_alignStore);
112  m_defTransform = m_defTransform * m_pendingTransformList[t]->getDefTransform(m_alignStore);
113  }
114  }
115  terminate ();
116 }
117 
119 {
120  m_volume = vol;
121  unsigned int listSize = m_pendingTransformList.size ();
122  if (listSize == 0) {
123  m_transform = GeoTrf::Transform3D::Identity();
124  m_defTransform = GeoTrf::Transform3D::Identity();
125  }
126  else {
127  m_transform = m_pendingTransformList[0]->getTransform(m_alignStore);
128  m_defTransform = m_pendingTransformList[0]->getDefTransform(m_alignStore);
129  for (unsigned int t = 1; t < m_pendingTransformList.size (); t++) {
130  m_transform = m_transform * m_pendingTransformList[t]->getTransform(m_alignStore);
131  m_defTransform = m_defTransform * m_pendingTransformList[t]->getDefTransform(m_alignStore);
132  }
133  }
134  terminate ();
135 }
136 
138 {
139 
140  m_minorLimit = sT->getNCopies();
141  m_minorIndex = 0;
142  m_serialTransformer = sT;
143  m_volume = sT->getVolume();
144 
145  unsigned int listSize = m_pendingTransformList.size ();
146  if (listSize == 0) {
147  m_transform = GeoTrf::Transform3D::Identity();
148  m_defTransform = GeoTrf::Transform3D::Identity();
149  }
150  else {
151  m_transform = m_pendingTransformList[0]->getTransform(m_alignStore);
152  m_defTransform = m_pendingTransformList[0]->getDefTransform(m_alignStore);
153  for (unsigned int t = 1; t < m_pendingTransformList.size (); t++) {
154  m_transform = m_transform * m_pendingTransformList[t]->getTransform(m_alignStore);
155  m_defTransform = m_defTransform * m_pendingTransformList[t]->getDefTransform(m_alignStore);
156  }
157  }
158  terminate ();
159 }
160 
162 {
163  m_nameTag = nameTag;
164  m_serialDenominator = nullptr;
165  m_serialDenomPosition = 0;
166 }
167 
169 {
170  m_serialDenominator = sD;
171  m_serialDenomPosition = m_volCount;
172 }
173 
174 
176 {
177  m_idTag = idTag;
178  m_serialIdentifier = nullptr;
179  m_serialIdentPosition = m_volCount;
180 }
181 
183 {
184  m_serialIdentifier = sI;
185  m_serialIdentPosition =m_volCount;
186 }
187 
189 {
190  return m_volume;
191 }
192 
193 GeoTrf::Transform3D GeoVolumeCursor::getTransform () const
194 {
195  if (m_minorLimit) {
196  return m_transform*m_serialTransformer->getTransform(m_minorIndex);
197  }
198  else {
199  return m_transform;
200  }
201 }
202 
203 GeoTrf::Transform3D GeoVolumeCursor::getDefTransform () const
204 {
205  if (m_minorLimit) {
206  return m_defTransform*m_serialTransformer->getTransform(m_minorIndex);
207  }
208  else {
209  return m_defTransform;
210  }
211 }
212 
213 std::string GeoVolumeCursor::getName () const
214 {
215  std::string name;
216  if(m_nameTag) {
217  name = m_nameTag->getName();
218  }
219  else if(m_serialDenominator) {
220  name = m_serialDenominator->getBaseName() + std::to_string((int)(m_volCount-m_serialDenomPosition-1));
221  }
222  else {
223  name = "ANON";
224  }
225  return name;
226 }
227 
229 {
230  Query<int> id;
231  if (m_idTag) {
232  id = Query<int> (m_idTag->getIdentifier ());
233  }
234  else if (m_serialIdentifier) {
235  id = Query<int> (m_volCount - m_serialIdentPosition - 1 + m_serialIdentifier->getBaseId());
236  }
237  return id;
238 }
239 
240 bool GeoVolumeCursor::hasAlignableTransform() const
241 {
242  return m_hasAlignTrans;
243 }
Like a GeoSerialDenominator. Identifies volumes, including virtual volumes.
void next()
Advance.
This class generates a name for all physical volumes following it. The name is a prefix string follow...
Abstract base class for GeoModel alignment stores The interface allows to store/retrieve transformati...
This class represent a physical volume whose absolute default and aligned positions are known and hel...
This class gives a name to the next physical volume.
Definition: GeoNameTag.h:17
PVConstLink getVolume() const
Returns the selected physical volume or nullptr if not found.
GeoTrf::Transform3D getDefTransform() const
Returns the default ransformation to the volume.
virtual void handleSerialDenominator(const GeoSerialDenominator *sD) override
Handles a Serial Denominator.
virtual void handleTransform(const GeoTransform *xform) override
Handles a Transform.
Query< int > getId() const
Returns the id of the volume. From the identifier.
bool atEnd() const
Check if we are at the last volume.
virtual void handleSerialTransformer(const GeoSerialTransformer *sT) override
Handles a Serial Transformer.
This class gives an integral identifer to the following physical volume.
void resuscitate()
Ressucitate (undo terminate)
GeoTrf::Transform3D getTransform() const
Returns the transformation to the volume.
virtual void handleFullPhysVol(const GeoFullPhysVol *vol) override
Handles a physical volume.
virtual void handleNameTag(const GeoNameTag *nameTag) override
Handles a Name Tag.
This class takes a physical volume and places it according to a transformation field, N times.
virtual void handleSerialIdentifier(const GeoSerialIdentifier *sI) override
Handles a Serial Identifier.
Represents Nodes that can be assembled together to make a graph. Subclasses (for now): ...
Definition: GeoGraphNode.h:28
virtual void handlePhysVol(const GeoPhysVol *vol) override
Handles a physical volume.
A basic geometrical (Euclidean) transform. Can return a GeoTrf::Transform3D. Reference counted...
Definition: GeoTransform.h:22
A GeoPhysVol is a physical volume for normal recursive access only. This means, normally, that it represents a piece of detector that nobody cares about except for tracing engines like GEANT. More specifically:
Definition: GeoPhysVol.h:31
virtual void handleIdentifierTag(const GeoIdentifierTag *idTag) override
Handles an Identifier Tag.
std::string getName() const
Returns the name of the volume. From nametag or serial denominator.