Source code for astrolyze.maps.tools

# Copyright (C) 2012, Christof Buchbender
# BSD License (License.txt)
import math
import os
import string
import sys
import matplotlib.pyplot as plt

import astrolyze.maps.main
import astrolyze.maps.fits
import astrolyze.maps.gildas
import astrolyze.maps.miriad

import astrolyze.functions.constants as const


[docs]def get_list(folder, data_format=None, depth=False): r""" Loading a list of files in all subfolders. Parameters ---------- folder : string The path to the folder that has to be parsed. data_format : string Search for specific files containing the string, e.g. '.fits' depth : integer The steps into the subfolder system. Defaults to maximum depth. Returns ------- final_list : array Array with the string to the files in the folder and sub folders. folder_list : Array with the strings to the folders. Only if depth is set. """ def get_sub_folder(folder): r""" Returns a list with the contents of a folder. """ os.system('ls ' + str(folder) + ' > temp') filein = open('temp').readlines() list = [] for i in filein: list += [str(folder) + '/' + str(i.strip())] os.system('rm -r temp') return list folder_list = [folder] final_list = [] # Variable to steer the depth of the search. x = 1 execute = True while execute: # Variables to check if the algorithm found folder # and or files in the last iterations. If only files are # found the loop is stopped. folder_check = False file_check = False new_folder_list = [] for folder in folder_list: list = get_sub_folder(folder) for sub_folder in list: if os.path.isdir(sub_folder): new_folder_list += [sub_folder] folder_check = True if os.path.isfile(sub_folder): if ((data_format is not None and data_format in sub_folder)): if sub_folder not in final_list: final_list += [sub_folder] if (data_format is None): final_list += [sub_folder] file_check = True if not folder_check and file_check: execute = False x = x + 1 if x > depth and depth: execute = False if x > 1000: print 'Not all folders contain files.' execute = False # Replace the list of folders from last iteration with the # list of folders of the next. folder_list = new_folder_list if not depth: return final_list if depth: return final_list, folder_list
[docs]def copy_structure(list, old_prefix, new_prefix): r""" Copies a folder structure from old_prefix to new_prefix. To assure all folders exists before working with or copying data. Parameters ---------- list : list A list containing the relative or absolute paths to files. old_prefix : string The old path to the folder structure that has to be copied. Has to actually appear in all the strings in list. new_prefix : string The path to where the folder structure is to be copied. Notes ----- This is usefull if one is working on many files stored in several sub-folders retrieved using :py:func:`get_list`. Examples -------- Say the folder structure is like this >>> ls ../modified/ co10/ co21/ >>> ls ../modfied/co10/ map1/ map2/ >>> ls ../modified/co21/ map1/ map2/ This can be copied to say ../even_more_modified by doing as follows: >>> from astrolyze.maptools import * >>> list = maptools.get_list(../modified) >>> maptools.copy_structure(list, old_prefix='../modified', >>> new_prefix='../even_more_modified') """ for item in list: item = item.replace(old_prefix, new_prefix) folder_parts = item.split('/')[:-1] string = folder_parts[0] folders = [string] for i in folder_parts[1:]: print i string = string + '/' + i folders += [string] for i in folders: print i if not os.path.isdir(i): print 'mkdir ' + i os.system('mkdir ' + i) else: pass
def unifyProjection(list, coordinate, angle=None, prefix='repro'): os.system('ls > temp') filein = open('temp').readlines() if folder + '\n' in filein: os.system('rm -rf ' + folder + '/*.*') pass else: os.system('mkdir ' + folder) os.system('rm temp') for i in list: i1 = i.strip().split('.') dataFormat = i1.pop() if dataFormat == 'fits': map = FitsMap(i) map = map.toGildas(prefix=folder) if dataFormat == 'gdf': map = GildasMap(i) map = map.toGildas(prefix=folder) if dataFormat != 'gdf': if dataFormat != 'fits': map = MiriadMap(str(i.strip())) map = map.toGildas(prefix=folder) map = map.reproject(coord=coordinate) if angle: map.goRot(angle) map.toFits() os.system('rm -rf ' + folder + '/*.gdf')
[docs]def unifyUnits(list, folder='units'): ''' NOT READY YET! ''' os.system('ls > temp') filein = open('temp').readlines() if folder + '\n' in filein: os.system('rm -rf ' + folder + '/*.*') pass else: os.system('mkdir ' + folder) os.system('rm temp') for i in list: i1 = i.strip().split('.') dataFormat = i1.pop() if dataFormat == 'fits': maps += [fits.FitsMap(str(i.strip()))] if dataFormat == 'gdf': maps += [gildas.GildasMap(str(i.strip()))] if dataFormat != 'gdf': if dataFormat != 'fits': maps += [miriad.MiriadMap(str(i.strip()))] for i in maps: if i.fluxUnit == 'JyB': if finalUnit == 'JyB': os.system('cp -r ' + str(i.map_name) + ' ' + folder + '/') pass if finalUnit == 'Tmb': i = i.toFits() i.data = i.data pass
[docs]def unifyMaps(list, tinMap, folder='reg'): ''' changes the dimensions and pixel sizes off all maps to that of a template map. ''' os.system('ls > temp') filein = open('temp').readlines() if folder + '\n' in filein: os.system('rm -rf ' + folder + '/*.*') pass else: os.system('mkdir ' + folder) os.system('rm temp') maps = [] for i in list: print i i1 = i.strip().split('.') dataFormat = i1.pop() if dataFormat == 'fits': maps += [fits.FitsMap(str(i.strip()))] if dataFormat == 'gdf': maps += [gildas.GildasMap(str(i.strip()))] if dataFormat != 'gdf': if dataFormat != 'fits': maps += [miriad.MiriadMap(str(i.strip()))] i1 = tinMap.strip().split('.') dataFormat = i1.pop() if dataFormat == 'fits': tinMap1 = fits.FitsMap(tinMap) tinMap1 = tinMap1.toMiriad() if dataFormat == 'gdf': tinMap1 = gildas.GildasMap(tinMap) tinMap1 = tinMap1.toMiriad() if dataFormat != 'gdf': if dataFormat != 'fits': tinMap1 = miriad.MiriadMap(tinMap) for i in maps: i.prefix = str(folder) + '/' mirMap = i.toMiriad() old = mirMap.map_name mirMap.regrid(tin=tinMap1.map_name) os.system('rm -rf ' + str(old)) old = mirMap.map_name mirMap = mirMap.toFits() os.system('rm -rf ' + str(addOn.myStrip(mirMap.map_name, 5))) os.system('rm -rf ' + tinMap1.map_name)
def scatterPlot(list): colors = ['green', 'red', 'black', 'yellow', 'blue', 'navy'] os.system('ls > temp') filein = open('temp').readlines() if 'scatterPlots\n' in filein: os.system('rm -rf scatterPlots/*.*') pass else: os.system('mkdir scatterPlots') os.system('rm temp') for j in list: plt.clf() os.system('ls ' + str(j) + ' > temp') filein = open('temp').readlines() a = 0 for i in filein: name = (i.split('.')[0].split('_')[0] + '_' + i.split('.')[0].split('_')[1]) region = i.split('.')[0].split('_')[2] filein = open(j + '/' + i.strip()).readlines() x = [] y = [] for k in filein: x += [k.split()[0]] y += [k.split()[1]] plt.plot(x, y, 'x', color=colors[a], label=region) a = a + 1 plt.legend(numpoints=1, loc='lower right') plt.xlabel(str(name.split('_')[0])) plt.ylabel(str(name.split('_')[1])) plt.savefig('scatterPlots/' + name + '.eps', dpi=None, facecolor='w', edgecolor='w', orientation='portrait', papertype='a4', format='eps', transparent=False, bbox_inches='tight')
[docs]def unifyResolution(liste, resolution=False, folder='smooth', scaling=''): ''' Approved. ''' os.system('ls > temp') filein = open('temp').readlines() if folder + '\n' in filein: os.system('rm -rf ' + folder + '/*') os.system('rm -rf ' + folder + '/*.*') pass else: os.system('mkdir ' + folder) os.system('rm temp') maps = [] filein = liste for i in filein: i1 = i.strip().split('.') dataFormat = i1.pop() if dataFormat == 'fits': maps += [fits.FitsMap(str(i.strip()))] if dataFormat == 'gdf': maps += [gildas.GildasMap(str(i.strip()))] if dataFormat != 'gdf': if dataFormat != 'fits': maps += [miriad.MiriadMap(str(i.strip()))] resolutions = [] if not resolution: for i in maps: maxRes = max(i.resolution[0:2]) resolutions += [float(maxRes)] for i in maps: i.prefix = folder + '/' mirMap = i.toMiriad() if float(max(resolutions)) != float(mirMap.resolution): sm = mirMap.resolution[0] mirMap.smooth(max(resolutions), mirMap.resolution, scaling) os.system('rm -rf ' + str(mirMap.returnName(resolution=sm))) mirMap.toFits() else: for i in maps: if i.resolution is list: maxRes = max(i.resolution[0:2]) else: maxRes = i.resolution if float(resolution) > float(max(maxRes)): # change the intrinsic folder i.prefix = folder + '/' # change to miriad and save in new folder i = i.toMiriad() # store old resolution sm = i.resolution # smooth to new resolution i.smooth(resolution, i.resolution[0], scale=scaling) os.system('rm -rf ' + str(i.returnName(resolution=sm))) i = i.toFits() os.system('rm -rf ' + str(addOn.myStrip(i.map_name, 5)))
def unifyPixelSize(pixSize, liste, folder): maps = [] filein = open(liste).readlines() for i in filein: i1 = i.strip().split('.') if i1[1] == 'fits': maps += [fits.FitsMap(str(i.strip()))] if i1[1] == 'gdf': maps += [gildas.GildasMap(str(i.strip()))] if len(i1) == 1: maps += [miriad.MiriadMap(str(i.strip()))] pixSizes = [] for i in maps: mirMap = i.toMiriad() mirMap.regridMiriadToArcsec(pixSize, scale='')