# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# (C) British Crown Copyright 2017-2019 Met Office.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# * Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
"""Module containing weather symbol decision tree for Global data"""
from iris.coords import AuxCoord
# Start node for the Global wxcode decision tree.
START_NODE_GLOBAL = 'heavy_precipitation'
[docs]def wxcode_decision_tree_global():
"""
Define queries that comprise the weather symbol decision tree.
Each queries contains the following elements:
* succeed: The next query to call if the diagnostic being queried
satisfies the current query.
* fail: The next query to call if the diagnostic being queried
does not satisfy the current query.
* probability_thresholds: A list of probability thresholds that the
query requires. One entry is provided for each diagnostic
field being tested.
* threshold_condition: The condition the diagnostic must satisfy
relative to the probability threshold (e.g. greater than (>)
the probability threshold).
* condition_combination: The way (AND, OR) in which multiple
conditions should be combined;
e.g. rainfall > 0.5 AND snowfall > 0.5
* diagnostics_fields: The diagnostics which are being used in the
query. If this is a list of lists, the two fields in a given
list are subtracted (1st - (2nd * gamma)) and then compared
with the probability threshold.
* diagnostic_gamma (NOT UNIVERSAL): This is the gamma factor that
is used when comparing two fields directly, rather than
comparing a single field to a probability threshold.
e.g. gamma * P(SnowfallRate) < P(RainfallRate).
* diagnostic_thresholds: The thresholding that is expected to have
been applied to the input data; this is used to extract the
appropriate data from the input cubes.
* diagnostic_conditions: The condition that is expected to have
been applied to the input data; this can be used to ensure
the thresholding is as expected.
Returns:
dict:
A dictionary containing the queries that comprise the decision
tree.
"""
queries = {
'heavy_precipitation': {
'succeed': 'heavy_precipitation_cloud',
'fail': 'light_precipitation',
'probability_thresholds': [0.5, 0.5],
'threshold_condition': '>=',
'condition_combination': 'OR',
'diagnostic_fields':
['probability_of_rainfall_rate_above_threshold',
'probability_of_lwe_snowfall_rate_above_threshold'],
'diagnostic_thresholds': [AuxCoord(1.0, units='mm hr-1'),
AuxCoord(1.0, units='mm hr-1')],
'diagnostic_conditions': ['above', 'above']},
'heavy_precipitation_cloud': {
'succeed': 'heavy_sleet_continuous',
'fail': 'heavy_sleet_shower',
'probability_thresholds': [0.5],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
['probability_of_cloud_area_fraction_above_threshold'],
'diagnostic_thresholds': [AuxCoord(0.8125, units=1)],
'diagnostic_conditions': ['above']},
'heavy_sleet_continuous': {
'succeed': 18,
'fail': 'heavy_rain_or_snow_continuous',
'probability_thresholds': [0., 0.],
'threshold_condition': '>=',
'condition_combination': 'AND',
'diagnostic_fields':
[['probability_of_lwe_snowfall_rate_above_threshold',
'probability_of_rainfall_rate_above_threshold'],
['probability_of_rainfall_rate_above_threshold',
'probability_of_lwe_snowfall_rate_above_threshold']],
'diagnostic_gamma': [0.7, 1.0],
'diagnostic_thresholds': [[AuxCoord(1.0, units='mm hr-1'),
AuxCoord(1.0, units='mm hr-1')],
[AuxCoord(1.0, units='mm hr-1'),
AuxCoord(1.0, units='mm hr-1')]],
'diagnostic_conditions': [['above', 'above'],
['above', 'above']]},
'heavy_sleet_shower': {
'succeed': 17,
'fail': 'heavy_rain_or_snow_shower',
'probability_thresholds': [0., 0.],
'threshold_condition': '>=',
'condition_combination': 'AND',
'diagnostic_fields':
[['probability_of_lwe_snowfall_rate_above_threshold',
'probability_of_rainfall_rate_above_threshold'],
['probability_of_rainfall_rate_above_threshold',
'probability_of_lwe_snowfall_rate_above_threshold']],
'diagnostic_gamma': [0.7, 1.0],
'diagnostic_thresholds': [[AuxCoord(1.0, units='mm hr-1'),
AuxCoord(1.0, units='mm hr-1')],
[AuxCoord(1.0, units='mm hr-1'),
AuxCoord(1.0, units='mm hr-1')]],
'diagnostic_conditions': [['above', 'above'],
['above', 'above']]},
'heavy_rain_or_snow_continuous': {
'succeed': 27,
'fail': 15,
'probability_thresholds': [0.],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
[['probability_of_lwe_snowfall_rate_above_threshold',
'probability_of_rainfall_rate_above_threshold']],
'diagnostic_gamma': [1.],
'diagnostic_thresholds': [[AuxCoord(1.0, units='mm hr-1'),
AuxCoord(1.0, units='mm hr-1')]],
'diagnostic_conditions': [['above', 'above']]},
'heavy_rain_or_snow_shower': {
'succeed': 26,
'fail': 14,
'probability_thresholds': [0.],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
[['probability_of_lwe_snowfall_rate_above_threshold',
'probability_of_rainfall_rate_above_threshold']],
'diagnostic_gamma': [1.],
'diagnostic_thresholds': [[AuxCoord(1.0, units='mm hr-1'),
AuxCoord(1.0, units='mm hr-1')]],
'diagnostic_conditions': [['above', 'above']]},
'light_precipitation': {
'succeed': 'light_precipitation_cloud',
'fail': 'drizzle_mist',
'probability_thresholds': [0.5, 0.5],
'threshold_condition': '>=',
'condition_combination': 'OR',
'diagnostic_fields':
['probability_of_rainfall_rate_above_threshold',
'probability_of_lwe_snowfall_rate_above_threshold'],
'diagnostic_thresholds': [AuxCoord(0.1, units='mm hr-1'),
AuxCoord(0.1, units='mm hr-1')],
'diagnostic_conditions': ['above', 'above']},
'light_precipitation_cloud': {
'succeed': 'light_sleet_continuous',
'fail': 'light_sleet_shower',
'probability_thresholds': [0.5],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
['probability_of_cloud_area_fraction_above_threshold'],
'diagnostic_thresholds': [AuxCoord(0.8125, units=1)],
'diagnostic_conditions': ['above']},
'light_sleet_continuous': {
'succeed': 18,
'fail': 'light_rain_or_snow_continuous',
'probability_thresholds': [0., 0.],
'threshold_condition': '>=',
'condition_combination': 'AND',
'diagnostic_fields':
[['probability_of_lwe_snowfall_rate_above_threshold',
'probability_of_rainfall_rate_above_threshold'],
['probability_of_rainfall_rate_above_threshold',
'probability_of_lwe_snowfall_rate_above_threshold']],
'diagnostic_gamma': [0.7, 1.0],
'diagnostic_thresholds': [[AuxCoord(0.1, units='mm hr-1'),
AuxCoord(0.1, units='mm hr-1')],
[AuxCoord(0.1, units='mm hr-1'),
AuxCoord(0.1, units='mm hr-1')]],
'diagnostic_conditions': [['above', 'above'],
['above', 'above']]},
'light_rain_or_snow_continuous': {
'succeed': 24,
'fail': 12,
'probability_thresholds': [0.],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
[['probability_of_lwe_snowfall_rate_above_threshold',
'probability_of_rainfall_rate_above_threshold']],
'diagnostic_gamma': [1.],
'diagnostic_thresholds': [[AuxCoord(0.1, units='mm hr-1'),
AuxCoord(0.1, units='mm hr-1')]],
'diagnostic_conditions': ['above', 'above']},
'light_sleet_shower': {
'succeed': 17,
'fail': 'light_rain_or_snow_shower',
'probability_thresholds': [0., 0.],
'threshold_condition': '>=',
'condition_combination': 'AND',
'diagnostic_fields':
[['probability_of_lwe_snowfall_rate_above_threshold',
'probability_of_rainfall_rate_above_threshold'],
['probability_of_rainfall_rate_above_threshold',
'probability_of_lwe_snowfall_rate_above_threshold']],
'diagnostic_gamma': [0.7, 1.0],
'diagnostic_thresholds': [[AuxCoord(0.1, units='mm hr-1'),
AuxCoord(0.1, units='mm hr-1')],
[AuxCoord(0.1, units='mm hr-1'),
AuxCoord(0.1, units='mm hr-1')]],
'diagnostic_conditions': [['above', 'above'],
['above', 'above']]},
'light_rain_or_snow_shower': {
'succeed': 23,
'fail': 10,
'probability_thresholds': [0.],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
[['probability_of_lwe_snowfall_rate_above_threshold',
'probability_of_rainfall_rate_above_threshold']],
'diagnostic_gamma': [1.],
'diagnostic_thresholds': [[AuxCoord(0.1, units='mm hr-1'),
AuxCoord(0.1, units='mm hr-1')]],
'diagnostic_conditions': ['above', 'above']},
'drizzle_mist': {
'succeed': 11,
'fail': 'drizzle_cloud',
'probability_thresholds': [0.5, 0.5],
'threshold_condition': '>=',
'condition_combination': 'AND',
'diagnostic_fields':
['probability_of_rainfall_rate_above_threshold',
'probability_of_visibility_in_air_below_threshold'],
'diagnostic_thresholds': [AuxCoord(0.03, units='mm hr-1'),
AuxCoord(5000., units='m')],
'diagnostic_conditions': ['above', 'below']},
'drizzle_cloud': {
'succeed': 11,
'fail': 'mist_conditions',
'probability_thresholds': [0.5, 0.5],
'threshold_condition': '>=',
'condition_combination': 'AND',
'diagnostic_fields':
['probability_of_rainfall_rate_above_threshold',
('probability_of_low_type_cloud_area_fraction_'
'above_threshold')],
'diagnostic_thresholds': [AuxCoord(0.03, units='mm hr-1'),
AuxCoord(0.85, units=1)],
'diagnostic_conditions': ['above', 'above']},
'no_precipitation_cloud': {
'succeed': 'overcast_cloud',
'fail': 'partly_cloudy',
'probability_thresholds': [0.5],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
['probability_of_cloud_area_fraction_above_threshold'],
'diagnostic_thresholds': [AuxCoord(0.8125, units=1)],
'diagnostic_conditions': ['above']},
'overcast_cloud': {
'succeed': 8,
'fail': 7,
'probability_thresholds': [0.5],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
[('probability_of_low_type_cloud_area_fraction_'
'above_threshold')],
'diagnostic_thresholds': [AuxCoord(0.85, units=1)],
'diagnostic_conditions': ['above']},
'partly_cloudy': {
'succeed': 3,
'fail': 1,
'probability_thresholds': [0.5],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
['probability_of_cloud_area_fraction_above_threshold'],
'diagnostic_thresholds': [AuxCoord(0.1875, units=1)],
'diagnostic_conditions': ['above']},
'mist_conditions': {
'succeed': 'fog_conditions',
'fail': 'no_precipitation_cloud',
'probability_thresholds': [0.5],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
['probability_of_visibility_in_air_below_threshold'],
'diagnostic_thresholds': [AuxCoord(5000., units='m')],
'diagnostic_conditions': ['below']},
'fog_conditions': {
'succeed': 6,
'fail': 5,
'probability_thresholds': [0.5],
'threshold_condition': '>=',
'condition_combination': '',
'diagnostic_fields':
['probability_of_visibility_in_air_below_threshold'],
'diagnostic_thresholds': [AuxCoord(1000., units='m')],
'diagnostic_conditions': ['below']},
}
return queries