Newer
Older
import subprocess
Javier Vegas-Regidor
committed
import numpy as np
from autosubmit.config.log import Log
Javier Vegas-Regidor
committed
from cdo import Cdo
from nco import Nco
import tempfile
import os
Javier Vegas-Regidor
committed
class Utils(object):
nco = Nco()
cdo = Cdo()
@staticmethod
def setminmax(filename, variable_list):
if isinstance(variable_list, basestring):
variable_list = variable_list.split()
Javier Vegas-Regidor
committed
Log.info('Getting max and min values for {0}', ' '.join(variable_list))
Javier Vegas-Regidor
committed
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):
Javier Vegas-Regidor
committed
Utils.rename_variables(filename, {old_name: new_name}, must_exist, rename_dimension)
def rename_variables(filepath, dic_names, must_exist=True, rename_dimension=False):
Javier Vegas-Regidor
committed
handler = Utils.nco.openCdf(filepath)
for old_name, new_name in dic_names.items():
Javier Vegas-Regidor
committed
if old_name in handler.variables:
handler.renameVariable(old_name, new_name)
elif must_exist:
raise Exception("Variable {0} does not exist in file {1}".format(old_name, filepath))
Javier Vegas-Regidor
committed
if old_name in handler.dimensions:
handler.renameDimension(old_name, new_name)
elif must_exist:
raise Exception("Variable {0} does not exist in file {1}".format(old_name, filepath))
handler.close()
@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(command, log_level=Log.DEBUG):
if isinstance(command, basestring):
command = command.split()
process = subprocess.Popen(command, stdout=subprocess.PIPE)
output = list()
comunicate = process.communicate()
for line in comunicate:
if not line:
continue
Log.log.log(log_level, line)
if process.returncode != 0:
raise Exception('Error executing {0}\n Return code: {1}', ' '.join(command), process.returncode)
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()