pyadps 0.2.0b0__py3-none-any.whl → 0.3.0b0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyadps/pages/01_Read_File.py +96 -17
- pyadps/pages/02_View_Raw_Data.py +69 -33
- pyadps/pages/03_Download_Raw_File.py +4 -4
- pyadps/pages/04_Sensor_Health.py +892 -0
- pyadps/pages/05_QC_Test.py +478 -0
- pyadps/pages/06_Profile_Test.py +959 -0
- pyadps/pages/07_Velocity_Test.py +599 -0
- pyadps/pages/{07_Write_File.py → 08_Write_File.py} +127 -52
- pyadps/pages/09_Auto_process.py +62 -0
- pyadps/utils/__init__.py +2 -3
- pyadps/utils/autoprocess.py +129 -46
- pyadps/utils/metadata/config.ini +22 -4
- pyadps/utils/metadata/demo.000 +0 -0
- pyadps/utils/plotgen.py +499 -0
- pyadps/utils/profile_test.py +491 -126
- pyadps/utils/pyreadrdi.py +13 -6
- pyadps/utils/readrdi.py +78 -6
- pyadps/utils/script.py +21 -23
- pyadps/utils/sensor_health.py +120 -0
- pyadps/utils/signal_quality.py +343 -23
- pyadps/utils/velocity_test.py +75 -27
- pyadps/utils/writenc.py +8 -1
- {pyadps-0.2.0b0.dist-info → pyadps-0.3.0b0.dist-info}/METADATA +53 -22
- pyadps-0.3.0b0.dist-info/RECORD +33 -0
- {pyadps-0.2.0b0.dist-info → pyadps-0.3.0b0.dist-info}/WHEEL +1 -1
- pyadps/pages/04_QC_Test.py +0 -334
- pyadps/pages/05_Profile_Test.py +0 -575
- pyadps/pages/06_Velocity_Test.py +0 -341
- pyadps/utils/cutbin.py +0 -413
- pyadps/utils/regrid.py +0 -279
- pyadps-0.2.0b0.dist-info/RECORD +0 -31
- {pyadps-0.2.0b0.dist-info → pyadps-0.3.0b0.dist-info}/LICENSE +0 -0
- {pyadps-0.2.0b0.dist-info → pyadps-0.3.0b0.dist-info}/entry_points.txt +0 -0
pyadps/pages/01_Read_File.py
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
import os
|
2
2
|
import tempfile
|
3
3
|
|
4
|
+
import numpy as np
|
4
5
|
import pandas as pd
|
5
6
|
import streamlit as st
|
6
7
|
import utils.readrdi as rd
|
7
|
-
import utils.writenc as wr
|
8
|
-
from streamlit.runtime.state import session_state
|
9
8
|
from utils.signal_quality import default_mask
|
9
|
+
from utils.readrdi import ReadFile
|
10
|
+
|
11
|
+
# To make the page wider if the user presses the reload button.
|
12
|
+
st.set_page_config(layout="wide")
|
10
13
|
|
11
14
|
"""
|
12
15
|
Streamlit page to load ADCP binary file and display File Header
|
@@ -110,7 +113,7 @@ if uploaded_file is not None:
|
|
110
113
|
correlation = ds.correlation.data
|
111
114
|
echo = ds.echo.data
|
112
115
|
pgood = ds.percentgood.data
|
113
|
-
beamdir = ds.fixedleader.system_configuration()[
|
116
|
+
beamdir = ds.fixedleader.system_configuration()["Beam Direction"]
|
114
117
|
|
115
118
|
st.session_state.fname = uploaded_file.name
|
116
119
|
st.session_state.head = ds.fileheader
|
@@ -121,6 +124,14 @@ if uploaded_file is not None:
|
|
121
124
|
st.session_state.correlation = ds.correlation.data
|
122
125
|
st.session_state.pgood = ds.percentgood.data
|
123
126
|
st.session_state.beam_direction = beamdir
|
127
|
+
st.session_state.sound_speed = ds.variableleader.speed_of_sound.data
|
128
|
+
st.session_state.depth = ds.variableleader.depth_of_transducer.data
|
129
|
+
st.session_state.temperature = (
|
130
|
+
ds.variableleader.temperature.data * ds.variableleader.temperature.scale
|
131
|
+
)
|
132
|
+
st.session_state.salinity = (
|
133
|
+
ds.variableleader.salinity.data * ds.variableleader.salinity.scale
|
134
|
+
)
|
124
135
|
|
125
136
|
# st.session_state.flead = flead
|
126
137
|
# st.session_state.vlead = vlead
|
@@ -134,6 +145,9 @@ if uploaded_file is not None:
|
|
134
145
|
elif "flead" in st.session_state:
|
135
146
|
st.write("You selected `%s`" % st.session_state.fname)
|
136
147
|
else:
|
148
|
+
# reset the cache and resources if the user press reload button.
|
149
|
+
st.cache_data.clear()
|
150
|
+
st.cache_resource.clear()
|
137
151
|
st.stop()
|
138
152
|
|
139
153
|
########## TIME AXIS ##############
|
@@ -166,8 +180,65 @@ date_df = pd.DataFrame(
|
|
166
180
|
)
|
167
181
|
|
168
182
|
st.session_state.date = pd.to_datetime(date_df)
|
169
|
-
|
170
|
-
|
183
|
+
st.session_state.date1 = pd.to_datetime(date_df)
|
184
|
+
st.session_state.date2 = pd.to_datetime(date_df)
|
185
|
+
st.session_state.ensemble_axis = np.arange(0, st.session_state.head.ensembles, 1)
|
186
|
+
|
187
|
+
|
188
|
+
# ---------- Initialize all options -------------
|
189
|
+
# ------------------
|
190
|
+
# Global Tests
|
191
|
+
# ------------------
|
192
|
+
# Checks if the following tests are carried out
|
193
|
+
st.session_state.isSensorTest = False
|
194
|
+
st.session_state.isQCTest = False
|
195
|
+
st.session_state.isProfileTest = False
|
196
|
+
st.session_state.isGrid = False
|
197
|
+
st.session_state.isGridSave = False
|
198
|
+
st.session_state.isVelocityTest = False
|
199
|
+
|
200
|
+
# Check if visiting the page first time
|
201
|
+
st.session_state.isFirstSensorVisit = True
|
202
|
+
st.session_state.isFirstQCVisit = True
|
203
|
+
st.session_state.isFirstProfileVisit = True
|
204
|
+
st.session_state.isFirstVelocityVisit = True
|
205
|
+
# ------------------
|
206
|
+
# Local Tests:
|
207
|
+
# ------------------
|
208
|
+
st.session_state.isRollCheck = False
|
209
|
+
st.session_state.isPitchCheck = False
|
210
|
+
|
211
|
+
st.session_state.isQCCheck = False
|
212
|
+
st.session_state.isBeamModified = False
|
213
|
+
|
214
|
+
st.session_state.isTrimEndsCheck = False
|
215
|
+
st.session_state.isCutBinSideLobeCheck = False
|
216
|
+
st.session_state.isCutBinManualCheck = False
|
217
|
+
st.session_state.isRegridCheck = False
|
218
|
+
|
219
|
+
st.session_state.isMagnetCheck = False
|
220
|
+
st.session_state.isDespikeCheck = False
|
221
|
+
st.session_state.isFlatlineCheck = False
|
222
|
+
st.session_state.isCutoffCheck = False
|
223
|
+
|
224
|
+
|
225
|
+
# ------------------
|
226
|
+
# Data Modifications
|
227
|
+
# ------------------
|
228
|
+
# SENSOR TEST
|
229
|
+
# Velocity Modified Based on Sound
|
230
|
+
st.session_state.isVelocityModifiedSound = False
|
231
|
+
# Transducer depth modified based on Pressure sensor
|
232
|
+
st.session_state.isDepthModified = False
|
233
|
+
st.session_state.isTemperatureModified = False
|
234
|
+
st.session_state.isSalinityModified = False
|
235
|
+
# QC TEST
|
236
|
+
st.session_state.isBeamModified = False
|
237
|
+
# VELOCITY TEST
|
238
|
+
# Velocity Modified based on magnetic declination
|
239
|
+
st.session_state.isVelocityModifiedMagnet = False
|
240
|
+
|
241
|
+
# MASK DATA
|
171
242
|
# The velocity data has missing values due to the cutoff
|
172
243
|
# criteria used before deployment. The `default_mask` uses
|
173
244
|
# the velocity to create a mask. This mask file is stored
|
@@ -176,16 +247,17 @@ st.session_state.date = pd.to_datetime(date_df)
|
|
176
247
|
# WARNING: Never Change `st.session_state.orig_mask` in the code!
|
177
248
|
#
|
178
249
|
if "orig_mask" not in st.session_state:
|
179
|
-
st.session_state.
|
180
|
-
|
181
|
-
)
|
250
|
+
ds = st.session_state.ds
|
251
|
+
st.session_state.orig_mask = default_mask(ds)
|
182
252
|
|
183
|
-
#
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
st.session_state.
|
188
|
-
st.session_state.
|
253
|
+
# ----------------------
|
254
|
+
# Page returning options
|
255
|
+
# ----------------------
|
256
|
+
# This checks if we have returned back to the page after saving the data
|
257
|
+
st.session_state.isSensorPageReturn = False
|
258
|
+
st.session_state.isQCPageReturn = False
|
259
|
+
st.session_state.isProfilePageReturn = False
|
260
|
+
st.session_state.isVelocityPageReturn = False
|
189
261
|
|
190
262
|
########## FILE HEADER ###############
|
191
263
|
st.header("File Header", divider="blue")
|
@@ -262,10 +334,18 @@ if flead_check_button:
|
|
262
334
|
|
263
335
|
flead_button = st.button("Fixed Leader")
|
264
336
|
if flead_button:
|
337
|
+
# Pandas array should have all elements with same data type.
|
338
|
+
# Except Sl. no., which is np.uint64, rest are np.int64.
|
339
|
+
# Convert all datatype to uint64
|
340
|
+
fl_dict = st.session_state.flead.field().items()
|
341
|
+
new_dict = {}
|
342
|
+
for key, value in fl_dict:
|
343
|
+
new_dict[key] = value.astype(np.uint64)
|
344
|
+
|
265
345
|
df = pd.DataFrame(
|
266
346
|
{
|
267
|
-
"Fields":
|
268
|
-
"Values":
|
347
|
+
"Fields": new_dict.keys(),
|
348
|
+
"Values": new_dict.values(),
|
269
349
|
}
|
270
350
|
)
|
271
351
|
st.dataframe(df, use_container_width=True)
|
@@ -283,4 +363,3 @@ with right:
|
|
283
363
|
df = df.astype("str")
|
284
364
|
st.write((df.style.map(color_bool2)))
|
285
365
|
# st.dataframe(df)
|
286
|
-
|
pyadps/pages/02_View_Raw_Data.py
CHANGED
@@ -84,45 +84,81 @@ The ordinate (y-axis) for the heatmap is `bins` as the depth correction is not a
|
|
84
84
|
xbutton = st.radio("Select an x-axis to plot", ["time", "ensemble"], horizontal=True)
|
85
85
|
|
86
86
|
|
87
|
+
tab1, tab2, tab3, tab4 = st.tabs(["Primary Data", "Variable Leader", "Fixed Leader", "Advanced"])
|
88
|
+
|
89
|
+
with tab3:
|
87
90
|
# Fixed Leader Plots
|
88
|
-
st.header("Fixed Leader", divider="blue")
|
89
|
-
fbutton = st.radio("Select a dynamic variable to plot:", fdata.keys(), horizontal=True)
|
90
|
-
lineplot(fdata[fbutton], fbutton, xaxis=str(xbutton))
|
91
|
+
st.header("Fixed Leader", divider="blue")
|
92
|
+
fbutton = st.radio("Select a dynamic variable to plot:", fdata.keys(), horizontal=True)
|
93
|
+
lineplot(fdata[fbutton], fbutton, xaxis=str(xbutton))
|
91
94
|
|
95
|
+
with tab2:
|
92
96
|
# Variable Leader Plots
|
93
|
-
st.header("Variable Leader", divider="blue")
|
94
|
-
vbutton = st.radio("Select a dynamic variable to plot:", vdata.keys(), horizontal=True)
|
95
|
-
lineplot(vdata[vbutton], vbutton, xaxis=str(xbutton))
|
96
|
-
|
97
|
-
basic_options = [
|
98
|
-
"Pressure",
|
99
|
-
"Temperature",
|
100
|
-
"Salinity",
|
101
|
-
"Depth of Transducer",
|
102
|
-
"Heading",
|
103
|
-
"Pitch",
|
104
|
-
"Roll",
|
105
|
-
]
|
106
|
-
|
97
|
+
st.header("Variable Leader", divider="blue")
|
98
|
+
vbutton = st.radio("Select a dynamic variable to plot:", vdata.keys(), horizontal=True)
|
99
|
+
lineplot(vdata[vbutton], vbutton, xaxis=str(xbutton))
|
107
100
|
|
108
|
-
|
101
|
+
with tab1:
|
102
|
+
st.header("Velocity, Echo Intensity, Correlation & Percent Good", divider="blue")
|
109
103
|
|
110
104
|
|
111
|
-
def call_plot(varname, beam, xaxis="time"):
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
105
|
+
def call_plot(varname, beam, xaxis="time"):
|
106
|
+
if varname == "Velocity":
|
107
|
+
fillplot_plotly(velocity[beam - 1, :, :], title=varname, xaxis=xaxis)
|
108
|
+
elif varname == "Echo":
|
109
|
+
fillplot_plotly(echo[beam - 1, :, :], title=varname, xaxis=xaxis)
|
110
|
+
elif varname == "Correlation":
|
111
|
+
fillplot_plotly(correlation[beam - 1, :, :], title=varname, xaxis=xaxis)
|
112
|
+
elif varname == "Percent Good":
|
113
|
+
fillplot_plotly(pgood[beam - 1, :, :], title=varname, xaxis=xaxis)
|
120
114
|
|
121
115
|
|
122
|
-
var_option = st.selectbox(
|
123
|
-
|
124
|
-
)
|
125
|
-
beam = st.radio("Select beam", (1, 2, 3, 4), horizontal=True)
|
126
|
-
call_plot(var_option, beam, xaxis=str(xbutton))
|
127
|
-
|
116
|
+
var_option = st.selectbox(
|
117
|
+
"Select a data type", ("Velocity", "Echo", "Correlation", "Percent Good")
|
118
|
+
)
|
119
|
+
beam = st.radio("Select beam", (1, 2, 3, 4), horizontal=True)
|
120
|
+
call_plot(var_option, beam, xaxis=str(xbutton))
|
121
|
+
|
122
|
+
|
123
|
+
with tab4:
|
124
|
+
st.header("Advanced Data", divider="blue")
|
125
|
+
adv_option = st.selectbox(
|
126
|
+
"Select a data type", ("Bit Result",
|
127
|
+
"ADC Channel",
|
128
|
+
"Error Status Word 1",
|
129
|
+
"Error Status Word 2",
|
130
|
+
"Error Status Word 3",
|
131
|
+
"Error Status Word 4"))
|
132
|
+
if adv_option == "Bit Result":
|
133
|
+
bitdata = st.session_state.vlead.bitresult()
|
134
|
+
st.subheader("BIT Result", divider="orange")
|
135
|
+
st.write("""
|
136
|
+
This field contains the results of Workhorse ADCPs builtin test functions.
|
137
|
+
A zero indicates a successful BIT result.
|
138
|
+
""")
|
139
|
+
bitbutton = st.radio("Select a dynamic variable to plot:", bitdata.keys(), horizontal=True)
|
140
|
+
lineplot(bitdata[bitbutton], bitbutton, xaxis=str(xbutton))
|
141
|
+
|
142
|
+
elif adv_option == "ADC Channel":
|
143
|
+
adcdata = st.session_state.vlead.adc_channel()
|
144
|
+
st.subheader("ADC Channel", divider="orange")
|
145
|
+
adcbutton = st.radio("Select a dynamic variable to plot:", adcdata.keys(), horizontal=True)
|
146
|
+
lineplot(adcdata[adcbutton], adcbutton, xaxis=str(xbutton))
|
147
|
+
elif adv_option == "Error Status Word 1":
|
148
|
+
errordata1 = st.session_state.vlead.error_status_word(esw=1)
|
149
|
+
st.subheader("Error Status Word", divider="orange")
|
150
|
+
errorbutton = st.radio("Select a dynamic variable to plot:", errordata1.keys(), horizontal=True)
|
151
|
+
lineplot(errordata1[errorbutton], errorbutton, xaxis=str(xbutton))
|
152
|
+
elif adv_option == "Error Status Word 2":
|
153
|
+
errordata2 = st.session_state.vlead.error_status_word(esw=2)
|
154
|
+
errorbutton = st.radio("Select a dynamic variable to plot:", errordata2.keys(), horizontal=True)
|
155
|
+
lineplot(errordata2[errorbutton], errorbutton, xaxis=str(xbutton))
|
156
|
+
elif adv_option == "Error Status Word 3":
|
157
|
+
errordata3 = st.session_state.vlead.error_status_word(esw=3)
|
158
|
+
errorbutton = st.radio("Select a dynamic variable to plot:", errordata3.keys(), horizontal=True)
|
159
|
+
lineplot(errordata3[errorbutton], errorbutton, xaxis=str(xbutton))
|
160
|
+
elif adv_option == "Error Status Word 4":
|
161
|
+
errordata4 = st.session_state.vlead.error_status_word(esw=4)
|
162
|
+
errorbutton = st.radio("Select a dynamic variable to plot:", errordata4.keys(), horizontal=True)
|
163
|
+
lineplot(errordata4[errorbutton], errorbutton, xaxis=str(xbutton))
|
128
164
|
|
@@ -51,9 +51,9 @@ def file_write(path, axis_option, add_attributes=True):
|
|
51
51
|
st.session_state.rawfilename = tempdirname.name + "/rawfile.nc"
|
52
52
|
|
53
53
|
if add_attributes:
|
54
|
-
wr.rawnc(path, st.session_state.rawfilename, st.session_state.
|
54
|
+
wr.rawnc(path, st.session_state.rawfilename, st.session_state.date1, axis_option, attributes=st.session_state.attributes)
|
55
55
|
else:
|
56
|
-
wr.rawnc(path, st.session_state.rawfilename, st.session_state.
|
56
|
+
wr.rawnc(path, st.session_state.rawfilename, st.session_state.date1,axis_option)
|
57
57
|
|
58
58
|
@st.cache_data
|
59
59
|
def file_write_vlead(path, axis_option, add_attributes=True):
|
@@ -61,9 +61,9 @@ def file_write_vlead(path, axis_option, add_attributes=True):
|
|
61
61
|
st.session_state.vleadfilename = tempvardirname.name + "/vlead.nc"
|
62
62
|
|
63
63
|
if add_attributes:
|
64
|
-
wr.vlead_nc(path, st.session_state.vleadfilename, st.session_state.
|
64
|
+
wr.vlead_nc(path, st.session_state.vleadfilename, st.session_state.date2, axis_option, attributes=st.session_state.attributes)
|
65
65
|
else:
|
66
|
-
wr.vlead_nc(path, st.session_state.vleadfilename, st.session_state.
|
66
|
+
wr.vlead_nc(path, st.session_state.vleadfilename, st.session_state.date2, axis_option)
|
67
67
|
|
68
68
|
if "axis_option" not in st.session_state:
|
69
69
|
st.session_state.axis_option = "ensemble" # Default value
|