From f87a4bcdf3351a4532417dc22f234cb47fb19fc6 Mon Sep 17 00:00:00 2001
From: tomrink <rink@ssec.wisc.edu>
Date: Fri, 22 Sep 2023 14:29:45 -0500
Subject: [PATCH] snapshot...

---
 modules/deeplearning/cloud_opd_fcn_abi.py | 353 +++++++---------------
 1 file changed, 107 insertions(+), 246 deletions(-)

diff --git a/modules/deeplearning/cloud_opd_fcn_abi.py b/modules/deeplearning/cloud_opd_fcn_abi.py
index b13c348e..bcda7169 100644
--- a/modules/deeplearning/cloud_opd_fcn_abi.py
+++ b/modules/deeplearning/cloud_opd_fcn_abi.py
@@ -3,13 +3,13 @@ import contextlib
 import tensorflow as tf
 
 from deeplearning.cloud_fraction_fcn_abi import get_label_data_5cat
-from util.plot_cm import confusion_matrix_values
 from util.augment import augment_image
 from util.setup_cloud_fraction import logdir, modeldir, now, ancillary_path
 from util.util import EarlyStop, normalize, denormalize, scale, scale2, descale, \
     get_grid_values_all, make_tf_callable_generator
 import glob
-import os, datetime
+import os
+import datetime
 import numpy as np
 import pickle
 import h5py
@@ -31,9 +31,10 @@ else:
     NumLogits = NumClasses
 
 BATCH_SIZE = 128
-NUM_EPOCHS = 80
+NUM_EPOCHS = 100
 
 EARLY_STOP = True
+PATIENCE = 7
 
 NOISE_TRAINING = False
 NOISE_STDDEV = 0.01
@@ -71,8 +72,7 @@ label_param = 'cld_opd_dcomp'
 
 params = ['temp_11_0um_nom', 'refl_0_65um_nom', 'refl_submin_ch01', 'refl_submax_ch01', 'refl_substddev_ch01', 'cloud_probability', label_param]
 params_i = ['temp_11_0um_nom', 'refl_0_65um_nom', 'cloud_probability', label_param]
-data_params_half = ['temp_11_0um_nom']
-# data_params_half = ['temp_11_0um_nom', 'refl_0_65um_nom']
+data_params_half = ['temp_11_0um_nom', 'refl_0_65um_nom']
 sub_fields = ['refl_submin_ch01', 'refl_submax_ch01', 'refl_substddev_ch01']
 data_params_full = ['refl_0_65um_nom']
 
@@ -145,19 +145,17 @@ def upsample_mean(grd):
 
 
 def get_grid_cell_mean(grd_k):
-    grd_k = np.where(np.isnan(grd_k), 0, grd_k)
-
     mean = np.nanmean([grd_k[:, 0::4, 0::4], grd_k[:, 1::4, 0::4], grd_k[:, 2::4, 0::4], grd_k[:, 3::4, 0::4],
                        grd_k[:, 0::4, 1::4], grd_k[:, 1::4, 1::4], grd_k[:, 2::4, 1::4], grd_k[:, 3::4, 1::4],
                        grd_k[:, 0::4, 2::4], grd_k[:, 1::4, 2::4], grd_k[:, 2::4, 2::4], grd_k[:, 3::4, 2::4],
                        grd_k[:, 0::4, 3::4], grd_k[:, 1::4, 3::4], grd_k[:, 2::4, 3::4], grd_k[:, 3::4, 3::4]], axis=0)
+    # For an all-Nan slice
+    np.where(np.isnan(mean), 0, mean)
 
     return mean
 
 
 def get_min_max_std(grd_k):
