pyadps 0.3.3b0__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/Home_Page.py +42 -0
- pyadps/__init__.py +8 -0
- pyadps/__main__.py +15 -0
- pyadps/pages/01_Read_File.py +458 -0
- pyadps/pages/02_View_Raw_Data.py +164 -0
- pyadps/pages/03_Download_Raw_File.py +298 -0
- pyadps/pages/04_Sensor_Health.py +905 -0
- pyadps/pages/05_QC_Test.py +476 -0
- pyadps/pages/06_Profile_Test.py +970 -0
- pyadps/pages/07_Velocity_Test.py +600 -0
- pyadps/pages/08_Write_File.py +574 -0
- pyadps/pages/09_Auto_process.py +62 -0
- pyadps/pages/__init__.py +0 -0
- pyadps/utils/__init__.py +12 -0
- pyadps/utils/autoprocess.py +530 -0
- pyadps/utils/metadata/config.ini +99 -0
- pyadps/utils/metadata/demo.000 +0 -0
- pyadps/utils/metadata/flmeta.json +422 -0
- pyadps/utils/metadata/vlmeta.json +567 -0
- pyadps/utils/plotgen.py +728 -0
- pyadps/utils/profile_test.py +556 -0
- pyadps/utils/pyreadrdi.py +969 -0
- pyadps/utils/readrdi.py +1610 -0
- pyadps/utils/script.py +201 -0
- pyadps/utils/sensor_health.py +120 -0
- pyadps/utils/signal_quality.py +455 -0
- pyadps/utils/velocity_test.py +200 -0
- pyadps/utils/writenc.py +339 -0
- pyadps-0.3.3b0.dist-info/LICENSE +8 -0
- pyadps-0.3.3b0.dist-info/METADATA +172 -0
- pyadps-0.3.3b0.dist-info/RECORD +33 -0
- pyadps-0.3.3b0.dist-info/WHEEL +4 -0
- pyadps-0.3.3b0.dist-info/entry_points.txt +5 -0
pyadps/utils/writenc.py
ADDED
@@ -0,0 +1,339 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
"""
|
4
|
+
Created on Tue Aug 11 12:56:44 2020
|
5
|
+
|
6
|
+
@author: amol
|
7
|
+
"""
|
8
|
+
|
9
|
+
import time
|
10
|
+
|
11
|
+
import netCDF4 as nc4
|
12
|
+
import numpy as np
|
13
|
+
import pandas as pd
|
14
|
+
import streamlit as st
|
15
|
+
from netCDF4 import date2num
|
16
|
+
|
17
|
+
from pyadps.utils import readrdi as rd
|
18
|
+
|
19
|
+
|
20
|
+
def pd2nctime(time, t0="hours since 2000-01-01"):
|
21
|
+
"""
|
22
|
+
Function to convert pandas datetime format to netcdf datetime format.
|
23
|
+
"""
|
24
|
+
dti = pd.DatetimeIndex(time)
|
25
|
+
pydt = dti.to_pydatetime()
|
26
|
+
nctime = date2num(pydt, t0)
|
27
|
+
return nctime
|
28
|
+
|
29
|
+
|
30
|
+
def flead_ncatt(fl_obj, ncfile_id, ens=0):
|
31
|
+
"""
|
32
|
+
Adds global attributes to netcdf file. All variables from Fixed Leader
|
33
|
+
are appended for a given ensemble.
|
34
|
+
|
35
|
+
Parameters
|
36
|
+
----------
|
37
|
+
fl_obj : TYPE, FixedLeader Object
|
38
|
+
DESCRIPTION.
|
39
|
+
ncfile_id : TYPE
|
40
|
+
DESCRIPTION.
|
41
|
+
ens : TYPE, INTEGER optional
|
42
|
+
DESCRIPTION. The default is 0.
|
43
|
+
|
44
|
+
Returns
|
45
|
+
-------
|
46
|
+
None.
|
47
|
+
|
48
|
+
"""
|
49
|
+
|
50
|
+
ncfile_id.history = "Created " + time.ctime(time.time())
|
51
|
+
for key, value in fl_obj.fleader.items():
|
52
|
+
format_key = key.replace(" ", "_")
|
53
|
+
setattr(ncfile_id, format_key, format(value[ens], "d"))
|
54
|
+
|
55
|
+
for key, value in fl_obj.system_configuration(ens).items():
|
56
|
+
format_key = key.replace(" ", "_")
|
57
|
+
setattr(ncfile_id, format_key, format(value))
|
58
|
+
|
59
|
+
for key, value in fl_obj.ex_coord_trans(ens).items():
|
60
|
+
format_key = key.replace(" ", "_")
|
61
|
+
setattr(ncfile_id, format_key, format(value))
|
62
|
+
|
63
|
+
for field in ["source", "avail"]:
|
64
|
+
for key, value in fl_obj.ez_sensor(ens, field).items():
|
65
|
+
format_key = key.replace(" ", "_")
|
66
|
+
format_key = format_key + "_" + field.capitalize()
|
67
|
+
setattr(ncfile_id, format_key, format(value))
|
68
|
+
|
69
|
+
|
70
|
+
def rawnc(
|
71
|
+
infile,
|
72
|
+
outfile,
|
73
|
+
time,
|
74
|
+
axis_option=None,
|
75
|
+
attributes=None,
|
76
|
+
t0="hours since 2000-01-01",
|
77
|
+
):
|
78
|
+
"""
|
79
|
+
rawnc is a function to create netcdf file. Stores 3-D data types like
|
80
|
+
velocity, echo, correlation, and percent good.
|
81
|
+
|
82
|
+
Args:
|
83
|
+
infile (string): Input file path including filename
|
84
|
+
outfile (string): Output file path including filename
|
85
|
+
|
86
|
+
Returns
|
87
|
+
-------
|
88
|
+
None.
|
89
|
+
|
90
|
+
"""
|
91
|
+
|
92
|
+
outnc = nc4.Dataset(outfile, "w", format="NETCDF4")
|
93
|
+
|
94
|
+
flead = rd.FixedLeader(infile)
|
95
|
+
cell_list = flead.fleader["Cells"]
|
96
|
+
beam_list = flead.fleader["Beams"]
|
97
|
+
|
98
|
+
# Dimensions
|
99
|
+
# Define the primary axis based on axis_option
|
100
|
+
if axis_option == "ensemble":
|
101
|
+
outnc.createDimension("ensemble", None)
|
102
|
+
primary_axis = "ensemble"
|
103
|
+
ensemble = outnc.createVariable("ensemble", "i4", ("ensemble",))
|
104
|
+
ensemble.axis = "T"
|
105
|
+
elif axis_option == "time":
|
106
|
+
tsize = len(time)
|
107
|
+
outnc.createDimension("time", tsize)
|
108
|
+
primary_axis = "time"
|
109
|
+
time_var = outnc.createVariable("time", "i4", ("time",))
|
110
|
+
time_var.axis = "T"
|
111
|
+
time_var.units = t0
|
112
|
+
time_var.long_name = "time"
|
113
|
+
|
114
|
+
# Convert time_data to numerical format
|
115
|
+
nctime = pd2nctime(time, t0)
|
116
|
+
time_var[:] = nctime
|
117
|
+
|
118
|
+
else:
|
119
|
+
raise ValueError(f"Invalid axis_option: {axis_option}.")
|
120
|
+
|
121
|
+
outnc.createDimension("cell", max(cell_list))
|
122
|
+
outnc.createDimension("beam", max(beam_list))
|
123
|
+
|
124
|
+
# Variables
|
125
|
+
# Dimension Variables
|
126
|
+
cell = outnc.createVariable("cell", "i2", ("cell",))
|
127
|
+
cell.axis = "Z"
|
128
|
+
beam = outnc.createVariable("beam", "i2", ("beam",))
|
129
|
+
beam.axis = "X"
|
130
|
+
|
131
|
+
# Variables
|
132
|
+
|
133
|
+
# Data
|
134
|
+
cell[:] = np.arange(1, max(cell_list) + 1, 1)
|
135
|
+
beam[:] = np.arange(1, max(beam_list) + 1, 1)
|
136
|
+
|
137
|
+
varlist = rd.FileHeader(infile).data_types(1)
|
138
|
+
varlist.remove("Fixed Leader")
|
139
|
+
varlist.remove("Variable Leader")
|
140
|
+
|
141
|
+
varid = [0] * len(varlist)
|
142
|
+
|
143
|
+
for i, item in enumerate(varlist):
|
144
|
+
if item == "Velocity":
|
145
|
+
varid[i] = outnc.createVariable(
|
146
|
+
item, "i2", (primary_axis, "cell", "beam"), fill_value=-32768
|
147
|
+
)
|
148
|
+
# varid[i].missing_value = -32768
|
149
|
+
vel = getattr(rd, item)
|
150
|
+
var = vel(infile).data
|
151
|
+
# var = rd.variables(infile, item)
|
152
|
+
|
153
|
+
else:
|
154
|
+
# Unsigned integers might be assigned for future netcdf versions
|
155
|
+
format_item = item.replace(" ", "") # For percent good
|
156
|
+
varid[i] = outnc.createVariable(
|
157
|
+
format_item, "i2", (primary_axis, "cell", "beam")
|
158
|
+
)
|
159
|
+
datatype = getattr(rd, format_item)
|
160
|
+
var = np.array(datatype(infile).data, dtype="int16")
|
161
|
+
# var = np.array(rd.variables(infile, item), dtype="int16")
|
162
|
+
|
163
|
+
vshape = var.T.shape
|
164
|
+
if i == 0:
|
165
|
+
if primary_axis == "ensemble":
|
166
|
+
ensemble[:] = np.arange(1, vshape[0] + 1, 1)
|
167
|
+
|
168
|
+
varid[i][0 : vshape[0], 0 : vshape[1], 0 : vshape[2]] = var.T
|
169
|
+
|
170
|
+
# Add global attributes if provided
|
171
|
+
if attributes:
|
172
|
+
for key, value in attributes.items():
|
173
|
+
setattr(
|
174
|
+
outnc, key, str(value)
|
175
|
+
) # Convert to string to store in NetCDF metadata
|
176
|
+
|
177
|
+
# outnc.history = "Created " + time.ctime(time.time())
|
178
|
+
flead_ncatt(flead, outnc)
|
179
|
+
|
180
|
+
outnc.close()
|
181
|
+
|
182
|
+
|
183
|
+
def vlead_nc(
|
184
|
+
infile,
|
185
|
+
outfile,
|
186
|
+
time,
|
187
|
+
axis_option=None,
|
188
|
+
attributes=None,
|
189
|
+
t0="hours since 2000-01-01",
|
190
|
+
):
|
191
|
+
"""
|
192
|
+
Function to create ncfile containing Variable Leader.
|
193
|
+
|
194
|
+
Args:
|
195
|
+
infile (string): Input file path including filename
|
196
|
+
outfile (string): Output file path including filename
|
197
|
+
"""
|
198
|
+
outnc = nc4.Dataset(outfile, "w", format="NETCDF4")
|
199
|
+
|
200
|
+
# Dimensions
|
201
|
+
# Define the primary axis based on axis_option
|
202
|
+
if axis_option == "ensemble":
|
203
|
+
outnc.createDimension("ensemble", None)
|
204
|
+
primary_axis = "ensemble"
|
205
|
+
ensemble = outnc.createVariable("ensemble", "i4", ("ensemble",))
|
206
|
+
ensemble.axis = "T"
|
207
|
+
elif axis_option == "time":
|
208
|
+
tsize = len(time)
|
209
|
+
outnc.createDimension("time", tsize)
|
210
|
+
primary_axis = "time"
|
211
|
+
time_var = outnc.createVariable("time", "i4", ("time",))
|
212
|
+
time_var.axis = "T"
|
213
|
+
time_var.units = t0
|
214
|
+
time_var.long_name = "time"
|
215
|
+
|
216
|
+
# Convert time_data to numerical format
|
217
|
+
nctime = pd2nctime(time, t0)
|
218
|
+
time_var[:] = nctime
|
219
|
+
|
220
|
+
else:
|
221
|
+
raise ValueError(f"Invalid axis_option: {axis_option}.")
|
222
|
+
|
223
|
+
# Variables
|
224
|
+
|
225
|
+
vlead = rd.VariableLeader(infile)
|
226
|
+
vdict = vlead.vleader
|
227
|
+
varid = [0] * len(vdict)
|
228
|
+
|
229
|
+
i = 0
|
230
|
+
|
231
|
+
for key, values in vdict.items():
|
232
|
+
format_item = key.replace(" ", "_")
|
233
|
+
varid[i] = outnc.createVariable(
|
234
|
+
format_item, "i4", primary_axis, fill_value=-32768
|
235
|
+
)
|
236
|
+
var = values
|
237
|
+
vshape = var.shape
|
238
|
+
if i == 0:
|
239
|
+
if primary_axis == "ensemble":
|
240
|
+
ensemble[:] = np.arange(1, vshape[0] + 1, 1)
|
241
|
+
|
242
|
+
varid[i][0 : vshape[0]] = var
|
243
|
+
i += 1
|
244
|
+
|
245
|
+
# Add global attributes if provided
|
246
|
+
if attributes:
|
247
|
+
for key, value in attributes.items():
|
248
|
+
setattr(outnc, key, str(value)) # Store attributes as strings
|
249
|
+
|
250
|
+
outnc.close()
|
251
|
+
|
252
|
+
|
253
|
+
def finalnc(
|
254
|
+
outfile, depth, final_mask, time, data, t0="hours since 2000-01-01", attributes=None
|
255
|
+
):
|
256
|
+
"""
|
257
|
+
Function to create the processed NetCDF file.
|
258
|
+
|
259
|
+
Args:
|
260
|
+
outfile (string): Output file path
|
261
|
+
depth (numpy array): Contains the depth values (negative for depth)
|
262
|
+
time (pandas array): Time axis in Pandas datetime format
|
263
|
+
data (numpy array): Velocity (beam, depth, time)
|
264
|
+
t0 (string): Time unit and origin
|
265
|
+
"""
|
266
|
+
fill = -32768
|
267
|
+
|
268
|
+
# Change velocity to cm/s
|
269
|
+
data = data.astype(np.float64)
|
270
|
+
data[data > fill] /= 10
|
271
|
+
|
272
|
+
# Change depth to positive
|
273
|
+
# depth = abs(depth)
|
274
|
+
|
275
|
+
# Reverse the arrays if depth in descending order
|
276
|
+
if np.all(depth[:-1] >= depth[1:]):
|
277
|
+
depth = depth[::-1]
|
278
|
+
data = data[:, ::-1, :]
|
279
|
+
final_mask = final_mask[::-1, :]
|
280
|
+
|
281
|
+
ncfile = nc4.Dataset(outfile, mode="w", format="NETCDF4")
|
282
|
+
# Check if depth is scalar or array
|
283
|
+
if np.isscalar(depth):
|
284
|
+
zsize = 1 # Handle scalar depth
|
285
|
+
else:
|
286
|
+
zsize = len(depth) # Handle array depth
|
287
|
+
tsize = len(time)
|
288
|
+
ncfile.createDimension("depth", zsize)
|
289
|
+
ncfile.createDimension("time", tsize)
|
290
|
+
|
291
|
+
z = ncfile.createVariable("depth", np.float32, ("depth"))
|
292
|
+
z.units = "m"
|
293
|
+
z.long_name = "depth"
|
294
|
+
z.positive = "down"
|
295
|
+
|
296
|
+
t = ncfile.createVariable("time", np.float32, ("time"))
|
297
|
+
t.units = t0
|
298
|
+
t.long_name = "time"
|
299
|
+
|
300
|
+
# Create 2D variables
|
301
|
+
uvel = ncfile.createVariable("u", np.float32, ("time", "depth"), fill_value=fill)
|
302
|
+
uvel.units = "cm/s"
|
303
|
+
uvel.long_name = "zonal_velocity"
|
304
|
+
|
305
|
+
vvel = ncfile.createVariable("v", np.float32, ("time", "depth"), fill_value=fill)
|
306
|
+
vvel.units = "cm/s"
|
307
|
+
vvel.long_name = "meridional_velocity"
|
308
|
+
|
309
|
+
wvel = ncfile.createVariable("w", np.float32, ("time", "depth"), fill_value=fill)
|
310
|
+
wvel.units = "cm/s"
|
311
|
+
wvel.long_name = "vertical_velocity"
|
312
|
+
|
313
|
+
evel = ncfile.createVariable(
|
314
|
+
"err", np.float32, ("time", "depth"), fill_value=-32768
|
315
|
+
)
|
316
|
+
evel.units = "cm/s"
|
317
|
+
evel.long_name = "error_velocity"
|
318
|
+
|
319
|
+
mvel = ncfile.createVariable("mask", np.float32, ("time", "depth"), fill_value=fill)
|
320
|
+
mvel.long_name = "Velocity Mask (1: bad value, 0: good value)"
|
321
|
+
|
322
|
+
nctime = pd2nctime(time, t0)
|
323
|
+
# write data
|
324
|
+
z[:] = depth
|
325
|
+
t[:] = nctime
|
326
|
+
uvel[:, :] = data[0, :, :].T
|
327
|
+
vvel[:, :] = data[1, :, :].T
|
328
|
+
wvel[:, :] = data[2, :, :].T
|
329
|
+
evel[:, :] = data[3, :, :].T
|
330
|
+
mvel[:, :] = final_mask.T
|
331
|
+
|
332
|
+
# Add global attributes if provided
|
333
|
+
if attributes:
|
334
|
+
for key, value in attributes.items():
|
335
|
+
setattr(ncfile, key, str(value)) # Store attributes as strings
|
336
|
+
|
337
|
+
ncfile.mask_applied = "True"
|
338
|
+
|
339
|
+
ncfile.close()
|
@@ -0,0 +1,8 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
Copyright © 2024 <copyright holders>
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
5
|
+
|
6
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
7
|
+
|
8
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -0,0 +1,172 @@
|
|
1
|
+
Metadata-Version: 2.3
|
2
|
+
Name: pyadps
|
3
|
+
Version: 0.3.3b0
|
4
|
+
Summary: A Python package for ADCP data processing
|
5
|
+
Home-page: https://example.com
|
6
|
+
License: MIT
|
7
|
+
Keywords: adcp,data-processing,oceanography
|
8
|
+
Author: P. Amol
|
9
|
+
Author-email: prakashamol@gmail.com
|
10
|
+
Requires-Python: >=3.12,<4.0.0
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
12
|
+
Classifier: Operating System :: OS Independent
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
16
|
+
Provides-Extra: tests
|
17
|
+
Requires-Dist: cmake (>=3.30.2)
|
18
|
+
Requires-Dist: matplotlib (>=3.8.4)
|
19
|
+
Requires-Dist: meson (>=1.4.1)
|
20
|
+
Requires-Dist: netCDF4 (>=1.7.1)
|
21
|
+
Requires-Dist: numpy (>=1.26.4)
|
22
|
+
Requires-Dist: pandas (>=2.2.2)
|
23
|
+
Requires-Dist: plotly (>=5.22.0)
|
24
|
+
Requires-Dist: plotly-resampler (>=0.10.0)
|
25
|
+
Requires-Dist: pygeomag (>=1.1.0,<2.0.0)
|
26
|
+
Requires-Dist: scipy (>=1.14.0)
|
27
|
+
Requires-Dist: streamlit (>=1.36.0)
|
28
|
+
Project-URL: Documentation, https://example.com/docs
|
29
|
+
Project-URL: Repository, https://github.com/p-amol/pyadps
|
30
|
+
Description-Content-Type: text/markdown
|
31
|
+
|
32
|
+
# pyadps
|
33
|
+
|
34
|
+
`pyadps` is a Python package for processing moored Acoustic Doppler
|
35
|
+
Current Profiler (ADCP) data. It provides various functionalities
|
36
|
+
such as data reading, quality control tests, NetCDF file creation,
|
37
|
+
and visualization.
|
38
|
+
|
39
|
+
This software offers both a graphical interface (`Streamlit`) for
|
40
|
+
those new to Python and direct Python package access for experienced
|
41
|
+
users. Please note that `pyadps` is primarily designed for Teledyne
|
42
|
+
RDI workhorse ADCPs. Other company's ADCP files are not compatible,
|
43
|
+
and while some other RDI models may work, they might require additional
|
44
|
+
considerations.
|
45
|
+
|
46
|
+
- Documentation: <https://pyadps.readthedocs.io>
|
47
|
+
- Source code: <https://github.com/p-amol/pyadps>
|
48
|
+
- Bug reports: <https://github.com/p-amol/pyadps/issues>
|
49
|
+
|
50
|
+
## Table of Contents
|
51
|
+
|
52
|
+
- [Installation](#installation)
|
53
|
+
- [Quick Start](#quick-start)
|
54
|
+
- [License](#license)
|
55
|
+
|
56
|
+
## Installation
|
57
|
+
|
58
|
+
We recommend installing the package within a virtual environment.
|
59
|
+
At present, the package is compatible exclusively with Python version 3.12.
|
60
|
+
You can create a Python environment using tools like `venv` or `conda`.
|
61
|
+
Below are instructions for both methods.
|
62
|
+
|
63
|
+
### 1. Using `venv` (Built-in Python Tool)
|
64
|
+
|
65
|
+
#### Step 1: Install Python version 3.12 (if not already installed)
|
66
|
+
|
67
|
+
Ensure you have Python installed. You can download the latest version from [python.org](https://www.python.org/downloads/).
|
68
|
+
|
69
|
+
#### Step 2: Create a Virtual Environment
|
70
|
+
|
71
|
+
- Open your terminal or command prompt.
|
72
|
+
- Navigate to your project folder:
|
73
|
+
|
74
|
+
```bash
|
75
|
+
cd /path/to/your/project
|
76
|
+
```
|
77
|
+
|
78
|
+
- Run the following command to create a virtual environment
|
79
|
+
(replace adpsenv with your preferred environment name):
|
80
|
+
|
81
|
+
```bash
|
82
|
+
python -m venv adpsenv
|
83
|
+
```
|
84
|
+
|
85
|
+
#### Step 3: Activate the Environment
|
86
|
+
|
87
|
+
- On Windows:
|
88
|
+
|
89
|
+
```bash
|
90
|
+
adpsenv\Scripts\activate
|
91
|
+
```
|
92
|
+
|
93
|
+
- On macOS/Linux:
|
94
|
+
|
95
|
+
```bash
|
96
|
+
source adpsenv/bin/activate
|
97
|
+
```
|
98
|
+
|
99
|
+
You’ll see the environment name in your terminal prompt
|
100
|
+
indicating the environment is active.
|
101
|
+
|
102
|
+
#### Step 4: Install Dependencies
|
103
|
+
|
104
|
+
Now you can install packages like this:
|
105
|
+
|
106
|
+
```bash
|
107
|
+
pip install pyadps
|
108
|
+
```
|
109
|
+
|
110
|
+
#### Step 5: Deactivate the Environment
|
111
|
+
|
112
|
+
When you’re done working in the environment, deactivate it by running:
|
113
|
+
|
114
|
+
```bash
|
115
|
+
deactivate
|
116
|
+
```
|
117
|
+
|
118
|
+
### 2. Using `conda` (Anaconda/Miniconda)
|
119
|
+
|
120
|
+
#### Step 1: Install Conda
|
121
|
+
|
122
|
+
First, you need to have Conda installed on your system. You can either install:
|
123
|
+
|
124
|
+
- [Anaconda (Full Distribution)](https://www.anaconda.com/products/individual)
|
125
|
+
- [Miniconda (Lightweight Version)](https://docs.conda.io/en/latest/miniconda.html)
|
126
|
+
|
127
|
+
#### Step 2: Create a Conda Environment with Python 3.12
|
128
|
+
|
129
|
+
Once Conda is installed, open a terminal or command prompt and run
|
130
|
+
the following to create a new environment (replace `adpsenv` with
|
131
|
+
your preferred environment name):
|
132
|
+
|
133
|
+
```bash
|
134
|
+
conda create --name adpsenv python=3.12
|
135
|
+
```
|
136
|
+
|
137
|
+
#### Step 3: Activate the Conda Environment
|
138
|
+
|
139
|
+
```bash
|
140
|
+
conda activate adpsenv
|
141
|
+
```
|
142
|
+
|
143
|
+
#### Step 4: Install pyadps Dependencies
|
144
|
+
|
145
|
+
You can install packages with pip inside Conda environments.
|
146
|
+
|
147
|
+
```bash
|
148
|
+
pip install pyadps
|
149
|
+
```
|
150
|
+
|
151
|
+
#### Step 5: Deactivate the Conda Environment
|
152
|
+
|
153
|
+
When done working in the environment, deactivate the environment by running:
|
154
|
+
|
155
|
+
```bash
|
156
|
+
conda deactivate
|
157
|
+
```
|
158
|
+
|
159
|
+
## Quick Start
|
160
|
+
|
161
|
+
### Streamlit web interface
|
162
|
+
|
163
|
+
Open a terminal or command prompt, activate the environment, and run the command.
|
164
|
+
|
165
|
+
```bash
|
166
|
+
run-pyadps
|
167
|
+
```
|
168
|
+
|
169
|
+
## License
|
170
|
+
|
171
|
+
This project is licensed under the MIT License. See the LICENSE file for details.
|
172
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
pyadps/Home_Page.py,sha256=gC0eFMtn85U_A4KcVlCEzXkB6a_J0WD3vpK691Kmyw8,1180
|
2
|
+
pyadps/__init__.py,sha256=bNCm6_WIhiwvaUeOZhRkyLZyzzUKfSH80Fslg0JPJyk,232
|
3
|
+
pyadps/__main__.py,sha256=cIFUayxPnKl00oIR99L6IUEvc8trW7dijtfBQCAen5c,356
|
4
|
+
pyadps/pages/01_Read_File.py,sha256=MaBtdMrd1m6aox8O7IxVdMeoS5kYEiaossop_U3w6I8,14324
|
5
|
+
pyadps/pages/02_View_Raw_Data.py,sha256=AhT7gvDbcMRPf-WIBzTQ0o-nn9_q7NH6plTlpMtgzaY,6170
|
6
|
+
pyadps/pages/03_Download_Raw_File.py,sha256=3887Lj5h1IZTHFpPfc0fYT7oJ2qdMJtJj6X6fmHT9zw,9524
|
7
|
+
pyadps/pages/04_Sensor_Health.py,sha256=XQ7oTZ9LCrKDclVZPKQVsBtyDShdyHZfVhzCTRGZY0g,33905
|
8
|
+
pyadps/pages/05_QC_Test.py,sha256=W_YmczApToAt9px-W8F7IGcpmwo7-HVuGl9N7dzAQ9U,16054
|
9
|
+
pyadps/pages/06_Profile_Test.py,sha256=S_AhDv9mdoJOoVy1Qj4EI3VZT9pHSIrohgoaCLs75A0,34725
|
10
|
+
pyadps/pages/07_Velocity_Test.py,sha256=Sc9Ge8b_OSjwYX8r_VtJ0-3iMC9DfrDapmdFvuj5nT0,23007
|
11
|
+
pyadps/pages/08_Write_File.py,sha256=pXa1qUPegQ8nnZ9e65oE7GkuMPJ23TPM5956HlLN_PM,21540
|
12
|
+
pyadps/pages/09_Auto_process.py,sha256=gOvLEfwAPxe9v-W8DASKSuNQzB5BjHLnPkwUgOufwdI,1776
|
13
|
+
pyadps/pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
|
+
pyadps/utils/__init__.py,sha256=nCqRp-OT_1BC7RnL3ARUIldlw9sWyr1XqQvQid-B4ts,407
|
15
|
+
pyadps/utils/autoprocess.py,sha256=QBwu-CeQUmKn0B6usHthW0v78TeFLxC7k6s0ZPEZAuo,19507
|
16
|
+
pyadps/utils/metadata/config.ini,sha256=TC7htzGwUukIXt_u3JR5ycyvOoDj_JxWgGY6khjNeck,2154
|
17
|
+
pyadps/utils/metadata/demo.000,sha256=qxB3sgjABrpv4DNXkwjpbSxk5sc4UwAI8kgQX0--PM8,234468
|
18
|
+
pyadps/utils/metadata/flmeta.json,sha256=diIB9nht_0uw9YJNSFGdZYGzeVbR-07zIZS9Nf4VPSE,14245
|
19
|
+
pyadps/utils/metadata/vlmeta.json,sha256=_dkQlGkkUvpAIM7S6kEUenSaiCpOrwXg8n1aU3dDF3s,22535
|
20
|
+
pyadps/utils/plotgen.py,sha256=wF9Cj0oKeCSEYyPJxWdadJT8aiavE7HXEQJm6cDiBBY,26277
|
21
|
+
pyadps/utils/profile_test.py,sha256=kcqdFigL2wQwMRrKyfNzfGIYcFwRj1_945lEpIio6pQ,20173
|
22
|
+
pyadps/utils/pyreadrdi.py,sha256=P1UTDrglgbYn3XQGUTsqNPynDGE-zp4cI_TW8yfOlic,35090
|
23
|
+
pyadps/utils/readrdi.py,sha256=2v5N1SsBigj4Rnj0BCYwJ4x0p5eYdShKd0d236iA7oM,50006
|
24
|
+
pyadps/utils/script.py,sha256=uqKnKW1O5IiCNeQnaXy99R0Xf5uh5i3ALNxxZlmYrlE,6358
|
25
|
+
pyadps/utils/sensor_health.py,sha256=aHRaU4kMJZ9dGmYypKpCCgq-owWoNjvcl1I_9I7dG68,3973
|
26
|
+
pyadps/utils/signal_quality.py,sha256=ab0Sr0oPFxkFWBjuGbl_IZNQEnfi_mXPyHmVzaGSOBU,16239
|
27
|
+
pyadps/utils/velocity_test.py,sha256=-95NKLQJ8Ni8etdxhDHxsfMF4MdRWcXL9fgLgWy7Kn0,6112
|
28
|
+
pyadps/utils/writenc.py,sha256=H5rH2dfUECLukql5zNymAwEtMib8-PJo3y5e3_NIRsk,9754
|
29
|
+
pyadps-0.3.3b0.dist-info/LICENSE,sha256=sfY_7DzQF5FxnO2T6ek74dfm5uBmwEp1oEg_WlzNsb8,1092
|
30
|
+
pyadps-0.3.3b0.dist-info/METADATA,sha256=aZcklDAtDWnLK67oROVB4mQHiBrdyiUq6dfcT9XmTlw,4463
|
31
|
+
pyadps-0.3.3b0.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
|
32
|
+
pyadps-0.3.3b0.dist-info/entry_points.txt,sha256=-oZhbbJq8Q29uNVh5SmzOLp9OeFM9VUzHVxovfI4LXA,126
|
33
|
+
pyadps-0.3.3b0.dist-info/RECORD,,
|