pyadps 0.1.1__tar.gz → 0.2.1b0__tar.gz

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.
Files changed (57) hide show
  1. {pyadps-0.1.1 → pyadps-0.2.1b0}/PKG-INFO +5 -5
  2. {pyadps-0.1.1 → pyadps-0.2.1b0}/pyproject.toml +10 -10
  3. pyadps-0.2.1b0/src/pyadps/Home_Page.py +42 -0
  4. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/pages/01_Read_File.py +19 -188
  5. pyadps-0.2.1b0/src/pyadps/pages/02_View_Raw_Data.py +128 -0
  6. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/pages/03_Download_Raw_File.py +61 -149
  7. pyadps-0.2.1b0/src/pyadps/pages/04_QC_Test.py +334 -0
  8. pyadps-0.2.1b0/src/pyadps/pages/05_Profile_Test.py +575 -0
  9. pyadps-0.2.1b0/src/pyadps/pages/06_Velocity_Test.py +341 -0
  10. pyadps-0.2.1b0/src/pyadps/pages/07_Write_File.py +452 -0
  11. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/__init__.py +3 -3
  12. pyadps-0.2.1b0/src/pyadps/utils/autoprocess.py +282 -0
  13. pyadps-0.1.1/src/pyadps/utils/plotgen.py → pyadps-0.2.1b0/src/pyadps/utils/cutbin.py +14 -332
  14. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/metadata/config.ini +4 -22
  15. pyadps-0.2.1b0/src/pyadps/utils/plotgen.py +229 -0
  16. pyadps-0.2.1b0/src/pyadps/utils/profile_test.py +187 -0
  17. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/pyreadrdi.py +17 -27
  18. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/readrdi.py +18 -164
  19. pyadps-0.1.1/src/pyadps/utils/__pycache__/regrid.cpython-312.pyc → pyadps-0.2.1b0/src/pyadps/utils/regrid.py +0 -0
  20. pyadps-0.2.1b0/src/pyadps/utils/script.py +155 -0
  21. pyadps-0.2.1b0/src/pyadps/utils/signal_quality.py +135 -0
  22. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/velocity_test.py +31 -79
  23. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/writenc.py +21 -155
  24. pyadps-0.1.1/src/pyadps/Home_Page.py +0 -48
  25. pyadps-0.1.1/src/pyadps/pages/02_View_Raw_Data.py +0 -164
  26. pyadps-0.1.1/src/pyadps/pages/04_Sensor_Health.py +0 -905
  27. pyadps-0.1.1/src/pyadps/pages/05_QC_Test.py +0 -476
  28. pyadps-0.1.1/src/pyadps/pages/06_Profile_Test.py +0 -971
  29. pyadps-0.1.1/src/pyadps/pages/07_Velocity_Test.py +0 -600
  30. pyadps-0.1.1/src/pyadps/pages/08_Write_File.py +0 -587
  31. pyadps-0.1.1/src/pyadps/pages/09_Auto_process.py +0 -64
  32. pyadps-0.1.1/src/pyadps/pages/__pycache__/__init__.cpython-312.pyc +0 -0
  33. pyadps-0.1.1/src/pyadps/utils/__pycache__/__init__.cpython-312.pyc +0 -0
  34. pyadps-0.1.1/src/pyadps/utils/__pycache__/autoprocess.cpython-312.pyc +0 -0
  35. pyadps-0.1.1/src/pyadps/utils/__pycache__/cutbin.cpython-312.pyc +0 -0
  36. pyadps-0.1.1/src/pyadps/utils/__pycache__/plotgen.cpython-312.pyc +0 -0
  37. pyadps-0.1.1/src/pyadps/utils/__pycache__/profile_test.cpython-312.pyc +0 -0
  38. pyadps-0.1.1/src/pyadps/utils/__pycache__/pyreadrdi.cpython-312.pyc +0 -0
  39. pyadps-0.1.1/src/pyadps/utils/__pycache__/readrdi.cpython-312.pyc +0 -0
  40. pyadps-0.1.1/src/pyadps/utils/__pycache__/script.cpython-312.pyc +0 -0
  41. pyadps-0.1.1/src/pyadps/utils/__pycache__/sensor_health.cpython-312.pyc +0 -0
  42. pyadps-0.1.1/src/pyadps/utils/__pycache__/signal_quality.cpython-312.pyc +0 -0
  43. pyadps-0.1.1/src/pyadps/utils/__pycache__/velocity_test.cpython-312.pyc +0 -0
  44. pyadps-0.1.1/src/pyadps/utils/__pycache__/writenc.cpython-312.pyc +0 -0
  45. pyadps-0.1.1/src/pyadps/utils/autoprocess.py +0 -548
  46. pyadps-0.1.1/src/pyadps/utils/metadata/demo.000 +0 -0
  47. pyadps-0.1.1/src/pyadps/utils/profile_test.py +0 -556
  48. pyadps-0.1.1/src/pyadps/utils/script.py +0 -205
  49. pyadps-0.1.1/src/pyadps/utils/sensor_health.py +0 -120
  50. pyadps-0.1.1/src/pyadps/utils/signal_quality.py +0 -455
  51. {pyadps-0.1.1 → pyadps-0.2.1b0}/LICENSE +0 -0
  52. {pyadps-0.1.1 → pyadps-0.2.1b0}/README.md +0 -0
  53. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/__init__.py +0 -0
  54. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/__main__.py +0 -0
  55. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/pages/__init__.py +0 -0
  56. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/metadata/flmeta.json +0 -0
  57. {pyadps-0.1.1 → pyadps-0.2.1b0}/src/pyadps/utils/metadata/vlmeta.json +0 -0
