G4GUN Debug ============ Integration starting point : pure g4gun ----------------------------------------- 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) Evt debug with npy-/g4gun.py ----------------------------- domains ~~~~~~~~~ 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]]]) Opticks Space Domain ----------------------- 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 G4/GDML Space Domain ------------------------ 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. * actually: used capabilities of *G4VSolid* in *cg4-/CSolid* :: op --cgdmldetector Geometry Selection -------------------- * G4 needs the whole geometry * Op only needs the part relevant to optical photons, typically run with geometrical volume selection 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. * to avoid duplication moved selection into *OpticksQuery* for use from *assimprap-* and *cg4-* shape ~~~~~ :: 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