Source code for tools21cm.radio_telescope_layout

import numpy as np
import os, pickle
import itertools
from tqdm import tqdm
from . import cosmo as cm
from . import conv
from .const import KB_SI, c_light_cgs, c_light_SI, janskytowatt
from .read_files import get_package_resource_path
import astropy.units as u
from astropy.coordinates import EarthLocation

[docs] def subarray_type_to_antxyz(subarray_type, verbose=True): """ Resolves antenna configuration from various input types. Parameters ---------- subarray_type : str or np.ndarray If string, loads a pre-defined SKA-Low layout (e.g., "AA4"). If numpy array, it's used directly as the antenna positions. Otherwise, loads a default SKA1-Low configuration. verbose : bool, optional If True, enables verbose output during layout loading. Returns ------- antxyz : astropy.units.Quantity A 2D array of antenna (x, y, z) positions with units of meters. N_ant : int The total number of antennas in the configuration. """ if isinstance(subarray_type, str): antxyz = get_SKA_Low_layout(subarray_type=subarray_type, unit='xyz', verbose=verbose) elif isinstance(subarray_type, np.ndarray): antxyz = subarray_type else: antll = SKA1_LowConfig_Sept2016() antxyz = geographic_to_cartesian_coordinate_system(antll)*u.m N_ant = antxyz.shape[0] return antxyz, N_ant
[docs] def from_antenna_config(antxyz, z, nu=None): """ Calculates baseline vectors (u,v,w) from antenna XYZ positions. The function converts physical antenna separations into baseline coordinates in units of wavelength. Parameters ---------- antxyz: astropy.units.Quantity or np.ndarray The radio telescope antenna configuration in meters. z : float Redhsift of the slice observed, used to calculate frequency. nu : float, optional The frequency of observation in MHz. If None, it is calculated from z. Returns ------- Nbase : np.ndarray Numpy array of shape (N_baselines, 3) containing the (u,v,w) values. N_ant : int The total number of antennas. """ z = float(z) if antxyz is None: antll = SKA1_LowConfig_Sept2016() antll = antll[:,-2:].astype(float) antxyz = geographic_to_cartesian_coordinate_system(antll) else: antxyz = antxyz.to('m').value if not nu: nu = cm.z_to_nu(z) # MHz N_ant = antxyz.shape[0] pair_comb = itertools.combinations(range(N_ant), 2) pair_comb = list(pair_comb) lam = c_light_cgs/(nu*1e6)/1e2 # in m Nbase = [] for ii,jj in list(pair_comb): ux = (antxyz[ii,0]-antxyz[jj,0])/lam uy = (antxyz[ii,1]-antxyz[jj,1])/lam uz = (antxyz[ii,2]-antxyz[jj,2])/lam if ux==0: print(ii,jj) Nbase.append([ux,uy,uz]) Nbase = np.array(Nbase) return Nbase, N_ant
[docs] def earth_rotation_effect(Nbase, slice_nums, int_time, total_int_time, declination=-30.): """ Applies Earth's rotation to baseline vectors for given time slices. This function simulates the change in projected baseline coordinates (u,v,w) over the course of an observation due to the Earth's rotation. Parameters ---------- Nbase : np.ndarray Array of initial (u,v,w) baseline coordinates. slice_nums : int or np.ndarray The index or indices of the time slice(s) to compute. int_time : float Integration time per slice in seconds. total_int_time : float Total duration of the observation in hours. declination : float, optional The declination of the pointing center in degrees. Default is -30. Returns ------- new_Nbase : np.ndarray The rotated (u,v,w) coordinates. The shape will be (N_baselines, 3) if slice_nums is a single integer, or (N_slices, N_baselines, 3) if slice_nums is an array. """ # Convert to radians delta = np.deg2rad(declination) # Ensure slice_nums is an array for vectorized handling of multiple slices slice_nums = np.atleast_1d(slice_nums) # # Total number of integration steps # n_steps = int((total_int_time * 3600) / int_time) # Center observation around meridian: HA ranges from -ΔHA to +ΔHA HA0 = -0.5 * total_int_time*3600 + slice_nums * int_time HA = np.deg2rad(15.0 * HA0 / 3600.) #- np.pi / 2 + 2 * np.pi # Convert to radians (15 deg/hour) # # Compute hour angles (HA) for each slice_num in vectorized manner # HA = -15.0 * p * (slice_nums - 1) * int_time / 3600. - np.pi / 2 + 2 * np.pi # Rotation matrices for each HA and declination delta cos_HA, sin_HA = np.cos(HA), np.sin(HA) cos_delta, sin_delta = np.cos(delta), np.sin(delta) # Pre-allocate new_Nbase for each time slice new_Nbase = np.empty((len(slice_nums), *Nbase.shape)) # Apply rotation transformations new_Nbase[:, :, 0] = sin_HA[:, None] * Nbase[:, 0] + cos_HA[:, None] * Nbase[:, 1] new_Nbase[:, :, 1] = (-sin_delta * cos_HA[:, None] * Nbase[:, 0] + sin_delta * sin_HA[:, None] * Nbase[:, 1] + cos_delta * Nbase[:, 2]) new_Nbase[:, :, 2] = (cos_delta * cos_HA[:, None] * Nbase[:, 0] - cos_delta * sin_HA[:, None] * Nbase[:, 1] + sin_delta * Nbase[:, 2]) return new_Nbase.squeeze() if len(slice_nums) == 1 else new_Nbase
[docs] def get_uv_daily_observation(ncells, z, antxyz=None, total_int_time=4., int_time=10., boxsize=None, declination=-30., include_mirror_baselines=False, verbose=True): """ Simulates a full observation to generate a UV coverage map. This function combines baseline calculation, Earth rotation simulation, and UV track gridding to produce a final 2D UV coverage map, representing the density of measurements in the Fourier plane. Parameters ---------- ncells : int Number of cells in each dimension of the output grid. z : float Redshift of the observed slice. antxyz : np.ndarray, optional The radio telescope antenna configuration. If None, a default is loaded. total_int_time : float Total observation time per day in hours. int_time : float Integration time per observation in seconds. boxsize : float, optional Comoving size of the observed sky area in Mpc. declination : float Declination of the telescope pointing in degrees. include_mirror_baselines : bool, optional If True, includes mirrored baselines for hermitian conjugation. verbose : bool, optional If True, prints progress information. Returns ------- uv_map : np.ndarray 2D array `(ncells, ncells)` of baseline counts per pixel. N_ant : int The total number of antennas. """ # Load antenna configurations and initialize parameters Nbase, N_ant = from_antenna_config(antxyz, z) uv_map = np.zeros((ncells, ncells), dtype=np.float32) total_observations = int((total_int_time * 3600) / int_time) if verbose: print("Generating uv map from daily observations...") # Vectorize the observation loop by calculating all rotations at once time_indices = np.arange(total_observations) + 1 all_rotated_Nbase = (earth_rotation_effect(Nbase, i, int_time, total_int_time, declination) for i in time_indices) # Grid uv tracks for each observation without individual loops for rotated_Nbase in tqdm(all_rotated_Nbase, total=total_observations, disable=not verbose, desc="Gridding uv tracks"): uv_map += grid_uv_tracks(rotated_Nbase, z, ncells, boxsize=boxsize, include_mirror_baselines=include_mirror_baselines) uv_map /= total_observations # Normalize by the total number of observations if verbose: print("...done") return uv_map, N_ant
[docs] def grid_uv_tracks(Nbase, z, ncells, boxsize=None, include_mirror_baselines=False): """ Grids baseline (u,v) tracks onto a 2D map for a single time snapshot. This function takes a set of (u,v,w) coordinates, projects them onto a 2D grid corresponding to the field of view, and counts how many baselines fall into each grid cell. Parameters ---------- Nbase : np.ndarray Array containing (u,v,w) values for the antenna baselines. z : float Redshift of the slice observed. ncells : int Number of cells in each dimension of the output grid. boxsize : float, optional Comoving size of the sky observed. Uses a default if None. include_mirror_baselines : bool, optional If True, also grids the hermitian conjugate baselines at (-u, -v). Returns ------- uv_map : np.ndarray A 2D array `(ncells, ncells)` of baseline counts per pixel, shifted so the zero-frequency is at the center. """ z = float(z) if not boxsize: boxsize = conv.LB # Assuming conv.LB is defined elsewhere in your code uv_map = np.zeros((ncells, ncells), dtype=np.int32) # Using int32 for faster summing operations theta_max = boxsize / cm.z_to_cdist(z) # Include mirrored baselines if requested if include_mirror_baselines: Nbase = np.vstack([Nbase, -Nbase]) # Scale and round the coordinates in a single operation for efficiency Nb = np.round(Nbase * theta_max).astype(int) # Vectorized conditionals to select points within grid bounds, skipping for-loops mask = ( (Nb[:, 0] < ncells / 2) & (Nb[:, 0] >= -ncells / 2) & (Nb[:, 1] < ncells / 2) & (Nb[:, 1] >= -ncells / 2) ) Nb = Nb[mask] # Convert from negative to positive indexing within the grid and use broadcasting xx = (Nb[:, 0] + ncells // 2).astype(int) yy = (Nb[:, 1] + ncells // 2).astype(int) # Fast counting using numpy's bincount and reshaping uv_map_flat = np.bincount(xx * ncells + yy, minlength=ncells * ncells) uv_map = uv_map_flat.reshape(ncells, ncells) # Include mirrored baselines if requested if include_mirror_baselines: # uv_map += np.flip(np.flip(uv_map, axis=0), axis=1) # Flip along both axes for mirror effect uv_map = uv_map/2. # Average with mirrored baselines return np.fft.fftshift(uv_map)
[docs] def geographic_to_cartesian_coordinate_system(antll): """ Converts geographic coordinates (longitude, latitude) into Cartesian coordinates (x, y, z) assuming a spherical Earth with a fixed radius, using Astropy for unit handling. Parameters ---------- antll : np.ndarray A 2D NumPy array of shape (N, 2), where: - Column 0 is longitude in degrees (λ). - Column 1 is latitude in degrees (φ). Returns ------- antxyz : np.ndarray A 2D NumPy array of shape (N, 3) containing the Cartesian coordinates: - Column 0: x-coordinate in meters. - Column 1: y-coordinate in meters. - Column 2: z-coordinate in meters. Notes ----- - The Earth's radius (mean radius) is assumed to be 6,371 km. - Astropy is used to ensure unit consistency. """ Re = 6371. * u.km # Earth's radius if not isinstance(antll, u.quantity.Quantity): antll *= u.deg lon = antll[:, 0] lat = antll[:, 1] # Calculate Cartesian coordinates x = (Re * np.cos(lat) * np.cos(lon)).to(u.m) y = (Re * np.cos(lat) * np.sin(lon)).to(u.m) z = (Re * np.sin(lat)).to(u.m) # Combine into a single array antxyz = np.vstack((x.value, y.value, z.value)).T return antxyz
[docs] def cartesian_to_geographic_coordinate_system(antxyz): """ Converts Cartesian coordinates (x, y, z) back to geographic coordinates (longitude, latitude, height above Earth's surface), using Astropy for unit handling. Parameters ---------- antxyz : np.ndarray A 2D NumPy array of shape (N, 3), where: - Column 0 is the x-coordinate in meters. - Column 1 is the y-coordinate in meters. - Column 2 is the z-coordinate in meters. Returns ------- antll : np.ndarray A 2D NumPy array of shape (N, 3) containing the geographic coordinates: - Column 0: Longitude (λ) in degrees. - Column 1: Latitude (φ) in degrees. - Column 2: Height (h) in meters above the Earth's surface. Notes ----- - The Earth's radius (mean radius) is assumed to be 6,371 km. - Astropy is used to ensure unit consistency. """ Re = 6371. * u.km # Earth's radius # Extract Cartesian coordinates and attach units if isinstance(antxyz, u.quantity.Quantity): antxyz *= u.m x = antxyz[:, 0] y = antxyz[:, 1] z = antxyz[:, 2] # Compute radial distance (r) r = np.sqrt(x**2 + y**2 + z**2) # Compute geographic coordinates lon = np.arctan2(y, x).to(u.deg) lat = np.arcsin((z / r)).to(u.deg) height = (r - Re).to(u.m) # Combine into a single array antll = np.vstack((lon.value, lat.value, height.value)).T return antll
[docs] def antenna_positions_to_baselines(antxyz): """ Calculates all possible baseline vectors from a set of antenna positions. Parameters ---------- antxyz : np.ndarray or astropy.units.Quantity An array `(N_ant, 3)` of antenna positions. Returns ------- np.ndarray or astropy.units.Quantity An array `(N_ant * (N_ant - 1), 3)` of baseline vectors. """ # from itertools import combinations # baselines = [(a1-a2) for a1,a2 in tqdm(combinations(antxyz, 2))] from itertools import permutations baselines = np.array([(a1-a2) for a1,a2 in tqdm(permutations(antxyz, 2))]) try: return baselines*antxyz.unit except: return baselines
[docs] def enu_to_ecef(enu, lat_deg, lon_deg, origin_ecef): """ Converts local East-North-Up (ENU) coordinates to ECEF. Parameters ---------- enu : np.ndarray Positions `(N, 3)` in the local ENU frame (meters). lat_deg : float Latitude of the local frame's origin in degrees. lon_deg : float Longitude of the local frame's origin in degrees. origin_ecef : np.ndarray ECEF position `(3,)` of the local frame's origin (meters). Returns ------- np.ndarray Positions `(N, 3)` in the ECEF frame (meters). """ lat = np.deg2rad(lat_deg) lon = np.deg2rad(lon_deg) R = np.array([ [-np.sin(lon), -np.sin(lat)*np.cos(lon), np.cos(lat)*np.cos(lon)], [ np.cos(lon), -np.sin(lat)*np.sin(lon), np.cos(lat)*np.sin(lon)], [ 0, np.cos(lat), np.sin(lat)] ]) ecef_local = enu @ R.T return ecef_local + origin_ecef
[docs] def ecef_to_xyz(ecef, lon_deg, origin_ecef): """ Converts ECEF coordinates to a local interferometric XYZ frame. The XYZ frame is defined with X pointing to local East, Y to local North, and Z aligned with the ECEF Z-axis at the array center. Parameters ---------- ecef : np.ndarray Antenna positions `(N, 3)` in ECEF coordinates (meters). lon_deg : float Longitude of the array center in degrees. origin_ecef : np.ndarray ECEF position `(3,)` of the array center (meters). Returns ------- np.ndarray Antenna positions `(N, 3)` in the local XYZ frame (meters). """ lon_rad = np.deg2rad(lon_deg) R = np.array([ [ np.cos(lon_rad), np.sin(lon_rad), 0], [-np.sin(lon_rad), np.cos(lon_rad), 0], [0, 0, 1] ]) local = ecef - origin_ecef return local @ R.T + origin_ecef
[docs] def get_SKA_Low_layout(subarray_type="AA4", unit='ecef', verbose=True): """ Loads SKA Low antenna layout data from pre-defined configuration files. Parameters ---------- subarray_type : str, optional The name of the SKA Low subarray, e.g., "AA4", "AA2", "AASTAR". unit : str, optional The desired output coordinate system: 'ecef', 'enu', or 'xyz'. verbose : bool, optional If True, prints information about the loaded layout. Returns ------- astropy.units.Quantity An `(N_ant, 3)` array of antenna positions in the specified `unit`. """ if subarray_type.upper() == "AA4": filename = 'input_data/skalow_AA4_layout.txt' elif subarray_type.upper() in ["AASTAR", "AA*"]: filename = 'input_data/skalow_AAstar_layout.txt' elif subarray_type.upper() == "AA2": filename = 'input_data/skalow_AA2_layout.txt' elif subarray_type.upper() == "AA1": filename = 'input_data/skalow_AA1_layout.txt' elif subarray_type.upper() == "AA0.5": filename = 'input_data/skalow_AA0.5_layout.txt' else: filename = 'input_data/skalow1_layout.txt' # Load lat, lon, height from file lon, lat, height = np.loadtxt(get_package_resource_path('tools21cm', 'input_data/central_geographic_position.txt')) # EarthLocation of the array center core = EarthLocation(lat=lat * u.deg, lon=lon * u.deg, height=height * u.m) origin_ecef = np.array([core.x.value, core.y.value, core.z.value]) # in meters # Load ENU antenna positions path_to_file = get_package_resource_path('tools21cm', filename) ant_enu = np.loadtxt(path_to_file) # shape (N_ant, 3) if verbose: print(f'{subarray_type} contains {ant_enu.shape[0]} antennae.') # Handle coordinate transformations if unit.lower() == 'enu': # local ENU positions return ant_enu * u.m elif unit.lower() == 'ecef': # Convert ENU to ECEF if verbose: print('ENU -> ECEF') ant_ecef = enu_to_ecef(ant_enu, lat, lon, origin_ecef) return ant_ecef * u.m elif unit.lower() == 'xyz': # Convert ENU to ECEF to XYZ if verbose: print('ENU -> ECEF -> XYZ') ant_ecef = enu_to_ecef(ant_enu, lat, lon, origin_ecef) ant_xyz = ecef_to_xyz(ant_ecef, lon, origin_ecef) return ant_xyz * u.m elif unit in ['latlon', 'geodetic']: locations = EarthLocation.from_geocentric(ant_ecef[:, 0], ant_ecef[:, 1], ant_ecef[:, 2], unit=u.m) return locations.lat.deg, locations.lon.deg, locations.height.to(u.m).value else: raise ValueError(f"Unsupported unit '{unit}'. Must be one of 'enu', 'ecef', or 'xyz'.")
[docs] def get_latest_SKA_Low_layout( subarray_type='AA*', custom_stations=None, add_stations=None, exclude_stations=None, external_telescopes=None, ): """ Retrieves the latest SKA Low layout using the official ska-ost-array-config tool. This function acts as a wrapper for the SKAO library, providing a convenient way to access up-to-date and standardized array configurations. Parameters ---------- subarray_type : str, optional Name of the subarray configuration. custom_stations : list, optional A list of station names to create a custom subarray. add_stations : list, optional A list of station names to add to the specified subarray. exclude_stations : list, optional A list of station names to exclude from the specified subarray. external_telescopes : list, optional A list of external telescope configurations to include. Returns ------- ska_ost_array_config.array_config.LowSubArray or None An object representing the SKA Low subarray configuration, or None if the required `ska_ost_array_config` library is not installed. """ try: from ska_ost_array_config.array_config import LowSubArray, filter_array_by_distance except: print(f'Install the official tool from SKAO provided at') print(f'https://gitlab.com/ska-telescope/ost/ska-ost-array-config') return None low_all = LowSubArray( subarray_type=subarray_type, custom_stations=custom_stations, add_stations=add_stations, exclude_stations=exclude_stations, external_telescopes=external_telescopes, ) return low_all
def SKA1_LowConfig_Sept2016(): X = [1.167655398999999932e+02,1.167639199000000048e+02,1.167651233999999931e+02,1.167632707000000067e+02,1.167647362000000015e+02,1.167642596999999967e+02,1.167642823999999990e+02,1.167643800000000027e+02,1.167654335999999944e+02,1.167631211000000064e+02,1.167635745000000043e+02,1.167658808000000050e+02,1.167644358000000011e+02,1.167647771000000034e+02,1.167640540000000016e+02,1.167626123000000007e+02,1.167648029000000065e+02,1.167658351999999979e+02,1.167640291000000019e+02,1.167649085000000042e+02,1.167659199999999942e+02,1.167661626999999953e+02,1.167651634999999999e+02,1.167640078000000017e+02,1.167654026999999957e+02,1.167636229999999955e+02,1.167645437999999984e+02,1.167647060999999979e+02,1.167639855000000040e+02,1.167650722999999999e+02,1.167654382000000055e+02,1.167650862999999930e+02,1.167638584000000037e+02,1.167662325999999950e+02,1.167636825999999957e+02,1.167631401999999952e+02,1.167651603999999992e+02,1.167633533999999997e+02,1.167651051999999936e+02,1.167626254000000046e+02,1.167636904000000015e+02,1.167663275999999968e+02,1.167625929000000014e+02,1.167649674000000033e+02,1.167638366999999988e+02,1.167628655999999978e+02,1.167659002000000044e+02,1.167628385999999949e+02,1.167645657000000057e+02,1.167662167999999951e+02,1.167647726000000006e+02,1.167642471000000057e+02,1.167633445000000023e+02,1.167655101999999943e+02,1.167664458999999937e+02,1.167629455999999948e+02,1.167648417000000052e+02,1.167635398999999978e+02,1.167644183000000027e+02,1.167656886000000043e+02,1.167631796999999949e+02,1.167634831999999960e+02,1.167636839999999978e+02,1.167632454000000024e+02,1.167639195000000001e+02,1.167643659000000014e+02,1.167629960000000011e+02,1.167654433999999952e+02,1.167655697999999944e+02,1.167642254000000008e+02,1.167658689000000010e+02,1.167661604999999980e+02,1.167648360999999966e+02,1.167627719999999982e+02,1.167653454000000011e+02,1.167663943999999958e+02,1.167664467999999971e+02,1.167625601000000017e+02,1.167657815000000028e+02,1.167616289000000052e+02,1.167652462000000071e+02,1.167631212999999946e+02,1.167672824999999932e+02,1.167627999000000045e+02,1.167664591000000058e+02,1.167635965999999996e+02,1.167621414999999985e+02,1.167649980000000056e+02,1.167629746000000068e+02,1.167615334999999988e+02,1.167627927000000057e+02,1.167617536999999999e+02,1.167632495000000006e+02,1.167672551999999939e+02,1.167621608999999978e+02,1.167618740000000059e+02,1.167653964000000002e+02,1.167671021999999965e+02,1.167656369000000041e+02,1.167656084999999990e+02,1.167638069999999999e+02,1.167634192000000013e+02,1.167668948000000029e+02,1.167661372000000028e+02,1.167640186000000000e+02,1.167621211000000017e+02,1.167668842000000069e+02,1.167622668000000061e+02,1.167658279000000050e+02,1.167649911999999972e+02,1.167626226000000003e+02,1.167645538999999957e+02,1.167633663000000013e+02,1.167622453000000036e+02,1.167616692000000000e+02,1.167628236999999984e+02,1.167660285000000044e+02,1.167642421999999982e+02,1.167667019000000010e+02,1.167665894000000009e+02,1.167621203000000065e+02,1.167645772999999991e+02,1.167662301000000014e+02,1.167672749000000039e+02,1.167624308999999982e+02,1.167669259999999980e+02,1.167620172999999966e+02,1.167622932000000020e+02,1.167617213999999990e+02,1.167640444999999971e+02,1.167667126000000053e+02,1.167661492999999950e+02,1.167668223999999952e+02,1.167653755000000046e+02,1.167616431999999946e+02,1.167675196000000000e+02,1.167626336999999950e+02,1.167647103000000044e+02,1.167631223000000062e+02,1.167622778000000068e+02,1.167668196999999992e+02,1.167642399000000069e+02,1.167661542000000026e+02,1.167674226999999973e+02,1.167666547000000037e+02,1.167661875000000009e+02,1.167669635999999969e+02,1.167644075000000043e+02,1.167664853999999934e+02,1.167665176999999943e+02,1.167613343000000015e+02,1.167612311999999974e+02,1.167686377999999934e+02,1.167605929000000060e+02,1.167650950999999964e+02,1.167653222000000000e+02,1.167627564999999947e+02,1.167640370000000019e+02,1.167683598999999930e+02,1.167609994999999969e+02,1.167640258999999929e+02,1.167618693999999948e+02,1.167676603999999969e+02,1.167665496000000047e+02,1.167686127000000056e+02,1.167653518000000048e+02,1.167659311999999971e+02,1.167610827000000029e+02,1.167677769000000012e+02,1.167609613999999993e+02,1.167661935999999940e+02,1.167658203999999955e+02,1.167645573000000070e+02,1.167671459999999968e+02,1.167627073000000024e+02,1.167613300999999950e+02,1.167634316999999982e+02,1.167611986999999942e+02,1.167644733000000059e+02,1.167677046999999959e+02,1.167677573999999936e+02,1.167613807000000037e+02,1.167667629999999974e+02,1.167623195999999979e+02,1.167618808000000001e+02,1.167611495000000019e+02,1.167678961999999956e+02,1.167682370999999932e+02,1.167680438000000009e+02,1.167685012000000029e+02,1.167648745000000048e+02,1.167614764000000065e+02,1.167637109000000066e+02,1.167622887999999932e+02,1.167665419000000071e+02,1.167670628000000050e+02,1.167645423999999963e+02,1.167682532000000037e+02,1.167610607000000016e+02,1.167669630000000041e+02,1.167634067000000044e+02,1.167637098000000009e+02,1.167603370000000069e+02,1.167652939000000032e+02,1.167608787000000063e+02,1.167653751000000000e+02,1.167659601000000009e+02,1.167655450999999971e+02,1.167660134000000056e+02,1.167656620000000061e+02,1.167656702999999965e+02,1.167663144999999929e+02,1.167600867000000022e+02,1.167607957999999968e+02,1.167602056000000061e+02,1.167600324000000001e+02,1.167597561000000042e+02,1.167605132999999995e+02,1.167676510000000007e+02,1.167672890999999993e+02,1.167673297999999988e+02,1.167669669999999940e+02,1.167675715000000025e+02,1.167668773000000044e+02,1.167627662999999956e+02,1.167624284999999986e+02,1.167627393000000069e+02,1.167621333000000021e+02,1.167629950999999977e+02,1.167624133000000057e+02,1.167575812000000042e+02,1.167571410999999983e+02,1.167582742000000025e+02,1.167576853000000057e+02,1.167572466999999961e+02,1.167579644000000059e+02,1.167530505999999946e+02,1.167534117999999950e+02,1.167525791000000055e+02,1.167533348999999987e+02,1.167529681999999980e+02,1.167530614000000071e+02,1.167520465999999999e+02,1.167524496999999997e+02,1.167524927999999989e+02,1.167528934999999990e+02,1.167519147999999944e+02,1.167522364999999951e+02,1.167601496999999995e+02,1.167606990999999965e+02,1.167610568000000058e+02,1.167604848999999945e+02,1.167608436999999952e+02,1.167602442999999965e+02,1.167642048999999957e+02,1.167634233999999935e+02,1.167637744999999967e+02,1.167634227000000067e+02,1.167641981999999956e+02,1.167637390000000011e+02,1.167711220000000054e+02,1.167707261000000045e+02,1.167702907999999979e+02,1.167708843000000059e+02,1.167703810000000004e+02,1.167709195000000051e+02,1.167793211999999983e+02,1.167791813999999988e+02,1.167795291999999989e+02,1.167788500999999997e+02,1.167795128000000062e+02,1.167791201000000001e+02,1.167703630999999973e+02,1.167699891999999977e+02,1.167696118000000070e+02,1.167703549000000010e+02,1.167700985000000031e+02,1.167704837999999938e+02,1.167720829999999950e+02,1.167714744000000024e+02,1.167718145000000050e+02,1.167712388000000061e+02,1.167721587000000056e+02,1.167718593999999968e+02,1.167699709999999982e+02,1.167696284999999961e+02,1.167690852000000064e+02,1.167701157999999992e+02,1.167692767000000060e+02,1.167697275000000019e+02,1.167618649000000062e+02,1.167613391999999948e+02,1.167621651999999983e+02,1.167616862999999938e+02,1.167618862000000064e+02,1.167613223999999974e+02,1.167587488000000064e+02,1.167593112999999931e+02,1.167587160000000068e+02,1.167582898999999941e+02,1.167590691000000049e+02,1.167587759000000034e+02,1.167717769000000061e+02,1.167721822000000031e+02,1.167717075999999992e+02,1.167723117000000030e+02,1.167713075000000060e+02,1.167720742999999999e+02,1.167906677000000002e+02,1.167910262000000046e+02,1.167903222000000056e+02,1.167913484999999980e+02,1.167906526000000014e+02,1.167910011000000026e+02,1.168116744999999952e+02,1.168121998999999960e+02,1.168112332000000038e+02,1.168120439000000061e+02,1.168116773999999936e+02,1.168111896000000058e+02,1.168261114999999961e+02,1.168264826999999997e+02,1.168260810000000021e+02,1.168267996999999951e+02,1.168264779999999945e+02,1.168260118999999975e+02,1.167491272000000038e+02,1.167490547000000021e+02,1.167496873000000051e+02,1.167486614000000031e+02,1.167492924000000016e+02,1.167488723999999962e+02,1.167369383999999997e+02,1.167374566000000016e+02,1.167372028000000057e+02,1.167376328999999942e+02,1.167367779000000070e+02,1.167372457999999966e+02,1.167286485000000056e+02,1.167281763999999953e+02,1.167290074000000004e+02,1.167286519000000027e+02,1.167288958999999977e+02,1.167282369999999929e+02,1.167296735000000041e+02,1.167300575999999950e+02,1.167304058999999938e+02,1.167300922999999955e+02,1.167297104999999959e+02,1.167300098999999989e+02,1.167478811999999948e+02,1.167473976999999934e+02,1.167478698999999978e+02,1.167473075999999992e+02,1.167483165999999954e+02,1.167475354000000038e+02,1.167851002000000022e+02,1.167855277999999970e+02,1.167848766999999981e+02,1.167852766999999972e+02,1.167857920000000007e+02,1.167852249999999970e+02,1.167843351000000069e+02,1.167849020000000024e+02,1.167845193999999935e+02,1.167841326000000066e+02,1.167849202999999960e+02,1.167845937000000021e+02,1.167739720999999946e+02,1.167735765000000043e+02,1.167743154000000061e+02,1.167745857000000029e+02,1.167742106000000035e+02,1.167738521999999932e+02,1.167515432999999945e+02,1.167522850000000005e+02,1.167513538999999980e+02,1.167517880999999988e+02,1.167514498999999972e+02,1.167520839000000024e+02,1.167193486999999976e+02,1.167196165000000008e+02,1.167188220999999970e+02,1.167192399999999992e+02,1.167194779000000011e+02,1.167189309999999978e+02,1.168347370999999981e+02,1.168343480000000056e+02,1.168353120999999959e+02,1.168347631000000035e+02,1.168344672000000060e+02,1.168351963000000069e+02,1.168641578999999950e+02,1.168636118999999951e+02,1.168638423000000017e+02,1.168646104999999977e+02,1.168636347999999998e+02,1.168643040999999982e+02,1.168672039000000069e+02,1.168667745000000053e+02,1.168662077999999980e+02,1.168671252000000038e+02,1.168667427000000032e+02,1.168663363999999945e+02,1.169401076999999987e+02,1.169392885999999976e+02,1.169397308000000066e+02,1.169393103999999965e+02,1.169399659999999983e+02,1.169396636000000029e+02,1.169922322999999977e+02,1.169916867999999965e+02,1.169920481999999993e+02,1.169926363999999950e+02,1.169919191000000041e+02,1.169925288000000023e+02,1.170158578000000063e+02,1.170155881999999963e+02,1.170162531999999942e+02,1.170156053000000043e+02,1.170159924999999959e+02,1.170151704000000024e+02,1.171008345000000048e+02,1.171003946000000013e+02,1.171014442999999972e+02,1.171006011999999998e+02,1.171009887999999961e+02,1.171006102000000055e+02,1.166934693999999979e+02,1.166936476999999996e+02,1.166940412999999950e+02,1.166933202000000023e+02,1.166937032000000016e+02,1.166932108999999969e+02,1.166668403999999981e+02,1.166672183000000018e+02,1.166674160999999970e+02,1.166662459000000069e+02,1.166667465999999962e+02,1.166667281999999943e+02,1.166218060000000065e+02,1.166212838000000005e+02,1.166209024999999997e+02,1.166215547999999984e+02,1.166213153000000062e+02,1.166217019000000050e+02,1.166546550000000053e+02,1.166543053999999984e+02,1.166546701999999982e+02,1.166541229000000044e+02,1.166550110999999958e+02,1.166544358000000017e+02,1.166724451999999985e+02,1.166721744000000029e+02,1.166726361999999995e+02,1.166730036000000013e+02,1.166721143000000041e+02,1.166726134999999971e+02,1.167350928999999979e+02,1.167346517999999946e+02,1.167350832999999994e+02,1.167355045000000047e+02,1.167345238999999992e+02,1.167350732999999963e+02,1.167249632999999989e+02,1.167244781999999930e+02,1.167253556000000003e+02,1.167248093999999980e+02,1.167243430000000046e+02,1.167250602999999956e+02,1.167629117000000036e+02,1.167625574999999998e+02,1.167622003000000035e+02,1.167629697999999934e+02,1.167626113000000032e+02,1.167623293000000047e+02,1.168051832000000019e+02,1.168048251000000022e+02,1.168052279000000055e+02,1.168048880000000054e+02,1.168056073999999995e+02,1.168051392999999933e+02,1.167246454000000000e+02,1.167254413999999940e+02,1.167249869999999987e+02,1.167253591000000057e+02,1.167244720999999998e+02,1.167250108000000068e+02,1.166800132999999988e+02,1.166804197000000016e+02,1.166797939000000071e+02,1.166802069999999958e+02,1.166798232999999954e+02,1.166802390999999943e+02,1.166251826000000023e+02,1.166254959000000042e+02,1.166252036000000061e+02,1.166248264000000034e+02,1.166254433000000006e+02,1.166248820999999936e+02,1.165451233999999943e+02,1.165456468000000001e+02,1.165447980999999942e+02,1.165452092000000022e+02,1.165455271000000010e+02,1.165448236999999949e+02,1.164524468999999982e+02,1.164531216999999970e+02,1.164525555999999966e+02,1.164530242000000015e+02,1.164521976000000052e+02,1.164525842999999981e+02] Y = [-2.682598211999999904e+01,-2.682400458000000043e+01,-2.682519844000000120e+01,-2.682516319999999865e+01,-2.682463766000000049e+01,-2.682325862000000072e+01,-2.682416999000000146e+01,-2.682506289000000166e+01,-2.682419533999999928e+01,-2.682429412999999840e+01,-2.682428184000000115e+01,-2.682362068000000122e+01,-2.682555310000000048e+01,-2.682533563000000143e+01,-2.682459854000000021e+01,-2.682468756999999826e+01,-2.682399616000000009e+01,-2.682414453000000165e+01,-2.682512807999999893e+01,-2.682491591000000142e+01,-2.682458807000000078e+01,-2.682516717000000028e+01,-2.682559725999999856e+01,-2.682355978000000007e+01,-2.682351788000000070e+01,-2.682333347999999873e+01,-2.682367720999999960e+01,-2.682617452999999941e+01,-2.682568058000000022e+01,-2.682371811999999878e+01,-2.682539298000000016e+01,-2.682320405999999835e+01,-2.682607063000000025e+01,-2.682416668999999843e+01,-2.682531300000000130e+01,-2.682567879999999860e+01,-2.682466116999999883e+01,-2.682474063000000086e+01,-2.682620428999999973e+01,-2.682423371000000145e+01,-2.682458619000000155e+01,-2.682449107000000055e+01,-2.682524525999999909e+01,-2.682438176000000141e+01,-2.682640251000000120e+01,-2.682386629999999883e+01,-2.682575495000000032e+01,-2.682494529999999955e+01,-2.682298227000000068e+01,-2.682557407999999910e+01,-2.682341861000000094e+01,-2.682596995999999834e+01,-2.682382490000000175e+01,-2.682451285999999868e+01,-2.682485810000000015e+01,-2.682541349999999980e+01,-2.682577849000000114e+01,-2.682582645000000099e+01,-2.682448198999999889e+01,-2.682504806000000031e+01,-2.682605715000000046e+01,-2.682624136000000092e+01,-2.682495975000000143e+01,-2.682340203000000045e+01,-2.682303145999999927e+01,-2.682645225999999994e+01,-2.682465270999999873e+01,-2.682316336999999962e+01,-2.682382532000000097e+01,-2.682381442999999877e+01,-2.682541508999999991e+01,-2.682381893000000161e+01,-2.682648870999999957e+01,-2.682568999000000076e+01,-2.682494098000000093e+01,-2.682617564999999971e+01,-2.682650836999999910e+01,-2.682260188000000056e+01,-2.682657439000000110e+01,-2.682384838999999843e+01,-2.682734338999999935e+01,-2.682666532000000004e+01,-2.682346752000000123e+01,-2.682644618999999864e+01,-2.682314494999999965e+01,-2.682688522000000120e+01,-2.682546539999999879e+01,-2.682695037999999954e+01,-2.682285707999999858e+01,-2.682422313000000003e+01,-2.682686624000000108e+01,-2.682455841999999890e+01,-2.682217298999999855e+01,-2.682585337000000081e+01,-2.682416921000000087e+01,-2.682327722000000136e+01,-2.682272323000000114e+01,-2.682427994000000027e+01,-2.682703904999999978e+01,-2.682629731000000106e+01,-2.682221824000000154e+01,-2.682276292999999967e+01,-2.682564607000000123e+01,-2.682255358999999828e+01,-2.682263542000000101e+01,-2.682296638000000044e+01,-2.682385968000000176e+01,-2.682505448999999942e+01,-2.682239905999999863e+01,-2.682236118000000147e+01,-2.682598491999999979e+01,-2.682694784999999982e+01,-2.682718923999999916e+01,-2.682341097999999846e+01,-2.682577828000000153e+01,-2.682354013999999864e+01,-2.682622294999999824e+01,-2.682201411999999863e+01,-2.682340513000000115e+01,-2.682535036999999889e+01,-2.682373722999999899e+01,-2.682234714999999881e+01,-2.682342668000000074e+01,-2.682481891999999846e+01,-2.682653613000000092e+01,-2.682617013000000128e+01,-2.682651025999999916e+01,-2.682623596999999904e+01,-2.682541223000000130e+01,-2.682718982999999824e+01,-2.682415316999999888e+01,-2.682672155999999930e+01,-2.682295558999999940e+01,-2.682224409000000165e+01,-2.682507542999999828e+01,-2.682533616999999992e+01,-2.682301075000000168e+01,-2.682190813000000063e+01,-2.682255216000000075e+01,-2.682589630000000014e+01,-2.682653545999999878e+01,-2.682680214999999890e+01,-2.682704071999999940e+01,-2.682443615000000037e+01,-2.682590628999999893e+01,-2.682288295000000033e+01,-2.682463373999999945e+01,-2.682266231999999917e+01,-2.682271088999999975e+01,-2.682374225999999950e+01,-2.682451061000000081e+01,-2.682550190999999984e+01,-2.682529021999999941e+01,-2.682579734000000116e+01,-2.682117970999999912e+01,-2.682803679999999957e+01,-2.682784591000000063e+01,-2.682792141999999913e+01,-2.682601355999999981e+01,-2.682640912000000100e+01,-2.682096612000000135e+01,-2.682271340000000137e+01,-2.682675263000000143e+01,-2.682770799000000039e+01,-2.682458773999999835e+01,-2.682141498000000013e+01,-2.682734682999999976e+01,-2.682372738999999839e+01,-2.682592112000000029e+01,-2.682337974000000003e+01,-2.682755908000000034e+01,-2.682776266999999848e+01,-2.682851292000000143e+01,-2.682691589999999948e+01,-2.682148846000000120e+01,-2.682291113000000138e+01,-2.682799350999999888e+01,-2.682487697999999909e+01,-2.682135601999999963e+01,-2.682351119999999867e+01,-2.682414156000000105e+01,-2.682344168999999923e+01,-2.682156738000000118e+01,-2.682792622999999921e+01,-2.682684172000000089e+01,-2.682416534000000041e+01,-2.682551428000000016e+01,-2.682470260999999923e+01,-2.682339710000000110e+01,-2.682414079999999856e+01,-2.682773343999999938e+01,-2.682718221000000014e+01,-2.682115804000000026e+01,-2.682736391999999981e+01,-2.682181939999999898e+01,-2.682233542999999898e+01,-2.682761732999999893e+01,-2.682523962000000139e+01,-2.682257747999999964e+01,-2.682528072999999935e+01,-2.682842180999999826e+01,-2.682761299999999949e+01,-2.682469239999999999e+01,-2.682836179999999970e+01,-2.682458576000000150e+01,-2.682768902000000111e+01,-2.682093590999999932e+01,-2.682080716999999837e+01,-2.682141401000000158e+01,-2.682159569999999960e+01,-2.682117011000000062e+01,-2.682120898999999881e+01,-2.682541986000000023e+01,-2.682543757999999912e+01,-2.682500970999999979e+01,-2.682585369999999969e+01,-2.682560360000000088e+01,-2.682521484000000100e+01,-2.682781770000000066e+01,-2.682765479000000042e+01,-2.682721762999999982e+01,-2.682782358000000045e+01,-2.682745917000000091e+01,-2.682748782000000176e+01,-2.682017705000000163e+01,-2.681991547000000153e+01,-2.681976351000000136e+01,-2.681972558000000006e+01,-2.681950172999999893e+01,-2.681922924999999935e+01,-2.682106002000000089e+01,-2.682075517999999903e+01,-2.682063137000000097e+01,-2.682062054000000018e+01,-2.682034479000000005e+01,-2.682030267000000023e+01,-2.682574525000000065e+01,-2.682571809999999957e+01,-2.682539970999999923e+01,-2.682533873999999940e+01,-2.682530981000000025e+01,-2.682497726000000071e+01,-2.683431587000000107e+01,-2.683423445000000029e+01,-2.683386186999999978e+01,-2.683379150000000024e+01,-2.683370172000000053e+01,-2.683333486000000079e+01,-2.682900988999999825e+01,-2.682898022999999910e+01,-2.682891340999999841e+01,-2.682872649999999837e+01,-2.682863455000000030e+01,-2.682831961999999848e+01,-2.683235669999999828e+01,-2.683235249999999894e+01,-2.683221191000000161e+01,-2.683203243999999899e+01,-2.683189926000000014e+01,-2.683178841000000148e+01,-2.683354856000000055e+01,-2.683354453000000106e+01,-2.683336839000000040e+01,-2.683325586999999857e+01,-2.683298090999999985e+01,-2.683279832999999925e+01,-2.683009728000000038e+01,-2.682979153999999866e+01,-2.682971811999999900e+01,-2.682946553000000023e+01,-2.682936374000000157e+01,-2.682908632999999909e+01,-2.682615137999999888e+01,-2.682591782000000080e+01,-2.682585566999999926e+01,-2.682583525000000080e+01,-2.682545142000000027e+01,-2.682537765000000007e+01,-2.682189475999999928e+01,-2.682176822999999999e+01,-2.682163965000000161e+01,-2.682140138999999834e+01,-2.682131996000000029e+01,-2.682104471999999973e+01,-2.681601882000000003e+01,-2.681562856000000039e+01,-2.681555425999999898e+01,-2.681550478000000126e+01,-2.681523649000000020e+01,-2.681514360999999980e+01,-2.681117181000000116e+01,-2.681110182999999836e+01,-2.681092562999999984e+01,-2.681074687999999995e+01,-2.681045250000000024e+01,-2.681043869000000157e+01,-2.684394698999999918e+01,-2.684366272000000109e+01,-2.684360498999999933e+01,-2.684348559000000023e+01,-2.684327508999999878e+01,-2.684296827000000008e+01,-2.684975404000000054e+01,-2.684962038000000106e+01,-2.684925349999999966e+01,-2.684915399000000136e+01,-2.684908173999999903e+01,-2.684886159999999933e+01,-2.684866896000000125e+01,-2.684854895000000141e+01,-2.684848214999999882e+01,-2.684839303000000044e+01,-2.684806247999999940e+01,-2.684790263000000010e+01,-2.683634530000000140e+01,-2.683616165000000109e+01,-2.683609420000000156e+01,-2.683577632000000079e+01,-2.683574933999999956e+01,-2.683568570999999991e+01,-2.681023237999999864e+01,-2.680995352000000054e+01,-2.680979280000000031e+01,-2.680959315999999859e+01,-2.680945514000000074e+01,-2.680945385000000059e+01,-2.681152597000000171e+01,-2.681109842000000043e+01,-2.681091406000000177e+01,-2.681087983000000108e+01,-2.681082273000000171e+01,-2.681059630000000027e+01,-2.681849758999999978e+01,-2.681848799000000128e+01,-2.681825845999999913e+01,-2.681799621000000045e+01,-2.681796736000000081e+01,-2.681780759999999830e+01,-2.683374708999999925e+01,-2.683347982000000087e+01,-2.683342161999999931e+01,-2.683321420000000046e+01,-2.683294139999999928e+01,-2.683288694999999890e+01,-2.685609529999999978e+01,-2.685607410000000073e+01,-2.685574847000000176e+01,-2.685559479000000138e+01,-2.685548492999999937e+01,-2.685518160000000165e+01,-2.688073625999999905e+01,-2.688057617000000121e+01,-2.688033877000000160e+01,-2.688021957999999856e+01,-2.688001381999999850e+01,-2.687992913000000073e+01,-2.682014854999999898e+01,-2.682006489000000116e+01,-2.681983793999999932e+01,-2.681970066999999958e+01,-2.681951644000000101e+01,-2.681937909999999903e+01,-2.680705449999999956e+01,-2.680703232999999841e+01,-2.680677593000000059e+01,-2.680675068000000039e+01,-2.680671248000000162e+01,-2.680636044999999967e+01,-2.679281135000000091e+01,-2.679269800000000146e+01,-2.679269620999999901e+01,-2.679247190999999972e+01,-2.679234492000000145e+01,-2.679223100000000102e+01,-2.678285982999999959e+01,-2.678263645999999909e+01,-2.678258462000000151e+01,-2.678244409999999931e+01,-2.678225374000000159e+01,-2.678213682000000162e+01,-2.678450671999999955e+01,-2.678423906000000088e+01,-2.678418601999999993e+01,-2.678408510999999947e+01,-2.678376002999999983e+01,-2.678372956000000116e+01,-2.686176267999999823e+01,-2.686159646999999850e+01,-2.686155339999999825e+01,-2.686125592999999867e+01,-2.686094903000000045e+01,-2.686090598999999912e+01,-2.685878642999999855e+01,-2.685870578000000108e+01,-2.685834261000000112e+01,-2.685829027999999852e+01,-2.685805446999999901e+01,-2.685797243000000023e+01,-2.690680860999999879e+01,-2.690652953000000025e+01,-2.690646678999999963e+01,-2.690629901999999873e+01,-2.690614097999999998e+01,-2.690612716000000049e+01,-2.683064116999999982e+01,-2.683061409999999825e+01,-2.683051693000000171e+01,-2.683025639999999967e+01,-2.683021914000000052e+01,-2.683002687999999836e+01,-2.679902736000000019e+01,-2.679866777000000155e+01,-2.679863870000000148e+01,-2.679850684000000172e+01,-2.679821430000000149e+01,-2.679820227000000088e+01,-2.669732177999999934e+01,-2.669708801999999892e+01,-2.669691269999999861e+01,-2.669673155999999992e+01,-2.669667824000000067e+01,-2.669667331999999860e+01,-2.669055241999999950e+01,-2.669039417000000114e+01,-2.669031374000000056e+01,-2.669008061999999981e+01,-2.668998430999999982e+01,-2.668974898000000096e+01,-2.686364933999999849e+01,-2.686332064999999858e+01,-2.686328963000000059e+01,-2.686314137000000102e+01,-2.686286849000000032e+01,-2.686280413000000067e+01,-2.689933818000000088e+01,-2.689931557999999967e+01,-2.689901238999999933e+01,-2.689899700000000138e+01,-2.689886667000000031e+01,-2.689853735000000157e+01,-2.686551456000000115e+01,-2.686537586000000033e+01,-2.686524561999999960e+01,-2.686514601000000013e+01,-2.686482914000000122e+01,-2.686470904999999831e+01,-2.694980057000000073e+01,-2.694974299000000073e+01,-2.694945107999999934e+01,-2.694929703000000032e+01,-2.694917823999999840e+01,-2.694914685999999904e+01,-2.701275911999999835e+01,-2.701249221000000134e+01,-2.701237267999999858e+01,-2.701226611999999960e+01,-2.701213879999999889e+01,-2.701183478000000093e+01,-2.706405310999999969e+01,-2.706377415000000042e+01,-2.706373506999999989e+01,-2.706359356000000105e+01,-2.706347915999999998e+01,-2.706318397000000076e+01,-2.712774939999999901e+01,-2.712761601000000056e+01,-2.712752824000000018e+01,-2.712736265999999929e+01,-2.712729809000000003e+01,-2.712713915999999870e+01,-2.675105887000000138e+01,-2.675091735999999898e+01,-2.675086263000000031e+01,-2.675068531999999877e+01,-2.675056633999999889e+01,-2.675031407000000172e+01,-2.672196934999999840e+01,-2.672182176999999825e+01,-2.672161184999999861e+01,-2.672149780000000163e+01,-2.672145048000000145e+01,-2.672108151000000120e+01,-2.671301005999999845e+01,-2.671294577999999831e+01,-2.671276973000000154e+01,-2.671246972999999869e+01,-2.671244053999999934e+01,-2.671240137999999931e+01,-2.668502140000000011e+01,-2.668492387999999949e+01,-2.668475241000000153e+01,-2.668455841000000106e+01,-2.668435021000000162e+01,-2.668422316999999921e+01,-2.666182192999999856e+01,-2.666167061000000160e+01,-2.666138424000000029e+01,-2.666136020000000073e+01,-2.666107184999999902e+01,-2.666097462999999834e+01,-2.670516586000000103e+01,-2.670502262999999843e+01,-2.670481610999999944e+01,-2.670474630000000005e+01,-2.670460080999999875e+01,-2.670440535999999909e+01,-2.660137166999999891e+01,-2.660115099000000072e+01,-2.660097515000000001e+01,-2.660081122000000065e+01,-2.660076065000000156e+01,-2.660061336000000054e+01] return np.vstack((np.array(X),np.array(Y))).T