-    grd_k = np.where(np.isnan(grd_k), 0, grd_k)
-
     lo = np.nanmin([grd_k[:, 0::4, 0::4], grd_k[:, 1::4, 0::4], grd_k[:, 2::4, 0::4], grd_k[:, 3::4, 0::4],
                     grd_k[:, 0::4, 1::4], grd_k[:, 1::4, 1::4], grd_k[:, 2::4, 1::4], grd_k[:, 3::4, 1::4],
                     grd_k[:, 0::4, 2::4], grd_k[:, 1::4, 2::4], grd_k[:, 2::4, 2::4], grd_k[:, 3::4, 2::4],
@@ -177,14 +175,19 @@ def get_min_max_std(grd_k):
                       grd_k[:, 0::4, 1::4], grd_k[:, 1::4, 1::4], grd_k[:, 2::4, 1::4], grd_k[:, 3::4, 1::4],
                       grd_k[:, 0::4, 2::4], grd_k[:, 1::4, 2::4], grd_k[:, 2::4, 2::4], grd_k[:, 3::4, 2::4],
                       grd_k[:, 0::4, 3::4], grd_k[:, 1::4, 3::4], grd_k[:, 2::4, 3::4], grd_k[:, 3::4, 3::4]], axis=0)
+    # For an all-NaN slice
+    np.where(np.isnan(lo), 0, lo)
+    np.where(np.isnan(hi), 0, hi)
+    np.where(np.isnan(std), 0, std)
+    np.where(np.isnan(avg), 0, avg)
 
     return lo, hi, std, avg
 
 
 def get_cldy_frac_opd(cld_prob, opd):
     cld_prob = np.where(np.isnan(cld_prob), 0.0, cld_prob)
-    opd = np.where(np.isnan(opd), 0.0, opd)
     cld = np.where(cld_prob < 0.5, 0, 1)
+    opd = np.where(np.isnan(opd), 0.0, opd)
 
     cnt_cld = cld[:, 0::4, 0::4] + cld[:, 1::4, 0::4] + cld[:, 2::4, 0::4] + cld[:, 3::4, 0::4] + \
               cld[:, 0::4, 1::4] + cld[:, 1::4, 1::4] + cld[:, 2::4, 1::4] + cld[:, 3::4, 1::4] + \
@@ -296,7 +299,7 @@ class SRCNN:
         # self.n_chans = len(data_params_half) + len(data_params_full) + 1
         self.n_chans = 6
 
-        self.X_img = tf.keras.Input(shape=(None, None, self.n_chans + 1))
+        self.X_img = tf.keras.Input(shape=(None, None, self.n_chans + 2))
 
         self.inputs.append(self.X_img)
 
@@ -323,14 +326,32 @@ class SRCNN:
         input_data = np.concatenate(data_s)
         input_label = np.concatenate(label_s)
 
+        # refl_i = input_label[:, params_i.index('refl_0_65um_nom'), :, :]
+        # rlo, rhi, rstd, rmean = get_min_max_std(refl_i)
+        # rmean = rmean[:, slc_y, slc_x]
+        # rmean = scale2(rmean, -2.0, 120.0)
+        # rlo = rlo[:, slc_y, slc_x]
+        # rlo = scale2(rlo, -2.0, 120.0)
+        # rhi = rhi[:, slc_y, slc_x]
+        # rhi = scale2(rhi, -2.0, 120.0)
+        # refl_rng = rhi - rlo
+        # rstd = rstd[:, slc_y, slc_x]
+        # rstd = scale2(rstd, 0.0, 20.0)
+
         data_norm = []
-        for param in data_params_half:
-            idx = params.index(param)
-            tmp = input_data[:, idx, :, :]
-            tmp = tmp[:, slc_y, slc_x]
-            # tmp = normalize(tmp, param, mean_std_dct)
-            tmp = scale(tmp, param, mean_std_dct)
-            data_norm.append(tmp)
+        # for param in data_params_half:
+        #     idx = params.index(param)
+        #     tmp = input_data[:, idx, :, :]
+        #     tmp = tmp[:, slc_y, slc_x]
+        #     # tmp = normalize(tmp, param, mean_std_dct)
+        #     tmp = scale(tmp, param, mean_std_dct)
+        #     data_norm.append(tmp)
+            
+        bt = input_data[:, params.index('temp_11_0um_nom'), :, :]
+        bt = bt[:, slc_y, slc_x]
+        # bt = normalize(bt, 'temp_11_0um_nom', mean_std_dct)
+        bt = scale(bt, 'temp_11_0um_nom', mean_std_dct)
+        data_norm.append(bt)
 
         tmp = input_label[:, params_i.index('cloud_probability'), :, :]
         cld_prob = tmp.copy()
