GDML Examination
==================

.. contents:: :local:

TODO
----

#. try to create the geometry Russian doll hierarchy (starting from World) from the GDML parse, to grok the format


physvol
--------

::

     2172   <structure>
     2173     <volume name="/dd/Geometry/PoolDetails/lvNearTopCover0xbad46a0">
     2174       <materialref ref="/dd/Materials/PPE0xb8310e0"/>
     2175       <solidref ref="near_top_cover_box0xbad4490"/>
     2176     </volume>
     2177     <volume name="/dd/Geometry/RPC/lvRPCStrip0xb839910">
     2178       <materialref ref="/dd/Materials/MixGas0xbad5d28"/>
     2179       <solidref ref="RPCStrip0xb751cc0"/>
     2180     </volume>
     2181     <volume name="/dd/Geometry/RPC/lvRPCGasgap140xb7491f8">
     2182       <materialref ref="/dd/Materials/Air0xb830740"/>
     2183       <solidref ref="RPCGasgap140xbad5938"/>
     2184       <physvol name="/dd/Geometry/RPC/lvRPCGasgap14#pvStrip14Array#pvStrip14ArrayOne:1#pvStrip14Unit0xbc1e930">
     2185         <volumeref ref="/dd/Geometry/RPC/lvRPCStrip0xb839910"/>
     2186         <position name="/dd/Geometry/RPC/lvRPCGasgap14#pvStrip14Array#pvStrip14ArrayOne:1#pvStrip14Unit0xbc1e930_pos" unit="mm" x="-910" y="0" z="0"/>
     2187         <rotation name="/dd/Geometry/RPC/lvRPCGasgap14#pvStrip14Array#pvStrip14ArrayOne:1#pvStrip14Unit0xbc1e930_rot" unit="deg" x="0" y="0" z="-90"/>
     2188       </physvol>
     2189       <physvol name="/dd/Geometry/RPC/lvRPCGasgap14#pvStrip14Array#pvStrip14ArrayOne:2#pvStrip14Unit0xbc1f8b8">
     2190         <volumeref ref="/dd/Geometry/RPC/lvRPCStrip0xb839910"/>
     2191         <position name="/dd/Geometry/RPC/lvRPCGasgap14#pvStrip14Array#pvStrip14ArrayOne:2#pvStrip14Unit0xbc1f8b8_pos" unit="mm" x="-650" y="0" z="0"/>
     2192         <rotation name="/dd/Geometry/RPC/lvRPCGasgap14#pvStrip14Array#pvStrip14ArrayOne:2#pvStrip14Unit0xbc1f8b8_rot" unit="deg" x="0" y="0" z="-90"/>
     2193       </physvol>


Divide by 2 for open/close XML tags::

    [blyth@belle7 gdml]$ grep physvol $LOCAL_BASE/env/geant4/geometry/gdml/g4_01.gdml | echo $(( $(wc -l)/2 ))
    5642

::

    simon:gdml blyth$ echo "select count(*) from physvol ;" | sqlite3 $LOCAL_BASE/env/geant4/geometry/gdml/g4_01.gdml.db
    5642      

Matches the distinct name count in shapedb from vrml2 file::

    sqlite> select count(*) from shape ;
    12229     
    sqlite> select count(distinct(name)) from shape ;
    5642                 
    sqlite> select count(distinct(hash)) from shape ;
    12223         
    sqlite> select count(distinct(substr(name,0,instr(name,'.')))) from shape  ;
    5642      

