# Simulates the behaviour of MinMed on a reduced data cube # User specifies only number of boxes and cube to operate on # At every channel, splits spatial bandpass into n boxes and finds the median in each. Subtracts # the minimum of the medians from the entire bandpass. import math import numpy import pyfits import os # Changes to the directory where the script is located abspath = os.path.abspath(__file__) dname = os.path.dirname(abspath) os.chdir(dname) infile = 'AGES7448_group.fits' outfile = str(infile.split('.fits')[0]+str('_SimMinMed.fits')) # Specify number of boxes n = 5 FitsFile = pyfits.open(infile) image= FitsFile[0].data header=FitsFile[0].header sizez = image.shape[0] sizey = image.shape[1] sizex = image.shape[2] print sizex,sizey,sizez for yp in range(0,sizey): for zp in range(0,sizez): print yp vlist = [] medlist = [] bpass = numpy.array(image[zp,yp,:]) # No. boxes examined so far nb = 0 # No. values in each box lb = int(float(len(bpass))/float(n)) for i in range(0,n): for j in range(nb*lb,(nb*lb)+lb): vlist.append(bpass[j]) # Remove nans from vlist. Do this now, rather than removing from the bandpass, because # this makes it easier to iterate over the (fixed) length of the bandpass (rather than # what would be the variable length of vlist). # Have to convert vlist into numpy array first vlist = numpy.array(vlist) vlist = vlist[numpy.logical_not(numpy.isnan(vlist))] med = numpy.median(vlist) medlist.append(med) vlist = [] nb = nb + 1 minmed = numpy.min(medlist) bpass = bpass - minmed image[zp,yp,:] = bpass FitsFile = pyfits.writeto(outfile,image,header=header)