| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http: *www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| 'use strict'; |
| |
| /** |
| * @ngdoc function |
| * @name ocwUiApp.controller:ParameterSelectCtrl |
| * @description |
| * # ParameterSelectCtrl |
| * Controller of the ocwUiApp |
| */ |
| angular.module('ocwUiApp') |
| .controller('ParameterSelectCtrl', ['$rootScope', '$scope', '$http', '$timeout', '$location', |
| 'selectedDatasetInformation', 'regionSelectParams', 'evaluationSettings', |
| function($rootScope, $scope, $http, $timeout, $location, selectedDatasetInformation, regionSelectParams, evaluationSettings) { |
| $scope.datasets = selectedDatasetInformation.getDatasets(); |
| |
| // The min/max lat/lon values from the selected datasets |
| $scope.latMin = -90; |
| $scope.latMax = 90; |
| $scope.lonMin = -180; |
| $scope.lonMax = 180; |
| $scope.start = "1900-01-01 00:00:00"; |
| $scope.end = "2030-01-01 00:00:00"; |
| |
| // The min/max lat/lon values that are displayed |
| $scope.displayParams = regionSelectParams.getParameters(); |
| |
| $scope.runningEval = false; |
| |
| // Flag for toggling re-grid controls based on whether or not the user has selected a grid |
| // base from the selected datasets. By default we have no datasets so we don't need to show |
| // the controls! |
| $scope.areInUserRegridState = false; |
| |
| // Initialization for the lat/lon grid step sliders |
| // TODO There has to be a better way of dealing with this. Perhaps a directive?? |
| $scope.latSliderVal = 0; |
| $scope.lonSliderVal = 0; |
| |
| // Settings for jQuery datepicker directives! |
| $scope.datepickerSettings = { |
| changeMonth: true, |
| changeYear: true, |
| }; |
| |
| $scope.shouldDisableControls = function() { |
| return (selectedDatasetInformation.getDatasetCount() < 2); |
| } |
| |
| $scope.shouldDisableEvaluateButton = function() { |
| return ($scope.shouldDisableControls() || $scope.runningEval); |
| } |
| |
| $scope.shouldDisableResultsView = function() { |
| var res = false; |
| |
| if ($rootScope.evalResults == "") |
| res = true; |
| |
| return res; |
| } |
| |
| $scope.runEvaluation = function() { |
| $scope.runningEval = true; |
| |
| var data = {} |
| var settings = evaluationSettings.getSettings() |
| |
| // Set dataset information |
| |
| // Grab the reference dataset information |
| var ref_ds = settings.spatialSelect; |
| |
| if (ref_ds == null) { |
| ref_ds = $scope.datasets[0]; |
| } |
| |
| data['reference_dataset'] = null; |
| data['target_datasets'] = []; |
| |
| // Parse all the dataset information and generate the necessary objects for the backend |
| for (var i = 0; i < $scope.datasets.length; i++) { |
| var dataset = {} |
| dataset['dataset_info'] = {} |
| |
| if ($scope.datasets[i].isObs == 0) { |
| dataset['data_source_id'] = 1; |
| dataset['dataset_info']['dataset_id'] = $scope.datasets[i]['id']; |
| dataset['dataset_info']['var_name'] = $scope.datasets[i]['param']; |
| dataset['dataset_info']['lat_name'] = $scope.datasets[i]['lat']; |
| dataset['dataset_info']['lon_name'] = $scope.datasets[i]['lon']; |
| dataset['dataset_info']['time_name'] = $scope.datasets[i]['time']; |
| dataset['dataset_info']['name'] = $scope.datasets[i]['name']; |
| } else { |
| dataset['data_source_id'] = 2; |
| dataset['dataset_info']['dataset_id'] = $scope.datasets[i]['datasetId']; |
| dataset['dataset_info']['parameter_id'] = $scope.datasets[i]['param']; |
| dataset['dataset_info']['name'] = $scope.datasets[i]['name']; |
| } |
| |
| if ($scope.datasets[i].id === ref_ds.id) { |
| data['reference_dataset'] = dataset; |
| } else { |
| data['target_datasets'].push(dataset); |
| } |
| } |
| |
| // TODO: These should be use customizable |
| // Set the spatial rebin grid steps |
| data['spatial_rebin_lat_step'] = 1; |
| data['spatial_rebin_lon_step'] = 1; |
| |
| // Determine the temporal resolution to use when doing a temporal rebin. The |
| // value is used to determine the timedelta in days to use. |
| var temporal_res = settings.temporal.selected; |
| |
| if (temporal_res == 'daily') { |
| data['temporal_resolution'] = 1; |
| } else if (temporal_res == 'monthly') { |
| data['temporal_resolution'] = 30; |
| } else if (temporal_res == 'yearly') { |
| data['temporal_resolution'] = 365; |
| } else if (temporal_res == 'full') { |
| data['temporal_resolution'] = 999; |
| } else { |
| // Default to monthly just in case |
| data['temporal_resolution'] = 30; |
| } |
| |
| data['temporal_resolution_type'] = temporal_res; |
| |
| // Load the Metrics for the evaluation |
| data['metrics'] = [] |
| var metrics = settings.metrics |
| for (var i = 0; i < metrics.length; i++) { |
| var metric = metrics[i]; |
| |
| if (metric.select) { |
| data['metrics'].push(metric.name) |
| } |
| } |
| |
| // Set the bound values for the evaluation |
| data['start_time'] = $scope.displayParams.start + " 00:00:00", |
| data['end_time'] = $scope.displayParams.end + " 00:00:00", |
| data['lat_min'] = $scope.displayParams.latMin, |
| data['lat_max'] = $scope.displayParams.latMax, |
| data['lon_min'] = $scope.displayParams.lonMin, |
| data['lon_max'] = $scope.displayParams.lonMax, |
| |
| $http.post($rootScope.baseURL + '/processing/run_evaluation/', data). |
| success(function(data) { |
| var evalWorkDir = data['eval_work_dir']; |
| |
| $scope.runningEval = false; |
| |
| $timeout(function() { |
| var url = (evalWorkDir) ? '/results/' + evalWorkDir : '/results'; |
| $location.url(url) |
| }, 100); |
| }).error(function() { |
| $scope.runningEval = false; |
| }); |
| }; |
| |
| // Check the Parameter selection boxes after the user has changed input to ensure that valid |
| // values were entered |
| $scope.checkParameters = function() { |
| if (parseFloat($scope.displayParams.latMin) < parseFloat($scope.latMin)) |
| $scope.displayParams.latMin = $scope.latMin; |
| |
| if (parseFloat($scope.displayParams.latMax) > parseFloat($scope.latMax)) |
| $scope.displayParams.latMax = $scope.latMax; |
| |
| if (parseFloat($scope.displayParams.lonMin) < parseFloat($scope.lonMin)) |
| $scope.displayParams.lonMin = $scope.lonMin; |
| |
| if (parseFloat($scope.displayParams.lonMax) > parseFloat($scope.lonMax)) |
| $scope.displayParams.lonMax = $scope.lonMax; |
| |
| if ($scope.displayParams.start < $scope.start) |
| $scope.displayParams.start = $scope.start; |
| |
| if ($scope.displayParams.end > $scope.end) |
| $scope.displayParams.end = $scope.end; |
| |
| $scope.displayParams.latMin = $scope.truncateFloat($scope.displayParams.latMin); |
| $scope.displayParams.latMax = $scope.truncateFloat($scope.displayParams.latMax); |
| $scope.displayParams.lonMin = $scope.truncateFloat($scope.displayParams.lonMin); |
| $scope.displayParams.lonMax = $scope.truncateFloat($scope.displayParams.lonMax); |
| |
| $scope.$apply(); |
| $rootScope.$broadcast('redrawOverlays', []); |
| } |
| |
| $scope.unwatchDatasets = $scope.$watch('datasets', |
| function() { |
| var numDatasets = $scope.datasets.length; |
| $scope.displayParams.areValid = false; |
| $scope.areInUserRegridState = false; |
| |
| if (numDatasets) { |
| var latMin = -90, |
| latMax = 90, |
| lonMin = -180, |
| lonMax = 180, |
| start = "1900-01-01 00:00:00", |
| end = "2030-01-01 00:00:00", |
| datasetRegrid = false; |
| // Get the valid lat/lon range in the selected datasets. |
| for (var i = 0; i < numDatasets; i++) { |
| var curDataset = $scope.datasets[i]; |
| |
| latMin = (curDataset['latlonVals']['latMin'] > latMin) ? curDataset['latlonVals']['latMin'] : latMin; |
| latMax = (curDataset['latlonVals']['latMax'] < latMax) ? curDataset['latlonVals']['latMax'] : latMax; |
| lonMin = (curDataset['latlonVals']['lonMin'] > lonMin) ? curDataset['latlonVals']['lonMin'] : lonMin; |
| lonMax = (curDataset['latlonVals']['lonMax'] < lonMax) ? curDataset['latlonVals']['lonMax'] : lonMax; |
| start = (curDataset['timeVals']['start'] > start) ? curDataset['timeVals']['start'] : start; |
| end = (curDataset['timeVals']['end'] < end) ? curDataset['timeVals']['end'] : end; |
| |
| datasetRegrid = datasetRegrid || curDataset.regrid; |
| |
| } |
| |
| $scope.areInUserRegridState = !datasetRegrid |
| } |
| |
| // Update the display parameters with the new valid overlap that we've found! |
| $scope.displayParams.latMin = $scope.truncateFloat(latMin); |
| $scope.displayParams.latMax = $scope.truncateFloat(latMax); |
| $scope.displayParams.lonMin = $scope.truncateFloat(lonMin); |
| $scope.displayParams.lonMax = $scope.truncateFloat(lonMax); |
| $scope.displayParams.start = (typeof start == 'undefined') ? "" : start.split(" ")[0]; |
| $scope.displayParams.end = (typeof end == 'undefined') ? "" : end.split(" ")[0]; |
| |
| // Update the local store values! |
| $scope.latMin = latMin; |
| $scope.latMax = latMax; |
| $scope.lonMin = lonMin; |
| $scope.lonMax = lonMax; |
| $scope.start = (typeof start == 'undefined') ? "" : start.split(" ")[0]; |
| $scope.end = (typeof end == 'undefined') ? "" : end.split(" ")[0]; |
| |
| $scope.displayParams.areValid = true; |
| $rootScope.$broadcast('redrawOverlays', []); |
| }, true); |
| |
| $scope.truncateFloat = function(floatVal) { |
| if (floatVal > 0) { |
| return Math.floor(floatVal); |
| } else { |
| return Math.ceil(floatVal); |
| } |
| }; |
| }]); |