From d1ec41f36b30ff3ff489505cb1a3ebf4c7276cf2 Mon Sep 17 00:00:00 2001 From: Marcel Caron <74978213+MarcelCaron-NOAA@users.noreply.github.com> Date: Fri, 4 Oct 2024 08:46:12 -0400 Subject: [PATCH] Fix unit conversion logic (#579) Co-authored-by: marcel caron --- ush/analyses/plot_util.py | 64 ++++++++++++-------- ush/aqm/plot_util.py | 64 ++++++++++++-------- ush/cam/plot_util.py | 64 ++++++++++++-------- ush/global_ens/ush_gens_plot_py/plot_util.py | 64 ++++++++++++-------- ush/mesoscale/plot_util.py | 64 ++++++++++++-------- 5 files changed, 190 insertions(+), 130 deletions(-) diff --git a/ush/analyses/plot_util.py b/ush/analyses/plot_util.py index efc5a4e7c9..f48fdfecbd 100755 --- a/ush/analyses/plot_util.py +++ b/ush/analyses/plot_util.py @@ -702,22 +702,24 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -755,23 +757,27 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1445,22 +1451,24 @@ def calculate_stat(logger, model_data, stat, conversion): oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1496,23 +1504,27 @@ def calculate_stat(logger, model_data, stat, conversion): uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in diff --git a/ush/aqm/plot_util.py b/ush/aqm/plot_util.py index efc5a4e7c9..f48fdfecbd 100755 --- a/ush/aqm/plot_util.py +++ b/ush/aqm/plot_util.py @@ -702,22 +702,24 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -755,23 +757,27 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1445,22 +1451,24 @@ def calculate_stat(logger, model_data, stat, conversion): oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1496,23 +1504,27 @@ def calculate_stat(logger, model_data, stat, conversion): uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in diff --git a/ush/cam/plot_util.py b/ush/cam/plot_util.py index e8813ad0da..2a2fac1162 100755 --- a/ush/cam/plot_util.py +++ b/ush/cam/plot_util.py @@ -836,22 +836,24 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -889,23 +891,27 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1608,22 +1614,24 @@ def calculate_stat(logger, model_data, stat, conversion): oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1659,23 +1667,27 @@ def calculate_stat(logger, model_data, stat, conversion): uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in diff --git a/ush/global_ens/ush_gens_plot_py/plot_util.py b/ush/global_ens/ush_gens_plot_py/plot_util.py index 4cfe9c477a..480a78dd1e 100755 --- a/ush/global_ens/ush_gens_plot_py/plot_util.py +++ b/ush/global_ens/ush_gens_plot_py/plot_util.py @@ -745,22 +745,24 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -798,23 +800,27 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1591,22 +1597,24 @@ def calculate_stat(logger, model_data, stat, conversion): mae = model_data.loc[:]['MAE'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1642,23 +1650,27 @@ def calculate_stat(logger, model_data, stat, conversion): uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in diff --git a/ush/mesoscale/plot_util.py b/ush/mesoscale/plot_util.py index 9d137af168..e2ee040690 100755 --- a/ush/mesoscale/plot_util.py +++ b/ush/mesoscale/plot_util.py @@ -781,22 +781,24 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -834,23 +836,27 @@ def calculate_bootstrap_ci(logger, bs_method, model_data, stat, nrepl, level, uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1553,22 +1559,24 @@ def calculate_stat(logger, model_data, stat, conversion): oobar = model_data.loc[:]['OOBAR'] if bool_convert: coef, const = conversion - fbar = coef*fbar+const - obar = coef*obar+const + fbar_og = fbar + obar_og = obar + fbar = coef*fbar_og+const + obar = coef*obar_og+const fobar = ( np.power(coef, 2)*fobar - + coef*const*fbar - + coef*const*obar + + coef*const*fbar_og + + coef*const*obar_og + np.power(const, 2) ) ffbar = ( np.power(coef, 2)*ffbar - + 2.*coef*const*fbar + + 2.*coef*const*fbar_og + np.power(const, 2) ) oobar = ( np.power(coef, 2)*oobar - + 2.*coef*const*obar + + 2.*coef*const*obar_og + np.power(const, 2) ) elif all(elem in model_data_columns for elem in @@ -1604,23 +1612,27 @@ def calculate_stat(logger, model_data, stat, conversion): uvoobar = model_data.loc[:]['UVOOBAR'] if bool_convert: coef, const = conversion - ufbar = coef*ufbar+const - vfbar = coef*vfbar+const - uobar = coef*uobar+const - vobar = coef*vobar+const + ufbar_og = ufbar + vfbar_og = vfbar + uobar_og = uobar + vobar_og = vobar + ufbar = coef*ufbar_og+const + vfbar = coef*vfbar_og+const + uobar = coef*uobar_og+const + vobar = coef*vobar_og+const uvfobar = ( np.power(coef, 2)*uvfobar - + coef*const*(ufbar + uobar + vfbar + vobar) + + coef*const*(ufbar_og + uobar_og + vfbar_og + vobar_og) + np.power(const, 2) ) uvffbar = ( np.power(coef, 2)*uvffbar - + 2.*coef*const*(ufbar + vfbar) + + 2.*coef*const*(ufbar_og + vfbar_og) + np.power(const, 2) ) uvoobar = ( np.power(coef, 2)*uvoobar - + 2.*coef*const*(uobar + vobar) + + 2.*coef*const*(uobar_og + vobar_og) + np.power(const, 2) ) elif all(elem in model_data_columns for elem in