Working with Instrumental Descriptions

the instrumental description is loaded by the event source, and consists of a hierarchy of classes in the ctapipe.instrument module, the base of which is the SubarrayDescription

[1]:
from ctapipe.utils.datasets import get_dataset_path
from ctapipe.io import EventSource
import numpy as np

filename = get_dataset_path("gamma_prod5.simtel.zst")

with EventSource(filename, max_events=1) as source:
    subarray = source.subarray

the SubarrayDescription:

[2]:
subarray.info()
Subarray : MonteCarloArray
Num Tels : 180
Footprint: 4.92 km2

       Type       Count     Tel IDs
----------------- ----- ---------------
MST_MST_NectarCam    28 100-124,128-130
   SST_ASTRI_CHEC   120 30-99,131-180
 MST_MST_FlashCam    28 5-29,125-127
   LST_LST_LSTCam     4 1-4
[3]:
subarray.to_table()
[3]:
Table length=180
tel_idpos_xpos_ypos_znametypecamera_typecamera_indexoptics_indextel_description
mmm
int16float64float64float64str5str3str9int64int64str17
1-20.64299964904785-64.8170013427734434.29999923706055LSTLSTLSTCam03LST_LST_LSTCam
279.9939956665039-0.768000006675720229.399999618530273LSTLSTLSTCam03LST_LST_LSTCam
3-19.39599990844726665.1999969482421931.0LSTLSTLSTCam03LST_LST_LSTCam
4-120.032997131347661.151000022888183633.099998474121094LSTLSTLSTCam03LST_LST_LSTCam
5-0.017000000923871994-0.001000000047497451324.350000381469727MSTMSTFlashCam32MST_MST_FlashCam
6-1.468000054359436-151.220993041992231.0MSTMSTFlashCam32MST_MST_FlashCam
7-3.1379997730255127-325.244995117187539.0MSTMSTFlashCam32MST_MST_FlashCam
81.4339998960494995151.2200012207031225.0MSTMSTFlashCam32MST_MST_FlashCam
93.1039998531341553325.243011474609423.5MSTMSTFlashCam32MST_MST_FlashCam
..............................
171260.0920.045.0ASTRISSTCHEC21SST_ASTRI_CHEC
172260.0-920.065.0ASTRISSTCHEC21SST_ASTRI_CHEC
173-500.0815.015.0ASTRISSTCHEC21SST_ASTRI_CHEC
174-500.0-815.075.0ASTRISSTCHEC21SST_ASTRI_CHEC
175500.0815.045.0ASTRISSTCHEC21SST_ASTRI_CHEC
176500.0-815.053.0ASTRISSTCHEC21SST_ASTRI_CHEC
177-810.0655.012.0ASTRISSTCHEC21SST_ASTRI_CHEC
178-810.0-655.068.0ASTRISSTCHEC21SST_ASTRI_CHEC
179810.0655.020.0ASTRISSTCHEC21SST_ASTRI_CHEC
180810.0-655.041.0ASTRISSTCHEC21SST_ASTRI_CHEC
[ ]:

You can also get a table of just the OpticsDescriptions (CameraGeometry is more complex and can’t be stored on a single table row, so each one can be converted to a table separately)

[4]:
subarray.to_table(kind='optics')
[4]:
Table length=4
descriptionnametypemirror_areanum_mirrorsnum_mirror_tilesequivalent_focal_length
m2m
str17str5str3float64int64int64float64
MST_MST_NectarCamMSTMST106.241355895996118616.445049285888672
SST_ASTRI_CHECASTRISST14.126235008239746222.1519100666046143
MST_MST_FlashCamMSTMST106.241355895996118616.445049285888672
LST_LST_LSTCamLSTLST386.7332458496094119829.30565071105957

Make a sub-array with only SC-type telescopes:

[5]:
sc_tels =[tel_id for tel_id, tel in subarray.tel.items() if tel.optics.num_mirrors ==  2]
newsub = subarray.select_subarray(sc_tels, name="SCTels")
newsub.info()
Subarray : SCTels
Num Tels : 120
Footprint: 4.92 km2

     Type      Count    Tel IDs
-------------- ----- -------------
SST_ASTRI_CHEC   120 30-99,131-180

can also do this by using Table.group_by

Explore some of the details of the telescopes

