Source code for meqsilhouette.utils.add_ant

""" adds a new antenna to a CASA antenna table
Usage: python add_ant.py

Currently, the inputs are hardcoded, with the AMT as an example. 

Inputs:
- input antenna table name
- output antenna table name
- new antenna dictionary, includes:
-- Position: Lat [deg], Long [deg, east +ve], height [metres]
converts to XYZ assuming WGS84 ellipsoid, formulas from Seeber, Satellite Geodesy (2003 ed, sect.2.1.4)

-- antenna mount type (will become important as MeqSilhouette accounts for this)

-- DISH_DIAMETER [metres]

-- etc.

e.g. newAntDict = {'OFFSET'  : [0,0,0],\
            'POSITION': [5627893.7450699108, 1637770.1989314035, -2512490.219404601],\
            'TYPE'    : 'GROUND-BASED',\
            'DISH_DIAMETER': 12,\
            'FLAG_ROW':  0,\
            'MOUNT'   : 'alt-az',\
            'NAME'    : 'AMT',\
            'STATION' : 'AMT'}

Ouputs: new antenna table

"""

import numpy as np
import pyrap.tables as pt
import os
from meqsilhouette.utils.comm_functions import *
import sys


[docs]def latlonh_2_xyz(lat_deg,lon_deg,h_metres): """ Convert input Lat,Lon,height to XYZ coordinates, assuming WGS84 geoid Parameters ---------- lat_deg : float Latitude in degrees lon_deg : float Longitude in degrees h_metres : float Height in metres Returns ------- list XYZ coordinates in metres """ degrad = np.pi/180. #WGS84 a = 6378137. finv = 298.257223563 f = 1./finv e2 = 2.*f - f**2 latr = lat_deg*degrad slat = np.sin(latr) slat2 = slat**2 clat = np.cos(latr) lonr = lon_deg*degrad clon = np.cos(lonr) slon = np.sin(lonr) nbar = a / np.sqrt(1. - e2*slat2) x = (nbar+h_metres) * clat*clon y = (nbar+h_metres) * clat*slon z = ((1.-e2)*nbar+h_metres) * slat return [x,y,z]
[docs]def AddAnt(inputAntTableName,outputAntTableName, newAntDict): """ Add a single row to existing CASA antenna table and write to a new table. Parameters ---------- inputAntTableName : str Name of input antenna table outputAntTableName : str Name of output antenna table newAntDict : dict Dictionary containing new antenna parameters """ if (os.path.exists(outputAntTableName)): abort('Antenna table %s exists!'%outputAntTableName) os.system('cp -r %s %s'%(inputAntTableName,outputAntTableName)) tab=pt.table(outputAntTableName,readonly=False,ack=True) tab.addrows(nrows=1) info('new antenna row parameter values:') for colname in tab.colnames(): col=tab.getcol(colname) print (colname + '=') print (newAntDict[colname]) print ('') col[-1] = newAntDict[colname] tab.putcol(colname,col) tab.close() info("Additional antenna %s added to input antenna table '%s'\n\ and written out to new antenna table '%s'"\ %(newAntDict['NAME'],inputAntTableName,outputAntTableName))
if __name__ == '__main__': if len(sys.argv) != 3: abort('Not enough inputs found. Aborting...') else: tabin = sys.argv[1] tabout = sys.argv[2] AMT_LatLonh = [ -23. - (20/60.) - (31.90)/3600., 16 + (13/60.) + (31.78)/3600., 2350] AMT_xyz = latlonh_2_xyz(AMT_LatLonh[0],AMT_LatLonh[1],AMT_LatLonh[2]) AMTAntDict = {'OFFSET' : [0,0,0],\ 'POSITION': AMT_xyz,\ 'TYPE' : 'GROUND-BASED',\ 'DISH_DIAMETER': 15,\ 'FLAG_ROW': 0,\ 'MOUNT' : 'alt-az',\ 'NAME' : 'AMT',\ 'STATION' : 'AMT'} #AddAnt('EHT','EHT_AMT',AMTAntDict) MeerKAT_LatLonh = [-30 - (42./60) - (47.41/3600), -21 - (26./60) - (38./3600), 1050] MeerKAT_xyz = latlonh_2_xyz(MeerKAT_LatLonh[0],MeerKAT_LatLonh[1],MeerKAT_LatLonh[2]) MeerKATAntDict = {'OFFSET' : [0,0,0],\ 'POSITION': MeerKAT_xyz,\ 'TYPE' : 'GROUND-BASED',\ 'DISH_DIAMETER': 13.5,\ 'FLAG_ROW': 0,\ 'MOUNT' : 'alt-az',\ 'NAME' : 'MK',\ 'STATION' : 'MK'} APEX_LatLonh = [-23 - (00./60) - (21.0/3600), -67 - (45./60) - (33./3600), 5100] APEX_xyz = latlonh_2_xyz(APEX_LatLonh[0],APEX_LatLonh[1],APEX_LatLonh[2]) APEXAntDict = {'OFFSET' : [0,0,0],\ 'POSITION': APEX_xyz,\ 'TYPE' : 'GROUND-BASED',\ 'DISH_DIAMETER': 12.0,\ 'FLAG_ROW': 0,\ 'MOUNT' : 'alt-az',\ 'NAME' : 'APEX',\ 'STATION' : 'APEX'} AddAnt(tabin,tabout,AMTAntDict) #MeerKATAntDict)