ROOT Load of GDML, counts 12230 nodes matching the VRML2 shape count (assume extra 1 is world that was culled in VRML2)::


    root [0]  TGeoManager::Import("/data1/env/local/env/geant4/geometry/gdml/g4_01.gdml")
    Info in <TGeoManager::Import>: Reading geometry from file: /data1/env/local/env/geant4/geometry/gdml/g4_01.gdml
    Info in <TGeoManager::TGeoManager>: Geometry Geometry, default geometry created
    Error: Unsupported GDML Tag Used :isotope. Please Check Geometry/Schema.
    Error: Unsupported GDML Tag Used :atom. Please Check Geometry/Schema.
    Error: Unsupported GDML Tag Used :fraction. Please Check Geometry/Schema.
    ...
    Info in <TGeoManager::SetTopVolume>: Top volume is World. Master volume is World
    Info in <TGeoManager::CheckGeometry>: Fixing runtime shapes...
    Info in <TGeoManager::CheckGeometry>: ...Nothing to fix
    Info in <TGeoManager::CloseGeometry>: Counting nodes...
    Info in <TGeoManager::Voxelize>: Voxelizing...
    Info in <TGeoManager::CloseGeometry>: Building cache...
    Info in <TGeoNavigator::BuildCache>: --- Maximum geometry depth set to 100
    Info in <TGeoManager::CloseGeometry>: 12230 nodes/ 249 volume UID's in default geometry
    Info in <TGeoManager::CloseGeometry>: ----------------modeler ready----------------
    (class TGeoManager*)0x89be148
    root [1] 


VRML2 GDML mismatch ?
----------------------

Hmm, was expecting the phyvol to correspond to the 12k ?

  * so what are all the other VRML2 shapes `12229-5642=6587`
  * clearly the algorithmically transformed/duplicated volumes, eg 2 AD, 672 PMT
  * the structure of the GDML heirarchy of volume/physvol/solid is doing the duplicatation that VRML2 spelt out in shapes

::

    sqlite> select count(*) as N, name, max(dx)||":"||max(dy)||":"||max(dz) as dxyz from xshape group by name having N>1; 
    N           name                                                                                                                                                                                                      dxyz                        
    ----------  ---------------------------------------------------------------------------------------------                                                                                                             ----------------------------
    2           /dd/Geometry/AD/lvADE#pvAdVertiCableTray.1005                                                                                                                                                             66.2000000000007:72.0:5000.0
    2           /dd/Geometry/AD/lvADE#pvCenterCalibE.1001                                                                                                                                                                 798.1:798.0:688.98          
    2           /dd/Geometry/AD/lvADE#pvElectricalDistributionBoxE.1007                                                                                                                                                   608.200000000001:609.0:260.3
    2           /dd/Geometry/AD/lvADE#pvGCatCalibE.1004                         
    ...
    2           /dd/Geometry/AD/lvLSO#pvIAV.1000                                                                                                                                                                          3126.0:3126.0:3174.49    
    2           /dd/Geometry/AD/lvOAV#pvLSO.1000                                                                                                                                                                          3958.9:3959.0:4076.53       
    ...
    672         /dd/Geometry/PMT/lvPmtHemi#pvPmtHemiVacuum.1000                                                                                                                                                           297.0:297.0:292.5           
    672         /dd/Geometry/PMT/lvPmtHemiVacuum#pvPmtHemiBottom.1001                                                                                                                                                     196.100000000002:196.0:196.2
    672         /dd/Geometry/PMT/lvPmtHemiVacuum#pvPmtHemiCathode.1000                                                                                                                                                    196.100000000002:196.0:196.2
    672         /dd/Geometry/PMT/lvPmtHemiVacuum#pvPmtHemiDynode.1002                                                                                                                                                     174.900000000001:175.0:166.0





Maybe the AD split happedns here
----------------------------------

