10from argparse
import ArgumentParser
11from array
import array
18 nav = ROOT.gGeoManager.GetCurrentNavigator()
20 Info[
"node"] = nav.GetCurrentNode()
22 tmp = Info[
"node"].GetVolume().GetShape()
23 Info[
"material"] = Info[
"node"].GetVolume().GetMaterial().GetName()
25 x = ROOT.gGeoManager.GetVerboseLevel()
26 ROOT.gGeoManager.SetVerboseLevel(0)
27 Info[
"weight"] = Info[
"node"].GetVolume().Weight()
28 Info[
"cubicmeter"] = Info[
"node"].GetVolume().Capacity() / 1000000.0
29 ROOT.gGeoManager.SetVerboseLevel(x)
30 o = [tmp.GetOrigin()[0], tmp.GetOrigin()[1], tmp.GetOrigin()[2]]
33 globOrigin = array(
"d", [0, 0, 0])
34 nav.LocalToMaster(local, globOrigin)
35 Info[
"origin"] = globOrigin
37 [-tmp.GetDX() + o[0], o[1], o[2]],
38 [tmp.GetDX() + o[0], o[1], o[2]],
39 [o[0], -tmp.GetDY() + o[1], o[2]],
40 [o[0], tmp.GetDY() + o[1], o[2]],
41 [o[0], o[1], -tmp.GetDZ() + o[2]],
42 [o[0], o[1], tmp.GetDZ() + o[2]],
47 glob = array(
"d", [0, 0, 0])
48 nav.LocalToMaster(local, glob)
49 shifted.append([glob[0], glob[1], glob[2]])
50 Info[
"boundingbox"] = {}
59 Info[
"boundingbox"][j] = [jmin, jmax]
63def print_info(path: str, node, level: int, currentlevel: int, print_sub_det_info=
False) ->
None:
66 for subnode
in node.GetNodes():
67 name = subnode.GetName()
69 sub_nodes[name] = fullInfo[name][
"origin"][2]
71 for name, _
in sorted(sub_nodes.items(), key=operator.itemgetter(1)):
72 boundingbox = fullInfo[name][
"boundingbox"]
75 "{:<28s}: z={:10.4F}cm dZ={:10.4F}cm [{:10.4F} {:10.4F}]"
76 +
" dx={:10.4F}cm [{:10.4F} {:10.4F}] dy={:10.4F}cm [{:10.4F} {:10.4F}] {:>20s}"
80 " " * int(currentlevel) + name,
81 fullInfo[name][
"origin"][2],
82 abs(boundingbox[2][0] - boundingbox[2][1]) / 2.0,
85 abs(boundingbox[0][0] - boundingbox[0][1]) / 2.0,
88 abs(boundingbox[1][0] - boundingbox[1][1]) / 2.0,
91 fullInfo[name][
"material"],
95 cubicmeter = fullInfo[name][
"cubicmeter"]
96 weight = fullInfo[name][
"weight"]
97 format_string +=
" {:10.1F}kg {:10.1F}m3"
98 format_variable.extend([weight, cubicmeter])
100 print(format_string.format(*format_variable))
102 if options.volume
in [
"", name]:
103 print_sub_det_info =
True
105 if print_sub_det_info
and currentlevel < level
and fullInfo[name][
"node"].GetNodes():
106 print_info(fullInfo[name][
"path"], fullInfo[name][
"node"], level, currentlevel + 1, print_sub_det_info)
108 if currentlevel == 0:
109 print_sub_det_info =
False
112parser = ArgumentParser()
113parser.add_argument(
"-g",
"--geometry", help=
"Input geometry file", required=
True)
114parser.add_argument(
"-l",
"--level", help=
"Max subnode level", default=0)
115parser.add_argument(
"-v",
"--volume", help=
"Name of node to expand", default=
"")
116parser.add_argument(
"-X",
"--moreInfo", help=
"Print weight and capacity", action=
"store_true")
118options = parser.parse_args()
119fname = options.geometry
120fgeom = ROOT.TFile.Open(fname)
121fGeo = fgeom.Get(
"FAIRGeom")
122top = fGeo.GetTopVolume()
127 " Detector element z(midpoint) halflength volume-start volume-end dx"
128 " x-start x-end dy y-start y-end material weight capacity"
132 " Detector element z(midpoint) halflength volume-start volume-end dx"
133 " x-start x-end dy y-start y-end material"
137print_info(
"", top, int(options.level), currentlevel)