[6]:
tel = subarray.tel[1]
tel
[6]:
TelescopeDescription(type=LST, name=LST, optics=LST, camera=LSTCam)
[7]:
tel.optics.mirror_area
[7]:
$386.73325 \; \mathrm{m^{2}}$
[8]:
tel.optics.num_mirror_tiles
[8]:
198
[9]:
tel.optics.equivalent_focal_length
[9]:
$29.305651 \; \mathrm{m}$
[10]:
tel.camera
[10]:
CameraDescription(camera_name=LSTCam, geometry=LSTCam, readout=LSTCam)
[11]:
tel.camera.geometry.pix_x
[11]:
$[0,~-0.037796701,~-0.047245475,~\dots,~0.67088033,~-0.45356484,~-0.50081024] \; \mathrm{m}$
[12]:
%matplotlib inline
from ctapipe.visualization import CameraDisplay
CameraDisplay(tel.camera.geometry)
[12]:
<ctapipe.visualization.mpl_camera.CameraDisplay at 0x7fbdfad3b0d0>
../_images/examples_InstrumentDescription_18_1.png
[13]:
CameraDisplay(subarray.tel[98].camera.geometry)
[13]:
<ctapipe.visualization.mpl_camera.CameraDisplay at 0x7fbdfad3bd60>
../_images/examples_InstrumentDescription_19_1.png

Plot the subarray

We’ll make a subarray by telescope type and plot each separately, so they appear in different colors. We also calculate the radius using the mirror area (and exagerate it a bit).

This is just for debugging and info, for any “real” use, a visualization.ArrayDisplay should be used

[14]:
subarray.peek()
../_images/examples_InstrumentDescription_21_0.png
[15]:
subarray.footprint
[15]:
$4.923463 \; \mathrm{km^{2}}$

Get info about the subarray in general

[16]:
subarray.telescope_types
[16]:
[TelescopeDescription(type=MST, name=MST, optics=MST, camera=NectarCam),
 TelescopeDescription(type=SST, name=ASTRI, optics=ASTRI, camera=CHEC),
 TelescopeDescription(type=MST, name=MST, optics=MST, camera=FlashCam),
 TelescopeDescription(type=LST, name=LST, optics=LST, camera=LSTCam)]
[17]:
subarray.camera_types
[17]:
[CameraDescription(camera_name=LSTCam, geometry=LSTCam, readout=LSTCam),
 CameraDescription(camera_name=NectarCam, geometry=NectarCam, readout=NectarCam),
 CameraDescription(camera_name=CHEC, geometry=CHEC, readout=CHEC),
 CameraDescription(camera_name=FlashCam, geometry=FlashCam, readout=FlashCam)]
[18]:
subarray.optics_types
[18]:
[OpticsDescription(name=ASTRI, equivalent_focal_length=2.15 m, num_mirrors=2, mirror_area=14.13 m2),
 OpticsDescription(name=MST, equivalent_focal_length=16.45 m, num_mirrors=1, mirror_area=106.24 m2),
 OpticsDescription(name=LST, equivalent_focal_length=29.31 m, num_mirrors=1, mirror_area=386.73 m2)]