::

    26985       <physvol name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:1#pvLegInOWSUnit0xb905030">
    26986         <volumeref ref="/dd/Geometry/PoolDetails/lvLegInOWSTub0xc4c2208"/>
    26987         <position name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:1#pvLegInOWSUnit0xb905030_pos" unit="mm" x="4713" y="1842" z="-4456"/>
    26988       </physvol>
    26989       <physvol name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:2#pvLegInOWSUnit0xc12ecb0">
    26990         <volumeref ref="/dd/Geometry/PoolDetails/lvLegInOWSTub0xc4c2208"/>
    26991         <position name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:2#pvLegInOWSUnit0xc12ecb0_pos" unit="mm" x="1029" y="1842" z="-4456"/>
    26992         <rotation name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:2#pvLegInOWSUnit0xc12ecb0_rot" unit="deg" x="0" y="0" z="-90"/>
    26993       </physvol>
    26994       <physvol name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:3#pvLegInOWSUnit0xb76f880">
    26995         <volumeref ref="/dd/Geometry/PoolDetails/lvLegInOWSTub0xc4c2208"/>
    26996         <position name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:3#pvLegInOWSUnit0xb76f880_pos" unit="mm" x="1029" y="-1842" z="-4456"/>
    26997         <rotation name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:3#pvLegInOWSUnit0xb76f880_rot" unit="deg" x="0" y="0" z="-180"/>
    26998       </physvol>
    26999       <physvol name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:4#pvLegInOWSUnit0xc4c26e0">
    27000         <volumeref ref="/dd/Geometry/PoolDetails/lvLegInOWSTub0xc4c2208"/>
    27001         <position name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:4#pvLegInOWSUnit0xc4c26e0_pos" unit="mm" x="4713" y="-1842" z="-4456"/>
    27002         <rotation name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE1OWSLegs#pvLegInOWS:4#pvLegInOWSUnit0xc4c26e0_rot" unit="deg" x="0" y="0" z="90"/>
    27003       </physvol>
    27004       <physvol name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:1#pvLegInOWSUnit0xc4c27e0">
    27005         <volumeref ref="/dd/Geometry/PoolDetails/lvLegInOWSTub0xc4c2208"/>
    27006         <position name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:1#pvLegInOWSUnit0xc4c27e0_pos" unit="mm" x="-1029" y="1842" z="-4456"/>
    27007       </physvol>
    27008       <physvol name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:2#pvLegInOWSUnit0xc4c2890">
    27009         <volumeref ref="/dd/Geometry/PoolDetails/lvLegInOWSTub0xc4c2208"/>
    27010         <position name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:2#pvLegInOWSUnit0xc4c2890_pos" unit="mm" x="-4713" y="1842" z="-4456"/>
    27011         <rotation name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:2#pvLegInOWSUnit0xc4c2890_rot" unit="deg" x="0" y="0" z="-90"/>
    27012       </physvol>
    27013       <physvol name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:3#pvLegInOWSUnit0xc4c2990">
    27014         <volumeref ref="/dd/Geometry/PoolDetails/lvLegInOWSTub0xc4c2208"/>
    27015         <position name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:3#pvLegInOWSUnit0xc4c2990_pos" unit="mm" x="-4713" y="-1842" z="-4456"/>
    27016         <rotation name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:3#pvLegInOWSUnit0xc4c2990_rot" unit="deg" x="0" y="0" z="-180"/>
    27017       </physvol>
    27018       <physvol name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:4#pvLegInOWSUnit0xc4c2a90">
    27019         <volumeref ref="/dd/Geometry/PoolDetails/lvLegInOWSTub0xc4c2208"/>
    27020         <position name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:4#pvLegInOWSUnit0xc4c2a90_pos" unit="mm" x="-1029" y="-1842" z="-4456"/>
    27021         <rotation name="/dd/Geometry/Pool/lvNearPoolOWS#pvNearADE2OWSLegs#pvLegInOWS:4#pvLegInOWSUnit0xc4c2a90_rot" unit="deg" x="0" y="0" z="90"/>
    27022       </physvol>





Pick a volume to see whats going down in the GDML
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

::

    simon:~ blyth$ echo "select id,uname,name from physvol where name like '/dd/Geometry/AD/lvOAV#pvLSO%' ;" |  sqlite3 $LOCAL_BASE/env/geant4/geometry/gdml/g4_01.gdml.db
    377 /dd/Geometry/AD/lvOAV#pvLSO0xba431e8  /dd/Geometry/AD/lvOAV#pvLSO

