Skip to content

Geometry

pybes3 provides a set of methods to retrieve theoretical geometry information of detectors.

The unit of length is cm.

MDC

GID conversion

import numpy as np
import pybes3 as p3

# generate random wire gid
gid = np.random.randint(0, 6796, 100)

# get layer, wire, stereo, is_stereo
layer = p3.mdc_gid_to_layer(gid)
wire = p3.mdc_gid_to_wire(gid)
stereo = p3.mdc_gid_to_stereo(gid)
is_stereo = p3.mdc_gid_to_is_stereo(gid)
superlayer = p3.mdc_gid_to_superlayer(gid)

# is_stereo can also be obtained by layer
is_stereo = p3.mdc_layer_to_is_stereo(layer)

# superlayer can also be obtained by layer
superlayer = p3.mdc_layer_to_superlayer(layer)

# get gid
gid = p3.get_mdc_gid(layer, wire)

Note

mdc_gid_to_stereo returns the stereo type of the wire, which can be 0 (axial), -1 for west_phi < east_phi and 1 for west_phi > east_phi.

Wires position

To get west/east x, y, z of wires:

# get west x, y, z
west_x = p3.mdc_gid_to_west_x(gid)
west_y = p3.mdc_gid_to_west_y(gid)
west_z = p3.mdc_gid_to_west_z(gid)

# get east x, y, z
east_x = p3.mdc_gid_to_east_x(gid)
east_y = p3.mdc_gid_to_east_y(gid)
east_z = p3.mdc_gid_to_east_z(gid)

To get x, y of wires at a specific z:

# get x, y of wire 0 at z = -1, 0, 1 cm
z = np.array([-1, 0, 1])
x = p3.mdc_gid_z_to_x(0, z)
y = p3.mdc_gid_z_to_y(0, z)

# get x, y of wires at z = 10 cm
x_z10 = p3.mdc_gid_z_to_x(gid, 10)
y_z10 = p3.mdc_gid_z_to_y(gid, 10)

You can get the whole wires position table of MDC:

# get table in `dict[str, np.ndarray]`
wire_position_np = p3.get_mdc_wire_position() 

# get table in `ak.Array`
wire_position_ak = p3.get_mdc_wire_position(library="ak")

# get table in `pd.DataFrame`
wire_position_pd = p3.get_mdc_wire_position(library="pd")

EMC

GID conversion

import numpy as np
import pybes3 as p3

# generate random crystal gid
gid = np.random.randint(0, 6240, 100)

# get part, theta, phi
part = p3.emc_gid_to_part(gid)
theta = p3.emc_gid_to_theta(gid)
phi = p3.emc_gid_to_phi(gid)

# get gid
gid = p3.get_emc_gid(part, theta, phi)

Crystals position

To get front center, center x, y, z of crystals:

# get front center x, y, z
front_center_x = p3.emc_gid_to_front_center_x(gid)
front_center_y = p3.emc_gid_to_front_center_y(gid)
front_center_z = p3.emc_gid_to_front_center_z(gid)

# get center x, y, z
center_x = p3.emc_gid_to_center_x(gid)
center_y = p3.emc_gid_to_center_y(gid)
center_z = p3.emc_gid_to_center_z(gid)

There are total 8 points on a crystal, you can get x, y, z of these points:

# get x, y, z of point-0 of crystals
x0 = p3.emc_gid_to_point_x(gid, 0)
y0 = p3.emc_gid_to_point_y(gid, 0)
z0 = p3.emc_gid_to_point_z(gid, 0)

# get x, y, z of point-7 of crystals
x7 = p3.emc_gid_to_point_x(gid, 7)
y7 = p3.emc_gid_to_point_y(gid, 7)
z7 = p3.emc_gid_to_point_z(gid, 7)

# get x, y, z of all 8 points of crystal 0
point_id = np.arange(8)
x = p3.emc_gid_to_point_x(0, point_id)
y = p3.emc_gid_to_point_y(0, point_id)
z = p3.emc_gid_to_point_z(0, point_id)

You can get the whole crystals position table of EMC:

# get table in `dict[str, np.ndarray]`
crystal_position_np = p3.get_emc_crystal_position()

# get table in `ak.Array`
crystal_position_ak = p3.get_emc_crystal_position(library="ak")

# get table in `pd.DataFrame`
crystal_position_pd = p3.get_emc_crystal_position(library="pd")

Barrel geometry

Some geometry constants of EMC barrel can be obtained:

p3.emc_barrel_h1
p3.emc_barrel_h2
p3.emc_barrel_h3
p3.emc_barrel_l
p3.emc_barrel_r
p3.emc_barrel_offset_1
p3.emc_barrel_offset_2

These constants are exported from EmcRecGeoSvc in BOSS.