Skip to content

Commit 611d1ba

Browse files
committed
update helper functions
1 parent 1f20199 commit 611d1ba

File tree

1 file changed

+43
-39
lines changed

1 file changed

+43
-39
lines changed

spt_compute/imports/helper_functions.py

+43-39
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,36 @@
11
# -*- coding: utf-8 -*-
2-
##
3-
## helper_functions.py
4-
## spt_compute
5-
##
6-
## Created by Alan D. Snow.
7-
## Copyright © 2015-2016 Alan D Snow. All rights reserved.
8-
## License: BSD-3 Clause
2+
#
3+
# helper_functions.py
4+
# spt_ecmwf_autorapid_process
5+
#
6+
# Created by Alan D. Snow
7+
# License: BSD-3 Clause
98

109
import datetime
1110
from glob import glob
12-
from netCDF4 import Dataset, num2date # http://unidata.github.io/netcdf4-python/
1311
import os
1412
import re
1513
from shutil import rmtree
1614
import sys
1715

1816

19-
#----------------------------------------------------------------------------------------
17+
# ----------------------------------------------------------------------------------------
2018
# HELPER FUNCTIONS
21-
#----------------------------------------------------------------------------------------
19+
# ----------------------------------------------------------------------------------------
2220
class CaptureStdOutToLog(object):
23-
def __init__(self, out_file_path):
24-
self.out_file_path = out_file_path
21+
def __init__(self, log_file_path, error_file_path=None):
22+
self.log_file_path = log_file_path
23+
self.error_file_path = error_file_path
24+
if error_file_path is None:
25+
self.error_file_path = "{0}.err".format(os.path.splitext(log_file_path)[0])
26+
2527
def __enter__(self):
2628
self._stdout = sys.stdout
2729
self._stderr = sys.stderr
28-
sys.stdout = sys.stderr = open(self.out_file_path, 'w')
30+
sys.stdout = open(self.log_file_path, 'w')
31+
sys.stderr = open(self.error_file_path, 'w')
2932
return self
33+
3034
def __exit__(self, *args):
3135
sys.stdout.close()
3236
sys.stdout = self._stdout
@@ -46,43 +50,44 @@ def case_insensitive_file_search(directory, pattern):
4650
raise
4751

4852

49-
def clean_main_logs(main_log_directory, prepend="spt_compute_ecmwf_",
50-
lock_file_name="spt_compute_ecmwf_run_info_lock.txt",
51-
log_file_path=""):
53+
def clean_main_logs(main_log_directory, prepend="rapid_", log_file_path=""):
5254
"""
53-
Removes old log files older than one week old in main log directory
55+
This removes main logs older than three days old
5456
"""
5557
date_today = datetime.datetime.utcnow()
56-
week_timedelta = datetime.timedelta(7)
58+
week_timedelta = datetime.timedelta(3)
59+
60+
# clean up log files
5761
main_log_files = [f for f in os.listdir(main_log_directory) if
5862
not os.path.isdir(os.path.join(main_log_directory, f))
5963
and not log_file_path.endswith(f)
60-
and f != lock_file_name]
64+
and (f.endswith('log') or f.endswith('err'))]
6165

6266
for main_log_file in main_log_files:
6367
try:
64-
log_datetime = datetime.datetime.strptime(main_log_file, "{0}%y%m%d%H%M%S.log".format(prepend))
65-
if (date_today-log_datetime > week_timedelta):
68+
log_datetime = datetime.datetime.strptime(main_log_file[:18],
69+
"{0}%y%m%d%H%M%S".format(
70+
prepend))
71+
if date_today - log_datetime > week_timedelta:
6672
os.remove(os.path.join(main_log_directory, main_log_file))
6773
except Exception as ex:
6874
print(ex)
6975
pass
7076

7177