::

     4064     <volume name="/dd/Geometry/AD/lvOAV0xb78abc0">
     4065       <materialref ref="/dd/Materials/Acrylic0xb85a2d8"/>
     4066       <solidref ref="oav0xb78bb68"/>
     4067       <physvol name="/dd/Geometry/AD/lvOAV#pvLSO0xba431e8">
     4068         <volumeref ref="/dd/Geometry/AD/lvLSO0xbac5950"/>
     4069         <position name="/dd/Geometry/AD/lvOAV#pvLSO0xba431e8_pos" unit="mm" x="0" y="0" z="31.5"/>
     4070       </physvol>
     4071       <physvol name="/dd/Geometry/AD/lvOAV#pvOcrGdsLsoInOav0xbc16ab8">
     4072         <volumeref ref="/dd/Geometry/AdDetails/lvOcrGdsLsoInOav0xbc15650"/>
     4073         <position name="/dd/Geometry/AD/lvOAV#pvOcrGdsLsoInOav0xbc16ab8_pos" unit="mm" x="0" y="0" z="2024.81037191693"/>
     4074       </physvol>
     4075       <physvol name="/dd/Geometry/AD/lvOAV#pvOcrCalLsoInOav0xbc16860">
     4076         <volumeref ref="/dd/Geometry/AdDetails/lvOcrCalLsoInOav0xbc172a0"/>
     4077         <position name="/dd/Geometry/AD/lvOAV#pvOcrCalLsoInOav0xbc16860_pos" unit="mm" x="0" y="0" z="2024.81037191693"/>
     4078       </physvol>
     4079     </volume>






Compare VRML2 shape names with physvol names
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

::

    simon:gdml blyth$ vi ~/.sqliterc  # avoid truncation with ".width 256" 
    simon:gdml blyth$ echo "select distinct(name) from physvol order by name ;" | sqlite3 $LOCAL_BASE/env/geant4/geometry/gdml/g4_01.gdml.db > physvol_names

    simon:gdml blyth$ scp N:/data1/env/local/env/geant4/geometry/vrml2/g4_01.db /usr/local/env/geant4/geometry/vrml2/
    simon:gdml blyth$ echo "select distinct(name) from shape order by name ;" | sqlite3 $LOCAL_BASE/env/geant4/geometry/vrml2/g4_01.db > shape_names


Apparently the VRML2 names have been de-duped via the `.1005` etc::

    simon:gdml blyth$ diff -y physvol_names shape_names | head -10 
    name                                                            name                                                         
    -------------------------------------------------------------   -------------------------------------------------------------
    /dd/Geometry/AD/lvADE#pvAdVertiCableTray                      | /dd/Geometry/AD/lvADE#pvAdVertiCableTray.1005                
    /dd/Geometry/AD/lvADE#pvCenterCalibE                          | /dd/Geometry/AD/lvADE#pvCenterCalibE.1001                    
    /dd/Geometry/AD/lvADE#pvElectricalDistributionBoxE            | /dd/Geometry/AD/lvADE#pvElectricalDistributionBoxE.1007      
    /dd/Geometry/AD/lvADE#pvGCatCalibE                            | /dd/Geometry/AD/lvADE#pvGCatCalibE.1004                      
    /dd/Geometry/AD/lvADE#pvGasDistributionBoxE                   | /dd/Geometry/AD/lvADE#pvGasDistributionBoxE.1006             
    /dd/Geometry/AD/lvADE#pvMOClarityBoxE                         | /dd/Geometry/AD/lvADE#pvMOClarityBoxE.1008                   
    /dd/Geometry/AD/lvADE#pvOffCenterCalibE                       | /dd/Geometry/AD/lvADE#pvOffCenterCalibE.1003                 
    /dd/Geometry/AD/lvADE#pvOflTnkContainer                       | /dd/Geometry/AD/lvADE#pvOflTnkContainer.1002                 

    simon:gdml blyth$ diff -y physvol_names shape_names | tail -10 
    /dd/Geometry/Sites/lvNearHallBot#pvNearHallRadSlabs#pvNearHal | /dd/Geometry/Sites/lvNearHallBot#pvNearHallRadSlabs#pvNearHal
    /dd/Geometry/Sites/lvNearHallBot#pvNearPoolDead               | /dd/Geometry/Sites/lvNearHallBot#pvNearPoolDead.1000         
    /dd/Geometry/Sites/lvNearHallTop#pvNearRPCRoof                | /dd/Geometry/Sites/lvNearHallTop#pvNearRPCRoof.1003          
    /dd/Geometry/Sites/lvNearHallTop#pvNearRPCSptRoof             | /dd/Geometry/Sites/lvNearHallTop#pvNearRPCSptRoof.1004       
    /dd/Geometry/Sites/lvNearHallTop#pvNearTeleRpc#pvNearTeleRpc: | /dd/Geometry/Sites/lvNearHallTop#pvNearTeleRpc#pvNearTeleRpc:
    /dd/Geometry/Sites/lvNearHallTop#pvNearTeleRpc#pvNearTeleRpc: | /dd/Geometry/Sites/lvNearHallTop#pvNearTeleRpc#pvNearTeleRpc:
    /dd/Geometry/Sites/lvNearHallTop#pvNearTopCover               | /dd/Geometry/Sites/lvNearHallTop#pvNearTopCover.1000         
    /dd/Geometry/Sites/lvNearSiteRock#pvNearHallBot               | /dd/Geometry/Sites/lvNearSiteRock#pvNearHallBot.1001         
    /dd/Geometry/Sites/lvNearSiteRock#pvNearHallTop               | /dd/Geometry/Sites/lvNearSiteRock#pvNearHallTop.1000         
    /dd/Structure/Sites/db-rock                                   | /dd/Structure/Sites/db-rock.1000                             
    simon:gdml blyth$ 


