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" 14 , m_transform(
GeoTrf::Transform3D::Identity())
15 , m_defTransform(
GeoTrf::Transform3D::Identity())
19 , m_serialTransformer(nullptr)
21 , m_serialDenominator(nullptr)
23 , m_serialDenomPosition(0)
24 , m_serialIdentifier(nullptr)
25 , m_serialIdentPosition(0)
27 , m_hasAlignTrans(false)
34 GeoVolumeCursor::~GeoVolumeCursor()
43 if (m_minorIndex==m_minorLimit) {
56 m_serialTransformer =
nullptr;
57 m_pendingTransformList.erase (m_pendingTransformList.begin (),
58 m_pendingTransformList.end ());
59 m_hasAlignTrans =
false;
62 int N = m_parent->getNChildNodes();
64 const GeoGraphNode *
const *node = m_parent->getChildNode(m_majorIndex);
65 const GeoGraphNode *
const *back = m_parent->getChildNode(N-1);
93 m_pendingTransformList.push_back (xform);
94 if(dynamic_cast<const GeoAlignableTransform*>(xform))
95 m_hasAlignTrans =
true;
102 unsigned int listSize = m_pendingTransformList.size ();
104 m_transform = GeoTrf::Transform3D::Identity();
105 m_defTransform = GeoTrf::Transform3D::Identity();
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);
121 unsigned int listSize = m_pendingTransformList.size ();
123 m_transform = GeoTrf::Transform3D::Identity();
124 m_defTransform = GeoTrf::Transform3D::Identity();
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);
140 m_minorLimit = sT->getNCopies();
142 m_serialTransformer = sT;
143 m_volume = sT->getVolume();
145 unsigned int listSize = m_pendingTransformList.size ();
147 m_transform = GeoTrf::Transform3D::Identity();
148 m_defTransform = GeoTrf::Transform3D::Identity();
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);
164 m_serialDenominator =
nullptr;
165 m_serialDenomPosition = 0;
170 m_serialDenominator = sD;
171 m_serialDenomPosition = m_volCount;
178 m_serialIdentifier =
nullptr;
179 m_serialIdentPosition = m_volCount;
184 m_serialIdentifier = sI;
185 m_serialIdentPosition =m_volCount;
196 return m_transform*m_serialTransformer->getTransform(m_minorIndex);
206 return m_defTransform*m_serialTransformer->getTransform(m_minorIndex);
209 return m_defTransform;
217 name = m_nameTag->getName();
219 else if(m_serialDenominator) {
220 name = m_serialDenominator->getBaseName() + std::to_string((
int)(m_volCount-m_serialDenomPosition-1));
234 else if (m_serialIdentifier) {
235 id =
Query<int> (m_volCount - m_serialIdentPosition - 1 + m_serialIdentifier->getBaseId());
240 bool GeoVolumeCursor::hasAlignableTransform()
const 242 return m_hasAlignTrans;
Like a GeoSerialDenominator. Identifies volumes, including virtual volumes.
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...
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.
Smart pointer to physical volume... constant.
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): ...
virtual void handlePhysVol(const GeoPhysVol *vol) override
Handles a physical volume.
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:
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.