Repository: climate
Updated Branches:
  refs/heads/master b0a2158a4 -> e05cff99c


CLIMATE-506, Find temporal overlap between models and obervations

To be able to add the multi obs/model functionality to OCW cli, there is need 
to find the temporal overlap between all datasets (models and observations).
If any dataset (model or observation) does not have overlap with other, it 
should be notifies to user.


Project: http://git-wip-us.apache.org/repos/asf/climate/repo
Commit: http://git-wip-us.apache.org/repos/asf/climate/commit/adbad2e9
Tree: http://git-wip-us.apache.org/repos/asf/climate/tree/adbad2e9
Diff: http://git-wip-us.apache.org/repos/asf/climate/diff/adbad2e9

Branch: refs/heads/master
Commit: adbad2e96bb85aa7f349c605292c15f66744b682
Parents: b0a2158
Author: Maziyar Boustani <[email protected]>
Authored: Thu Aug 7 17:01:39 2014 -0700
Committer: Maziyar Boustani <[email protected]>
Committed: Thu Aug 7 17:01:39 2014 -0700

----------------------------------------------------------------------
 ocw-cli/ocw_cli.py | 75 ++++++++++++++++++++++++++++---------------------
 1 file changed, 43 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/climate/blob/adbad2e9/ocw-cli/ocw_cli.py
----------------------------------------------------------------------
diff --git a/ocw-cli/ocw_cli.py b/ocw-cli/ocw_cli.py
index 796e9ca..66213ff 100644
--- a/ocw-cli/ocw_cli.py
+++ b/ocw-cli/ocw_cli.py
@@ -58,7 +58,7 @@ def ready_screen(page, note=""):
           screen.addstr(y-2, x-21, "(C)  = Complete")
      screen.addstr(y-2, 1, note)
 
-     return y,x
+     return y, x
 
 
 ##############################################################
@@ -147,7 +147,7 @@ def list_model_screen(header):
      screen.getstr()
 
 
-def manage_model_screen(header, note = ""):
+def manage_model_screen(header, note=""):
      '''Generates Manage Model screen.
 
      :param header: Header of page
@@ -204,14 +204,14 @@ def select_obs_screen(header):   #TODO: if the 
observation is already selected,
           for position, obs_info in enumerate(all_obs_info):
                dataset_id = obs_info['dataset_id']
                parameter_id = obs_info['parameter_id']
-               timestep = obs_info ['timestep']
-               start_date = obs_info ['start_date']
-               end_date = obs_info ['end_date']
+               timestep = obs_info['timestep']
+               start_date = obs_info['start_date']
+               end_date = obs_info['end_date']
                min_lat = eval(obs_info['bounding_box'].encode())[2][0] if 
obs_info['bounding_box'] else None
                max_lat = eval(obs_info['bounding_box'].encode())[0][0] if 
obs_info['bounding_box'] else None
                min_lon = eval(obs_info['bounding_box'].encode())[2][1] if 
obs_info['bounding_box'] else None
                max_lon = eval(obs_info['bounding_box'].encode())[0][1] if 
obs_info['bounding_box'] else None
-               database = obs_info ['database']
+               database = obs_info['database']
                line = "|{0:>10}| - |{1:>12}| - |{2:>9}| - |{3}| - |{4}| - 
|{5:>9}| - |{6:>9}| - |{7:>9}| - |{8:>9}| - |{9}".format(
                     dataset_id, parameter_id, timestep, start_date, end_date,
                     str(min_lat), str(max_lat), str(min_lon), str(max_lon), 
database)
@@ -300,7 +300,7 @@ def list_obs_screen(header):
      screen.getstr()
 
 
-def manage_obs_screen(header, note = ""):
+def manage_obs_screen(header, note=""):
      '''Generates Manage Observation screen.
 
      :param header: Header of page