@@ -338,6 +359,12 @@ class SRCNN:
         tmp = tmp[:, slc_y, slc_x]
         data_norm.append(tmp)
 
+        refl = input_data[:, params.index('refl_0_65um_nom'), :, :]
+        refl = refl[:, slc_y, slc_x]
+        # refl = normalize(refl, 'refl_0_65um_nom', mean_std_dct)
+        refl = scale(refl, 'refl_0_65um_nom', mean_std_dct)
+        data_norm.append(refl)
+
         # for param in sub_fields:
         #     idx = params.index(param)
         #     tmp = input_data[:, idx, :, :]
@@ -350,23 +377,21 @@ class SRCNN:
         #         tmp = scale2(tmp, 0.0, 20.0)
         #     data_norm.append(tmp)
 
-        idx = params.index(sub_fields[0])
-        tmp = input_data[:, idx, :, :]
-        tmp = tmp[:, slc_y, slc_x]
-        rlo = scale(tmp, 'refl_0_65um_nom', mean_std_dct)
-        data_norm.append(rlo)
+        refl_lo = input_data[:, params.index(sub_fields[0]), :, :]
+        refl_lo = refl_lo[:, slc_y, slc_x]
+        refl_lo = scale2[refl_lo, -2.0, 120.0]
 
-        idx = params.index(sub_fields[1])
-        tmp = input_data[:, idx, :, :]
-        tmp = tmp[:, slc_y, slc_x]
-        tmp = scale(tmp, 'refl_0_65um_nom', mean_std_dct)
-        data_norm.append(tmp - rlo)
+        refl_hi = input_data[:, params.index(sub_fields[1]), :, :]
+        refl_hi = refl_hi[:, slc_y, slc_x]
+        refl_hi = scale2[refl_hi, -2.0, 120.0]
 
-        idx = params.index(sub_fields[2])
-        tmp = input_data[:, idx, :, :]
-        tmp = tmp[:, slc_y, slc_x]
-        tmp = scale2(tmp, 0.0, 20.0)
-        data_norm.append(tmp)
+        refl_rng = refl_hi - refl_lo
+        data_norm.append(refl_rng)
+
+        refl_std = input_data[:, params.index(sub_fields[2]), :, :]
+        refl_std = refl_std[:, slc_y, slc_x]
+        refl_std = scale2[refl_std, 0.0, 30.0]
+        data_norm.append(refl_std)
 
         tmp = input_label[:, label_idx_i, :, :]
         tmp = get_grid_cell_mean(tmp)
@@ -383,16 +408,16 @@ class SRCNN:
         label = label[:, y_64, x_64]
         cld_prob = cld_prob[:, y_64, x_64]
         cat_cf = get_label_data_5cat(cld_prob)
+        _, _, cp_std, _ = get_min_max_std(cld_prob)
         if KERNEL_SIZE != 1:
             cat_cf = np.pad(cat_cf, pad_width=[(0, 0), (1, 1), (1, 1)])
+            cp_std = np.pad(cp_std, pad_width=[(0, 0), (1, 1), (1, 1)])
         data_norm.append(cat_cf)
+        data_norm.append(cp_std)
         data = np.stack(data_norm, axis=3)
-        data = data.astype(np.float32)
 
         label = get_cldy_frac_opd(cld_prob, label)
         # label = scale(label, label_param, mean_std_dct)
-        label = np.where(np.isnan(label), 0, label)
-
         label = np.where(np.isnan(label), 0, label)
         label = np.expand_dims(label, axis=3)
 
@@ -540,7 +565,7 @@ class SRCNN:
         initial_learning_rate = 0.001
         decay_rate = 0.95
         steps_per_epoch = int(self.num_data_samples/BATCH_SIZE)  # one epoch
-        decay_steps = int(steps_per_epoch) * 1
+        decay_steps = int(steps_per_epoch) * 2
         print('initial rate, decay rate, steps/epoch, decay steps: ', initial_learning_rate, decay_rate, steps_per_epoch, decay_steps)
 
         self.learningRateSchedule = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate, decay_steps, decay_rate)