@@ -1,8 +1,8 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: pyadps
3
- Version: 0.1.1
3
+ Version: 0.2.1b0
4
4
  Summary: A Python package for ADCP data processing
5
- Home-page: https://pyadps.readthedocs.io/en/latest/index.html
5
+ Home-page: https://example.com
6
6
  License: MIT
7
7
  Keywords: adcp,data-processing,oceanography
8
8
  Author: P. Amol
@@ -22,10 +22,10 @@ Requires-Dist: numpy (>=1.26.4)
22
22
  Requires-Dist: pandas (>=2.2.2)
23
23
  Requires-Dist: plotly (>=5.22.0)
24
24
  Requires-Dist: plotly-resampler (>=0.10.0)
25
- Requires-Dist: pygeomag (>=1.1.0,<2.0.0)
26
25
  Requires-Dist: scipy (>=1.14.0)
27
26
  Requires-Dist: streamlit (>=1.36.0)
28
- Project-URL: Documentation, https://pyadps.readthedocs.io/en/latest/index.html
27
+ Requires-Dist: wmm2020 (>=1.1.1)
28
+ Project-URL: Documentation, https://example.com/docs
29
29
  Project-URL: Repository, https://github.com/p-amol/pyadps
30
30
  Description-Content-Type: text/markdown
31
31
 
@@ -1,19 +1,19 @@
1
1
  [tool.poetry]
2
2
  name = "pyadps"
3
- version = "0.1.1"
3
+ version = "0.2.1-beta"
4
4
  description = "A Python package for ADCP data processing"
5
5
  authors = ["P. Amol <prakashamol@gmail.com>"]
6
6
  readme = "README.md"
7
7
  license = "MIT"
8
- homepage = "https://pyadps.readthedocs.io/en/latest/index.html" # You can add your homepage URL or GitHub URL here
9
- repository = "https://github.com/p-amol/pyadps" # Replace with your repository link
10
- documentation = "https://pyadps.readthedocs.io/en/latest/index.html" # Optional documentation link
8
+ homepage = "https://example.com" # You can add your homepage URL or GitHub URL here
9
+ repository = "https://github.com/p-amol/pyadps" # Replace with your repository link
10
+ documentation = "https://example.com/docs" # Optional documentation link
11
11
  keywords = ["adcp", "data-processing", "oceanography"]
12
12
  include = ["utils/metadata/*.json"]
13
13
  classifiers = [
14
- "Programming Language :: Python :: 3",
15
- "License :: OSI Approved :: MIT License",
16
- "Operating System :: OS Independent",
14
+ "Programming Language :: Python :: 3",
15
+ "License :: OSI Approved :: MIT License",
16
+ "Operating System :: OS Independent"
17
17
  ]
18
18
 
19
19
 
@@ -23,14 +23,13 @@ streamlit = ">=1.36.0"
23
23
  numpy = ">=1.26.4"
24
24
  matplotlib = ">=3.8.4"
25
25
  scipy = ">=1.14.0"
26
+ wmm2020 = ">=1.1.1"
26
27
  cmake = ">=3.30.2"
27
28
  pandas = ">=2.2.2"
28
29
  netCDF4 = ">=1.7.1"
29
30
  plotly = ">=5.22.0"