@@ -378,7 +378,7 @@ def run_screen(model_datasets, models_info, 
observations_info,
           OUTPUT_PLOT = "plot"
 
           dataset_id = int(observations_info[0]['dataset_id'])       #just 
accepts one dataset at this time
-          parameter_id =  int(observations_info[0]['parameter_id'])  #just 
accepts one dataset at this time
+          parameter_id = int(observations_info[0]['parameter_id'])  #just 
accepts one dataset at this time
 
           new_bounds = Bounds(overlap_min_lat, overlap_max_lat, 
overlap_min_lon, overlap_max_lon, overlap_start_time, overlap_end_time)
           model_dataset = dsp.subset(new_bounds, model_datasets[0])   #just 
accepts one model at this time
@@ -481,10 +481,13 @@ def get_model_temp_bound():
      :rtypes: (datatime, datetime)
      '''
 
-     model_start_time = model_datasets[0].time_range()[0]    #just accepts one 
model at this time
-     model_end_time = model_datasets[0].time_range()[1]      #just accepts one 
model at this time
+     models_start_time = []
+     models_end_time = []
+     for model in model_datasets:
+          models_start_time.append(model.time_range()[0])
+          models_end_time.append(model.time_range()[1])
 
-     return model_start_time, model_end_time
+     return models_start_time, models_end_time
 
 
 def get_obs_temp_bound():
@@ -494,32 +497,40 @@ def get_obs_temp_bound():
      :rtype: (datetime, datetime)
      '''
 
-     obs_start_time = observations_info[0]['start_date']    #just accepts one 
obs at this time
-     obs_end_time = observations_info[0]['end_date']        #just accepts one 
obs at this time
-     obs_start_time = datetime.strptime(obs_start_time, "%Y-%m-%d")
-     obs_end_time = datetime.strptime(obs_end_time, "%Y-%m-%d")
+     observations_start_time = []
+     observations_end_time = []
+     for obs in observations_info:
+          obs_start_time = datetime.strptime(obs['start_date'], "%Y-%m-%d")
+          observations_start_time.append(obs_start_time)
+          obs_end_time = datetime.strptime(obs['end_date'], "%Y-%m-%d")
+          observations_end_time.append(obs_end_time)
 
-     return obs_start_time, obs_end_time
+     return observations_start_time, observations_end_time
 
 
-def get_temp_overlap(model_start_time, model_end_time, obs_start_time, 
obs_end_time):
+def get_temp_overlap(models_start_time, models_end_time, 
observations_start_time, observations_end_time):
      '''Calculate temporal overlap between given datasets.
 
-     :param model_start_time: model start time
-     :type model_start_time: datetime
-     :param model_end_time: model end time
-     :type model_end_time: datetime
-     :param obs_start_time: obs start time
-     :type obs_start_time: datetime
-     :param obs_end_time: obs end time
-     :type obs_end_time: datetime
+     :param models_start_time: models start time
+     :type models_start_time: list of datetimes
+     :param models_end_time: models end time
+     :type models_end_time: list of datetime
+     :param observations_start_time: obs start time
+     :type observations_start_time: list of datetimes
+     :param observations_end_time: obs end time
+     :type observations_end_time: list of datetimes
 
      :returns: overlap start and end time between model and observation
      :rtype: (datetime, datetime)
      '''
 
-     overlap_start_time = max(model_start_time, obs_start_time)
-     overlap_end_time = min(model_end_time, obs_end_time)
+     overlap_start_time = max(models_start_time + observations_start_time)
+     overlap_end_time = min(models_end_time + observations_end_time)
+
+     #Need to check if all datasets have temporal overlap, otherwise return
+     # to main menu and print a warning as notification.
+     if overlap_end_time <= overlap_start_time:
+          main_menu(model_datasets, models_info, observation_datasets, 
observations_info, note="WARNING: One or more dataset does not have temporal 
overlap with others.")
 
      return overlap_start_time, overlap_end_time
 
@@ -595,9 +606,9 @@ def settings_screen(header):
      '''
 
      note = ""
-     model_start_time, model_end_time = get_model_temp_bound()
-     obs_start_time, obs_end_time = get_obs_temp_bound()
-     overlap_start_time, overlap_end_time = get_temp_overlap(model_start_time, 
model_end_time, obs_start_time, obs_end_time)
+     models_start_time, models_end_time = get_model_temp_bound()
+     observations_start_time, observations_end_time = get_obs_temp_bound()
+     overlap_start_time, overlap_end_time = 
get_temp_overlap(models_start_time, models_end_time, observations_start_time, 
observations_end_time)
      model_min_lat, model_max_lat, model_min_lon, model_max_lon = 
get_model_spatial_bound()
      obs_min_lat, obs_max_lat, obs_min_lon, obs_max_lon = 
get_obs_spatial_bound()
      overlap_min_lat, overlap_max_lat, overlap_min_lon, overlap_max_lon = 
get_spatial_overlap(model_min_lat, model_max_lat, model_min_lon, model_max_lon, 
obs_min_lat, obs_max_lat, obs_min_lon, obs_max_lon)
@@ -788,7 +799,7 @@ def settings_screen(header):
 #     Main Menu Screen
 ##############################################################
 
-def main_menu(model_datasets, models_info, observation_datasets, 
observations_info, note = ""):
+def main_menu(model_datasets, models_info, observation_datasets, 
observations_info, note=""):
      '''This function Generates main menu page.
 
      :param model_datasets: list of model dataset objects
@@ -803,7 +814,7 @@ def main_menu(model_datasets, models_info, 
observation_datasets, observations_in
 
      option = ''
      while option != '0':
-          ready_screen("main_menu", note='')
+          ready_screen("main_menu", note)
           model_status = "NC" if len(model_datasets) == 0 else "C"     #NC 
(Not Complete), if there is no model added, C (Complete) if model is added
           obs_status = "NC" if len(observations_info) == 0 else "C"    #NC 
(Not Complete), if there is no observation added, C (Complete) if observation 
is added
           screen.addstr(1, 1, "Main Menu:")

Reply via email to