@@ -640,7 +665,7 @@ class SRCNN:
         best_test_loss = np.finfo(dtype=np.float64).max
 
         if EARLY_STOP:
-            es = EarlyStop()
+            es = EarlyStop(patience=PATIENCE)
 
         for epoch in range(NUM_EPOCHS):
             self.train_loss.reset_states()
@@ -962,7 +987,8 @@ def run_restore_static(directory, ckpt_dir, out_file=None):
                  descale(inputs[:, 1:y_hi, 1:x_hi, 3], 'refl_0_65um_nom', mean_std_dct),
                  inputs[:, 1:y_hi, 1:x_hi, 4],
                  descale(inputs[:, 1:y_hi, 1:x_hi, 5], label_param, mean_std_dct),
-                 inputs[:, 1:y_hi, 1:x_hi, 6]])
+                 inputs[:, 1:y_hi, 1:x_hi, 6],
+                 inputs[:, 1:y_hi, 1:x_hi, 7]])
 
 
 def run_evaluate_static(in_file, out_file, ckpt_dir):
@@ -1138,226 +1164,61 @@ def run_evaluate_static_(bt, refl, refl_lo, refl_hi, refl_std, cp, ckpt_dir):
     return cld_frac
 
 
-def analyze_3cat(file):
-
-    tup = np.load(file, allow_pickle=True)
-    lbls = tup[0]
-    pred = tup[1]
-
-    lbls = lbls.flatten()
-    pred = pred.flatten()
-    print(np.sum(lbls == 0), np.sum(lbls == 1), np.sum(lbls == 2))
-
-    msk_0_1 = lbls != 2
-    msk_1_2 = lbls != 0
-    msk_0_2 = lbls != 1
-
-    lbls_0_1 = lbls[msk_0_1]
-
-    pred_0_1 = pred[msk_0_1]
-    pred_0_1 = np.where(pred_0_1 == 2, 1, pred_0_1)
-
-    # ----
-    lbls_1_2 = lbls[msk_1_2]
-    lbls_1_2 = np.where(lbls_1_2 == 1, 0, lbls_1_2)
-    lbls_1_2 = np.where(lbls_1_2 == 2, 1, lbls_1_2)
-
-    pred_1_2 = pred[msk_1_2]
-    pred_1_2 = np.where(pred_1_2 == 0, -9, pred_1_2)
-    pred_1_2 = np.where(pred_1_2 == 1, 0, pred_1_2)
-    pred_1_2 = np.where(pred_1_2 == 2, 1, pred_1_2)
-    pred_1_2 = np.where(pred_1_2 == -9, 1, pred_1_2)
-
-    # ----
-    lbls_0_2 = lbls[msk_0_2]
-    lbls_0_2 = np.where(lbls_0_2 == 2, 1, lbls_0_2)
-
-    pred_0_2 = pred[msk_0_2]
-    pred_0_2 = np.where(pred_0_2 == 2, 1, pred_0_2)
-
-    cm_0_1 = confusion_matrix_values(lbls_0_1, pred_0_1)
-    cm_1_2 = confusion_matrix_values(lbls_1_2, pred_1_2)
-    cm_0_2 = confusion_matrix_values(lbls_0_2, pred_0_2)
-
-    true_0_1 = (lbls_0_1 == 0) & (pred_0_1 == 0)
-    false_0_1 = (lbls_0_1 == 1) & (pred_0_1 == 0)
-
-    true_no_0_1 = (lbls_0_1 == 1) & (pred_0_1 == 1)
-    false_no_0_1 = (lbls_0_1 == 0) & (pred_0_1 == 1)
-
-    true_0_2 = (lbls_0_2 == 0) & (pred_0_2 == 0)
-    false_0_2 = (lbls_0_2 == 1) & (pred_0_2 == 0)
-
-    true_no_0_2 = (lbls_0_2 == 1) & (pred_0_2 == 1)
-    false_no_0_2 = (lbls_0_2 == 0) & (pred_0_2 == 1)
-
-    true_1_2 = (lbls_1_2 == 0) & (pred_1_2 == 0)
-    false_1_2 = (lbls_1_2 == 1) & (pred_1_2 == 0)
-
-    true_no_1_2 = (lbls_1_2 == 1) & (pred_1_2 == 1)
-    false_no_1_2 = (lbls_1_2 == 0) & (pred_1_2 == 1)
-
-    tp_0 = np.sum(true_0_1).astype(np.float64)
-    tp_1 = np.sum(true_1_2).astype(np.float64)
-    tp_2 = np.sum(true_0_2).astype(np.float64)
-
-    tn_0 = np.sum(true_no_0_1).astype(np.float64)
-    tn_1 = np.sum(true_no_1_2).astype(np.float64)
-    tn_2 = np.sum(true_no_0_2).astype(np.float64)
-
-    fp_0 = np.sum(false_0_1).astype(np.float64)
-    fp_1 = np.sum(false_1_2).astype(np.float64)
-    fp_2 = np.sum(false_0_2).astype(np.float64)
-
-    fn_0 = np.sum(false_no_0_1).astype(np.float64)
-    fn_1 = np.sum(false_no_1_2).astype(np.float64)
-    fn_2 = np.sum(false_no_0_2).astype(np.float64)
-
-    recall_0 = tp_0 / (tp_0 + fn_0)
-    recall_1 = tp_1 / (tp_1 + fn_1)
-    recall_2 = tp_2 / (tp_2 + fn_2)
-
-    precision_0 = tp_0 / (tp_0 + fp_0)
-    precision_1 = tp_1 / (tp_1 + fp_1)
-    precision_2 = tp_2 / (tp_2 + fp_2)
-
-    mcc_0 = ((tp_0 * tn_0) - (fp_0 * fn_0)) / np.sqrt((tp_0 + fp_0) * (tp_0 + fn_0) * (tn_0 + fp_0) * (tn_0 + fn_0))
-    mcc_1 = ((tp_1 * tn_1) - (fp_1 * fn_1)) / np.sqrt((tp_1 + fp_1) * (tp_1 + fn_1) * (tn_1 + fp_1) * (tn_1 + fn_1))
-    mcc_2 = ((tp_2 * tn_2) - (fp_2 * fn_2)) / np.sqrt((tp_2 + fp_2) * (tp_2 + fn_2) * (tn_2 + fp_2) * (tn_2 + fn_2))
-
-    acc_0 = np.sum(lbls_0_1 == pred_0_1)/pred_0_1.size
-    acc_1 = np.sum(lbls_1_2 == pred_1_2)/pred_1_2.size
-    acc_2 = np.sum(lbls_0_2 == pred_0_2)/pred_0_2.size
-
-    print(acc_0, recall_0, precision_0, mcc_0)
-    print(acc_1, recall_1, precision_1, mcc_1)
-    print(acc_2, recall_2, precision_2, mcc_2)
-
-    return cm_0_1, cm_1_2, cm_0_2, [acc_0, acc_1, acc_2], [recall_0, recall_1, recall_2],\
-        [precision_0, precision_1, precision_2], [mcc_0, mcc_1, mcc_2]
-
-
-def analyze_5cat(file):
-
-    tup = np.load(file, allow_pickle=True)
-    lbls = tup[0]
-    pred = tup[1]
-
-    lbls = lbls.flatten()
-    pred = pred.flatten()
-    np.histogram(lbls, bins=5)
-    np.histogram(pred, bins=5)
-
-    new_lbls = np.zeros(lbls.size, dtype=np.int32)
-    new_pred = np.zeros(pred.size, dtype=np.int32)
-
-    new_lbls[lbls == 0] = 0
-    new_lbls[lbls == 1] = 1
-    new_lbls[lbls == 2] = 1
-    new_lbls[lbls == 3] = 1
-    new_lbls[lbls == 4] = 2
-
-    new_pred[pred == 0] = 0
-    new_pred[pred == 1] = 1
-    new_pred[pred == 2] = 1
-    new_pred[pred == 3] = 1
-    new_pred[pred == 4] = 2
-
-    np.histogram(new_lbls, bins=3)
-    np.histogram(new_pred, bins=3)
-
-    lbls = new_lbls
-    pred = new_pred
-
-    print(np.sum(lbls == 0), np.sum(lbls == 1), np.sum(lbls == 2))
-
-    msk_0_1 = lbls != 2
-    msk_1_2 = lbls != 0
-    msk_0_2 = lbls != 1
-
-    lbls_0_1 = lbls[msk_0_1]
-
-    pred_0_1 = pred[msk_0_1]
-    pred_0_1 = np.where(pred_0_1 == 2, 1, pred_0_1)
-
-    # ----------------------------------------------
-    lbls_1_2 = lbls[msk_1_2]
-    lbls_1_2 = np.where(lbls_1_2 == 1, 0, lbls_1_2)
-    lbls_1_2 = np.where(lbls_1_2 == 2, 1, lbls_1_2)
-
-    pred_1_2 = pred[msk_1_2]
-    pred_1_2 = np.where(pred_1_2 == 0, -9, pred_1_2)
-    pred_1_2 = np.where(pred_1_2 == 1, 0, pred_1_2)
-    pred_1_2 = np.where(pred_1_2 == 2, 1, pred_1_2)
-    pred_1_2 = np.where(pred_1_2 == -9, 1, pred_1_2)
-
-    # -----------------------------------------------
-    lbls_0_2 = lbls[msk_0_2]
-    lbls_0_2 = np.where(lbls_0_2 == 2, 1, lbls_0_2)
-
-    pred_0_2 = pred[msk_0_2]
-    pred_0_2 = np.where(pred_0_2 == 2, 1, pred_0_2)
-
-    cm_0_1 = confusion_matrix_values(lbls_0_1, pred_0_1)
-    cm_1_2 = confusion_matrix_values(lbls_1_2, pred_1_2)
-    cm_0_2 = confusion_matrix_values(lbls_0_2, pred_0_2)
-
-    true_0_1 = (lbls_0_1 == 0) & (pred_0_1 == 0)
-    false_0_1 = (lbls_0_1 == 1) & (pred_0_1 == 0)
-
-    true_no_0_1 = (lbls_0_1 == 1) & (pred_0_1 == 1)
-    false_no_0_1 = (lbls_0_1 == 0) & (pred_0_1 == 1)
-
-    true_0_2 = (lbls_0_2 == 0) & (pred_0_2 == 0)
-    false_0_2 = (lbls_0_2 == 1) & (pred_0_2 == 0)
+def analyze(directory, outfile):
+    train_data_files = glob.glob(directory + 'train*mres*.npy')
+    valid_data_files = glob.glob(directory + 'valid*mres*.npy')
+    train_label_files = glob.glob(directory + 'train*ires*.npy')
+    valid_label_files = glob.glob(directory + 'valid*ires*.npy')
 