30
31
  plotly-resampler = ">=0.10.0"
31
32
  meson = ">=1.4.1"
32
- pygeomag = "^1.1.0"
33
-
34
33
 
35
34
  [tool.poetry.extras]
36
35
  tests = ["pytest"]
@@ -38,8 +37,9 @@ tests = ["pytest"]
38
37
  [tool.poetry.scripts]
39
38
  run-pyadps = "pyadps.__main__:main"
40
39
  run-auto = "pyadps.utils.autoprocess:main"
41
- run-script = "pyadps.utils.script:main"
42
40
 
43
41
  [build-system]
44
42
  requires = ["poetry-core>=1.0.0"]
45
43
  build-backend = "poetry.core.masonry.api"
44
+
45
+
@@ -0,0 +1,42 @@
1
+ import streamlit as st
2
+
3
+
4
+ def main():
5
+ st.set_page_config(
6
+ page_title="ADCP Data Processing Software",
7
+ page_icon=":world_map:️",
8
+ layout="wide",
9
+ initial_sidebar_state="auto",
10
+ menu_items={
11
+ "Get Help": "http://github.com/p-amol/adps",
12
+ "Report a bug": "http://github.com/adps/issues",
13
+ "About": "# Python ADCP Data Processing Software (PyADPS)",
14
+ },
15
+ )
16
+
17
+ """
18
+ # **Python ADCP Data Processing Software (pyadps)**
19
+ `pyadps` is a software for processing Teledyne RDI Acoustic Doppler Current Profiler (ADCP) PD0 files. Currently the software can process the data from Workhorse ADCPs.
20
+
21
+ ## Features
22
+
23
+ * Access RDI ADCP binary files using Python 3
24
+ * Convert RDI binary files to netcdf
25
+ * Process ADCP data
26
+
27
+ ## Contribute
28
+ Issue Tracker: http://github.com/adps/issues
29
+ Source Code: http://github.com/p-amol/adps
30
+
31
+ ## Support
32
+ If you are having issues, please let us know.
33
+ We have a mailing list located at: adps-python@google-groups.com
34
+
35
+ ## License
36
+ The project is licensed under the MIT license.
37
+
38
+ """
39
+
40
+
41
+ if __name__ == "__main__":
42
+ main()
@@ -1,15 +1,12 @@
1
1
  import os
2
2
  import tempfile
3
3
 
4
- import numpy as np
5
4
  import pandas as pd
6
5
  import streamlit as st
7
6
  import utils.readrdi as rd
7
+ import utils.writenc as wr
8
+ from streamlit.runtime.state import session_state
8
9
  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")
13
10
 
