##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
# 
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
# 
# Contractor Name:        Raytheon Company
# Contractor Address:     6825 Pine Street, Suite 340
#                         Mail Stop B8
#                         Omaha, NE 68106
#                         402.291.0100
# 
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
# ----------------------------------------------------------------------------
# This software is in the public domain, furnished "as is", without technical
# support, and with no warranty, express or implied, as to its usefulness for
# any purpose.
#
# Numeric_SnowAmt_SmartTool
#
# Author: billingsley
# ----------------------------------------------------------------------------

##
# This is an absolute override file, indicating that a higher priority version
# of the file will completely replace a lower priority version of the file.
##

ToolType = "numeric"
WeatherElementEdited = "SnowAmt"
from numpy import *

# Set up Class
import SmartScript
## For available commands, see SmartScript

class Tool (SmartScript.SmartScript):
    def __init__(self, dbss):
        SmartScript.SmartScript.__init__(self, dbss)
  
    def execute(self, Topo, T, FzLevel, QPF):        
        "Determines SnowAmt from QPF, T, FzLevel and Topo information"
##        if T < 9:   # This way 8.5 will be treated as 8
##            SnowRatio = 20
##        elif T >= 30:
##            SnowRatio = 7
##        else:
##            SnowRatio = SnowRatioDict[int(T)]
        SnowRatio = self.linear(9,29,18,8,T).astype(float32)
        SnowRatio[less(T, 9)] = 20
        SnowRatio[greater_equal(T, 30)] = 7
                    
##        # Determine new value
##        if (FzLevel-1000) <= Topo:
##            SnowAmt = SnowRatio * QPF
##        else:
##            SnowAmt = 0
        SnowAmt = self.empty()
        fzLevelMask = less_equal(FzLevel-1000, Topo)
        SnowAmt[fzLevelMask] = SnowRatio[fzLevelMask] * QPF[fzLevelMask]

        # Return the new value
        return SnowAmt

    def linear(self, xmin, xmax, ymin, ymax, we):
        m = (ymax - ymin) / (xmax - xmin + .0000001)
        b = ymin - m * xmin
        return m * we + b
## POINT-BASED VERSION
# This dictionary maps temperature to snow ratio.
# The boundaries are handled in the code below.
##SnowRatioDict = {
##    9:18,
##    10:18,
##    11:17,
##    12:17,
##    13:16,
##    14:15,
##    15:14,
##    16:13,
##    17:13,
##    18:12,
##    19:12,
##    20:11,
##    21:11,
##    22:11,
##    23:10,
##    24:10,
##    25:9,
##    26:9,
##    27:8,
##    28:8,
##    29:8
##    }
    
######################
##def SnowAmt_SmartTool(QPF, T, FzLevel, Topo):
##    "Determines SnowAmt from QPF, T, FzLevel and Topo information"
    
##    if T < 9:   # This way 8.5 will be treated as 8
##        SnowRatio = 20
##    elif T >= 30:
##        SnowRatio = 7
##    else:
##        SnowRatio = SnowRatioDict[int(T)]
        

##    # Determine new value
##    if (FzLevel-1000) <= Topo:
##        SnowAmt = SnowRatio * QPF
##    else:
##        SnowAmt = 0

##    # Return the new value
##    return SnowAmt

