From 41b8bc6ee31c68579676429ceac51f6b70243a8e Mon Sep 17 00:00:00 2001
From: tomrink <rink@ssec.wisc.edu>
Date: Wed, 3 Mar 2021 11:37:34 -0600
Subject: [PATCH] initial commit

---
 modules/icing/__init__.py   |   0
 modules/icing/pirep_goes.py |  36 ++++++++++++
 modules/icing/pireps.py     | 107 ++++++++++++++++++++++++++++++++++++
 3 files changed, 143 insertions(+)
 create mode 100644 modules/icing/__init__.py
 create mode 100644 modules/icing/pirep_goes.py
 create mode 100644 modules/icing/pireps.py

diff --git a/modules/icing/__init__.py b/modules/icing/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/modules/icing/pirep_goes.py b/modules/icing/pirep_goes.py
new file mode 100644
index 00000000..2e05a235
--- /dev/null
+++ b/modules/icing/pirep_goes.py
@@ -0,0 +1,36 @@
+from amv.intercompare import pirep_icing
+from deeplearning.amv_raob import get_images
+import numpy as np
+import pickle
+
+pirep_file = '/home/rink/data/pirep/pireps_2018040100_2018123023.csv'
+
+ice_dict, no_ice_dict = pirep_icing(pirep_file)
+print('num obs: ice, no ice', len(ice_dict), len(no_ice_dict))
+
+time_keys = list(ice_dict.keys())
+
+hist = np.zeros(20)
+
+for idx, time in enumerate(time_keys):
+    if (idx % 4) != 0:
+        continue
+    print(100.0*(idx/len(time_keys)))
+    reports = ice_dict[time]
+    lat_s = []
+    lon_s = []
+    for tup in reports:
+        lat, lon, fl, rpt_str = tup
+        lat_s.append(lat)
+        lon_s.append(lon)
+
+    images, _, _, idxs = get_images(lon_s, lat_s, time, ['14'], [10], [1])
+    if images is not None:
+        counts, edges = np.histogram(images[0,], range=[150, 350], bins=20)
+        hist += counts
+
+f = open('/home/rink/ice_hist.pkl', 'wb')
+pickle.dump(hist, f)
+f.close()
+print('bin edges: ', edges)
+
diff --git a/modules/icing/pireps.py b/modules/icing/pireps.py
new file mode 100644
index 00000000..61053b00
--- /dev/null
+++ b/modules/icing/pireps.py
@@ -0,0 +1,107 @@
+import datetime
+from datetime import timezone
+import re
+
+NO_ICE = '\s*NEG\s*|\s*NONE\s*|\s*NEGATIVE\s*|\s*NO\s*'
+ICE_LVL = '\d+-\d+|FL\d+-FL\d+'
+FLT_LVL = '/FL\s{0,1}\d+\s*'
+ICE_RPT = '/IC'
+ATYPE = '/TP'
+RMK = '/RM'
+
+
+# Returns icing/non-icing
+def pirep_icing(filename, lon_range=[-180, 180], lat_range=[-55, 55]):
+    no_ice_reports = []
+    ice_reports = []
+
+    # HEADER: VALID,URGENT,AIRCRAFT,REPORT,LAT,LON
+
+    ice_dict = {}
+    no_ice_dict = {}
+
+    with open(filename) as file:
+        for idx, line in enumerate(file):
+            toks = line.split(',')
+            if toks[0] == 'VALID':  # Skip headers (concatenated files)
+                continue
+            if len(toks) != 6:  # Check for line format error
+                continue
+
+            report = toks[3]
+            lat = float(toks[4])
+            lon = float(toks[5])
+
+            if lon < lon_range[0] or lon > lon_range[1]:
+                continue
+            if lat < lat_range[0] or lat > lat_range[1]:
+                continue
+
+            # Flight level
+            so = re.search(FLT_LVL, report)
+            if so is None:
+                continue
+            else:
+                fl = so.group()
+                fl = (fl[3:].rstrip()).lstrip()
+                if fl.isnumeric():
+                    fl = float(fl) * 100 * 0.3048  # conv flight level to meters
+                else:
+                    continue
+
+            # Icing
+            ii = report.find('/IC')
+            if ii >= 0:
+                ice_str = report[ii+3:]
+                ri = ice_str.find('/RM')
+
+                if ri >= 0:
+                    ice_str = ice_str[:ri]
+                else:
+                    ri = ice_str.find(',')
+                    if ri >= 0:
+                        ice_str = ice_str[:ri]
+                ice_str = ice_str.lstrip()
+                if ice_str.find('N/A') >= 0:
+                    continue
+
+                dto = datetime.datetime.strptime(toks[0], '%Y%m%d%H%M').replace(tzinfo=timezone.utc)
+                timestmp = dto.timestamp()
+
+                if len(re.findall(NO_ICE, ice_str)) != 0:
+                    no_ice_reports.append(ice_str)
+                    rpts = no_ice_dict.get(timestmp)
+                    tup = (lat, lon, fl, ice_str)
+                    if rpts is None:
+                        rpts = []
+                        rpts.append(tup)
+                        no_ice_dict[timestmp] = rpts
+                    else:
+                        rpts.append(tup)
+                else:
+                    ice_reports.append(ice_str)
+                    so = re.search(ICE_LVL, ice_str)
+                    if so is not None:
+                        lvl_a, lvl_b = so.group().split('-')
+                        if lvl_a.find('FL') >= 0:
+                            lvl_a = float(lvl_a[2:]) * 100 * 0.3048
+                            lvl_b = float(lvl_b[2:]) * 100 * 0.3048
+                        else:
+                            lvl_a = float(lvl_a) * 100 * 0.3048
+                            lvl_b = float(lvl_b) * 100 * 0.3048
+
+                        fl = max(lvl_a, lvl_b)
+
+                    if fl > 15000.0:
+                        continue
+
+                    rpts = ice_dict.get(timestmp)
+                    tup = (lat, lon, fl, ice_str)
+                    if rpts is None:
+                        rpts = []
+                        rpts.append(tup)
+                        ice_dict[timestmp] = rpts
+                    else:
+                        rpts.append(tup)
+
+    return ice_dict, no_ice_dict
-- 
GitLab