def run_screen(model_datasets, models_info, observations_info,
               overlap_start_time, overlap_end_time, overlap_min_lat,
               overlap_max_lat, overlap_min_lon, overlap_max_lon,
               temp_grid_setting, spatial_grid_option, spatial_grid_setting_lat, spatial_grid_setting_lon, reference_dataset, target_datasets, metric, working_directory, plot_title):
    try:
        target_datasets_ensemble = []
        new_model_datasets = model_datasets[:]

        option = None
        if option != "0":
             ready_screen("run_evaluation_screen")
             y = screen.getmaxyx()[0]
             screen.addstr(2, 2, "Evaluation started....")
             screen.refresh()

             screen.addstr(4, 4, "Retrieving data...")
             screen.refresh()
             obs_dataset = []
             for i in range(len(observations_info)):
                  if observations_info[i]['dataset_id'] == "esgf":
                      obs_dataset.append(load_file(observations_info[i]['database'], observations_info[i]['parameter_id']))
                  else:
                      dataset_id = int(observations_info[i]['dataset_id'])
                      parameter_id = int(observations_info[i]['parameter_id'])
                      obs_dataset.append(rcmed.parameter_dataset(
                          dataset_id,
                          parameter_id,
                          overlap_min_lat,
                          overlap_max_lat,
                          overlap_min_lon,
                          overlap_max_lon,
                          overlap_start_time,
                          overlap_end_time))

             screen.addstr(4, 4, "--> Data retrieved.")
             screen.refresh()

             EVAL_BOUNDS = Bounds(overlap_min_lat, overlap_max_lat, overlap_min_lon, overlap_max_lon, overlap_start_time, overlap_end_time)

             screen.addstr(5, 4, "Temporally regridding...")
             screen.refresh()
             for i in range(len(obs_dataset)):
                  obs_dataset[i] = dsp.temporal_rebin(obs_dataset[i], temp_grid_setting.lower())

             for member, each_target_dataset in enumerate(new_model_datasets):
                  new_model_datasets[member] = dsp.temporal_rebin(new_model_datasets[member], temp_grid_setting.lower())
                  if each_target_dataset.lats.ndim !=2 and each_target_dataset.lons.ndim !=2:
                      new_model_datasets[member] = dsp.subset(EVAL_BOUNDS, new_model_datasets[member])
                  else:
                      new_model_datasets[member] = dsp.temporal_slice(EVAL_BOUNDS.start, EVAL_BOUNDS.end, each_target_dataset)
             screen.addstr(5, 4, "--> Temporally regridded.")
             screen.refresh()

             screen.addstr(6, 4, "Spatially regridding...")
             screen.refresh()
             if spatial_grid_option == 'Observation':
                 new_lats = obs_dataset[0].lats
                 new_lons = obs_dataset[0].lons
             elif spatial_grid_option == 'Model':
                 new_lats = new_model_datasets[0].lats
                 new_lons = new_model_datasets[0].lons
             else: 
                 new_lats = np.arange(overlap_min_lat, overlap_max_lat, spatial_grid_setting_lat)
                 new_lons = np.arange(overlap_min_lon, overlap_max_lon, spatial_grid_setting_lon)
             if spatial_grid_option != 'Observation':
                 for i in range(len(obs_dataset)):
                      obs_dataset[i] = dsp.spatial_regrid(obs_dataset[i], new_lats, new_lons)
                      obs_dataset[i] = dsp.variable_unit_conversion(obs_dataset[i])
             if spatial_grid_option != 'Model':
                 for member, each_target_dataset in enumerate(new_model_datasets):
                      new_model_datasets[member] = dsp.spatial_regrid(new_model_datasets[member], new_lats, new_lons)
                      new_model_datasets[member] = dsp.variable_unit_conversion(new_model_datasets[member])
             screen.addstr(6, 4, "--> Spatially regridded.")
             screen.refresh()

             obs_dataset = dsp.mask_missing_data(obs_dataset+new_model_datasets)[0:len(obs_dataset)]
             new_model_datasets = dsp.mask_missing_data(obs_dataset+new_model_datasets)[len(obs_dataset):]

             if metric == 'bias_of_multiyear_climatology':
                  allNames = []

                  for model in new_model_datasets:
                          allNames.append(model.name)

                  screen.addstr(7, 4, "Setting up metrics...")
                  screen.refresh()
                  mean_bias = metrics.TemporalMeanBias()
                  pattern_correlation = metrics.PatternCorrelation()
                  spatial_std_dev_ratio = metrics.StdDevRatio()
                  screen.addstr(7, 4, "--> Metrics setting done.")
                  screen.refresh()

                  screen.addstr(8, 4, "Running evaluation.....")
                  screen.refresh()
                  if reference_dataset[:3] == 'obs':
                       reference = obs_dataset[int(reference_dataset[-1])]
                  if reference_dataset[:3] == 'mod':
                       reference = obs_dataset[int(new_model_datasets[-1])]

                  targets = []
                  for target in target_datasets:
                       if target[:3] == 'obs':
                            targets.append(obs_dataset[int(target[-1])])
                       if target[:3] == 'mod':
                            targets.append(new_model_datasets[int(target[-1])])

                  evaluation_result = evaluation.Evaluation(reference, targets, [mean_bias])
                  #export_evaluation_to_config(evaluation_result)
                  evaluation_result.run()
                  screen.addstr(8, 4, "--> Evaluation Finished.")
                  screen.refresh()

                  screen.addstr(9, 4, "Generating plots....")
                  screen.refresh()
                  new_rcm_bias = evaluation_result.results[0]

                  if not os.path.exists(working_directory):
                       os.makedirs(working_directory)

                  fname = working_directory + 'Bias_contour'
                  fname2= working_directory + 'Obs_contour'
                  fname3= working_directory + 'Model_contour'
                  plotter.draw_contour_map(new_rcm_bias, new_lats, new_lons, gridshape=(2, 5), fname=fname, subtitles=allNames, cmap='coolwarm')
                  plotter.draw_contour_map(utils.calc_temporal_mean(reference), new_lats, new_lons, gridshape=(2, 5), fname=fname2, subtitles=allNames, cmap='rainbow')
                  plotter.draw_contour_map(utils.calc_temporal_mean(targets[0]), new_lats, new_lons, gridshape=(2, 5), fname=fname3, subtitles=allNames, cmap='rainbow')
                  screen.addstr(9, 4, "--> Plots generated.")
                  screen.refresh()
                  screen.addstr(y-2, 1, "Press 'enter' to Exit: ")
                  option = screen.getstr()

             if metric == 'std':
                  for i in range(len(obs_dataset)):
                       _, obs_dataset[i].values = utils.calc_climatology_year(obs_dataset[i])
                       obs_dataset[i].values = np.expand_dims(obs_dataset[i].values, axis=0)

                  target_datasets_ensemble = dsp.ensemble(new_model_datasets)
                  target_datasets_ensemble.name = "ENS"
                  new_model_datasets.append(target_datasets_ensemble)

                  for member, each_target_dataset in enumerate(new_model_datasets):
                          _, new_model_datasets[member].values = utils.calc_climatology_year(new_model_datasets[member])
                          new_model_datasets[member].values = np.expand_dims(new_model_datasets[member].values, axis=0)

                  allNames = []

                  for model in new_model_datasets:
                          allNames.append(model.name)
                  pattern_correlation = metrics.PatternCorrelation()
                  spatial_std_dev = metrics.StdDevRatio()

                  if reference_dataset[:3] == 'obs':
                       reference = obs_dataset[int(reference_dataset[-1])]
                  if reference_dataset[:3] == 'mod':
                       reference = obs_dataset[int(new_model_datasets[-1])]

                  targets = []
                  for target in target_datasets:
                       if target[:3] == 'obs':
                            targets.append(obs_dataset[int(target[-1])])
                       if target[:3] == 'mod':
                            targets.append(new_model_datasets[int(target[-1])])

                  evaluation_result = evaluation.Evaluation(reference, targets, [spatial_std_dev])
                  export_evaluation_to_config(evaluation_result)
                  evaluation_result.run()

                  rcm_std_dev = evaluation_result.results
                  evaluation_result = evaluation.Evaluation(reference, targets, [pattern_correlation])
                  evaluation_result.run()

                  rcm_pat_cor = evaluation_result.results
                  taylor_data = np.array([rcm_std_dev, rcm_pat_cor]).transpose()
                  new_taylor_data = np.squeeze(np.array(taylor_data))

                  if not os.path.exists(working_directory):
                       os.makedirs(working_directory)

                  fname = working_directory + 'taylor_plot'

                  plotter.draw_taylor_diagram(new_taylor_data, allNames, "CRU31", fname=fname, fmt='png', frameon=False)
        del new_model_datasets
        del obs_dataset
        return "No error"
    except Exception, error:
         return "Error: {0}".format(error[0][:200])


##############################################################
#     Settings Screen
##############################################################
Returns True if the input consists soley of digits and represents an
dataset/ETHPy150Open apache/climate/RCMES/cli_app.py/run_screen--crossover with--dataset/ETHPy150Open kenfar/DataGristle/gristle/field_type.py/is_integer