[19]:
from astropy.coordinates import SkyCoord
from ctapipe.coordinates import GroundFrame
center = SkyCoord("10.0 m", "2.0 m", "0.0 m", frame='groundframe')
coords = subarray.tel_coords  # a flat list of coordinates by tel_index
coords.separation(center)
[19]:
[$115^\circ37{}^\prime48.53728809{}^{\prime\prime}$ $23^\circ16{}^\prime48.71368376{}^{\prime\prime}$ $94^\circ46{}^\prime57.06512996{}^{\prime\prime}$ $160^\circ38{}^\prime17.99179741{}^{\prime\prime}$ $90^\circ02{}^\prime22.86896225{}^{\prime\prime}$ $101^\circ37{}^\prime15.59471603{}^{\prime\prime}$ $101^\circ46{}^\prime37.67470941{}^{\prime\prime}$ $78^\circ18{}^\prime27.84261148{}^{\prime\prime}$ $78^\circ10{}^\prime28.36657617{}^{\prime\prime}$ $45^\circ27{}^\prime35.97543537{}^{\prime\prime}$ $16^\circ59{}^\prime24.86749269{}^{\prime\prime}$ $39^\circ58{}^\prime36.5305221{}^{\prime\prime}$ $69^\circ06{}^\prime00.41200774{}^{\prime\prime}$ $110^\circ55{}^\prime43.84261342{}^{\prime\prime}$ $139^\circ53{}^\prime52.10746639{}^{\prime\prime}$ $161^\circ53{}^\prime57.44575812{}^{\prime\prime}$ $134^\circ14{}^\prime04.61794311{}^{\prime\prime}$ $45^\circ19{}^\prime31.8677554{}^{\prime\prime}$ $15^\circ41{}^\prime09.62278432{}^{\prime\prime}$ $12^\circ23{}^\prime30.02446134{}^{\prime\prime}$ $39^\circ16{}^\prime01.93418447{}^{\prime\prime}$ $69^\circ02{}^\prime23.91555142{}^{\prime\prime}$ $111^\circ01{}^\prime02.98397763{}^{\prime\prime}$ $140^\circ35{}^\prime18.81775813{}^{\prime\prime}$ $166^\circ57{}^\prime33.12823197{}^{\prime\prime}$ $163^\circ35{}^\prime33.54325283{}^{\prime\prime}$ $134^\circ29{}^\prime00.15614806{}^{\prime\prime}$ $11^\circ55{}^\prime58.302677{}^{\prime\prime}$ $167^\circ37{}^\prime52.38371474{}^{\prime\prime}$ $26^\circ01{}^\prime54.63781737{}^{\prime\prime}$ $49^\circ42{}^\prime53.3573094{}^{\prime\prime}$ $130^\circ15{}^\prime08.98906098{}^{\prime\prime}$ $153^\circ27{}^\prime53.98923833{}^{\prime\prime}$ $56^\circ58{}^\prime06.54760364{}^{\prime\prime}$ $80^\circ40{}^\prime58.98009562{}^{\prime\prime}$ $99^\circ20{}^\prime36.68467668{}^{\prime\prime}$ $122^\circ54{}^\prime22.08156543{}^{\prime\prime}$ $78^\circ08{}^\prime42.65380699{}^{\prime\prime}$ $101^\circ49{}^\prime26.16909516{}^{\prime\prime}$ $34^\circ01{}^\prime48.4871336{}^{\prime\prime}$ $57^\circ46{}^\prime41.25947597{}^{\prime\prime}$ $122^\circ15{}^\prime35.5320416{}^{\prime\prime}$ $145^\circ39{}^\prime14.42191405{}^{\prime\prime}$ $1^\circ14{}^\prime54.5162229{}^{\prime\prime}$ $24^\circ26{}^\prime06.70955766{}^{\prime\prime}$ $155^\circ24{}^\prime16.53048746{}^{\prime\prime}$ $176^\circ30{}^\prime58.85678108{}^{\prime\prime}$ $78^\circ08{}^\prime35.43447641{}^{\prime\prime}$ $101^\circ49{}^\prime13.04461153{}^{\prime\prime}$ $15^\circ25{}^\prime15.9893754{}^{\prime\prime}$ $39^\circ07{}^\prime10.57205245{}^{\prime\prime}$ $140^\circ50{}^\prime37.19773001{}^{\prime\prime}$ $164^\circ04{}^\prime49.92718766{}^{\prime\prime}$ $45^\circ17{}^\prime39.84001018{}^{\prime\prime}$ $69^\circ00{}^\prime41.87664707{}^{\prime\prime}$ $111^\circ01{}^\prime39.52843975{}^{\prime\prime}$ $134^\circ31{}^\prime54.15211982{}^{\prime\prime}$ $11^\circ51{}^\prime48.04299327{}^{\prime\prime}$ $167^\circ57{}^\prime00.7607586{}^{\prime\prime}$ $62^\circ40{}^\prime06.90027025{}^{\prime\prime}$ $86^\circ22{}^\prime57.30949883{}^{\prime\prime}$ $93^\circ37{}^\prime39.95895171{}^{\prime\prime}$ $117^\circ14{}^\prime49.7522144{}^{\prime\prime}$ $78^\circ08{}^\prime46.65029204{}^{\prime\prime}$ $101^\circ49{}^\prime21.94647892{}^{\prime\prime}$ $28^\circ49{}^\prime16.21053425{}^{\prime\prime}$ $52^\circ34{}^\prime56.22025098{}^{\prime\prime}$ $127^\circ28{}^\prime14.89982613{}^{\prime\prime}$ $150^\circ53{}^\prime43.36851833{}^{\prime\prime}$ $2^\circ37{}^\prime25.28096743{}^{\prime\prime}$ $26^\circ19{}^\prime10.19296874{}^{\prime\prime}$ $153^\circ38{}^\prime45.55173649{}^{\prime\prime}$ $176^\circ17{}^\prime30.67883187{}^{\prime\prime}$ $15^\circ25{}^\prime49.43804438{}^{\prime\prime}$ $39^\circ09{}^\prime24.17330046{}^{\prime\prime}$ $140^\circ51{}^\prime45.78771005{}^{\prime\prime}$ $164^\circ14{}^\prime51.16830131{}^{\prime\prime}$ $52^\circ19{}^\prime45.41515578{}^{\prime\prime}$ $76^\circ00{}^\prime54.35432629{}^{\prime\prime}$ $104^\circ00{}^\prime40.3191603{}^{\prime\prime}$ $127^\circ35{}^\prime18.49132396{}^{\prime\prime}$ $38^\circ28{}^\prime24.20830686{}^{\prime\prime}$ $62^\circ09{}^\prime24.90488478{}^{\prime\prime}$ $117^\circ52{}^\prime38.73247866{}^{\prime\prime}$ $141^\circ23{}^\prime18.86339205{}^{\prime\prime}$ $11^\circ51{}^\prime40.55787668{}^{\prime\prime}$ $168^\circ03{}^\prime13.67455894{}^{\prime\prime}$ $66^\circ00{}^\prime25.50011034{}^{\prime\prime}$ $89^\circ41{}^\prime49.40711649{}^{\prime\prime}$ $90^\circ14{}^\prime45.66080857{}^{\prime\prime}$ $113^\circ56{}^\prime46.48499003{}^{\prime\prime}$ $25^\circ52{}^\prime55.46889846{}^{\prime\prime}$ $49^\circ36{}^\prime25.53139002{}^{\prime\prime}$ $130^\circ25{}^\prime28.16246205{}^{\prime\prime}$ $153^\circ52{}^\prime16.80179427{}^{\prime\prime}$ $5^\circ18{}^\prime28.02210585{}^{\prime\prime}$ $29^\circ01{}^\prime06.88086914{}^{\prime\prime}$ $150^\circ59{}^\prime18.82490611{}^{\prime\prime}$ $174^\circ17{}^\prime23.56686487{}^{\prime\prime}$ $90^\circ02{}^\prime22.86896225{}^{\prime\prime}$ $101^\circ37{}^\prime15.59471603{}^{\prime\prime}$ $101^\circ46{}^\prime37.67470941{}^{\prime\prime}$ $78^\circ18{}^\prime27.84261148{}^{\prime\prime}$ $78^\circ10{}^\prime28.36657617{}^{\prime\prime}$ $45^\circ27{}^\prime35.97543537{}^{\prime\prime}$ $16^\circ59{}^\prime24.86749269{}^{\prime\prime}$ $39^\circ58{}^\prime36.5305221{}^{\prime\prime}$ $69^\circ06{}^\prime00.41200774{}^{\prime\prime}$ $110^\circ55{}^\prime43.84261342{}^{\prime\prime}$ $139^\circ53{}^\prime52.10746639{}^{\prime\prime}$ $161^\circ53{}^\prime57.44575812{}^{\prime\prime}$ $134^\circ14{}^\prime04.61794311{}^{\prime\prime}$ $45^\circ19{}^\prime31.8677554{}^{\prime\prime}$ $15^\circ41{}^\prime09.62278432{}^{\prime\prime}$ $12^\circ23{}^\prime30.02446134{}^{\prime\prime}$ $39^\circ16{}^\prime01.93418447{}^{\prime\prime}$ $69^\circ02{}^\prime23.91555142{}^{\prime\prime}$ $111^\circ01{}^\prime02.98397763{}^{\prime\prime}$ $140^\circ35{}^\prime18.81775813{}^{\prime\prime}$ $166^\circ57{}^\prime33.12823197{}^{\prime\prime}$ $163^\circ35{}^\prime33.54325283{}^{\prime\prime}$ $134^\circ29{}^\prime00.15614806{}^{\prime\prime}$ $11^\circ55{}^\prime58.302677{}^{\prime\prime}$ $167^\circ37{}^\prime52.38371474{}^{\prime\prime}$ $136^\circ57{}^\prime45.95755748{}^{\prime\prime}$ $135^\circ07{}^\prime08.42537213{}^{\prime\prime}$ $144^\circ03{}^\prime07.34583759{}^{\prime\prime}$ $136^\circ57{}^\prime45.95755748{}^{\prime\prime}$ $135^\circ07{}^\prime08.42537213{}^{\prime\prime}$ $144^\circ03{}^\prime07.34583759{}^{\prime\prime}$ $12^\circ21{}^\prime10.63672941{}^{\prime\prime}$ $11^\circ49{}^\prime31.42733953{}^{\prime\prime}$ $14^\circ26{}^\prime28.56626411{}^{\prime\prime}$ $117^\circ32{}^\prime31.4678604{}^{\prime\prime}$ $16^\circ04{}^\prime14.73718876{}^{\prime\prime}$ $62^\circ57{}^\prime07.77000849{}^{\prime\prime}$ $78^\circ42{}^\prime38.29587693{}^{\prime\prime}$ $101^\circ14{}^\prime22.04343375{}^{\prime\prime}$ $118^\circ48{}^\prime09.35939992{}^{\prime\prime}$ $141^\circ08{}^\prime27.59692398{}^{\prime\prime}$ $38^\circ36{}^\prime57.36221721{}^{\prime\prime}$ $61^\circ14{}^\prime04.57040488{}^{\prime\prime}$ $104^\circ39{}^\prime08.29781247{}^{\prime\prime}$ $127^\circ08{}^\prime29.11683192{}^{\prime\prime}$ $52^\circ44{}^\prime50.28926073{}^{\prime\prime}$ $75^\circ22{}^\prime30.28675274{}^{\prime\prime}$ $154^\circ17{}^\prime04.33890125{}^{\prime\prime}$ $175^\circ51{}^\prime30.60324792{}^{\prime\prime}$ $3^\circ07{}^\prime40.20738999{}^{\prime\prime}$ $25^\circ40{}^\prime46.72611271{}^{\prime\prime}$ $155^\circ31{}^\prime05.76852749{}^{\prime\prime}$ $177^\circ07{}^\prime48.37033358{}^{\prime\prime}$ $1^\circ51{}^\prime33.76315166{}^{\prime\prime}$ $24^\circ28{}^\prime05.09034799{}^{\prime\prime}$ $168^\circ33{}^\prime14.25941047{}^{\prime\prime}$ $11^\circ18{}^\prime49.45565605{}^{\prime\prime}$ $89^\circ48{}^\prime50.06947064{}^{\prime\prime}$ $112^\circ43{}^\prime37.64931806{}^{\prime\prime}$ $67^\circ11{}^\prime56.82656885{}^{\prime\prime}$ $90^\circ11{}^\prime11.75785172{}^{\prime\prime}$ $125^\circ45{}^\prime46.14049369{}^{\prime\prime}$ $148^\circ07{}^\prime09.66819251{}^{\prime\prime}$ $31^\circ38{}^\prime07.22086606{}^{\prime\prime}$ $54^\circ16{}^\prime21.09751607{}^{\prime\prime}$ $143^\circ36{}^\prime39.3424254{}^{\prime\prime}$ $165^\circ48{}^\prime19.81864969{}^{\prime\prime}$ $13^\circ45{}^\prime49.96366223{}^{\prime\prime}$ $36^\circ22{}^\prime59.16585{}^{\prime\prime}$ $94^\circ28{}^\prime09.44371894{}^{\prime\prime}$ $117^\circ00{}^\prime03.42456501{}^{\prime\prime}$ $62^\circ56{}^\prime30.19964872{}^{\prime\prime}$ $85^\circ32{}^\prime22.19145376{}^{\prime\prime}$ $110^\circ12{}^\prime59.25351694{}^{\prime\prime}$ $132^\circ40{}^\prime35.18429669{}^{\prime\prime}$ $47^\circ13{}^\prime11.25823017{}^{\prime\prime}$ $69^\circ48{}^\prime47.82814446{}^{\prime\prime}$ $129^\circ43{}^\prime35.22132347{}^{\prime\prime}$ $152^\circ07{}^\prime05.15361244{}^{\prime\prime}$ $27^\circ40{}^\prime14.4110196{}^{\prime\prime}$ $50^\circ18{}^\prime25.99569671{}^{\prime\prime}$]

