def test_ascending(): 'Test ascending iteration of volumes' g = construct.Geometry() box = g.shapes.Box("box",'1mm','2mm','3mm') top = g.structure.Volume('top', material='air', shape=box) vol = top for dn in range(3): d = g.structure.Volume('daughter_%d' % dn, material='air', shape=box) top.placements.append(g.structure.Placement('place_%d'%dn, volume=d).name) top.placements.append(g.structure.Placement('again_%d'%dn, volume=d).name) for gdn in range(2): gd = g.structure.Volume('granddaughter_%d_%d' % (dn, gdn), material='air', shape=box) d.placements.append(g.structure.Placement('place_%d_%d' % (dn, gdn), volume=gd).name) seen = set() for vol in ascending(g.store.structure, top): print vol if vol.name in seen: raise ValueError, "Seen again: %s" % vol.name seen.add(vol.name) #print g.store.structure vols = list(ascending_all(g.store.structure, top)) #print '\n'.join([v.name for v in vols]) assert len(vols) == 19, len(vols) assert vols[-1].name == 'top'
def test_ascending(): 'Test ascending iteration of volumes' g = construct.Geometry() box = g.shapes.Box("box",'1mm','2mm','3mm') top = g.structure.Volume('top', material='air', shape=box) vol = top for dn in range(3): d = g.structure.Volume('daughter_%d' % dn, material='air', shape=box) top.placements.append(g.structure.Placement('place_%d'%dn, volume=d).name) top.placements.append(g.structure.Placement('again_%d'%dn, volume=d).name) for gdn in range(2): gd = g.structure.Volume('granddaughter_%d_%d' % (dn, gdn), material='air', shape=box) d.placements.append(g.structure.Placement('place_%d_%d' % (dn, gdn), volume=gd).name) seen = set() for vol in ascending(g.store.structure, top): print (vol) if vol.name in seen: raise (ValueError, "Seen again: %s" % vol.name) seen.add(vol.name) #print (g.store.structure) vols = list(ascending_all(g.store.structure, top)) #print ('\n'.join([v.name for v in vols])) assert len(vols) == 19, len(vols) assert vols[-1].name == 'top'
def convert(geom): ''' Return an lxml.etree formed from the geometry ''' gdml_node = etree.Element("gdml") # I have no idea what this means but it reproduces what other GDML # files have and w/out it Geant4 complains. gdml_node.set('{http://www.w3.org/2001/XMLSchema-instance}noNamespaceSchemaLocation', 'http://service-spi.web.cern.ch/service-spi/app/releases/GDML/schema/gdml.xsd') # <define> define_node = etree.Element('define') gdml_node.append(define_node) center = identity = None for name, obj in geom.store.structure.items(): typename = type(obj).__name__.lower() node = None if typename == 'position': node = etree.Element('position', **nt_qunit2xmldict(obj, 'cm')) if obj.name == 'center': center = obj if typename == 'rotation': node = etree.Element('rotation', **nt_qunit2xmldict(obj, 'degree')) if obj.name == 'identity': identity = obj if node is not None: define_node.append(node) continue if center is None: define_node.append(etree.Element('position', name='center')) if identity is None: define_node.append(etree.Element('rotation', name='identity')) # <materials> materials_node = etree.Element('materials') gdml_node.append(materials_node) for name, obj in geom.store.matter.items(): node = make_material_node(obj) if node is not None: materials_node.append(node) # <solids> solids_node = etree.Element('solids') gdml_node.append(solids_node) for obj in geom.store.shapes.values(): node = make_shape_node(obj) if node is not None: solids_node.append(node) # <structure> structure_node = etree.Element('structure') gdml_node.append(structure_node) for vol in ascending(geom.store.structure, geom.world): assert vol node = make_volume_node(vol, geom.store.structure) if node is not None: structure_node.append(node) # <setup> setup_node = etree.Element('setup', name="Default", version="0") gdml_node.append(setup_node) world_node = etree.Element('world', ref=geom.world) setup_node.append(world_node) return gdml_node
def convert(geom): ''' Return an lxml.etree formed from the geometry ''' gdml_node = etree.Element("gdml") # I have no idea what this means but it reproduces what other GDML # files have and w/out it Geant4 complains. gdml_node.set( '{http://www.w3.org/2001/XMLSchema-instance}noNamespaceSchemaLocation', 'http://service-spi.web.cern.ch/service-spi/app/releases/GDML/schema/gdml.xsd' ) # <define> define_node = etree.Element('define') gdml_node.append(define_node) center = identity = None for name, obj in geom.store.structure.items(): typename = type(obj).__name__.lower() node = None if typename == 'position': node = etree.Element('position', **nt_qunit2xmldict(obj, 'cm')) if obj.name == 'center': center = obj if typename == 'rotation': node = etree.Element('rotation', **nt_qunit2xmldict(obj, 'degree')) if obj.name == 'identity': identity = obj if node is not None: define_node.append(node) continue if center is None: define_node.append(etree.Element('position', name='center')) if identity is None: define_node.append(etree.Element('rotation', name='identity')) # <materials> materials_node = etree.Element('materials') gdml_node.append(materials_node) for name, obj in geom.store.matter.items(): node = make_material_node(obj) if node is not None: materials_node.append(node) # <solids> solids_node = etree.Element('solids') gdml_node.append(solids_node) for obj in geom.store.shapes.values(): node = make_shape_node(obj) if node is not None: solids_node.append(node) # <structure> structure_node = etree.Element('structure') gdml_node.append(structure_node) for vol in ascending(geom.store.structure, geom.world): assert vol node = make_volume_node(vol, geom.store.structure) if node is not None: structure_node.append(node) # <setup> setup_node = etree.Element('setup', name="Default", version="0") gdml_node.append(setup_node) world_node = etree.Element('world', ref=geom.world) setup_node.append(world_node) return gdml_node