From ggv-g4gun-notes:
ggv-;ggv-g4gun
      # geant4 particle gun simulation within default DYB geometry, loaded from GDML
ggv-;ggv-g4gun --load --target 3153
      # visualize the geant4 propagation, with GGeoView
      # see also issues/nopstep_vis_debug.rst
ggv-;ggv-g4gun --dbg --load --target 3153 --optixviz
      # attempting to load the CFG4 Geant4/CPU simulated nopstep,photons,records,history
      # needs the optixviz in order to setup OpEngine for indexing the history sequence
      #
      # TODO: revive/re-implement CPU indexer, so can do the lot without GPU (albeit very slowly)
position/time/wavelength domains:
simon:cfg4 blyth$ ii
SQLITE3_DATABASE=/usr/local/env/nuwa/mocknuwa.db
Python 2.7.11 (default, Dec  5 2015, 23:51:51)
Type "copyright", "credits" or "license" for more information.
IPython 1.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
IPython profile: g4opticks
In [1]: run g4gun.py
Evt(-1,"G4Gun","G4Gun","G4Gun/G4Gun/-1 : ", seqs="[]")
 fdom :       (3, 1, 4) : (metadata) 3*float4 domains of position, time, wavelength (used for compression)
 idom :       (1, 1, 4) : (metadata) int domain
   ox :      (96, 4, 4) : (photons) final photon step
   wl :           (96,) : (photons) wavelength
 post :         (96, 4) : (photons) final photon step: position, time
 dirw :         (96, 4) : (photons) final photon step: direction, weight
 polw :         (96, 4) : (photons) final photon step: polarization, wavelength
flags :           (96,) : (photons) final photon step: flags
   c4 :           (96,) : (photons) final photon step: dtype split uint8 view of ox flags
   rx :  (96, 10, 2, 4) : (records) photon step records
   ph :      (96, 1, 2) : (records) photon history flag/material sequence
In [2]: evt.fdom
Out[2]:
A(fdomG4Gun,-1,G4Gun)(metadata) 3*float4 domains of position, time, wavelength (used for compression)
A([[[ -16520.   , -802110.   ,   -7125.   ,    7710.625]],
       [[      0.   ,     200.   ,      50.   ,       0.   ]],
       [[     60.   ,     820.   ,      20.   ,     760.   ]]], dtype=float32)
