import subprocess import numpy as np from autosubmit.config.log import Log from cdo import Cdo from nco import Nco import tempfile import os import pwd import shutil class Utils(object): nco = Nco() cdo = Cdo() @staticmethod def setminmax(filename, variable_list): if isinstance(variable_list, basestring): variable_list = variable_list.split() Log.info('Getting max and min values for {0}', ' '.join(variable_list)) dataset = Utils.nco.readCdf(filename) for variable in variable_list: var = dataset.variables[variable] values = [np.max(var), np.min(var)] Utils.nco.ncatted(input=filename, output=filename, options='-h -a valid_max,{0},m,f,{1}'.format(variable, values[0])) Utils.nco.ncatted(input=filename, output=filename, options='-h -a valid_min,{0},m,f,{1}'.format(variable, values[1])) @staticmethod def rename_variable(filename, old_name, new_name, must_exist=True, rename_dimension=False): if must_exist: dot = '' else: dot = '.' options = '-v {0}{1},{2}'.format(dot, old_name, new_name) if rename_dimension: options += ' -d {0}{1},{2}'.format(dot, old_name, new_name) Utils.nco.ncrename(input=filename, output=filename, options=options) @staticmethod def rename_variables(filepath, dic_names, must_exist=True, rename_dimension=False): if must_exist: dot = '' else: dot = '.' options = '' for old_name, new_name in dic_names.items(): options += '-v {0}{1},{2} '.format(dot, old_name, new_name) if rename_dimension: options += ' -d {0}{1},{2} '.format(dot, old_name, new_name) Utils.nco.ncrename(input=filepath, output=filepath, options=options) @staticmethod def move_file(source, destiny): if not os.path.exists(os.path.dirname(destiny)): os.makedirs(os.path.dirname(destiny)) shutil.move(source, destiny) @staticmethod def execute_shell_command(line, log_level=Log.DEBUG): if isinstance(line, basestring): line = line.split() process = subprocess.Popen(line, stdout=subprocess.PIPE) for line in process.communicate(): if not line: continue Log.log.log(log_level, line) if process.returncode != 0: raise Exception('Error executing {0}\n Return code: {1}', ' '.join(line), process.returncode) return line class TempFile(object): autoclean = True files = list() scratch_folder = os.path.join('/scratch', pwd.getpwuid(os.getuid())[0]) prefix = 'temp' @staticmethod def get(filename=None, clean=True): if filename: path = os.path.join(TempFile.scratch_folder, filename) else: path = tempfile.mkstemp(dir=TempFile.scratch_folder, prefix=TempFile.prefix, suffix='.nc')[1] if clean: TempFile.files.append(path) return path @staticmethod def clean(): for temp_file in TempFile.files: if os.path.exists(temp_file): os.remove(temp_file) TempFile.files = list()