def main(options): debug = options.debug MSlist = [] for inmspart in options.inms.split(','): for msname in glob.iglob(inmspart): MSlist.append(msname) if len(MSlist) == 0: print 'Error: You must specify at least one MS name.' print ' Use "uvplot.py -h" to get help.' return if len(MSlist) > 1: print 'WARNING: Antenna selection (other than all) may not work well' print ' when plotting more than one MS. Carefully inspect the' print ' listings of antenna numbers/names!' device = options.device if device=='?': ppgplot.pgldev() return if options.title == '': plottitle = options.inms else: plottitle = options.title axlimits = options.axlimits.split(',') if len(axlimits) == 4: xmin,xmax,ymin,ymax = axlimits else: print 'Error: You must specify four axis limits' return timeslots = options.timeslots.split(',') if len(timeslots) != 3: print 'Error: Timeslots format is start,skip,end' return for i in range(len(timeslots)): timeslots[i] = int(timeslots[i]) if timeslots[i] < 0: print 'Error: timeslots values must not be negative' return antToPlotSpl = options.antennas.split(',') antToPlot = [] for i in range(len(antToPlotSpl)): tmpspl = antToPlotSpl[i].split('..') if len(tmpspl) == 1: antToPlot.append(int(antToPlotSpl[i])) elif len(tmpspl) == 2: for j in range(int(tmpspl[0]),int(tmpspl[1])+1): antToPlot.append(j) else: print 'Error: Could not understand antenna list.' return queryMode = options.query plotLambda = options.kilolambda badval = 0.0 xaxisvals = numpy.array([]) yaxisvals = numpy.array([]) savex = numpy.array([]) savey = numpy.array([]) numPlotted = 0 for inputMS in MSlist: # open the main table and print some info about the MS print 'Getting info for', inputMS t = pt.table(inputMS, readonly=True, ack=False) tfreq = pt.table(t.getkeyword('SPECTRAL_WINDOW'),readonly=True,ack=False) ref_freq = tfreq.getcol('REF_FREQUENCY',nrow=1)[0] ch_freq = tfreq.getcol('CHAN_FREQ',nrow=1)[0] print 'Reference frequency:\t%f MHz' % (ref_freq/1.e6) if options.wideband: ref_wavelength = 2.99792458e8/ch_freq else: ref_wavelength = [2.99792458e8/ref_freq] print 'Reference wavelength:\t%f m' % (ref_wavelength[0]) if options.sameuv and numPlotted > 0: print 'Assuming same uvw as first MS!' if plotLambda: for w in ref_wavelength: xaxisvals = numpy.append(xaxisvals,[savex/w/1000.,-savex/w/1000.]) yaxisvals = numpy.append(yaxisvals,[savey/w/1000.,-savey/w/1000.]) else: print 'Plotting more than one MS with same uv, all in meters... do you want -k?' xaxisvals = numpy.append(xaxisvals,[savex,-savex]) yaxisvals = numpy.append(yaxisvals,[savey,-savey]) continue firstTime = t.getcell("TIME", 0) lastTime = t.getcell("TIME", t.nrows()-1) intTime = t.getcell("INTERVAL", 0) print 'Integration time:\t%f sec' % (intTime) nTimeslots = (lastTime - firstTime) / intTime print 'Number of timeslots:\t%d' % (nTimeslots) if timeslots[1] == 0: if nTimeslots >= 100: timeskip = int(nTimeslots/100) else: timeskip = 1 else: timeskip = int(timeslots[1]) print 'For each baseline, plotting one point every %d samples' % (timeskip) if timeslots[2] == 0: timeslots[2] = nTimeslots # open the antenna subtable tant = pt.table(t.getkeyword('ANTENNA'), readonly=True, ack=False) # Station names antList = tant.getcol('NAME') if len(antToPlot)==1 and antToPlot[0]==-1: antToPlot = range(len(antList)) print 'Station list (only starred stations will be plotted):' for i in range(len(antList)): star = ' ' if i in antToPlot: star = '*' print '%s %2d\t%s' % (star, i, antList[i]) # Bail if we're in query mode if queryMode: return # select by time from the beginning, and only use specified antennas tsel = t.query('TIME >= %f AND TIME <= %f AND ANTENNA1 IN %s AND ANTENNA2 IN %s' % (firstTime+timeslots[0]*intTime,firstTime+timeslots[2]*intTime,str(antToPlot),str(antToPlot)), columns='ANTENNA1,ANTENNA2,UVW') # Now we loop through the baselines i = 0 nb = (len(antToPlot)*(len(antToPlot)-1))/2 sys.stdout.write('Reading uvw for %d baselines: %04d/%04d'%(nb,i,nb)) sys.stdout.flush() for tpart in tsel.iter(["ANTENNA1","ANTENNA2"]): ant1 = tpart.getcell("ANTENNA1", 0) ant2 = tpart.getcell("ANTENNA2", 0) if ant1 not in antToPlot or ant2 not in antToPlot: continue if ant1 == ant2: continue i += 1 sys.stdout.write('\b\b\b\b\b\b\b\b\b%04d/%04d'%(i,nb)) sys.stdout.flush() # Get the values to plot uvw = tpart.getcol('UVW', rowincr=timeskip) if numPlotted == 0: savex = numpy.append(savex,[uvw[:,0],-uvw[:,0]]) savey = numpy.append(savey,[uvw[:,1],-uvw[:,1]]) if plotLambda: for w in ref_wavelength: xaxisvals = numpy.append(xaxisvals,[uvw[:,0]/w/1000.,-uvw[:,0]/w/1000.]) yaxisvals = numpy.append(yaxisvals,[uvw[:,1]/w/1000.,-uvw[:,1]/w/1000.]) else: xaxisvals = numpy.append(xaxisvals,[uvw[:,0],-uvw[:,0]]) yaxisvals = numpy.append(yaxisvals,[uvw[:,1],-uvw[:,1]]) #if debug: # print uvw.shape # print xaxisvals.shape # print yaxisvals.shape #else: # sys.stdout.write('.') # sys.stdout.flush() sys.stdout.write(' Done!\n') numPlotted += 1 print 'Plotting uv points ...' # open the graphics device, using only one panel ppgplot.pgbeg(device, 1, 1) # set the font size ppgplot.pgsch(1) ppgplot.pgvstd() # Plot the data if debug: print xaxisvals xaxisvals = numpy.array(xaxisvals) yaxisvals = numpy.array(yaxisvals) tmpvals = numpy.sqrt(xaxisvals**2+yaxisvals**2) ppgplot.pgsci(1) uvmax = max(xaxisvals.max(),yaxisvals.max()) uvmin = min(xaxisvals.min(),yaxisvals.min()) uvuplim = 0.02*(uvmax-uvmin)+uvmax uvlolim = uvmin-0.02*(uvmax-uvmin) if xmin == '': minx = uvlolim else: minx = float(xmin) if xmax == '': maxx = uvuplim else: maxx = float(xmax) if ymin == '': miny = uvlolim else: miny = float(ymin) if ymax == '': maxy = uvuplim else: maxy = float(ymax) if minx == maxx: minx = -1.0 maxx = 1.0 if miny == maxy: miny = -1.0 maxy = 1.0 ppgplot.pgpage() ppgplot.pgswin(minx,maxx,miny,maxy) ppgplot.pgbox('BCNST',0.0,0,'BCNST',0.0,0) if plotLambda: ppgplot.pglab('u [k\gl]', 'v [k\gl]', '%s'%(plottitle)) else: ppgplot.pglab('u [m]', 'v [m]', '%s'%(plottitle)) ppgplot.pgpt(xaxisvals[tmpvals!=badval], yaxisvals[tmpvals!=badval], 1) # Close the PGPLOT device ppgplot.pgclos()
def main(options): global keepPlotting keepPlotting = True debug = options.debug inputMS = glob.glob(options.inms) if inputMS == '': print 'Error: You must specify a MS name.' print ' Use "uvplot.py -h" to get help.' return if options.inms.endswith('/'): options.inms = options.inms[:-1] inputMSbasename = options.inms.split('/')[-1] if inputMSbasename == '': # The user has not specified the full path of the MS inputMSbasename = options.inms device = options.device if device=='?': ppgplot.pgldev() return xaxis = options.xaxis if xaxis == 'ha': print 'Adding derived columns to allow plotting hour angle...' try: pt.addDerivedMSCal(inputMS) except: print 'Failed, trying to remove and add columns...' try: pt.removeDerivedMSCal(inputMS) pt.addDerivedMSCal(inputMS) except: print 'That failed too... plotting HA seems to not be possible.' return yaxis = options.yaxis column = options.column nx, ny = options.nxy.split(',') axlimits = options.axlimits.split(',') if len(axlimits) == 4: xmin,xmax,ymin,ymax = axlimits else: print 'Error: You must specify four axis limits' return showFlags = options.flag flagCol = options.colflag showAutocorr = options.autocorr showStats = options.statistics timeslots = options.timeslots.split(',') if len(timeslots) != 2: print 'Error: Timeslots format is start,end' return for i in range(len(timeslots)): timeslots[i] = int(timeslots[i]) antToPlotSpl = options.antennas.split(',') antToPlot = [] for i in range(len(antToPlotSpl)): tmpspl = antToPlotSpl[i].split('..') if len(tmpspl) == 1: antToPlot.append(int(antToPlotSpl[i])) elif len(tmpspl) == 2: for j in range(int(tmpspl[0]),int(tmpspl[1])+1): antToPlot.append(j) else: print 'Error: Could not understand antenna list.' return polarizations = options.polar.split(',') for i in range(len(polarizations)): polarizations[i] = int(polarizations[i]) convertStokes = options.stokes operation = options.operation if operation != '': operation = int(operation) if convertStokes: print 'Error: Stokes conversion is not compatible with special operations' return channels = options.channels.split(',') if len(channels) != 2: print 'Error: Channels format is start,end' return for i in range(len(channels)): channels[i] = int(channels[i]) if channels[1] == -1: channels[1] = None # last element even if there is only one else: channels[1] += 1 queryMode = options.query doUnwrap = options.wrap if not queryMode: # open the graphics device, use the right number of panels ppgplot.pgbeg(device, int(nx), int(ny)) # set the font size ppgplot.pgsch(1.5) ppgplot.pgvstd() # open the main table and print some info about the MS t = pt.table(inputMS, readonly=True, ack=False) firstTime = t.query(sortlist='TIME',columns='TIME',limit=1).getcell("TIME", 0) lastTime = t.query(sortlist='TIME',columns='TIME',offset=t.nrows()-1).getcell("TIME", 0) intTime = t.getcell("INTERVAL", 0) print 'Integration time:\t%f sec' % (intTime) nTimeslots = (lastTime - firstTime) / intTime if timeslots[1] == -1: timeslots[1] = nTimeslots else: timeslots[1] += 1 print 'Number of timeslots:\t%d' % (nTimeslots) # open the antenna and spectral window subtables tant = pt.table(t.getkeyword('ANTENNA'), readonly=True, ack=False) tsp = pt.table(t.getkeyword('SPECTRAL_WINDOW'), readonly=True, ack=False) numChannels = len(tsp.getcell('CHAN_FREQ',0)) print 'Number of channels:\t%d' % (numChannels) print 'Reference frequency:\t%5.2f MHz' % (tsp.getcell('REF_FREQUENCY',0)/1.e6) # Station names antList = tant.getcol('NAME') if len(antToPlot)==1 and antToPlot[0]==-1: antToPlot = range(len(antList)) print 'Station list (only starred stations will be plotted):' for i in range(len(antList)): star = ' ' if i in antToPlot: star = '*' print '%s %2d\t%s' % (star, i, antList[i]) # Bail if we're in query mode if queryMode: return # select by time from the beginning, and only use specified antennas tsel = t.query('TIME >= %f AND TIME <= %f AND ANTENNA1 IN %s AND ANTENNA2 IN %s' % (firstTime+timeslots[0]*intTime,firstTime+timeslots[1]*intTime,str(antToPlot),str(antToPlot))) # values to use for each polarization plotColors = [1,2,3,4] labXPositions = [0.35,0.45,0.55,0.65] labYPositions = [1.0,1.0,1.0,1.0] if convertStokes: polLabels = ['I','Q','U','V'] else: polLabels = ['XX','XY','YX','YY'] # define nicely written axis labels axisLabels = {'time': 'Time', 'ha': 'Hour angle', 'chan': 'Channel', 'freq': 'Frequency [MHz]', 'amp': 'Visibility amplitude', 'real': 'Real part of visibility', 'imag': 'Imaginary part of visibility', 'phase': 'Visibility phase [radians]'} # Now we loop through the baselines ppgplot.pgpage() for tpart in tsel.iter(["ANTENNA1","ANTENNA2"]): if not keepPlotting: return ant1 = tpart.getcell("ANTENNA1", 0) ant2 = tpart.getcell("ANTENNA2", 0) if ant1 not in antToPlot or ant2 not in antToPlot: continue if ant1 == ant2: if not showAutocorr: continue # Get the values to plot, strategy depends on axis type if xaxis == 'time' or xaxis == 'ha': xaxisvals = getXAxisVals(tpart, xaxis, channels) yaxisvals = getYAxisVals(tpart, yaxis, column, operation, showFlags, flagCol, channels, doUnwrap, convertStokes) else: xaxisvals = getXAxisVals(tsp, xaxis, channels) yaxisvals = getYAxisVals(tpart, yaxis, column, operation, showFlags, flagCol, channels, doUnwrap, convertStokes, xaxistype=1) if xaxisvals == None: # This baseline must be empty, go to next one print 'No good data on baseline %s - %s' % (antList[ant1],antList[ant2]) continue if debug: print xaxisvals.shape print yaxisvals.shape for r in range(len(xaxisvals)): print '%s'%yaxisvals[r] if len(xaxisvals) != len(yaxisvals): # something is wrong print 'Error: X and Y axis types incompatible' return # Plot the data, each polarization in a different color ppgplot.pgsci(1) if xmin == '': minx = xaxisvals.min() else: minx = float(xmin) if xmax == '': maxx = xaxisvals.max() else: maxx = float(xmax) if ymin == '': miny = yaxisvals.min() if numpy.ma.getmaskarray(yaxisvals.min()): print 'All data flagged on baseline %s - %s' % (antList[ant1],antList[ant2]) continue else: miny = float(ymin) if ymax == '': maxy = yaxisvals.max() else: maxy = float(ymax) if minx == maxx: minx -= 1.0 maxx += 1.0 else: diffx = maxx - minx minx -= 0.02*diffx maxx += 0.02*diffx if miny == maxy: miny -= 1.0 maxy += 1.0 else: diffy = maxy - miny miny -= 0.02*diffy maxy += 0.02*diffy #ppgplot.pgpage() ppgplot.pgswin(minx,maxx,miny,maxy) if xaxis == 'time' or xaxis == 'ha': ppgplot.pgtbox('ZHOBCNST',0.0,0,'BCNST',0.0,0) else: ppgplot.pgbox('BCNST',0.0,0,'BCNST',0.0,0) #ppgplot.pglab(axisLabels[xaxis], axisLabels[yaxis], '%s - %s'%(antList[ant1],antList[ant2])) #ppgplot.pgmtxt('T', 3.0, 0.5, 0.5, inputMSbasename) ppgplot.pglab(axisLabels[xaxis], axisLabels[yaxis], inputMSbasename + '(' + getDataDescription(column) + '): %s - %s'%(antList[ant1],antList[ant2])) if operation != 0: # some operations is defined if operation == 1: label = 'XX-YY' elif operation == 2: label = 'XY.YX*' else: print 'Special operation not defined' return ppgplot.pgsci(plotColors[0]) tmpvals = yaxisvals print 'Baseline',antList[ant1],'-',antList[ant2],': Plotting',len(tmpvals[~tmpvals.mask]),'points of ' + label ppgplot.pgpt(xaxisvals[~tmpvals.mask], tmpvals[~tmpvals.mask], 1) addInfo(showStats, tmpvals[~tmpvals.mask], label, labXPositions[1], labYPositions[1]) else: for j in polarizations: ppgplot.pgsci(plotColors[j]) tmpvals = yaxisvals[:,j] if j == polarizations[0]: print 'Baseline',antList[ant1],'-',antList[ant2],': Plotting',len(tmpvals[~tmpvals.mask]),'points per polarization' ppgplot.pgpt(xaxisvals[~tmpvals.mask], tmpvals[~tmpvals.mask], 1) addInfo(showStats, tmpvals[~tmpvals.mask], polLabels[j], labXPositions[j], labYPositions[j]) ppgplot.pgpage() # Close the PGPLOT device ppgplot.pgclos() if xaxis=='ha': print 'Removing derived columns...' pt.removeDerivedMSCal(inputMS)
def main(options): global keepPlotting keepPlotting = True debug = options.debug inputMS = options.inms if inputMS == "": print "Error: You must specify a MS name." print ' Use "uvplot.py -h" to get help.' return if inputMS.endswith("/"): inputMS = inputMS[:-1] inputMSbasename = inputMS.split("/")[-1] if inputMSbasename == "": # The user has not specified the full path of the MS inputMSbasename = inputMS device = options.device if device == "?": ppgplot.pgldev() return xaxis = options.xaxis yaxis = options.yaxis column = options.column nx, ny = options.nxy.split(",") axlimits = options.axlimits.split(",") if len(axlimits) == 4: xmin, xmax, ymin, ymax = axlimits else: print "Error: You must specify four axis limits" return showFlags = options.flag flagCol = options.colflag showAutocorr = options.autocorr showStats = options.statistics timeslots = options.timeslots.split(",") if len(timeslots) != 2: print "Error: Timeslots format is start,end" return for i in range(len(timeslots)): timeslots[i] = int(timeslots[i]) antToPlotSpl = options.antennas.split(",") antToPlot = [] for i in range(len(antToPlotSpl)): tmpspl = antToPlotSpl[i].split("..") if len(tmpspl) == 1: antToPlot.append(int(antToPlotSpl[i])) elif len(tmpspl) == 2: for j in range(int(tmpspl[0]), int(tmpspl[1]) + 1): antToPlot.append(j) else: print "Error: Could not understand antenna list." return polarizations = options.polar.split(",") for i in range(len(polarizations)): polarizations[i] = int(polarizations[i]) convertStokes = options.stokes operation = options.operation if operation != "": operation = int(operation) if convertStokes: print "Error: Stokes conversion is not compatible with special operations" return channels = options.channels.split(",") if len(channels) != 2: print "Error: Channels format is start,end" return for i in range(len(channels)): channels[i] = int(channels[i]) if channels[1] == -1: channels[1] = None # last element even if there is only one else: channels[1] += 1 queryMode = options.query doUnwrap = options.wrap if not queryMode: # open the graphics device, use the right number of panels ppgplot.pgbeg(device, int(nx), int(ny)) # set the font size ppgplot.pgsch(1.5) ppgplot.pgvstd() # open the main table and print some info about the MS t = pt.table(inputMS, readonly=True, ack=False) firstTime = t.getcell("TIME", 0) lastTime = t.getcell("TIME", t.nrows() - 1) intTime = t.getcell("INTERVAL", 0) print "Integration time:\t%f sec" % (intTime) nTimeslots = (lastTime - firstTime) / intTime if timeslots[1] == -1: timeslots[1] = nTimeslots else: timeslots[1] += 1 print "Number of timeslots:\t%d" % (nTimeslots) # open the antenna and spectral window subtables tant = pt.table(t.getkeyword("ANTENNA"), readonly=True, ack=False) tsp = pt.table(t.getkeyword("SPECTRAL_WINDOW"), readonly=True, ack=False) numChannels = len(tsp.getcell("CHAN_FREQ", 0)) print "Number of channels:\t%d" % (numChannels) print "Reference frequency:\t%5.2f MHz" % (tsp.getcell("REF_FREQUENCY", 0) / 1.0e6) # Station names antList = tant.getcol("NAME") if len(antToPlot) == 1 and antToPlot[0] == -1: antToPlot = range(len(antList)) print "Station list (only starred stations will be plotted):" for i in range(len(antList)): star = " " if i in antToPlot: star = "*" print "%s %2d\t%s" % (star, i, antList[i]) # Bail if we're in query mode if queryMode: return # select by time from the beginning, and only use specified antennas tsel = t.query( "TIME >= %f AND TIME <= %f AND ANTENNA1 IN %s AND ANTENNA2 IN %s" % (firstTime + timeslots[0] * intTime, firstTime + timeslots[1] * intTime, str(antToPlot), str(antToPlot)) ) # values to use for each polarization plotColors = [1, 2, 3, 4] labXPositions = [0.35, 0.45, 0.55, 0.65] labYPositions = [1.0, 1.0, 1.0, 1.0] if convertStokes: polLabels = ["I", "Q", "U", "V"] else: polLabels = ["XX", "XY", "YX", "YY"] # define nicely written axis labels axisLabels = { "time": "Time", "chan": "Channel", "freq": "Frequency [MHz]", "amp": "Visibility amplitude", "real": "Real part of visibility", "imag": "Imaginary part of visibility", "phase": "Visibility phase [radians]", } # Now we loop through the baselines ppgplot.pgpage() for tpart in tsel.iter(["ANTENNA1", "ANTENNA2"]): if not keepPlotting: return ant1 = tpart.getcell("ANTENNA1", 0) ant2 = tpart.getcell("ANTENNA2", 0) if ant1 not in antToPlot or ant2 not in antToPlot: continue if ant1 == ant2: if not showAutocorr: continue # Get the values to plot, strategy depends on axis type if xaxis == "time": xaxisvals = getXAxisVals(tpart, xaxis, channels) yaxisvals = getYAxisVals( tpart, yaxis, column, operation, showFlags, flagCol, channels, doUnwrap, convertStokes ) else: xaxisvals = getXAxisVals(tsp, xaxis, channels) yaxisvals = getYAxisVals( tpart, yaxis, column, operation, showFlags, flagCol, channels, doUnwrap, convertStokes, xaxistype=1 ) if xaxisvals == None: # This baseline must be empty, go to next one print "No good data on baseline %s - %s" % (antList[ant1], antList[ant2]) continue if debug: print xaxisvals.shape print yaxisvals.shape for r in range(len(xaxisvals)): print "%s" % yaxisvals[r] if len(xaxisvals) != len(yaxisvals): # something is wrong print "Error: X and Y axis types incompatible" return # Plot the data, each polarization in a different color ppgplot.pgsci(1) if xmin == "": minx = xaxisvals.min() else: minx = float(xmin) if xmax == "": maxx = xaxisvals.max() else: maxx = float(xmax) if ymin == "": miny = yaxisvals.min() if numpy.ma.getmaskarray(yaxisvals.min()): print "All data flagged on baseline %s - %s" % (antList[ant1], antList[ant2]) continue else: miny = float(ymin) if ymax == "": maxy = yaxisvals.max() else: maxy = float(ymax) if minx == maxx: minx -= 1.0 maxx += 1.0 else: diffx = maxx - minx minx -= 0.02 * diffx maxx += 0.02 * diffx if miny == maxy: miny -= 1.0 maxy += 1.0 else: diffy = maxy - miny miny -= 0.02 * diffy maxy += 0.02 * diffy # ppgplot.pgpage() ppgplot.pgswin(minx, maxx, miny, maxy) if xaxis == "time": ppgplot.pgtbox("ZHOBCNST", 0.0, 0, "BCNST", 0.0, 0) else: ppgplot.pgbox("BCNST", 0.0, 0, "BCNST", 0.0, 0) # ppgplot.pglab(axisLabels[xaxis], axisLabels[yaxis], '%s - %s'%(antList[ant1],antList[ant2])) # ppgplot.pgmtxt('T', 3.0, 0.5, 0.5, inputMSbasename) ppgplot.pglab( axisLabels[xaxis], axisLabels[yaxis], inputMSbasename + "(" + getDataDescription(column) + "): %s - %s" % (antList[ant1], antList[ant2]), ) if operation != 0: # some operations is defined if operation == 1: label = "XX-YY" elif operation == 2: label = "XY.YX*" else: print "Special operation not defined" return ppgplot.pgsci(plotColors[0]) tmpvals = yaxisvals print "Baseline", antList[ant1], "-", antList[ant2], ": Plotting", len( tmpvals[~tmpvals.mask] ), "points of " + label ppgplot.pgpt(xaxisvals[~tmpvals.mask], tmpvals[~tmpvals.mask], 1) addInfo(showStats, tmpvals[~tmpvals.mask], label, labXPositions[1], labYPositions[1]) else: for j in polarizations: ppgplot.pgsci(plotColors[j]) tmpvals = yaxisvals[:, j] if j == polarizations[0]: print "Baseline", antList[ant1], "-", antList[ant2], ": Plotting", len( tmpvals[~tmpvals.mask] ), "points per polarization" ppgplot.pgpt(xaxisvals[~tmpvals.mask], tmpvals[~tmpvals.mask], 1) addInfo(showStats, tmpvals[~tmpvals.mask], polLabels[j], labXPositions[j], labYPositions[j]) ppgplot.pgpage() # Close the PGPLOT device ppgplot.pgclos()
def listdevices(self): print 'Listing of available PGPLOT devices:\n' ppgplot.pgldev() print '\n'
def main(options): debug = options.debug MSlist = [] device = options.device if device == '?': ppgplot.pgldev() return for inmspart in options.inms.split(','): for msname in glob.iglob(inmspart): MSlist.append(msname) if len(MSlist) == 0: print('Error: You must specify at least one MS name.') print(' Use "uvplot.py -h" to get help.') return if len(MSlist) > 1: print('WARNING: Antenna selection (other than all) may not work well') print(' when plotting more than one MS. Carefully inspect the') print(' listings of antenna numbers/names!') if options.title == '': plottitle = options.inms else: plottitle = options.title axlimits = options.axlimits.split(',') if len(axlimits) == 4: xmin, xmax, ymin, ymax = axlimits else: print('Error: You must specify four axis limits') return timeslots = options.timeslots.split(',') if len(timeslots) != 3: print('Error: Timeslots format is start,skip,end') return for i in range(len(timeslots)): timeslots[i] = int(timeslots[i]) if timeslots[i] < 0: print('Error: timeslots values must not be negative') return doPlotColors = options.colors antToPlotSpl = options.antennas.split(',') antToPlot = [] for i in range(len(antToPlotSpl)): tmpspl = antToPlotSpl[i].split('..') if len(tmpspl) == 1: antToPlot.append(int(antToPlotSpl[i])) elif len(tmpspl) == 2: for j in range(int(tmpspl[0]), int(tmpspl[1]) + 1): antToPlot.append(j) else: print('Error: Could not understand antenna list.') return queryMode = options.query plotLambda = options.kilolambda badval = 0.0 xaxisvals0 = numpy.array([]) yaxisvals0 = numpy.array([]) xaxisvals1 = numpy.array([]) yaxisvals1 = numpy.array([]) xaxisvals2 = numpy.array([]) yaxisvals2 = numpy.array([]) xaxisvals3 = numpy.array([]) yaxisvals3 = numpy.array([]) xaxisvals4 = numpy.array([]) yaxisvals4 = numpy.array([]) xaxisvals5 = numpy.array([]) yaxisvals5 = numpy.array([]) savex0 = numpy.array([]) savey0 = numpy.array([]) savex1 = numpy.array([]) savey1 = numpy.array([]) savex2 = numpy.array([]) savey2 = numpy.array([]) savex3 = numpy.array([]) savey3 = numpy.array([]) savex4 = numpy.array([]) savey4 = numpy.array([]) savex5 = numpy.array([]) savey5 = numpy.array([]) numPlotted = 0 ptcolor = 0 for inputMS in MSlist: # open the main table and print some info about the MS print('Getting info for', inputMS) t = pt.table(inputMS, readonly=True, ack=False) tfreq = pt.table(t.getkeyword('SPECTRAL_WINDOW'), readonly=True, ack=False) ref_freq = tfreq.getcol('REF_FREQUENCY', nrow=1)[0] ch_freq = tfreq.getcol('CHAN_FREQ', nrow=1)[0] print('Reference frequency:\t%f MHz' % (ref_freq / 1.e6)) if options.wideband: ref_wavelength = 2.99792458e8 / ch_freq else: ref_wavelength = [2.99792458e8 / ref_freq] print('Reference wavelength:\t%f m' % (ref_wavelength[0])) if options.sameuv and numPlotted > 0: print('Assuming same uvw as first MS!') if plotLambda: for w in ref_wavelength: xaxisvals0 = numpy.append( xaxisvals0, [savex0 / w / 1000., -savex0 / w / 1000.]) yaxisvals0 = numpy.append( yaxisvals0, [savey0 / w / 1000., -savey0 / w / 1000.]) xaxisvals1 = numpy.append( xaxisvals1, [savex1 / w / 1000., -savex1 / w / 1000.]) yaxisvals1 = numpy.append( yaxisvals1, [savey1 / w / 1000., -savey1 / w / 1000.]) xaxisvals2 = numpy.append( xaxisvals2, [savex2 / w / 1000., -savex2 / w / 1000.]) yaxisvals2 = numpy.append( yaxisvals2, [savey2 / w / 1000., -savey2 / w / 1000.]) xaxisvals3 = numpy.append( xaxisvals3, [savex3 / w / 1000., -savex3 / w / 1000.]) yaxisvals3 = numpy.append( yaxisvals3, [savey3 / w / 1000., -savey3 / w / 1000.]) xaxisvals4 = numpy.append( xaxisvals4, [savex4 / w / 1000., -savex4 / w / 1000.]) yaxisvals4 = numpy.append( yaxisvals4, [savey4 / w / 1000., -savey4 / w / 1000.]) xaxisvals5 = numpy.append( xaxisvals5, [savex5 / w / 1000., -savex5 / w / 1000.]) yaxisvals5 = numpy.append( yaxisvals5, [savey5 / w / 1000., -savey5 / w / 1000.]) else: print( 'Plotting more than one MS with same uv, all in meters... do you want -k?' ) xaxisvals0 = numpy.append(xaxisvals0, [savex0, -savex0]) yaxisvals0 = numpy.append(yaxisvals0, [savey0, -savey0]) xaxisvals1 = numpy.append(xaxisvals1, [savex1, -savex1]) yaxisvals1 = numpy.append(yaxisvals1, [savey1, -savey1]) xaxisvals2 = numpy.append(xaxisvals2, [savex2, -savex2]) yaxisvals2 = numpy.append(yaxisvals2, [savey2, -savey2]) xaxisvals3 = numpy.append(xaxisvals3, [savex3, -savex3]) yaxisvals3 = numpy.append(yaxisvals3, [savey3, -savey3]) xaxisvals4 = numpy.append(xaxisvals4, [savex4, -savex4]) yaxisvals4 = numpy.append(yaxisvals4, [savey4, -savey4]) xaxisvals5 = numpy.append(xaxisvals5, [savex5, -savex5]) yaxisvals5 = numpy.append(yaxisvals5, [savey5, -savey5]) continue firstTime = t.getcell("TIME", 0) lastTime = t.getcell("TIME", t.nrows() - 1) intTime = t.getcell("INTERVAL", 0) print('Integration time:\t%f sec' % (intTime)) nTimeslots = (lastTime - firstTime) / intTime print('Number of timeslots:\t%d' % (nTimeslots)) if timeslots[1] == 0: if nTimeslots >= 100: timeskip = int(nTimeslots / 100) else: timeskip = 1 else: timeskip = int(timeslots[1]) print('For each baseline, plotting one point every %d samples' % (timeskip)) if timeslots[2] == 0: timeslots[2] = nTimeslots # open the antenna subtable tant = pt.table(t.getkeyword('ANTENNA'), readonly=True, ack=False) # Station names antList = tant.getcol('NAME') if len(antToPlot) == 1 and antToPlot[0] == -1: antToPlot = list(range(len(antList))) print('Station list (only starred stations will be plotted):') for i in range(len(antList)): star = ' ' if i in antToPlot: star = '*' print('%s %2d\t%s' % (star, i, antList[i])) # Bail if we're in query mode if queryMode: return # select by time from the beginning, and only use specified antennas tsel = t.query( 'TIME >= %f AND TIME <= %f AND ANTENNA1 IN %s AND ANTENNA2 IN %s' % (firstTime + timeslots[0] * intTime, firstTime + timeslots[2] * intTime, str(antToPlot), str(antToPlot)), columns='ANTENNA1,ANTENNA2,UVW') # Now we loop through the baselines i = 0 nb = (len(antToPlot) * (len(antToPlot) - 1)) / 2 sys.stdout.write('Reading uvw for %d baselines: %04d/%04d' % (nb, i, nb)) sys.stdout.flush() for tpart in tsel.iter(["ANTENNA1", "ANTENNA2"]): ant1 = tpart.getcell("ANTENNA1", 0) ant2 = tpart.getcell("ANTENNA2", 0) if ant1 not in antToPlot or ant2 not in antToPlot: continue if ant1 == ant2: continue i += 1 sys.stdout.write('\b\b\b\b\b\b\b\b\b%04d/%04d' % (i, nb)) sys.stdout.flush() if doPlotColors: stNameStr = antList[ant1][0] + antList[ant2][0] if stNameStr == 'CC': ptcolor = 0 elif stNameStr == 'RR': ptcolor = 1 elif 'C' in stNameStr and 'R' in stNameStr: ptcolor = 2 elif 'C' in stNameStr: ptcolor = 3 elif 'R' in stNameStr: ptcolor = 4 else: ptcolor = 5 # Get the values to plot uvw = tpart.getcol('UVW', rowincr=timeskip) if numPlotted == 0: savex0 = numpy.append(savex0, [uvw[:, 0], -uvw[:, 0]]) savey0 = numpy.append(savey0, [uvw[:, 1], -uvw[:, 1]]) savex1 = numpy.append(savex1, [uvw[:, 0], -uvw[:, 0]]) savey1 = numpy.append(savey1, [uvw[:, 1], -uvw[:, 1]]) savex2 = numpy.append(savex2, [uvw[:, 0], -uvw[:, 0]]) savey2 = numpy.append(savey2, [uvw[:, 1], -uvw[:, 1]]) savex3 = numpy.append(savex3, [uvw[:, 0], -uvw[:, 0]]) savey3 = numpy.append(savey3, [uvw[:, 1], -uvw[:, 1]]) savex4 = numpy.append(savex4, [uvw[:, 0], -uvw[:, 0]]) savey4 = numpy.append(savey4, [uvw[:, 1], -uvw[:, 1]]) savex5 = numpy.append(savex5, [uvw[:, 0], -uvw[:, 0]]) savey5 = numpy.append(savey5, [uvw[:, 1], -uvw[:, 1]]) if plotLambda: for w in ref_wavelength: if ptcolor == 0: xaxisvals0 = numpy.append( xaxisvals0, [uvw[:, 0] / w / 1000., -uvw[:, 0] / w / 1000.]) yaxisvals0 = numpy.append( yaxisvals0, [uvw[:, 1] / w / 1000., -uvw[:, 1] / w / 1000.]) elif ptcolor == 1: xaxisvals1 = numpy.append( xaxisvals1, [uvw[:, 0] / w / 1000., -uvw[:, 0] / w / 1000.]) yaxisvals1 = numpy.append( yaxisvals1, [uvw[:, 1] / w / 1000., -uvw[:, 1] / w / 1000.]) elif ptcolor == 2: xaxisvals2 = numpy.append( xaxisvals2, [uvw[:, 0] / w / 1000., -uvw[:, 0] / w / 1000.]) yaxisvals2 = numpy.append( yaxisvals2, [uvw[:, 1] / w / 1000., -uvw[:, 1] / w / 1000.]) elif ptcolor == 3: xaxisvals3 = numpy.append( xaxisvals3, [uvw[:, 0] / w / 1000., -uvw[:, 0] / w / 1000.]) yaxisvals3 = numpy.append( yaxisvals3, [uvw[:, 1] / w / 1000., -uvw[:, 1] / w / 1000.]) elif ptcolor == 4: xaxisvals4 = numpy.append( xaxisvals4, [uvw[:, 0] / w / 1000., -uvw[:, 0] / w / 1000.]) yaxisvals4 = numpy.append( yaxisvals4, [uvw[:, 1] / w / 1000., -uvw[:, 1] / w / 1000.]) elif ptcolor == 5: xaxisvals5 = numpy.append( xaxisvals5, [uvw[:, 0] / w / 1000., -uvw[:, 0] / w / 1000.]) yaxisvals5 = numpy.append( yaxisvals5, [uvw[:, 1] / w / 1000., -uvw[:, 1] / w / 1000.]) else: if ptcolor == 0: xaxisvals0 = numpy.append(xaxisvals0, [uvw[:, 0], -uvw[:, 0]]) yaxisvals0 = numpy.append(yaxisvals0, [uvw[:, 1], -uvw[:, 1]]) elif ptcolor == 1: xaxisvals1 = numpy.append(xaxisvals1, [uvw[:, 0], -uvw[:, 0]]) yaxisvals1 = numpy.append(yaxisvals1, [uvw[:, 1], -uvw[:, 1]]) elif ptcolor == 2: xaxisvals2 = numpy.append(xaxisvals2, [uvw[:, 0], -uvw[:, 0]]) yaxisvals2 = numpy.append(yaxisvals2, [uvw[:, 1], -uvw[:, 1]]) elif ptcolor == 3: xaxisvals3 = numpy.append(xaxisvals3, [uvw[:, 0], -uvw[:, 0]]) yaxisvals3 = numpy.append(yaxisvals3, [uvw[:, 1], -uvw[:, 1]]) elif ptcolor == 4: xaxisvals4 = numpy.append(xaxisvals4, [uvw[:, 0], -uvw[:, 0]]) yaxisvals4 = numpy.append(yaxisvals4, [uvw[:, 1], -uvw[:, 1]]) elif ptcolor == 5: xaxisvals5 = numpy.append(xaxisvals5, [uvw[:, 0], -uvw[:, 0]]) yaxisvals5 = numpy.append(yaxisvals5, [uvw[:, 1], -uvw[:, 1]]) #if debug: # print uvw.shape # print xaxisvals.shape # print yaxisvals.shape #else: # sys.stdout.write('.') # sys.stdout.flush() sys.stdout.write(' Done!\n') numPlotted += 1 print('Plotting uv points ...') # open the graphics device, using only one panel ppgplot.pgbeg(device, 1, 1) # set the font size ppgplot.pgsch(1) ppgplot.pgvstd() xaxisvals = numpy.append( xaxisvals0, numpy.append( xaxisvals1, numpy.append( xaxisvals2, numpy.append(xaxisvals3, numpy.append(xaxisvals4, xaxisvals5))))) yaxisvals = numpy.append( yaxisvals0, numpy.append( yaxisvals1, numpy.append( yaxisvals2, numpy.append(yaxisvals3, numpy.append(yaxisvals4, yaxisvals5))))) tmpvals0 = numpy.sqrt(xaxisvals0**2 + yaxisvals0**2) tmpvals1 = numpy.sqrt(xaxisvals1**2 + yaxisvals1**2) tmpvals2 = numpy.sqrt(xaxisvals2**2 + yaxisvals2**2) tmpvals3 = numpy.sqrt(xaxisvals3**2 + yaxisvals3**2) tmpvals4 = numpy.sqrt(xaxisvals4**2 + yaxisvals4**2) tmpvals5 = numpy.sqrt(xaxisvals5**2 + yaxisvals5**2) # Plot the data if debug: print(xaxisvals0[tmpvals0 != badval]) print(yaxisvals0[tmpvals0 != badval]) ppgplot.pgsci(1) uvmax = max(xaxisvals.max(), yaxisvals.max()) uvmin = min(xaxisvals.min(), yaxisvals.min()) uvuplim = 0.02 * (uvmax - uvmin) + uvmax uvlolim = uvmin - 0.02 * (uvmax - uvmin) if xmin == '': minx = uvlolim else: minx = float(xmin) if xmax == '': maxx = uvuplim else: maxx = float(xmax) if ymin == '': miny = uvlolim else: miny = float(ymin) if ymax == '': maxy = uvuplim else: maxy = float(ymax) if minx == maxx: minx = -1.0 maxx = 1.0 if miny == maxy: miny = -1.0 maxy = 1.0 ppgplot.pgpage() ppgplot.pgswin(minx, maxx, miny, maxy) ppgplot.pgbox('BCNST', 0.0, 0, 'BCNST', 0.0, 0) if plotLambda: ppgplot.pglab('u [k\gl]', 'v [k\gl]', '%s' % (plottitle)) else: ppgplot.pglab('u [m]', 'v [m]', '%s' % (plottitle)) ppgplot.pgpt(xaxisvals0[tmpvals0 != badval], yaxisvals0[tmpvals0 != badval], 1) #if doPlotColors: ppgplot.pgmtxt('T', 1, 0.35, 0.5, 'C-C') ppgplot.pgsci(2) ppgplot.pgpt(xaxisvals1[tmpvals1 != badval], yaxisvals1[tmpvals1 != badval], 1) #if doPlotColors: ppgplot.pgmtxt('T', 1, 0.50, 0.5, 'R-R') ppgplot.pgsci(4) ppgplot.pgpt(xaxisvals2[tmpvals2 != badval], yaxisvals2[tmpvals2 != badval], 1) #if doPlotColors: ppgplot.pgmtxt('T', 1, 0.65, 0.5, 'C-R') ppgplot.pgsci(3) ppgplot.pgpt(xaxisvals3[tmpvals3 != badval], yaxisvals3[tmpvals3 != badval], 1) #if doPlotColors: ppgplot.pgmtxt('T', 1, 0.55, 0.5, 'C-I') ppgplot.pgsci(5) ppgplot.pgpt(xaxisvals4[tmpvals4 != badval], yaxisvals4[tmpvals4 != badval], 1) #if doPlotColors: ppgplot.pgmtxt('T', 1, 0.65, 0.5, 'R-I') ppgplot.pgsci(6) ppgplot.pgpt(xaxisvals5[tmpvals5 != badval], yaxisvals5[tmpvals5 != badval], 1) #if doPlotColors: ppgplot.pgmtxt('T', 1, 0.75, 0.5, 'I-I') # Close the PGPLOT device ppgplot.pgclos()