Touchables: Uniquely Identifying a Volume
Introduction to Touchables
A touchable for a volume serves the purpose of providing
a unique identification for a detector element. This can be useful
for description of the geometry alternative to the one used by the
Geant4 tracking system, such as a Sensitive Detectors based
read-out geometry, or a parameterised geometry for fast Monte
Carlo. In order to create a touchable volume, several
techniques can be implemented: for example, in Geant4 touchables
are implemented as solids associated to a transformation-matrix in
the global reference system, or as a hierarchy of physical volumes
up to the root of the geometrical tree.
A touchable is a geometrical entity (volume or solid) which has
a unique placement in a detector description. It is represented by
an abstract base class which can be implemented in a variety of
ways. Each way must provide the capabilities of obtaining the
transformation and solid that is described by the touchable.
What can a Touchable do?
All G4VTouchable implementations must respond to the
two following "requests", where in all cases, by depth it
is meant the number of levels up in the tree to be
considered (the default and current one is 0):
GetTranslation(depth)
GetRotation(depth)
that return the components of the volume's transformation.
Additional capabilities are available from implementations with
more information. These have a default implementation that causes
an exception.
Several capabilities are available from touchables with physical
volumes:
GetSolid(depth) gives the solid associated to the
touchable.
GetVolume(depth) gives the physical volume.
GetReplicaNumber(depth) or
GetCopyNumber(depth) which return the copy number of the
physical volume (replicated or not).
Touchables that store volume hierarchy (history) have the whole
stack of parent volumes available. Thus it is possible to add a
little more state in order to extend its functionality. We add a
"pointer" to a level and a member function to move the level in
this stack. Then calling the above member functions for another
level the information for that level can be retrieved.
The top of the history tree is, by convention, the world
volume.
GetHistoryDepth() gives the depth of the history
tree.
MoveUpHistory(num) moves the current pointer inside
the touchable to point num levels up the history tree.
Thus, e.g., calling it with num=1 will cause the internal
pointer to move to the mother of the current volume.
WARNING: this function changes the state of the touchable and can
cause errors in tracking if applied to Pre/Post step
touchables.
These methods are valid only for the touchable-history type,
as specified also below.
An update method, with different arguments is available, so that
the information in a touchable can be updated:
UpdateYourself(vol, history) takes a physical volume
pointer and can additionally take a NavigationHistory
pointer.
Touchable history holds stack of geometry data
As shown in Sections
and ,
a logical volume represents unpositioned detector elements, and a physical
volume can represent multiple detector elements. On the other hand,
touchables provide a unique identification for a detector element.
In particular, the Geant4 transportation process and the tracking
system exploit touchables as implemented in
G4TouchableHistory. The touchable history is the minimal
set of information required to specify the full genealogy of a
given physical volume (up to the root of the geometrical tree).
These touchable volumes are made available to the user at every
step of the Geant4 tracking in G4VUserSteppingAction.
To create/access a G4TouchableHistory the user must
message G4Navigator which provides the method
CreateTouchableHistoryHandle():
G4TouchableHistoryHandle CreateTouchableHistoryHandle() const;
this will return a handle to the touchable.
The methods that differentiate the touchable-history from other
touchables (since they have meaning only for this type...),
are:
G4int GetHistoryDepth() const;
G4int MoveUpHistory( G4int num_levels = 1 );
The first method is used to find out how many levels deep in the
geometry tree the current volume is. The second method asks the
touchable to eliminate its deepest level.
As mentioned above, MoveUpHistory(num) significantly
modifies the state of a touchable.