-    true_no_0_2 = (lbls_0_2 == 1) & (pred_0_2 == 1)
-    false_no_0_2 = (lbls_0_2 == 0) & (pred_0_2 == 1)
+    data_s = []
+    label_s = []
+    for idx, data_f in enumerate(valid_data_files):
+        nda = np.load(data_f)
+        data_s.append(nda)
 
-    true_1_2 = (lbls_1_2 == 0) & (pred_1_2 == 0)
-    false_1_2 = (lbls_1_2 == 1) & (pred_1_2 == 0)
+        f = valid_label_files[idx]
+        nda = np.load(f)
+        label_s.append(nda)
 
-    true_no_1_2 = (lbls_1_2 == 1) & (pred_1_2 == 1)
-    false_no_1_2 = (lbls_1_2 == 0) & (pred_1_2 == 1)
+    input_data = np.concatenate(data_s)
+    input_label = np.concatenate(label_s)
 
-    tp_0 = np.sum(true_0_1).astype(np.float64)
-    tp_1 = np.sum(true_1_2).astype(np.float64)
-    tp_2 = np.sum(true_0_2).astype(np.float64)
+    refl_i = input_label[:, params_i.index('refl_0_65um_nom'), :, :]
+    rlo, rhi, rstd, rmean = get_min_max_std(refl_i)
+    rmean_i = rmean[:, slc_y, slc_x]
+    rlo_i = rlo[:, slc_y, slc_x]
+    rhi_i = rhi[:, slc_y, slc_x]
+    rstd_i = rstd[:, slc_y, slc_x]
 