Telescope IDs vs Indices

Note that subarray.tel is a dict mapped by tel_id (the indentifying number of a telescope). It is possible to have telescope IDs that do not start at 0, are not contiguouous (e.g. if a subarray is selected). Some functions and properties like tel_coords are numpy arrays (not dicts) so they are not mapped to the telescope ID, but rather the index within this SubarrayDescription. To convert between the two concepts you can do:

[20]:
subarray.tel_ids_to_indices([1,5,23])
[20]:
array([ 0,  4, 22])

or you can get the indexing array directly in numpy or dict form:

[21]:
subarray.tel_index_array
[21]:
array([ -1,   0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,
        12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,
        25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,
        38,  39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,
        51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
        64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,
        77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
        90,  91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102,
       103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
       116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
       129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
       142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
       155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
       168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179])
[22]:
subarray.tel_index_array[[1,5,23]]
[22]:
array([ 0,  4, 22])
[23]:
subarray.tel_indices[1]  # this is a dict of tel_id -> tel_index, so we can only do one at once
[23]:
0
[24]:
ids = subarray.get_tel_ids_for_type(subarray.telescope_types[0])
ids
[24]:
[100,
 101,
 102,
 103,
 104,
 105,
 106,
 107,
 108,
 109,
 110,
 111,
 112,
 113,
 114,
 115,
 116,
 117,
 118,
 119,
 120,
 121,
 122,
 123,
 124,
 128,
 129,
 130]
