Readflags.py
Readflags.py
— 10.4 KB
File contents
######################################################################
#
# readflags.py
#
# readflags: reads Antenna.xml and Flag.xml SDM tables and parses
# flag commands into returned dictionary
#
# listflags: prints flags from dictionary returned by readflags
#
# useflags: applies flags to ms
#
# plotflags: plots flags from dictionary returned by readflags
#
# Created S.T. Myers 2010-05-04 v1.0 from flagant.py
# Updated S.T. Myers 2010-05-24 v2.0 include reasons
# Updated S.T. Myers 2010-08-19 v3.0 restructure (read/list/useflags)
# Updated J. Marvil 2010-08-23 v4.0 plotflags
#
# Usage:
# from readflags import *
# sdmfile = '62_1_sb166824_1_000.55257.37544340278'
# myflags = readflags(sdmfile)
# or
# myflags = readflags(sdmfile,tbuff=2.0)
#
# then
# listflags(myflags)
# listflags(myflags,antenna='ea01')
# listflags(myflags,reason='FOCUS_ERROR')
#
# and/or
# msfile = '62_1_sb166824_1_000.55257.37544340278.ms'
# useflags(msfile,myflags)
# useflags(msfile,myflags,antenna='ea01')
# useflags(msfile,myflags,reason='FOCUS_ERROR')
#
# then
# plotflags(myflags)
#
# Notes: readflags
# Returns a dictionary with the 'antenna' and 'timerange' parameters
# used from the SDM (or MS) Antenna.xml and Flag.xml tables. Also
# individual flags in 'flaglist' structure.
#
# The tbuff parameter pads the timeranges (default by 1sec)
#
# (I)Python Notes: (courtesy A.Deller)
#
# Nominally, the flagant.py needs to be in the same directory you
# are running casapy from. If you want to put the source in a
# different directory, then:
#
# 1) Set up a place where you will put your modules and point a
# variable at it, e.g.:
# export CASAPYUTILS="~/src/python_mods/"
# 2) Then make sure ipython knows about it by putting:
# ip.ex("sys.path.append(os.environ['CASAPYUTILS'])")
# in your ~/.ipython/ipy_user_conf.py (under the main: block).
#
######################################################################
def readflags(sdmfile, tbuff=1.0):
try:
import casac
except ImportError, e:
print "failed to load casa:\n", e
exit(1)
qatool = casac.homefinder.find_home_by_name('quantaHome')
qa = casac.qa = qatool.create()
try:
from xml.dom import minidom
except ImportError, e:
print "failed to load xml.dom.minidom:\n", e
exit(1)
try:
from flagdata_cli import flagdata_cli as flagdata
except ImportError, e:
print "failed to load flagdata:\n", e
exit(1)
# construct look-up dictionary of name vs. id from Antenna.xml
xmlants = minidom.parse(sdmfile+'/Antenna.xml')
antdict = {}
rowlist = xmlants.getElementsByTagName("row")
for rownode in rowlist:
rowname = rownode.getElementsByTagName("name")
ant = str(rowname[0].childNodes[0].nodeValue)
rowid = rownode.getElementsByTagName("antennaId")
id = str(rowid[0].childNodes[0].nodeValue)
antdict[id] = ant
print ' Found ',rowlist.length,' antennas in Antenna.xml'
# now read Flag.xml into dictionary also and make a list
xmlflags = minidom.parse(sdmfile+'/Flag.xml')
flagdict = {}
flaglist = []
flagants = {}
flagreas = {}
rowlist = xmlflags.getElementsByTagName("row")
for rownode in rowlist:
rowfid = rownode.getElementsByTagName("flagId")
fid = str(rowfid[0].childNodes[0].nodeValue)
flagdict[fid] = {}
flaglist.append(fid)
rowid = rownode.getElementsByTagName("antennaId")
id = str(rowid[0].childNodes[0].nodeValue)
# start and end times in mjd ns
rowstart = rownode.getElementsByTagName("startTime")
start = int(rowstart[0].childNodes[0].nodeValue)
startmjd = (float(start)*1.0E-9 - tbuff)/86400.0
t = qa.quantity(startmjd,'d')
starttime = qa.time(t,form="ymd")
rowend = rownode.getElementsByTagName("endTime")
end = int(rowend[0].childNodes[0].nodeValue)
endmjd = (float(end)*1.0E-9 + tbuff)/86400.0
t = qa.quantity(endmjd,'d')
endtime = qa.time(t,form="ymd")
# reasons
rowreason = rownode.getElementsByTagName("reason")
reas = str(rowreason[0].childNodes[0].nodeValue)
# Construct antenna name and timerange and reason strings
antname = antdict[id]
flagdict[fid]['antenna'] = antname
cmd = starttime+'~'+endtime
flagdict[fid]['timerange'] = cmd
flagdict[fid]['reason'] = reas
# Also build per antenna strings
if flagants.has_key(antname):
flagants[antname] += ','+cmd
flagreas[antname] += ','+reas
else:
flagants[antname] = cmd
flagreas[antname] = reas
print ' Found ',rowlist.length,' flags in Flag.xml'
flags = {}
flags['antenna'] = []
flags['timerange'] = []
flags['reason'] = []
flags['flaglist'] = flagdict
if rowlist.length > 0:
#
keylist = flagants.keys()
keylist.sort()
antenna = []
timerange = []
reason = []
for ant in keylist:
antenna.append(ant)
timerange.append(flagants[ant])
reason.append(flagreas[ant])
# save the params in a dictionary
flags['antenna'] = antenna
flags['timerange'] = timerange
flags['reason'] = reason
else:
print 'No flagging found in Flag.xml'
# return the dictionary for later use
return flags
# Done
def listflags(myflags,antenna='',reason=''):
# Loop over flags
for key in myflags['flaglist'].keys():
myf = myflags['flaglist'][key]
ant = myf['antenna']
tim = myf['timerange']
reas = myf['reason']
if antenna=='' or ant==antenna:
if reason=='' or reas==reason:
print '%16s %8s %32s %48s' % (key, ant, reas, tim)
return
# Done
def useflags(msfile,myflags,antenna='',reason=''):
try:
import casac
except ImportError, e:
print "failed to load casa:\n", e
exit(1)
try:
from flagdata_cli import flagdata_cli as flagdata
except ImportError, e:
print "failed to load flagdata:\n", e
exit(1)
keylist = myflags['flaglist'].keys()
if keylist.__len__() > 0:
#
# Flag the data
#
keylist.sort()
flagants = {}
#
# Construct flag list for selected ant,reason
#
for key in keylist:
ant = myflags['flaglist'][key]['antenna']
if antenna=='' or ant==antenna:
reas = myflags['flaglist'][key]['reason']
if reason=='' or reas==reason:
# print '%16s %8s %32s %48s' % (key, ant, reas, tim)
cmd = myflags['flaglist'][key]['timerange']
if flagants.has_key(ant):
flagants[ant] += ','+cmd
else:
flagants[ant] = cmd
#
# Form and apply flags if any
flagkeys = flagants.keys()
if flagkeys.__len__() > 0:
antlist = []
timelist = []
flagkeys.sort()
for key in flagkeys:
cmd = flagants[key]
antlist.append(key)
timelist.append(cmd)
print 'Flagging data with '+str(antlist.__len__())+' entries'
flagdata(vis=msfile,mode='manualflag',antenna=antlist,timerange=timelist)
else:
print 'No flags found meeting criteria'
else:
print 'No flags found in dictionary'
return
# Done
def plotflags(myflags):
try:
import casac
except ImportError, e:
print "failed to load casa:\n", e
exit(1)
qatool = casac.homefinder.find_home_by_name('quantaHome')
qa = casac.qa = qatool.create()
try:
import pylab as pl
except ImportError, e:
print "failed to load pylab:\n", e
exit(1)
myants=myflags['antenna']
antind=0
pl.ioff()
f1=pl.figure()
ax1=f1.add_axes([.15,.1,.75,.85])
# ax1.set_ylabel('antenna')
# ax1.set_xlabel('time')
badflags=[]
for thisant in myflags['antenna']:
antind+=1
for thisflag in myflags['flaglist']:
if myflags['flaglist'][thisflag]['antenna']==thisant:
# print thisant, myflags['flaglist'][thisflag]['reason'], myflags['flaglist'][thisflag]['timerange']
thisReason=myflags['flaglist'][thisflag]['reason']
if thisReason=='FOCUS_ERROR': thisColor='red'
elif thisReason=='SUBREFLECTOR_ERROR': thisColor='blue'
elif thisReason=='ANTENNA_NOT_ON_SOURCE': thisColor='green'
elif thisReason=='ANTENNA_NOT_IN_SUBARRAY': thisColor='black'
mytimerange=myflags['flaglist'][thisflag]['timerange']
t1=mytimerange[:mytimerange.find('~')]
t2=mytimerange[mytimerange.find('~')+1:]
t1s, t2s=qa.convert(t1,'s')['value'], qa.convert(t2,'s')['value']
myTimeSpan=t2s-t1s
if myTimeSpan < 10000: ax1.plot([t1s,t2s],[antind,antind], color=thisColor, lw=2, alpha=.4)
else: badflags.append((thisant, myTimeSpan, thisReason))
##badflags are ones which span a time longer than that used above
##they can be so long that including them compresses the time axis so that none of the other flags are visible
# print 'badflags', badflags
myXlim=ax1.get_xlim()
myXrange=myXlim[1]-myXlim[0]
ax1.text(myXlim[0]+.05*myXrange, 29, 'FOCUS_ERROR', color='red')
ax1.text(myXlim[0]+.25*myXrange, 29, 'SUBREFLECTOR', color='blue')
ax1.text(myXlim[0]+.45*myXrange, 29, 'OFF_SOURCE', color='green')
ax1.text(myXlim[0]+.65*myXrange, 29, 'NOT_IN_SUBARRAY', color='black')
ax1.set_ylim([0,30])
ax1.set_yticks(range(1,len(myants)+1))
ax1.set_yticklabels(myants)
ax1.set_xticks(pl.linspace(myXlim[0],myXlim[1],3))
mytime=[myXlim[0],(myXlim[1]-myXlim[0])/2.0,myXlim[1]]
myTimestr = []
for time in mytime:
q1=qa.quantity(time,'s')
time1=qa.time(q1,form='ymd')
myTimestr.append(time1)
ax1.set_xticklabels([myTimestr[0],myTimestr[1][11:], myTimestr[2][11:]])
f1.show()
return
# Done

Connect with NRAO