-    tn_0 = np.sum(true_no_0_1).astype(np.float64)
-    tn_1 = np.sum(true_no_1_2).astype(np.float64)
-    tn_2 = np.sum(true_no_0_2).astype(np.float64)
+    rlo_m = input_data[:, params.index('refl_submin_ch01'), :, :]
+    rlo_m = rlo_m[:, slc_y, slc_x]
 
-    fp_0 = np.sum(false_0_1).astype(np.float64)
-    fp_1 = np.sum(false_1_2).astype(np.float64)
-    fp_2 = np.sum(false_0_2).astype(np.float64)
+    rhi_m = input_data[:, params.index('refl_submax_ch01'), :, :]
+    rhi_m = rhi_m[:, slc_y, slc_x]
 
-    fn_0 = np.sum(false_no_0_1).astype(np.float64)
-    fn_1 = np.sum(false_no_1_2).astype(np.float64)
-    fn_2 = np.sum(false_no_0_2).astype(np.float64)
+    rstd_m = input_data[:, params.index('refl_substddev_ch01'), :, :]
+    rstd_m = rstd_m[:, slc_y, slc_x]
 
-    recall_0 = tp_0 / (tp_0 + fn_0)
-    recall_1 = tp_1 / (tp_1 + fn_1)
-    recall_2 = tp_2 / (tp_2 + fn_2)
+    rmean = input_data[:, params.index('refl_0_65um_nom'), :, :]
+    rmean_m = rmean[:, slc_y, slc_x]
+    # ------------------------
 
