| 1 | <html>
|
|---|
| 2 | <head>
|
|---|
| 3 | <title>ADG: Geometry</title>
|
|---|
| 4 | </head>
|
|---|
| 5 |
|
|---|
| 6 | <!-- Changed by: Gabriele Cosmo, 18-Apr-2005 -->
|
|---|
| 7 | <!-- $Id: geomNav.html,v 1.5 2006/11/24 20:18:30 asaim Exp $ -->
|
|---|
| 8 | <!-- $Name: $ -->
|
|---|
| 9 | <body>
|
|---|
| 10 | <table WIDTH="100%"><TR>
|
|---|
| 11 | <td>
|
|---|
| 12 | <a href="../../../../Overview/html/index.html">
|
|---|
| 13 | <IMG SRC="../../../../resources/html/IconsGIF/Overview.gif" ALT="Overview"></a>
|
|---|
| 14 | <a href="geometry.html">
|
|---|
| 15 | <IMG SRC="../../../../resources/html/IconsGIF/Contents.gif" ALT="Contents"></a>
|
|---|
| 16 | <a href="geomReflection.html">
|
|---|
| 17 | <IMG SRC="../../../../resources/html/IconsGIF/Previous.gif" ALT="Previous"></a>
|
|---|
| 18 | <a href="geomEditor.html">
|
|---|
| 19 | <IMG SRC="../../../../resources/html/IconsGIF/Next.gif" ALT="Next"></a>
|
|---|
| 20 | </td>
|
|---|
| 21 | <td ALIGN="Right">
|
|---|
| 22 | <font SIZE="-1" COLOR="#238E23">
|
|---|
| 23 | <b>Geant4 User's Guide</b>
|
|---|
| 24 | <br>
|
|---|
| 25 | <b>For Application Developers</b>
|
|---|
| 26 | <br>
|
|---|
| 27 | <b>Geometry</b>
|
|---|
| 28 | </font>
|
|---|
| 29 | </td>
|
|---|
| 30 | </tr></table>
|
|---|
| 31 | <br><br>
|
|---|
| 32 |
|
|---|
| 33 | <a name="4.1.8">
|
|---|
| 34 | <h2>4.1.8 The Geometry Navigator</h2></a>
|
|---|
| 35 |
|
|---|
| 36 | <p>
|
|---|
| 37 | Navigation through the geometry at tracking time is implemented by the class
|
|---|
| 38 | <tt>G4Navigator</tt>. The navigator is used to locate points in the geometry
|
|---|
| 39 | and compute distances to geometry boundaries. At tracking time, the navigator
|
|---|
| 40 | is intended to be the only point of interaction with tracking.<br>
|
|---|
| 41 |
|
|---|
| 42 | Internally, the G4Navigator has several private helper/utility classes:
|
|---|
| 43 | <ul>
|
|---|
| 44 | <li><b>G4NavigationHistory</b> - stores the compounded transformations,
|
|---|
| 45 | replication/parameterisation information, and volume pointers at each
|
|---|
| 46 | level of the hierarchy to the current location. The volume types
|
|---|
| 47 | at each level are also stored - whether normal (placement),
|
|---|
| 48 | replicated or parameterised.</li>
|
|---|
| 49 | <li><b>G4NormalNavigation</b> - provides location & distance computation
|
|---|
| 50 | functions for geometries containing 'placement' volumes, with no voxels.
|
|---|
| 51 | </li>
|
|---|
| 52 | <li><b>G4VoxelNavigation</b> - provides location and distance computation
|
|---|
| 53 | functions for geometries containing 'placement' physical volumes with
|
|---|
| 54 | voxels. Internally a stack of voxel information is maintained. Private
|
|---|
| 55 | functions allow for isotropic distance computation to voxel boundaries
|
|---|
| 56 | and for computation of the 'next voxel' in a specified direction.</li>
|
|---|
| 57 | <li><b>G4ParameterisedNavigation</b> - provides location and distance
|
|---|
| 58 | computation functions for geometries containing parameterised volumes
|
|---|
| 59 | with voxels. Voxel information is maintained similarly to
|
|---|
| 60 | <tt>G4VoxelNavigation</tt>, but computation can also be simpler by
|
|---|
| 61 | adopting voxels to be one level deep only (<I>unrefined</I>, or 1D
|
|---|
| 62 | optimisation)</li>
|
|---|
| 63 | <li><b>G4ReplicaNavigation</b> - provides location and distance computation
|
|---|
| 64 | functions for replicated volumes.</li>
|
|---|
| 65 | </ul>
|
|---|
| 66 | In addition, the navigator maintains a set of flags for exiting/entry
|
|---|
| 67 | optimisation. A navigator is not a singleton class; this is mainly to
|
|---|
| 68 | allow a design extension in future (e.g geometrical event biasing).
|
|---|
| 69 | </p>
|
|---|
| 70 |
|
|---|
| 71 | <a name="4.1.8.1">
|
|---|
| 72 | <h3>4.1.8.1 Navigation and Tracking</h3></a>
|
|---|
| 73 |
|
|---|
| 74 | <p>
|
|---|
| 75 | The main functions required for tracking in the geometry are described below.
|
|---|
| 76 | Additional functions are provided to return the net transformation of volumes
|
|---|
| 77 | and for the creation of touchables. None of the functions implicitly requires
|
|---|
| 78 | that the geometry be described hierarchically.
|
|---|
| 79 | <ul>
|
|---|
| 80 | <li><b>SetWorldVolume()</b><br>
|
|---|
| 81 | Sets the first volume in the hierarchy. It must be unrotated and
|
|---|
| 82 | untranslated from the origin.</li>
|
|---|
| 83 | <li><b>LocateGlobalPointAndSetup()</b><br>
|
|---|
| 84 | Locates the volume containing the specified global point. This
|
|---|
| 85 | involves a traverse of the hierarchy, requiring the computation of
|
|---|
| 86 | compound transformations, testing replicated and parameterised volumes
|
|---|
| 87 | (etc). To improve efficiency this search may be performed relative
|
|---|
| 88 | to the last, and this is the recommended way of calling the
|
|---|
| 89 | function. A 'relative' search may be used for the first call of the
|
|---|
| 90 | function which will result in the search defaulting to a search from
|
|---|
| 91 | the root node of the hierarchy.
|
|---|
| 92 | Searches may also be performed using a <tt>G4TouchableHistory</tt>.</li>
|
|---|
| 93 | <li><b>LocateGlobalPointAndUpdateTouchableHandle()</b><br>
|
|---|
| 94 | First, search the geometrical hierarchy like the above method
|
|---|
| 95 | <tt>LocateGlobalPointAndSetup()</tt>. Then use the volume found and its
|
|---|
| 96 | navigation history to update the touchable.</li>
|
|---|
| 97 | <li><B>ComputeStep()</B><BR>
|
|---|
| 98 | Computes the distance to the next boundary intersected along the
|
|---|
| 99 | specified unit direction from a specified point. The point must be
|
|---|
| 100 | have been located prior to calling <tt>ComputeStep()</tt>.<BR>
|
|---|
| 101 | When calling <tt>ComputeStep()</tt>, a proposed physics step is passed.
|
|---|
| 102 | If it can be determined that the first intersection lies at or beyond that
|
|---|
| 103 | distance then <tt>kInfinity</tt> is returned. In any case, if the returned
|
|---|
| 104 | step is greater than the physics step, the physics step must be taken.</li>
|
|---|
| 105 | <li><B>SetGeometricallyLimitedStep()</B><BR>
|
|---|
| 106 | Informs the navigator that the last computed step was taken in its
|
|---|
| 107 | entirety. This enables entering/exiting optimisation, and should be
|
|---|
| 108 | called prior to calling <tt>LocateGlobalPointAndSetup()</tt>.</li>
|
|---|
| 109 | <li><b>CreateTouchableHistory()</b><br>
|
|---|
| 110 | Creates a <tt>G4TouchableHistory</tt> object, for which the caller has
|
|---|
| 111 | deletion responsibility. The 'touchable' volume is the volume returned
|
|---|
| 112 | by the last Locate operation. The object includes a copy of the current
|
|---|
| 113 | NavigationHistory, enabling the efficient relocation of points
|
|---|
| 114 | in/close to the current volume in the hierarchy.</li>
|
|---|
| 115 | </ul>
|
|---|
| 116 | As stated previously, the navigator makes use of utility classes to
|
|---|
| 117 | perform location and step computation functions. The different navigation
|
|---|
| 118 | utilities manipulate the <tt>G4NavigationHistory</tt> object.<BR>
|
|---|
| 119 | In <tt>LocateGlobalPointAndSetup()</tt> the process of locating a
|
|---|
| 120 | point breaks down into three main stages - optimisation,
|
|---|
| 121 | determination that the point is contained with a subtree (mother and
|
|---|
| 122 | daughters), and determination of the actual containing daughter. The
|
|---|
| 123 | latter two can be thought of as scanning first 'up' the hierarchy
|
|---|
| 124 | until a volume that is guaranteed to contain the point is found, and
|
|---|
| 125 | then scanning 'down' until the actual volume that contains the point
|
|---|
| 126 | is found.<BR>
|
|---|
| 127 | In <tt>ComputeStep()</tt> three types of computation are treated
|
|---|
| 128 | depending on the current containing volume:
|
|---|
| 129 | <ul>
|
|---|
| 130 | <li>The volume contains normal (placement) daughters (or none)</li>
|
|---|
| 131 | <li>The volume contains a single parameterised volume object,
|
|---|
| 132 | representing many volumes</li>
|
|---|
| 133 | <li>The volume is a replica and contains normal (placement) daughters</li>
|
|---|
| 134 | </ul>
|
|---|
| 135 | </P>
|
|---|
| 136 |
|
|---|
| 137 | <a name="4.1.8.2">
|
|---|
| 138 | <h3>4.1.8.2 Using the navigator to locate points</h3></a>
|
|---|
| 139 |
|
|---|
| 140 | <P>
|
|---|
| 141 | More than one navigator objects can be created inside an application; these
|
|---|
| 142 | navigators can act independently for different purposes. The main navigator
|
|---|
| 143 | which is <i>activated</i> automatically at the startup of a simulation program
|
|---|
| 144 | is the navigator used for the <i>tracking</i> and attached the world volume
|
|---|
| 145 | of the main tracking (or <i>mass</i>) geometry.<br>
|
|---|
| 146 | The navigator for tracking can be retrieved at any state of the application
|
|---|
| 147 | by messagging the <tt>G4TransportationManager</tt>:
|
|---|
| 148 | <pre>
|
|---|
| 149 | G4Navigator* tracking_navigator =
|
|---|
| 150 | G4TransportationManager::GetInstance()->GetNavigatorForTracking();
|
|---|
| 151 | </pre>
|
|---|
| 152 | The navigator for tracking also retains all the information of the current
|
|---|
| 153 | history of volumes transversed at a precise moment of the tracking during a
|
|---|
| 154 | run. Therefore, if the navigator for tracking is used during tracking for
|
|---|
| 155 | locating a generic point in the tree of volumes, the actual particle gets
|
|---|
| 156 | also -relocated- in the specified position and tracking will be of course
|
|---|
| 157 | affected !<br>
|
|---|
| 158 | In order to avoid the problem above and provide information about location
|
|---|
| 159 | of a point without affecting the tracking, it is suggested to either use an
|
|---|
| 160 | alternative <tt>G4Navigator</tt> object (which can then be assigned to the
|
|---|
| 161 | world-volume), or access the information through the step.
|
|---|
| 162 | </P>
|
|---|
| 163 |
|
|---|
| 164 | <P>
|
|---|
| 165 | <b>Using the 'step' to retrieve geometrical information</b>
|
|---|
| 166 | </P>
|
|---|
| 167 | <P>
|
|---|
| 168 | During the tracking run, geometrical information can be retrieved through
|
|---|
| 169 | the touchable handle associated to the current step. For example, to identify
|
|---|
| 170 | the exact copy-number of a specific physical volume in the mass geometry,
|
|---|
| 171 | one should do the following:
|
|---|
| 172 | <pre>
|
|---|
| 173 | // Given the pointer to the step object ...
|
|---|
| 174 | //
|
|---|
| 175 | G4Step* aStep = ..;
|
|---|
| 176 |
|
|---|
| 177 | // ... retrieve the 'pre-step' point
|
|---|
| 178 | //
|
|---|
| 179 | G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
|
|---|
| 180 |
|
|---|
| 181 | // ... retrieve a touchable handle and access to the information
|
|---|
| 182 | //
|
|---|
| 183 | G4TouchableHandle theTouchable = preStepPoint->GetTouchableHandle();
|
|---|
| 184 | G4int copyNo = theTouchable->GetCopyNumber();
|
|---|
| 185 | G4int motherCopyNo = theTouchable->GetCopyNumber(1);
|
|---|
| 186 | </pre>
|
|---|
| 187 | To determine the exact position in global coordinates in the mass geometry
|
|---|
| 188 | and convert to local coordinates (local to the current volume):
|
|---|
| 189 | <pre>
|
|---|
| 190 | G4ThreeVector worldPosition = preStepPoint->GetPosition();
|
|---|
| 191 | G4ThreeVector localPosition = theTouchable->GetHistory()->
|
|---|
| 192 | GetTopTransform().TransformPoint(worldPosition);
|
|---|
| 193 | </pre>
|
|---|
| 194 | </P>
|
|---|
| 195 |
|
|---|
| 196 | <P>
|
|---|
| 197 | <b>Using an alternative navigator to locate points</b>
|
|---|
| 198 | </P>
|
|---|
| 199 | <P>
|
|---|
| 200 | In order to know (when in the <i>idle</i> state of the application) in which
|
|---|
| 201 | physical volume a given point is located in the detector geometry, it is
|
|---|
| 202 | necessary to create an alternative navigator object first and assign it to
|
|---|
| 203 | the world volume:
|
|---|
| 204 | <pre>
|
|---|
| 205 | G4Navigator* aNavigator = new G4Navigator();
|
|---|
| 206 | aNavigator->SetWorldVolume(worldVolumePointer);
|
|---|
| 207 | </pre>
|
|---|
| 208 | Then, locate the point <tt>myPoint</tt> (defined in global coordinates),
|
|---|
| 209 | retrieve a <i>touchable handle</i> and do whatever you need with it:
|
|---|
| 210 | <pre>
|
|---|
| 211 | aNavigator->LocateGlobalPointAndSetup(myPoint);
|
|---|
| 212 | G4TouchableHistoryHandle aTouchable =
|
|---|
| 213 | aNavigator->CreateTouchableHistoryHandle();
|
|---|
| 214 |
|
|---|
| 215 | // Do whatever you need with it ...
|
|---|
| 216 | // ... convert point in local coordinates (local to the current volume)
|
|---|
| 217 | //
|
|---|
| 218 | G4ThreeVector localPosition = aTouchable->GetHistory()->
|
|---|
| 219 | GetTopTransform().TransformPoint(myPoint);
|
|---|
| 220 |
|
|---|
| 221 | // ... convert back to global coordinates system
|
|---|
| 222 | G4ThreeVector globalPosition = aTouchable->GetHistory()->
|
|---|
| 223 | GetTopTransform().Inverse().TransformPoint(localPosition);
|
|---|
| 224 | </pre>
|
|---|
| 225 | If outside of the tracking run and given a generic local position (local to a
|
|---|
| 226 | given volume in the geometry tree), it is -not- possible to determine a priori
|
|---|
| 227 | its global position and convert it to the global coordinates system.
|
|---|
| 228 | The reason for this is rather simple, nobody can guarantee that the given
|
|---|
| 229 | (local) point is located in the right -copy- of the physical volume !
|
|---|
| 230 | In order to retrieve this information, some extra knowledge related to the
|
|---|
| 231 | absolute position of the physical volume is required first, i.e. one should
|
|---|
| 232 | first determine a global point belonging to that volume, eventually making
|
|---|
| 233 | a dedicated scan of the geometry tree through a dedicated <tt>G4Navigator</tt>
|
|---|
| 234 | object and then apply the method above after having created the touchable for
|
|---|
| 235 | it.
|
|---|
| 236 | </P>
|
|---|
| 237 |
|
|---|
| 238 | <a name="4.1.8.3">
|
|---|
| 239 | <h3>4.1.8.3 Navigation in parallel geometries</h3></a>
|
|---|
| 240 |
|
|---|
| 241 | <P>
|
|---|
| 242 | Since release 8.2 of Geant4, it is possible to define geometry trees which
|
|---|
| 243 | are <i>parallel</i> to the tracking geometry and having them assigned to
|
|---|
| 244 | navigator objects that transparently communicate in sync with the normal
|
|---|
| 245 | tracking geometry.
|
|---|
| 246 | </P>
|
|---|
| 247 | <P>
|
|---|
| 248 | Parallel geometries can be defined for several uses (fast shower
|
|---|
| 249 | parameterisation, geometrical biasing, particle scoring, readout
|
|---|
| 250 | geometries, etc ...) and can <i>overlap</i> with the mass geometry defined
|
|---|
| 251 | for the tracking. The <i>parallel</i> transportation will be activated only
|
|---|
| 252 | after the registration of the parallel geometry in the detector description
|
|---|
| 253 | setup; see Section <a href="parallelWorld.html">4.7</a> for how to define a parallel
|
|---|
| 254 | geometry and register it to the run-manager.<br>
|
|---|
| 255 | The <tt>G4TransportationManager</tt> provides all the utilities to verify,
|
|---|
| 256 | retrieve and activate the navigators associated to the various parallel
|
|---|
| 257 | geometries defined.
|
|---|
| 258 | </P>
|
|---|
| 259 |
|
|---|
| 260 | <a name="4.1.8.4">
|
|---|
| 261 | <h3>4.1.8.4 Run-time commands</h3></a>
|
|---|
| 262 |
|
|---|
| 263 | <P>
|
|---|
| 264 | When running in <i>verbose</i> mode (i.e. the default, <TT>G4VERBOSE</TT>
|
|---|
| 265 | set while installing the Geant4 kernel libraries), the navigator provides
|
|---|
| 266 | a few commands to control its behavior. It is possible to select different
|
|---|
| 267 | verbosity levels (up to 5), with the command:
|
|---|
| 268 | <pre>
|
|---|
| 269 | geometry/navigator/verbose [verbose_level]
|
|---|
| 270 | </pre>
|
|---|
| 271 | or to force the navigator to run in <I>check</I> mode:
|
|---|
| 272 | <pre>
|
|---|
| 273 | geometry/navigator/check_mode [true/false]
|
|---|
| 274 | </pre>
|
|---|
| 275 | The latter will force more strict and less tolerant checks in step/safety
|
|---|
| 276 | computation to verify the correctness of the solids' response in the
|
|---|
| 277 | geometry.<br>
|
|---|
| 278 |
|
|---|
| 279 | By combining <i>check_mode</i> with verbosity level-1, additional verbosity
|
|---|
| 280 | checks on the response from the solids can be activated.
|
|---|
| 281 | <p></p>
|
|---|
| 282 |
|
|---|
| 283 | <hr>
|
|---|
| 284 | <a href="../../../../Authors/html/subjectsToAuthors.html">
|
|---|
| 285 | <i>About the authors</a></i> </P>
|
|---|
| 286 |
|
|---|
| 287 | </body>
|
|---|
| 288 | </html>
|
|---|