[25]:
idx = subarray.tel_ids_to_indices(ids)
idx
[25]:
array([ 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
       112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 127,
       128, 129])
[26]:
subarray.tel_coords[idx]
[26]:
<SkyCoord (GroundFrame): (x, y, z) in m
    [(-1.70000009e-02, -1.00000005e-03, 24.35000038),
     (-1.46800005e+00, -1.51220993e+02, 31.        ),
     (-3.13799977e+00, -3.25244995e+02, 39.        ),
     ( 1.43399990e+00,  1.51220001e+02, 25.        ),
     ( 3.10399985e+00,  3.25243011e+02, 23.5       ),
     ( 1.56492996e+02,  2.37051987e+02, 24.        ),
     ( 1.47427994e+02,  7.42020035e+01, 21.        ),
     ( 1.45977005e+02, -7.70189972e+01, 26.        ),
     ( 1.51914993e+02, -2.40013000e+02, 30.        ),
     (-1.51949005e+02,  2.40011002e+02, 27.        ),
     (-1.46011002e+02,  7.70169983e+01, 28.        ),
     (-1.47462006e+02, -7.42029953e+01, 28.        ),
     (-1.56527008e+02, -2.37053009e+02, 38.5       ),
     ( 2.95343018e+02,  4.47466980e+02, 25.        ),
     ( 3.17085999e+02,  1.59593002e+02, 18.5       ),
     ( 3.08424988e+02, -2.96000004e+00, 19.5       ),
     ( 3.13964996e+02, -1.65649994e+02, 22.5       ),
     ( 2.86701996e+02, -4.53053986e+02, 38.5       ),
     (-2.86834991e+02,  4.53053986e+02, 17.        ),
     (-3.13598999e+02,  1.65645996e+02, 30.5       ),
     (-3.08459015e+02,  2.95899987e+00, 29.5       ),
     (-3.16720001e+02, -1.59597992e+02, 35.        ),
     (-2.95476990e+02, -4.47468018e+02, 52.        ),
     ( 5.82261963e+02, -5.58799982e+00, 13.5       ),
     (-5.82296021e+02,  5.58699989e+00, 36.        ),
     (-1.56527008e+02, -2.13054001e+02, 38.5       ),
     (-1.21010994e+02,  7.70169983e+01, 28.        ),
     (-1.38000000e+02,  5.92999992e+01, 28.        )]>

so, with that method you can quickly get many telescope positions at once (the alternative is to use the dict positions which maps tel_id to a position on the ground

[27]:
subarray.positions[1]
[27]:
$[-20.643,~-64.817001,~34.299999] \; \mathrm{m}$