-    precision_0 = tp_0 / (tp_0 + fp_0)
-    precision_1 = tp_1 / (tp_1 + fp_1)
-    precision_2 = tp_2 / (tp_2 + fp_2)
+    cp_i = input_label[:, params_i.index('cloud_probability'), :, :]
+    _, _, _, mean = get_min_max_std(cp_i)
+    cp_mean_i = mean[:, slc_y, slc_x]
 
-    mcc_0 = ((tp_0 * tn_0) - (fp_0 * fn_0)) / np.sqrt((tp_0 + fp_0) * (tp_0 + fn_0) * (tn_0 + fp_0) * (tn_0 + fn_0))
-    mcc_1 = ((tp_1 * tn_1) - (fp_1 * fn_1)) / np.sqrt((tp_1 + fp_1) * (tp_1 + fn_1) * (tn_1 + fp_1) * (tn_1 + fn_1))
-    mcc_2 = ((tp_2 * tn_2) - (fp_2 * fn_2)) / np.sqrt((tp_2 + fp_2) * (tp_2 + fn_2) * (tn_2 + fp_2) * (tn_2 + fn_2))
+    mean = input_data[:, params.index('cloud_probability'), :, :]
+    cp_mean_m = mean[:, slc_y, slc_x]
+    # -----------------------------
 
-    acc_0 = np.sum(lbls_0_1 == pred_0_1)/pred_0_1.size
-    acc_1 = np.sum(lbls_1_2 == pred_1_2)/pred_1_2.size
-    acc_2 = np.sum(lbls_0_2 == pred_0_2)/pred_0_2.size
+    opd_i = input_label[:, params_i.index('cld_opd_dcomp'), :, :]
+    _, _, _, mean = get_min_max_std(opd_i)
+    opd_mean_i = mean[:, slc_y, slc_x]
 
-    print(acc_0, recall_0, precision_0, mcc_0)
-    print(acc_1, recall_1, precision_1, mcc_1)
-    print(acc_2, recall_2, precision_2, mcc_2)
+    mean = input_data[:, params.index('cld_opd_dcomp'), :, :]
+    opd_mean_m = mean[:, slc_y, slc_x]
 
-    return cm_0_1, cm_1_2, cm_0_2, [acc_0, acc_1, acc_2], [recall_0, recall_1, recall_2],\
-        [precision_0, precision_1, precision_2], [mcc_0, mcc_1, mcc_2], lbls, pred
+    np.save(outfile, (rmean_i, rmean_m, cp_mean_i, cp_mean_m, opd_mean_i, opd_mean_m, rlo_i, rlo_m, rhi_i, rhi_m, rstd_i, rstd_m))
 
 
 if __name__ == "__main__":
-- 
GitLab