Пример #1
0
import numpy as np
import matplotlib.pyplot as plt
from astropy import units as u
from astropy.time import Time
from astropy.coordinates import SkyCoord, EarthLocation, AltAz
from astropy.coordinates import ICRS, Galactic, FK4, FK5

#Find Altitude and Azimuth at ARO of the zenith at DRAO

#Observatories 
ARO = EarthLocation(lat=45.9555*u.deg, lon=-78.0730*u.deg, height=390*u.m)
DRAO = EarthLocation(lat=49.321*u.deg, lon=-119.624*u.deg, height=545*u.m)

midnight = Time('2015-9-01 00:00:00')

zenith = SkyCoord(AltAz,az=358.2*u.deg,alt=50.0*u.deg, obstime=midnight, location=DRAO)

ARO_coords = ARO.to_geocentric()
DRAO_coords = DRAO.to_geocentric()

print DRAO_coords
print ARO_coords
Пример #2
0
class Interferometer(object):
    def __init__(self,
                 configuration_file,
                 centre_freq=1420e6,  # Hz
                 sub_array=None,
                 ):
        self.frequency = centre_freq / u.s
        self.wavelength = phys.c / self.frequency

        self.ref_position = None
        self.observer = None
        arr_desc = {'names': ('name', 'east', 'north', 'up', 'location'),
                    'formats': ('S5', float, float, float, EarthLocation)}
        self.antennas = recarray((0,), dtype=arr_desc)

        array_config = self.read_config(configuration_file)
        if 'reference' in array_config.keys():
            self._set_reference_(array_config['reference'])
            self.__ephem_observer__()
        self._build_array_(array_config['antennas'])

        # function to update with only selected antennas
        if sub_array is not None:
            self._extract_subarray_(sub_array)

        # number of antennas
        self.nr_antennas = len(self.antennas)
        # number pair or baseline
        self.nr_baselines = (self.nr_antennas * (self.nr_antennas - 1)) // 2

    def __ephem_observer__(self):
        lon = self.ref_position.geodetic[0].degree
        lat = self.ref_position.geodetic[1].degree
        alt = self.ref_position.geodetic[2].value
        self.observer = ephem.Observer()
        self.observer.lon = str(lon)
        self.observer.lat = str(lat)
        self.observer.elevation = alt

    def read_config(self, filename):
        """Read array default .yaml file."""
        with open(filename, "r") as stream:
            data = yaml.safe_load(stream)
        return data

    def __return_value__(self, prefix, item):
        if item.startswith(prefix):
            return item.split('=')[-1].strip()
        else:
            return None

    def _set_reference_(self, ref_position):
        """General Earth position for the Telescope"""
        ref_LAT = Latitude(ref_position['latitude'],
                           u.degree,
                           copy=False)
        ref_LON = Longitude(ref_position['longitude'],
                            u.degree,
                            wrap_angle=180. * u.degree,
                            copy=False)
        ref_ALT = u.Quantity(ref_position['altitude'],
                             u.m,
                             copy=False)
        self.ref_position = EarthLocation(lat=ref_LAT,
                                          lon=ref_LON,
                                          height=ref_ALT)

    def _build_array_(self, antennas):
        """ENU coordinates per antenna"""
        if self.ref_position is not None:
            [x, y, z] = self.ref_position.to_geocentric()

        self.antennas.resize(len(antennas))
        for cnt, antenna in enumerate(antennas):
            ant_ = [item.strip() for item in antenna.split(",")]
            for item_ in ant_:
                for prefix_ in ('name', 'east', 'north', 'up'):
                    val_ = self.__return_value__(prefix_, item_)
                    if val_ is not None:
                        self.antennas[cnt][prefix_] = val_
            if self.ref_position is not None:
                ant_North = x.value + self.antennas[cnt]['north']
                ant_East = y.value + self.antennas[cnt]['east']
                ant_Up = z.value + self.antennas[cnt]['up']
                self.antennas[cnt]['location'] = EarthLocation(x=ant_North * u.m,
                                                               y=ant_East * u.m,
                                                               z=ant_Up * u.m)

    def _extract_subarray_(self, subarray):
        row_indices = []
        for row_cnt, antenna in enumerate(self.antennas):
            if antenna['name'] in subarray:
                row_indices.append(row_cnt)
        self.antennas = self.antennas[row_indices]

    def baselines(self):
        """The function evaluates baselines lenghts
           and the angle between antennas
        """
        P = np.array([self.antennas['north'],
                      self.antennas['east']]).T
        # antenna position in wavelength units
        P = P / self.wavelength.value  # baseline

        bl_length = np.zeros((self.nr_baselines, ))
        bl_az_angle = np.zeros((self.nr_baselines, ))
        cnt = 0
        for idx0 in range(self.nr_antennas):
            for idx1 in range(idx0 + 1, self.nr_antennas):
                bl_len_p0 = (P[idx0, 0] - P[idx1, 0])**2
                bl_len_p1 = (P[idx0, 1] - P[idx1, 1])**2
                bl_length[cnt] = np.sqrt(bl_len_p0 + bl_len_p1)
                bl_az_angle[cnt] = np.arctan2((P[idx0, 1] - P[idx1, 1]),
                                              (P[idx0, 0] - P[idx1, 0]))
                cnt += 1

        return bl_length, bl_az_angle