72-
def clean_logs(condor_log_directory, main_log_directory, prepend="spt_compute_ecmwf_", log_file_path=""):
78+
def clean_logs(condor_log_directory, main_log_directory, prepend="rapid_", log_file_path=""):
7379
"""
74-
This removed logs older than one week old
80+
This removes all logs older than three days old
7581
"""
7682
date_today = datetime.datetime.utcnow()
77-
week_timedelta = datetime.timedelta(7)
78-
#clean up condor logs
83+
week_timedelta = datetime.timedelta(3)
84+
# clean up condor logs
7985
condor_dirs = [d for d in os.listdir(condor_log_directory) if
8086
os.path.isdir(os.path.join(condor_log_directory, d))]
81-
8287
for condor_dir in condor_dirs:
8388
try:
8489
dir_datetime = datetime.datetime.strptime(condor_dir[:11], "%Y%m%d.%H")
85-
if (date_today-dir_datetime > week_timedelta):
90+
if date_today-dir_datetime > week_timedelta:
8691
rmtree(os.path.join(condor_log_directory, condor_dir))
8792
except Exception as ex:
8893
print(ex)
@@ -96,10 +101,11 @@ def find_current_rapid_output(forecast_directory, watershed, subbasin):
96101
Finds the most current files output from RAPID
97102
"""
98103
if os.path.exists(forecast_directory):
99-
basin_files = glob(os.path.join(forecast_directory,"Qout_%s_%s_*.nc" % (watershed, subbasin)))
100-
if len(basin_files) >0:
104+
basin_files = glob(os.path.join(forecast_directory,
105+
"Qout_{0}_{1}_*.nc".format(watershed, subbasin)))
106+
if len(basin_files) > 0:
101107
return basin_files
102-
#there are none found
108+
# there are none found
103109
return None
104110

105111

@@ -110,7 +116,7 @@ def get_valid_watershed_list(input_directory):
110116
valid_input_directories = []
111117
for directory in os.listdir(input_directory):
112118
if os.path.isdir(os.path.join(input_directory, directory)) \
113-
and len(directory.split("-")) == 2:
119+
and len(directory.split("-")) == 2:
114120
valid_input_directories.append(directory)
115121
else:
116122
print("{0} incorrectly formatted. Skipping ...".format(directory))
@@ -121,8 +127,8 @@ def get_date_timestep_from_forecast_folder(forecast_folder):
121127
"""
122128
Gets the datetimestep from forecast
123129
"""
124-
#OLD: Runoff.20151112.00.netcdf.tar.gz
125-
#NEW: Runoff.20160209.0.exp69.Fgrid.netcdf.tar
130+
# OLD: Runoff.20151112.00.netcdf.tar.gz
131+
# NEW: Runoff.20160209.0.exp69.Fgrid.netcdf.tar
126132
forecast_split = os.path.basename(forecast_folder).split(".")
127133
forecast_date_timestep = ".".join(forecast_split[1:3])
128134
return re.sub("[^\d.]+", "", forecast_date_timestep)
@@ -142,16 +148,14 @@ def get_datetime_from_forecast_folder(forecast_folder):
142148
:param forecast_folder:
143149
:return:
144150
"""
145-
return get_datetime_from_date_timestep(
146-
get_date_timestep_from_forecast_folder(forecast_folder))
147-
151+
return get_datetime_from_date_timestep(get_date_timestep_from_forecast_folder(forecast_folder))
148152

149153
def get_ensemble_number_from_forecast(forecast_name):
150154
"""
151155
Gets the datetimestep from forecast
152156
"""
153-
#OLD: 20151112.00.1.205.runoff.grib.runoff.netcdf
154-
#NEW: 52.Runoff.nc
157+
# OLD: 20151112.00.1.205.runoff.grib.runoff.netcdf
158+
# NEW: 52.Runoff.nc
155159
forecast_split = os.path.basename(forecast_name).split(".")
156160
if forecast_name.endswith(".205.runoff.grib.runoff.netcdf"):
157161
ensemble_number = int(forecast_split[2])
@@ -183,4 +187,4 @@ def log(message, severity):
183187
if severity in print_me:
184188
print("{0} {1}".format(severity, message))
185189
else:
186-
raise Exception(message)
190+
raise Exception(message)

0 commit comments

Comments
 (0)