14
11
  """
15
12
  Streamlit page to load ADCP binary file and display File Header
@@ -113,7 +110,7 @@ if uploaded_file is not None:
113
110
  correlation = ds.correlation.data
114
111
  echo = ds.echo.data
115
112
  pgood = ds.percentgood.data
116
- beamdir = ds.fixedleader.system_configuration()["Beam Direction"]
113
+ beamdir = ds.fixedleader.system_configuration()['Beam Direction']
117
114
 
118
115
  st.session_state.fname = uploaded_file.name
119
116
  st.session_state.head = ds.fileheader
@@ -124,14 +121,6 @@ if uploaded_file is not None:
124
121
  st.session_state.correlation = ds.correlation.data
125
122
  st.session_state.pgood = ds.percentgood.data
126
123
  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
- )
135
124
 
136
125
  # st.session_state.flead = flead
137
126
  # st.session_state.vlead = vlead
@@ -145,9 +134,6 @@ if uploaded_file is not None:
145
134
  elif "flead" in st.session_state:
146
135
  st.write("You selected `%s`" % st.session_state.fname)
147
136
  else:
148
- # reset the cache and resources if the user press reload button.
149
- st.cache_data.clear()
150
- st.cache_resource.clear()
151
137
  st.stop()
152
138
 
153
139
  ########## TIME AXIS ##############
@@ -182,157 +168,10 @@ date_df = pd.DataFrame(
182
168
  st.session_state.date = pd.to_datetime(date_df)
183
169
  st.session_state.date1 = pd.to_datetime(date_df)
184
170
  st.session_state.date2 = pd.to_datetime(date_df)
185
- st.session_state.date3 = pd.to_datetime(date_df)
186
- st.session_state.ensemble_axis = np.arange(0, st.session_state.head.ensembles, 1)
187
- st.session_state.axis_option = "time"
188
-
189
-
190
- # ---------- Initialize all options -------------
191
- # ------------------------
192
- # Page: Download Raw File
193
- # ------------------------
194
- # Widgets
195
- st.session_state.add_attributes_DRW = "No"
196
- st.session_state.axis_option_DRW = "time"
197
- st.session_state.rawnc_download_DRW = False
198
- st.session_state.vleadnc_download_DRW = False
199
- st.session_state.rawcsv_option_DRW = "Velocity"
200
- st.session_state.rawcsv_beam_DRW = 1
201
- st.session_state.rawcsv_download_DRW = False
202
-
203
- # ------------------
204
- # Page: Sensor Test
205
- # ------------------
206
- st.session_state.isSensorTest = False
207
- st.session_state.isFirstSensorVisit = True
208
-
209
- # -- Tab 1: Depth Correction
210
- st.session_state.isDepthModified_ST = False
211
- # Widgets
212
- # Options: "Fixed Value", "File Upload"
213
- st.session_state.depthoption_ST = "Fixed Value"
214
- st.session_state.isFixedDepth_ST = False
215
- st.session_state.fixeddepth_ST = 0
216
- st.session_state.isUploadDepth_ST = False
217
-
218
- # -- Tab 2: Salinity Correction
219
- st.session_state.isSalinityModified_ST = False
220
- # Widgets
221
- st.session_state.salinityoption_ST = "Fixed Value"
222
- st.session_state.isFixedSalinity_ST = False
223
- st.session_state.fixedsalinity_ST = 35
224
- st.session_state.isUploadSalinity_ST = False
225
-
226
- # -- Tab 3: Temperature Correction
227
- st.session_state.isTemperatureModified_ST = False
228
- # Widgets
229
- st.session_state.temperatureoption_ST = "Fixed Value"
230
- st.session_state.isFixedTemperature_ST = False
231
- st.session_state.fixedtemperature_ST = 0
232
- st.session_state.isUploadTemperature_ST = False
233
-
234
- # -- Tab 7: Pitch, Roll, Velocity Correction
235
- st.session_state.isRollCheck_ST = False
236
- st.session_state.isPitchCheck_ST = False
237
- st.session_state.isVelocityModifiedSound_ST = False
238
- # Widgets
239
- st.session_state.roll_cutoff_ST = 359
240
- st.session_state.pitch_cutoff_ST = 359
241
-
242
- # ------------------
243
- # Page: QC Test
244
- # ------------------
245
- # Global Test
246
- st.session_state.isQCTest = False
247
- st.session_state.isFirstQCVisit = True
248
-
249
- # Tab 2: Apply QC
250
- st.session_state.isQCCheck_QCT = False
251
- # Widgets
252
- st.session_state.ct_QCT = 64
253
- st.session_state.et_QCT = 0
254
- st.session_state.evt_QCT = 2000
255
- st.session_state.ft_QCT = 50
256
- st.session_state.is3beam_QCT = True
257
- st.session_state.pgt_QCT = 0
258
-
259
- # Data Modifications
260
- st.session_state.isBeamModified_QCT = False
261
- # Widgets
262
- st.session_state.beam_direction_QCT = st.session_state.beam_direction
263
-
264
- # ------------------
265
- # Page: Profile Test
266
- # ------------------
267
- st.session_state.isProfileTest = False
268
- st.session_state.isFirstProfileVisit = True
269
-
270
- # Tab1: Trim Ends
271
- st.session_state.isTrimEndsCheck_PT = False
272
- # Widgets
273
- st.session_state.start_ens_PT = 0
274
- st.session_state.end_ens_PT = st.session_state.head.ensembles
275
-
276
- # Tab2: Cutbins - Sidelobe
277
- st.session_state.isCutBinSideLobeCheck_PT = False
278
- st.session_state.extra_cells_PT = 0
279
- st.session_state.water_depth_PT = 0
280
-
281
- # Tab3: Cutbins - Manual
282
- st.session_state.isCutBinManualCheck_PT = False
283
-
284
- # Tab4: Regrid
285
- st.session_state.isRegridCheck_PT = False
286
- st.session_state.end_cell_option_PT = "Cell"
287
- st.session_state.interpolate_PT = "nearest"
288
- st.session_state.manualdepth_PT = 0
289
-
290
- # ------------------
291
- # Page: Velocity Test
292
- # ------------------
293
- # Global Test
294
- st.session_state.isVelocityTest = False
295
- # Check if visiting the page first time
296
- st.session_state.isFirstVelocityVisit = True
297
- # Local Tests:
298
- # Tab1: Magnetic Declination
299
- st.session_state.isMagnetCheck_VT = False
300
- # OPTIONS: pygeomag, API, Manual
301
- st.session_state.magnet_method_VT = "pygeomag"
302
- st.session_state.magnet_lat_VT = 0
303
- st.session_state.magnet_lon_VT = 0
304
- st.session_state.magnet_year_VT = 2025
305
- st.session_state.magnet_depth_VT = 0
306
- st.session_state.magnet_user_input_VT = 0
307
-
308
- # Tab2: Velocity Cutoff
309
- st.session_state.isCutoffCheck_VT = False
310
- st.session_state.maxuvel_VT = 250
311
- st.session_state.maxvvel_VT = 250
312
- st.session_state.maxwvel_VT = 15
313
-
314
- # Tab3: Despike
315
- st.session_state.isDespikeCheck_VT = False
316
- st.session_state.despike_kernel_VT = 5
317
- st.session_state.despike_cutoff_VT = 3
318
-
319
- # Tab4: Flatline
320
- st.session_state.isFlatlineCheck_VT = False
321
- st.session_state.flatline_kernel_VT = 5
322
- st.session_state.flatline_cutoff_VT = 3
323
-
324
- # ------------------
325
- # Page: Write File
326
- # ------------------
327
- st.session_state.isWriteFile = True
328
- st.session_state.isAttributes = False
329
- st.session_state.mask_data_WF = "Yes"
330
- # FileTypes: NetCDF, CSV
331
- st.session_state.file_type_WF = "NetCDF"
332
- st.session_state.isProcessedNetcdfDownload_WF = True
333
- st.session_state.isProcessedCSVDownload_WF = False
334
-
335
- # MASK DATA
171
+
172
+
173
+
174
+ ######### MASK DATA ##############
336
175
  # The velocity data has missing values due to the cutoff
337
176
  # criteria used before deployment. The `default_mask` uses
338
177
  # the velocity to create a mask. This mask file is stored
@@ -341,17 +180,16 @@ st.session_state.isProcessedCSVDownload_WF = False
341
180
  # WARNING: Never Change `st.session_state.orig_mask` in the code!
342
181
  #
343
182
  if "orig_mask" not in st.session_state:
344
- ds = st.session_state.ds
345
- st.session_state.orig_mask = default_mask(ds)
183
+ st.session_state.orig_mask = default_mask(
184
+ st.session_state.flead, st.session_state.velocity
185
+ )
346
186
 
347
- # ----------------------
348
- # Page returning options
349
- # ----------------------
350
- # This checks if we have returned back to the page after saving the data
351
- st.session_state.isSensorPageReturn = False
352
- st.session_state.isQCPageReturn = False
353
- st.session_state.isProfilePageReturn = False
354
- st.session_state.isVelocityPageReturn = False
187
+ # Checks if the following quality checks are carried out
188
+ st.session_state.isQCMask = False
189
+ st.session_state.isProfileMask = False
190
+ st.session_state.isGrid = False
191
+ st.session_state.isGridSave = False
192
+ st.session_state.isVelocityMask = False
355
193
 
356
194
  ########## FILE HEADER ###############
357
195
  st.header("File Header", divider="blue")
@@ -428,18 +266,10 @@ if flead_check_button:
428
266
 
429
267
  flead_button = st.button("Fixed Leader")
430
268
  if flead_button:
431
- # Pandas array should have all elements with same data type.
432
- # Except Sl. no., which is np.uint64, rest are np.int64.
433
- # Convert all datatype to uint64
434
- fl_dict = st.session_state.flead.field().items()
435
- new_dict = {}
436
- for key, value in fl_dict:
437
- new_dict[key] = value.astype(np.uint64)
438
-
439
269
  df = pd.DataFrame(
440
270
  {
441
- "Fields": new_dict.keys(),
442
- "Values": new_dict.values(),
271
+ "Fields": st.session_state.flead.field().keys(),
272
+ "Values": st.session_state.flead.field().values(),
443
273
  }
444
274
  )
445
275
  st.dataframe(df, use_container_width=True)
@@ -457,3 +287,4 @@ with right:
457
287
  df = df.astype("str")
458
288
  st.write((df.style.map(color_bool2)))
459
289
  # st.dataframe(df)
290
+
@@ -0,0 +1,128 @@
1
+ import matplotlib.pyplot as plt
2
+ import numpy as np
3
+ import pandas as pd
4
+ import plotly.express as px
5
+ import plotly.graph_objects as go
6
+ import streamlit as st
7
+ from plotly_resampler import FigureResampler
8
+
9
+ if "flead" not in st.session_state:
10
+ st.write(":red[Please Select Data!]")
11
+ st.stop()
12
+
13
+ # Load data
14
+ fdata = st.session_state.flead.fleader
15
+ vdata = st.session_state.vlead.vleader
16
+ velocity = st.session_state.velocity
17
+ echo = st.session_state.echo
18
+ correlation = st.session_state.correlation
19
+ pgood = st.session_state.pgood
20
+
21
+ x = np.arange(0, st.session_state.head.ensembles, 1)
22
+ y = np.arange(0, fdata["Cells"][0], 1)
23
+
24
+ X, Y = np.meshgrid(x, y)
25
+
26
+
27
+ @st.cache_data
28
+ def fillplot_matplotlib(data):
29
+ fig, ax = plt.subplots()
30
+ cs = ax.contourf(X, Y, data)
31
+ fig.colorbar(cs)
32
+ st.pyplot(fig)
33
+
34
+
35
+ @st.cache_data
36
+ def fillplot_plotly(data, colorscale="balance", title="Data", xaxis="time"):
37
+ if xaxis == "time":
38
+ xdata = st.session_state.date
39
+ elif xaxis == "ensemble":
40
+ xdata = x
41
+ else:
42
+ xdata = x
43
+ fig = FigureResampler(go.Figure())
44
+ data1 = np.where(data == -32768, np.nan, data)
45
+ fig.add_trace(
46
+ go.Heatmap(
47
+ z=data1[:, 0:-1],
48
+ x=xdata,
49
+ y=y,
50
+ colorscale=colorscale,
51
+ hoverongaps=False,
52
+ )
53
+ )
54
+ fig.update_layout(
55
+ xaxis=dict(showline=True, mirror=True),
56
+ yaxis=dict(showline=True, mirror=True),
57
+ title_text=title,
58
+ )
59
+ st.plotly_chart(fig)
60
+
61
+
62
+ @st.cache_data
63
+ def lineplot(data, title, xaxis="time"):
64
+ if xaxis == "time":
65
+ df = pd.DataFrame({"date": st.session_state.date, title: data})
66
+ fig = px.line(df, x="date", y=title)
67
+ else:
68
+ df = pd.DataFrame({"ensemble": x, title: data})
69
+ fig = px.line(df, x="ensemble", y=title)
70
+
71
+ st.plotly_chart(fig)
72
+
73
+
74
+ # Introduction
75
+ st.header("View Raw Data", divider="orange")
76
+ st.write(
77
+ """
78
+ Displays all variables available in the raw file. No processing has been carried out.
79
+ Data might be missing because of the quality-check criteria used before deployment.\n
80
+ Either `time` or `ensemble` axis can be chosen as the abscissa (x-axis).
81
+ The ordinate (y-axis) for the heatmap is `bins` as the depth correction is not applied.
82
+ """
83
+ )
84
+ xbutton = st.radio("Select an x-axis to plot", ["time", "ensemble"], horizontal=True)
85
+
86
+
87
+ # 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
+
92
+ # 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
+
107
+
108
+ st.header("Velocity, Echo Intensity, Correlation & Percent Good", divider="blue")
109
+
110
+
111
+ def call_plot(varname, beam, xaxis="time"):
112
+ if varname == "Velocity":
113
+ fillplot_plotly(velocity[beam - 1, :, :], title=varname, xaxis=xaxis)
114
+ elif varname == "Echo":
115
+ fillplot_plotly(echo[beam - 1, :, :], title=varname, xaxis=xaxis)
116
+ elif varname == "Correlation":
117
+ fillplot_plotly(correlation[beam - 1, :, :], title=varname, xaxis=xaxis)
118
+ elif varname == "Percent Good":
119
+ fillplot_plotly(pgood[beam - 1, :, :], title=varname, xaxis=xaxis)
120
+
121
+
122
+ var_option = st.selectbox(
123
+ "Select a data type", ("Velocity", "Echo", "Correlation", "Percent Good")
124
+ )
125
+ beam = st.radio("Select beam", (1, 2, 3, 4), horizontal=True)
126
+ call_plot(var_option, beam, xaxis=str(xbutton))
127
+
128
+