Previously lacked positional domain (center,extent) causing all positions are at origin:
In [8]: evt.rpost_(slice(0,5))
Out[8]:
A()sliced
A([[[  0.   ,   0.   ,   0.   ,   0.012],
        [  0.   ,   0.   ,   0.   ,   8.264],
        [  0.   ,   0.   ,   0.   ,   8.319],
        [  0.   ,   0.   ,   0.   ,  10.566],
        [  0.   ,   0.   ,   0.   ,  10.663]],
       [[  0.   ,   0.   ,   0.   ,   6.738],
        [  0.   ,   0.   ,   0.   ,   6.97 ],
        [  0.   ,   0.   ,   0.   ,   8.319],
        [  0.   ,   0.   ,   0.   ,  10.566],
        [  0.   ,   0.   ,   0.   ,  10.663]],
After fix:
In [3]: evt.rpost_(slice(0,5))
Out[3]:
A()sliced
A([[[ -18079.444, -799699.415,   -6603.538,       0.012],
        [ -19508.758, -800298.767,   -6191.734,       8.264],
        [ -19518.171, -800302.767,   -6189.145,       8.319],
        [ -19907.15 , -800465.842,   -6077.134,      10.566],
        [ -19923.857, -800472.901,   -6072.193,      10.663]],
       [[ -18079.444, -799699.415,   -6604.95 ,       6.738],
        [ -18094.034, -799738.477,   -6590.831,       6.97 ],
        [ -19518.171, -800302.767,   -6189.145,       8.319],
        [ -19907.15 , -800465.842,   -6077.134,      10.566],
        [ -19923.857, -800472.901,   -6072.193,      10.663]],
       [[ -18079.444, -799699.415,   -6603.538,       4.895],
        [ -18839.753, -799749.773,   -8635.028,      16.254],
        [ -18845.4  , -799750.008,   -8650.088,      16.34 ],
        [ -18999.533, -799760.362,   -9062.128,      18.647],
        [ -19923.857, -800472.901,   -6072.193,      10.663]],
       ...,
       [[ -18109.565, -799757.538,   -6583.065,       3.821],
        [ -18120.86 , -799746.714,   -6584.713,       3.906],
        [ -17526.215, -801158.144,   -8181.102,      25.373],
        [ -17410.674, -801565.242,   -8713.624,      28.864],
        [ -17405.732, -801582.655,   -8735.979,      29.011]],
       [[ -18038.029, -799830.957,   -6568.476,       1.508],
        [ -19382.158, -800539.496,   -6052.191,       9.723],
        [ -19390.865, -800544.202,   -6048.896,       9.778],
        [ -19765.489, -800741.633,   -5905.118,      12.067],
        [ -19781.255, -800749.869,   -5899.   ,      12.165]],
       [[ -18058.972, -799810.72 ,   -6608.48 ,      41.279],
        [ -18061.09 , -799810.014,   -6609.186,      41.298],
        [ -19390.865, -800544.202,   -6048.896,       9.778],
        [ -19765.489, -800741.633,   -5905.118,      12.067],
        [ -19781.255, -800749.869,   -5899.   ,      12.165]]])
When operating triangulated its easy to know the positions of all geometry, ggv- gets center extent from GMergedMesh:
532 void App::registerGeometry()
533 {
...
538     m_mesh0 = m_ggeo->getMergedMesh(0);
539
540     m_ggeo->setComposition(m_composition);
541
542     gfloat4 ce0 = m_mesh0->getCenterExtent(0);  // 0 : all geometry of the mesh, >0 : specific volumes
543     m_opticks->setSpaceDomain( glm::vec4(ce0.x,ce0.y,ce0.z,ce0.w) );
544
545     if(m_evt)
546     {
547        // TODO: migrate npy-/NumpyEvt to opop-/OpEvent so this can happen at more specific level
548         m_opticks->dumpDomains("App::registerGeometry copy Opticks domains to m_evt");
549         m_evt->setSpaceDomain(m_opticks->getSpaceDomain());
550     }
551
760 void GMesh::updateBounds()
761 {
762     gbbox   bb = findBBox(m_vertices, m_num_vertices);
763     gfloat4 ce = bb.center_extent() ;
764
When running with G4/GDML have entirely analytic geometry. Have transforms for all volumes, so can get centers of volumes by applying them to (0,0,0,1) but this does not provide extents ? Differences between multiple volumes would get close.
To get extents need to dynamically cast solids into specific shapes.
op --cgdmldetector
But the compression is only applied to optical photon steps. So should apply equivalent geometrical selection to GDML
126 op-geometry-query-dyb()
127 {
128     case $1 in
129         DYB)  echo "range:3153:12221"  ;;
130        IDYB)  echo "range:3158:3160" ;;  # 2 volumes : pvIAV and pvGDS
131        JDYB)  echo "range:3158:3159" ;;  # 1 volume : pvIAV
132        KDYB)  echo "range:3159:3160" ;;  # 1 volume : pvGDS
133        LDYB)  echo "range:3156:3157" ;;  # 1 volume : pvOAV
134        MDYB)  echo "range:3201:3202,range:3153:3154"  ;;  # 2 volumes : first pmt-hemi-cathode and ADE
135     esac
136     # range:3154:3155  SST  Stainless Steel/IWSWater not a good choice for an envelope, just get BULK_ABSORB without going anywhere
137 }
138
139 op-geometry-setup-dyb()
140 {
141     local geo=${1:-DYB}
142     export OPTICKS_GEOKEY=DAE_NAME_DYB
143     export OPTICKS_QUERY=$(op-geometry-query-dyb $geo)
Access with OpticksResource::getQuery Argh, query parsing done in assimprap-/AssimpSelection.
In [1]: run g4gun.py
Evt(-1,"G4Gun","G4Gun","G4Gun/G4Gun/-1 : ", seqs="[]")
 fdom :       (3, 1, 4) : (metadata) float domain
 idom :       (1, 1, 4) : (metadata) int domain
   ox :      (96, 4, 4) : (photons) final photon step
   wl :           (96,) : (photons) wavelength
 post :         (96, 4) : (photons) final photon step: position, time
 dirw :         (96, 4) : (photons) final photon step: direction, weight
 polw :         (96, 4) : (photons) final photon step: polarization, wavelength
flags :           (96,) : (photons) final photon step: flags
   c4 :           (96,) : (photons) final photon step: dtype split uint8 view of ox flags
   rx :  (96, 10, 2, 4) : (records) photon step records
   ph :      (96, 1, 2) : (records) photon history flag/material sequence