Skip to content

Commit

Permalink
subarray takes EarthLocations as tel pos
Browse files Browse the repository at this point in the history
  • Loading branch information
StFroese committed Oct 25, 2023
1 parent 973332b commit 25fc030
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 6 deletions.
15 changes: 9 additions & 6 deletions ctapipe/instrument/subarray.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ def __init__(
----------
name : str
name of this subarray
tel_positions : Dict[int, np.ndarray]
dict of x,y,z telescope positions on the ground by tel_id. These are
tel_positions : Dict[int, Union[np.ndarray, EarthLocation]]
dict of x,y,z telescope positions on the ground by tel_id or EarthLocation. These are
converted internally to a coordinate in the `~ctapipe.coordinates.GroundFrame`
tel_descriptions : Dict[TelescopeDescription]
dict of TelescopeDescriptions by tel_id
Expand All @@ -91,7 +91,7 @@ def __init__(
coordinate system used for `tel_positions`.
"""
self.name = name
self.positions = tel_positions or dict()
self.positions: Dict[int, Union[np.ndarray, EarthLocation]] = tel_positions or dict()
self.tels: Dict[int, TelescopeDescription] = tel_descriptions or dict()
self.reference_location = reference_location

Expand Down Expand Up @@ -157,9 +157,12 @@ def info(self, printer=print):
def tel_coords(self):
"""Telescope positions in `~ctapipe.coordinates.GroundFrame`"""

pos_x = [p[0].to_value(u.m) for p in self.positions.values()]
pos_y = [p[1].to_value(u.m) for p in self.positions.values()]
pos_z = [p[2].to_value(u.m) for p in self.positions.values()]
positions = self.positions.values()
positions = [GroundFrame.from_earth_location(p, self.reference_location).cartesian.xyz if isinstance(p, EarthLocation) else p for p in positions]

pos_x = [p[0].to_value(u.m) for p in positions]
pos_y = [p[1].to_value(u.m) for p in positions]
pos_z = [p[2].to_value(u.m) for p in positions]

frame = GroundFrame(reference_location=self.reference_location)

Expand Down
30 changes: 30 additions & 0 deletions ctapipe/instrument/tests/test_subarray.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,3 +287,33 @@ def test_subarrays(subarray_prod5_paranal: SubarrayDescription):
assert subarray.name == "NewArray"
assert isinstance(subarray.reference_location, EarthLocation)
assert subarray.reference_location == subarray_prod5_paranal.reference_location


def test_tel_pos_from_EarthLocation(prod5_mst_nectarcam):
rng = np.random.default_rng(0)

pos = {}
tel = {}

for tel_id in range(1, 11):
tel[tel_id] = prod5_mst_nectarcam
pos[tel_id] = rng.uniform(-100, 100, size=3) * u.m

for tel_id in range(12, 23):
tel[tel_id] = prod5_mst_nectarcam
rnd_lon = rng.uniform(LOCATION.lon.to_value('deg') - 1e-3, LOCATION.lon.to_value('deg') + 1e-3)
rnd_lat = rng.uniform(LOCATION.lat.to_value('deg') - 1e-3, LOCATION.lat.to_value('deg') + 1e-3)
rnd_height = rng.uniform(LOCATION.height.to_value('m') - 1e2, LOCATION.height.to_value('m') + 1e2)
pos[tel_id] = EarthLocation(lon=rnd_lon * u.deg, lat=rnd_lat * u.deg, height=rnd_height)

subarray = SubarrayDescription(
"test array",
tel_positions=pos,
tel_descriptions=tel,
reference_location=LOCATION,
)

x, y, z = subarray.tel_coords.cartesian.xyz
assert all(x.value > -100) and all(x.value < 100)
assert all(y.value > -100) and all(y.value < 100)
assert all(z.value > -100) and all(z.value < 100)

0 comments on commit 25fc030

Please sign in to comment.