Using a very recent sqlite3 (for the *instr* function) chop off the VRML2 de-dupe::

    [blyth@belle7 gdml]$ sqlite3-path
    [blyth@belle7 gdml]$ sqlite3 -version
    -- Loading resources from /home/blyth/.sqliterc

    3.8.0.2 2013-09-03 17:11:13 7dd4968f235d6e1ca9547cda9cf3bd570e1609ef

    [blyth@belle7 gdml]$ vi ~/.sqliterc
    [blyth@belle7 gdml]$ echo "select distinct(substr(name,0,instr(name,'.'))) as name from shape order by name ;" | sqlite3 $LOCAL_BASE/env/geant4/geometry/vrml2/g4_01.db  > shape_names_2
    simon:gdml blyth$ scp N:env/geant4/geometry/gdml/shape_names_2 .
    simon:gdml blyth$ diff physvol_names shape_names_2
    simon:gdml blyth$ 

Thus there are exactly the same VRML2 de-duped distinct shape names as GDML physvol names.



volume names
---------------

Only 249 `volume/\@name` in the GDML::

    simon:gdml blyth$ grep volume\  $LOCAL_BASE/env/geant4/geometry/gdml/g4_01.gdml
        <volume name="/dd/Geometry/PoolDetails/lvNearTopCover0xbad46a0">
        <volume name="/dd/Geometry/RPC/lvRPCStrip0xb839910">
        <volume name="/dd/Geometry/RPC/lvRPCGasgap140xb7491f8">
        <volume name="/dd/Geometry/RPC/lvRPCBarCham140xbad5978">
        <volume name="/dd/Geometry/RPC/lvRPCGasgap230xb83ee78">
        ...
        <volume name="/dd/Geometry/RadSlabs/lvNearRadSlab80xc505ff8">
        <volume name="/dd/Geometry/RadSlabs/lvNearRadSlab90xc632930">
        <volume name="/dd/Geometry/Sites/lvNearHallBot0xb7dd4a8">
        <volume name="/dd/Geometry/Sites/lvNearSiteRock0xb82e578">
        <volume name="World0xc6337a8">
    simon:gdml blyth$ grep volume\  $LOCAL_BASE/env/geant4/geometry/gdml/g4_01.gdml | wc -l
         249

    simon:gdml blyth$ echo "select count(*) from volume ;" | sqlite3 /usr/local/env/geant4/geometry/gdml/g4_01.gdml.db 
    249