5 #include "GeoModelKernel/GeoAccessVolumeAction.h" 6 #include "GeoModelKernel/GeoNameTag.h" 7 #include "GeoModelKernel/GeoSerialDenominator.h" 8 #include "GeoModelKernel/GeoSerialIdentifier.h" 12 GeoAccessVolumeAction::GeoAccessVolumeAction(
unsigned int Index,
const GeoVAlignmentStore* store)
13 : m_transform(
GeoTrf::Transform3D::Identity())
14 , m_defTransform(
GeoTrf::Transform3D::Identity())
18 , m_serialDenominator(nullptr)
20 , m_serialDenomPosition(0)
21 , m_serialIdentifier(nullptr)
22 , m_serialIdentPosition(0)
26 m_pendingTransformList.reserve(1);
29 GeoAccessVolumeAction::~GeoAccessVolumeAction()
35 m_pendingTransformList.push_back (xform);
43 if(getPath()->getLength()-1 == 0)
48 if(m_index == m_counter) {
50 unsigned int listSize = m_pendingTransformList.size ();
54 else if(listSize == 1) {
55 m_transform = m_pendingTransformList[0]->getTransform(m_alignStore);
56 m_defTransform = m_pendingTransformList[0]->getDefTransform(m_alignStore);
59 for(
unsigned int t = 0; t < m_pendingTransformList.size (); t++) {
60 m_transform = m_transform * m_pendingTransformList[t]->getTransform(m_alignStore);
61 m_defTransform = m_defTransform * m_pendingTransformList[t]->getDefTransform(m_alignStore);
69 m_pendingTransformList.erase (m_pendingTransformList.begin (),
70 m_pendingTransformList.end ());
83 if(getPath()->getLength()-1 == 0)
88 if(m_index == m_counter) {
90 unsigned int listSize = m_pendingTransformList.size ();
94 else if(listSize == 1) {
95 m_transform = m_pendingTransformList[0]->getTransform(m_alignStore);
96 m_defTransform = m_pendingTransformList[0]->getDefTransform(m_alignStore);
99 for(
unsigned int t = 0; t < m_pendingTransformList.size (); t++) {
100 m_transform = m_transform * m_pendingTransformList[t]->getTransform(m_alignStore);
101 m_defTransform = m_defTransform * m_pendingTransformList[t]->getDefTransform(m_alignStore);
107 m_pendingTransformList.erase (m_pendingTransformList.begin (),
108 m_pendingTransformList.end ());
130 return m_defTransform;
137 m_name = m_nameTag->getName();
139 else if(m_serialDenominator) {
140 m_name = m_serialDenominator->getBaseName() + std::to_string(m_index-m_serialDenomPosition);
152 m_serialDenominator =
nullptr;
153 m_serialDenomPosition = 0;
158 m_serialDenominator = sD;
159 m_serialDenomPosition = m_counter;
167 if(m_index < m_counter + sT->getNCopies()) {
168 unsigned int copy = m_index - m_counter;
169 m_volume = sT->getVolume();
170 for(
unsigned int t = 0; t < m_pendingTransformList.size (); t++) {
171 m_transform = m_transform * m_pendingTransformList[t]->getTransform(m_alignStore);
172 m_defTransform = m_defTransform * m_pendingTransformList[t]->getDefTransform(m_alignStore);
174 m_transform = m_transform * sT->getTransform (copy);
175 m_defTransform = m_defTransform * sT->getTransform (copy);
176 m_counter += (copy + 1);
182 m_pendingTransformList.erase(m_pendingTransformList.begin (),
183 m_pendingTransformList.end ());
184 m_counter += sT->getNCopies();
191 m_serialIdentifier =
nullptr;
192 m_serialIdentPosition = 0;
201 else if(m_serialIdentifier) {
202 id =
Query<int>(m_index - m_serialIdentPosition + m_serialIdentifier->getBaseId());
209 m_serialIdentifier = sI;
210 m_serialIdentPosition = m_counter;
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...
virtual void handleFullPhysVol(const GeoFullPhysVol *vol) override
Handles a physical volume.
virtual void handleSerialDenominator(const GeoSerialDenominator *sD) override
Handles a Serial Denominator.
virtual void handleSerialTransformer(const GeoSerialTransformer *sT) override
Handles a Serial Transformer.
virtual void handleIdentifierTag(const GeoIdentifierTag *idTag) override
Handles an Identifier Tag.
Abstract base class for GeoModel alignment stores The interface allows to store/retrieve transformati...
PVConstLink getVolume() const
Returns the selected physical volume or nullptr if not found.
This class represent a physical volume whose absolute default and aligned positions are known and hel...
virtual void handleSerialIdentifier(const GeoSerialIdentifier *sI) override
Handles an Serial Identifier.
const std::string & getName() const
Returns the name of the volume. From nametag or serial denominator.
Query< int > getId() const
Returns the id of the volume. From the identifier.
This class gives an integral identifer to the following physical volume.
virtual void handleNameTag(const GeoNameTag *nameTag) override
Handles a Name Tag.
const GeoTrf::Transform3D & getDefTransform() const
Returns the default ransformation to the volume.
Smart pointer to physical volume... constant.
virtual void handleTransform(const GeoTransform *xform) override
Handles a Transform.
const GeoTrf::Transform3D & getTransform() const
Returns the transformation to the volume.
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: