pyadps 0.1.0__tar.gz → 0.1.0b0__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.
- {pyadps-0.1.0 → pyadps-0.1.0b0}/PKG-INFO +22 -54
- {pyadps-0.1.0 → pyadps-0.1.0b0}/README.md +20 -51
- {pyadps-0.1.0 → pyadps-0.1.0b0}/pyproject.toml +10 -11
- pyadps-0.1.0b0/src/pyadps/Home_Page.py +42 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/pages/01_Read_File.py +16 -190
- pyadps-0.1.0b0/src/pyadps/pages/02_View_Raw_Data.py +128 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/pages/03_Download_Raw_File.py +60 -124
- pyadps-0.1.0b0/src/pyadps/pages/04_QC_Test.py +283 -0
- pyadps-0.1.0b0/src/pyadps/pages/05_Profile_Test.py +389 -0
- pyadps-0.1.0b0/src/pyadps/pages/06_Velocity_Test.py +293 -0
- pyadps-0.1.0b0/src/pyadps/pages/07_Write_File.py +367 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/utils/__init__.py +3 -3
- pyadps-0.1.0/src/pyadps/utils/plotgen.py → pyadps-0.1.0b0/src/pyadps/utils/cutbin.py +14 -332
- pyadps-0.1.0b0/src/pyadps/utils/plotgen.py +229 -0
- pyadps-0.1.0b0/src/pyadps/utils/profile_test.py +175 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/utils/pyreadrdi.py +6 -13
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/utils/readrdi.py +20 -167
- pyadps-0.1.0b0/src/pyadps/utils/regrid.py +122 -0
- pyadps-0.1.0b0/src/pyadps/utils/script.py +155 -0
- pyadps-0.1.0b0/src/pyadps/utils/signal_quality.py +135 -0
- pyadps-0.1.0b0/src/pyadps/utils/velocity_test.py +117 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/utils/writenc.py +27 -104
- pyadps-0.1.0/src/pyadps/Home_Page.py +0 -48
- pyadps-0.1.0/src/pyadps/pages/02_View_Raw_Data.py +0 -164
- pyadps-0.1.0/src/pyadps/pages/04_Sensor_Health.py +0 -905
- pyadps-0.1.0/src/pyadps/pages/05_QC_Test.py +0 -476
- pyadps-0.1.0/src/pyadps/pages/06_Profile_Test.py +0 -971
- pyadps-0.1.0/src/pyadps/pages/07_Velocity_Test.py +0 -600
- pyadps-0.1.0/src/pyadps/pages/08_Write_File.py +0 -574
- pyadps-0.1.0/src/pyadps/pages/09_Auto_process.py +0 -62
- pyadps-0.1.0/src/pyadps/utils/autoprocess.py +0 -530
- pyadps-0.1.0/src/pyadps/utils/metadata/config.ini +0 -99
- pyadps-0.1.0/src/pyadps/utils/metadata/demo.000 +0 -0
- pyadps-0.1.0/src/pyadps/utils/profile_test.py +0 -556
- pyadps-0.1.0/src/pyadps/utils/script.py +0 -205
- pyadps-0.1.0/src/pyadps/utils/sensor_health.py +0 -120
- pyadps-0.1.0/src/pyadps/utils/signal_quality.py +0 -455
- pyadps-0.1.0/src/pyadps/utils/velocity_test.py +0 -200
- {pyadps-0.1.0 → pyadps-0.1.0b0}/LICENSE +0 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/__init__.py +0 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/__main__.py +0 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/pages/__init__.py +0 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/utils/metadata/flmeta.json +0 -0
- {pyadps-0.1.0 → pyadps-0.1.0b0}/src/pyadps/utils/metadata/vlmeta.json +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.1
|
2
2
|
Name: pyadps
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.0b0
|
4
4
|
Summary: A Python package for ADCP data processing
|
5
5
|
Home-page: https://example.com
|
6
6
|
License: MIT
|
@@ -12,7 +12,6 @@ Classifier: License :: OSI Approved :: MIT License
|
|
12
12
|
Classifier: Operating System :: OS Independent
|
13
13
|
Classifier: Programming Language :: Python :: 3
|
14
14
|
Classifier: Programming Language :: Python :: 3.12
|
15
|
-
Classifier: Programming Language :: Python :: 3.13
|
16
15
|
Provides-Extra: tests
|
17
16
|
Requires-Dist: cmake (>=3.30.2)
|
18
17
|
Requires-Dist: matplotlib (>=3.8.4)
|
@@ -22,30 +21,18 @@ Requires-Dist: numpy (>=1.26.4)
|
|
22
21
|
Requires-Dist: pandas (>=2.2.2)
|
23
22
|
Requires-Dist: plotly (>=5.22.0)
|
24
23
|
Requires-Dist: plotly-resampler (>=0.10.0)
|
25
|
-
Requires-Dist: pygeomag (>=1.1.0,<2.0.0)
|
26
24
|
Requires-Dist: scipy (>=1.14.0)
|
27
25
|
Requires-Dist: streamlit (>=1.36.0)
|
26
|
+
Requires-Dist: wmm2020 (>=1.1.1)
|
28
27
|
Project-URL: Documentation, https://example.com/docs
|
29
28
|
Project-URL: Repository, https://github.com/p-amol/pyadps
|
30
29
|
Description-Content-Type: text/markdown
|
31
30
|
|
32
31
|
# pyadps
|
33
32
|
|
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.
|
33
|
+
`pyadps` is a Python package for processing moored Acoustic Doppler Current Profiler (ADCP) data. It provides various functionalities such as data reading, quality control tests, NetCDF file creation, and visualization.
|
38
34
|
|
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>
|
35
|
+
This software offers both a graphical interface (`Streamlit`) for those new to Python and direct Python package access for experienced users. Please note that `pyadps` is primarily designed for Teledyne RDI workhorse ADCPs. Other company's ADCP files are not compatible, and while some other RDI models may work, they might require additional considerations.
|
49
36
|
|
50
37
|
## Table of Contents
|
51
38
|
|
@@ -55,49 +42,37 @@ considerations.
|
|
55
42
|
|
56
43
|
## Installation
|
57
44
|
|
58
|
-
We recommend installing the package within a virtual environment.
|
59
|
-
|
60
|
-
You can create a Python environment using tools like `venv` or `conda`.
|
61
|
-
Below are instructions for both methods.
|
45
|
+
We recommend installing the package within a virtual environment. At present, the package is compatible exclusively with Python version 3.12.
|
46
|
+
You can create a Python environment using tools like `venv` or `conda`. Below are instructions for both methods.
|
62
47
|
|
63
48
|
### 1. Using `venv` (Built-in Python Tool)
|
64
49
|
|
65
50
|
#### Step 1: Install Python version 3.12 (if not already installed)
|
66
|
-
|
67
51
|
Ensure you have Python installed. You can download the latest version from [python.org](https://www.python.org/downloads/).
|
68
52
|
|
69
|
-
#### Step 2: Create a Virtual Environment
|
70
|
-
|
53
|
+
#### Step 2: Create a Virtual Environment
|
71
54
|
- Open your terminal or command prompt.
|
72
55
|
- Navigate to your project folder:
|
73
|
-
|
74
56
|
```bash
|
75
57
|
cd /path/to/your/project
|
76
58
|
```
|
77
|
-
|
78
|
-
- Run the following command to create a virtual environment
|
79
|
-
(replace adpsenv with your preferred environment name):
|
59
|
+
- Run the following command to create a virtual environment (replace adpsenv with your preferred environment name):
|
80
60
|
|
81
61
|
```bash
|
82
62
|
python -m venv adpsenv
|
83
63
|
```
|
84
64
|
|
85
65
|
#### Step 3: Activate the Environment
|
86
|
-
|
87
66
|
- On Windows:
|
88
|
-
|
89
67
|
```bash
|
90
68
|
adpsenv\Scripts\activate
|
91
69
|
```
|
92
70
|
|
93
71
|
- On macOS/Linux:
|
94
|
-
|
95
72
|
```bash
|
96
73
|
source adpsenv/bin/activate
|
97
74
|
```
|
98
|
-
|
99
|
-
You’ll see the environment name in your terminal prompt
|
100
|
-
indicating the environment is active.
|
75
|
+
You’ll see the environment name in your terminal prompt indicating the environment is active.
|
101
76
|
|
102
77
|
#### Step 4: Install Dependencies
|
103
78
|
|
@@ -108,51 +83,44 @@ pip install pyadps
|
|
108
83
|
```
|
109
84
|
|
110
85
|
#### Step 5: Deactivate the Environment
|
111
|
-
|
112
86
|
When you’re done working in the environment, deactivate it by running:
|
113
87
|
|
114
88
|
```bash
|
115
89
|
deactivate
|
116
90
|
```
|
117
91
|
|
118
|
-
### 2. Using `conda` (Anaconda/Miniconda)
|
119
92
|
|
120
|
-
#### Step 1: Install Conda
|
121
93
|
|
94
|
+
|
95
|
+
### 2. Using `conda` (Anaconda/Miniconda):
|
96
|
+
|
97
|
+
#### Step 1: Install Conda
|
122
98
|
First, you need to have Conda installed on your system. You can either install:
|
123
99
|
|
124
100
|
- [Anaconda (Full Distribution)](https://www.anaconda.com/products/individual)
|
125
101
|
- [Miniconda (Lightweight Version)](https://docs.conda.io/en/latest/miniconda.html)
|
126
102
|
|
127
103
|
#### 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):
|
104
|
+
Once Conda is installed, open a terminal or command prompt and run the following to create a new environment (replace `adpsenv` with your preferred environment name):
|
132
105
|
|
133
106
|
```bash
|
134
107
|
conda create --name adpsenv python=3.12
|
135
108
|
```
|
136
109
|
|
137
|
-
#### Step 3: Activate the
|
138
|
-
|
110
|
+
#### Step 3: Activate the Environment
|
139
111
|
```bash
|
140
112
|
conda activate adpsenv
|
141
113
|
```
|
142
114
|
|
143
|
-
#### Step 4: Install
|
144
|
-
|
145
|
-
You can install packages with pip inside Conda environments.
|
146
|
-
|
115
|
+
#### Step 4: Install Dependencies
|
116
|
+
You can install packages with pip inside Conda environments.
|
147
117
|
```bash
|
148
118
|
pip install pyadps
|
149
119
|
```
|
150
120
|
|
151
|
-
#### Step 5: Deactivate the
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
```bash
|
121
|
+
#### Step 5: Deactivate the Environment
|
122
|
+
When done, deactivate the environment by running:
|
123
|
+
```
|
156
124
|
conda deactivate
|
157
125
|
```
|
158
126
|
|
@@ -161,11 +129,11 @@ conda deactivate
|
|
161
129
|
### Streamlit web interface
|
162
130
|
|
163
131
|
Open a terminal or command prompt, activate the environment, and run the command.
|
164
|
-
|
165
132
|
```bash
|
166
133
|
run-pyadps
|
167
134
|
```
|
168
135
|
|
136
|
+
|
169
137
|
## License
|
170
138
|
|
171
139
|
This project is licensed under the MIT License. See the LICENSE file for details.
|
@@ -1,20 +1,8 @@
|
|
1
1
|
# pyadps
|
2
2
|
|
3
|
-
`pyadps` is a Python package for processing moored Acoustic Doppler
|
4
|
-
|
5
|
-
|
6
|
-
and visualization.
|
7
|
-
|
8
|
-
This software offers both a graphical interface (`Streamlit`) for
|
9
|
-
those new to Python and direct Python package access for experienced
|
10
|
-
users. Please note that `pyadps` is primarily designed for Teledyne
|
11
|
-
RDI workhorse ADCPs. Other company's ADCP files are not compatible,
|
12
|
-
and while some other RDI models may work, they might require additional
|
13
|
-
considerations.
|
14
|
-
|
15
|
-
- Documentation: <https://pyadps.readthedocs.io>
|
16
|
-
- Source code: <https://github.com/p-amol/pyadps>
|
17
|
-
- Bug reports: <https://github.com/p-amol/pyadps/issues>
|
3
|
+
`pyadps` is a Python package for processing moored Acoustic Doppler Current Profiler (ADCP) data. It provides various functionalities such as data reading, quality control tests, NetCDF file creation, and visualization.
|
4
|
+
|
5
|
+
This software offers both a graphical interface (`Streamlit`) for those new to Python and direct Python package access for experienced users. Please note that `pyadps` is primarily designed for Teledyne RDI workhorse ADCPs. Other company's ADCP files are not compatible, and while some other RDI models may work, they might require additional considerations.
|
18
6
|
|
19
7
|
## Table of Contents
|
20
8
|
|
@@ -24,49 +12,37 @@ considerations.
|
|
24
12
|
|
25
13
|
## Installation
|
26
14
|
|
27
|
-
We recommend installing the package within a virtual environment.
|
28
|
-
|
29
|
-
You can create a Python environment using tools like `venv` or `conda`.
|
30
|
-
Below are instructions for both methods.
|
15
|
+
We recommend installing the package within a virtual environment. At present, the package is compatible exclusively with Python version 3.12.
|
16
|
+
You can create a Python environment using tools like `venv` or `conda`. Below are instructions for both methods.
|
31
17
|
|
32
18
|
### 1. Using `venv` (Built-in Python Tool)
|
33
19
|
|
34
20
|
#### Step 1: Install Python version 3.12 (if not already installed)
|
35
|
-
|
36
21
|
Ensure you have Python installed. You can download the latest version from [python.org](https://www.python.org/downloads/).
|
37
22
|
|
38
|
-
#### Step 2: Create a Virtual Environment
|
39
|
-
|
23
|
+
#### Step 2: Create a Virtual Environment
|
40
24
|
- Open your terminal or command prompt.
|
41
25
|
- Navigate to your project folder:
|
42
|
-
|
43
26
|
```bash
|
44
27
|
cd /path/to/your/project
|
45
28
|
```
|
46
|
-
|
47
|
-
- Run the following command to create a virtual environment
|
48
|
-
(replace adpsenv with your preferred environment name):
|
29
|
+
- Run the following command to create a virtual environment (replace adpsenv with your preferred environment name):
|
49
30
|
|
50
31
|
```bash
|
51
32
|
python -m venv adpsenv
|
52
33
|
```
|
53
34
|
|
54
35
|
#### Step 3: Activate the Environment
|
55
|
-
|
56
36
|
- On Windows:
|
57
|
-
|
58
37
|
```bash
|
59
38
|
adpsenv\Scripts\activate
|
60
39
|
```
|
61
40
|
|
62
41
|
- On macOS/Linux:
|
63
|
-
|
64
42
|
```bash
|
65
43
|
source adpsenv/bin/activate
|
66
44
|
```
|
67
|
-
|
68
|
-
You’ll see the environment name in your terminal prompt
|
69
|
-
indicating the environment is active.
|
45
|
+
You’ll see the environment name in your terminal prompt indicating the environment is active.
|
70
46
|
|
71
47
|
#### Step 4: Install Dependencies
|
72
48
|
|
@@ -77,51 +53,44 @@ pip install pyadps
|
|
77
53
|
```
|
78
54
|
|
79
55
|
#### Step 5: Deactivate the Environment
|
80
|
-
|
81
56
|
When you’re done working in the environment, deactivate it by running:
|
82
57
|
|
83
58
|
```bash
|
84
59
|
deactivate
|
85
60
|
```
|
86
61
|
|
87
|
-
### 2. Using `conda` (Anaconda/Miniconda)
|
88
62
|
|
89
|
-
#### Step 1: Install Conda
|
90
63
|
|
64
|
+
|
65
|
+
### 2. Using `conda` (Anaconda/Miniconda):
|
66
|
+
|
67
|
+
#### Step 1: Install Conda
|
91
68
|
First, you need to have Conda installed on your system. You can either install:
|
92
69
|
|
93
70
|
- [Anaconda (Full Distribution)](https://www.anaconda.com/products/individual)
|
94
71
|
- [Miniconda (Lightweight Version)](https://docs.conda.io/en/latest/miniconda.html)
|
95
72
|
|
96
73
|
#### Step 2: Create a Conda Environment with Python 3.12
|
97
|
-
|
98
|
-
Once Conda is installed, open a terminal or command prompt and run
|
99
|
-
the following to create a new environment (replace `adpsenv` with
|
100
|
-
your preferred environment name):
|
74
|
+
Once Conda is installed, open a terminal or command prompt and run the following to create a new environment (replace `adpsenv` with your preferred environment name):
|
101
75
|
|
102
76
|
```bash
|
103
77
|
conda create --name adpsenv python=3.12
|
104
78
|
```
|
105
79
|
|
106
|
-
#### Step 3: Activate the
|
107
|
-
|
80
|
+
#### Step 3: Activate the Environment
|
108
81
|
```bash
|
109
82
|
conda activate adpsenv
|
110
83
|
```
|
111
84
|
|
112
|
-
#### Step 4: Install
|
113
|
-
|
114
|
-
You can install packages with pip inside Conda environments.
|
115
|
-
|
85
|
+
#### Step 4: Install Dependencies
|
86
|
+
You can install packages with pip inside Conda environments.
|
116
87
|
```bash
|
117
88
|
pip install pyadps
|
118
89
|
```
|
119
90
|
|
120
|
-
#### Step 5: Deactivate the
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
```bash
|
91
|
+
#### Step 5: Deactivate the Environment
|
92
|
+
When done, deactivate the environment by running:
|
93
|
+
```
|
125
94
|
conda deactivate
|
126
95
|
```
|
127
96
|
|
@@ -130,11 +99,11 @@ conda deactivate
|
|
130
99
|
### Streamlit web interface
|
131
100
|
|
132
101
|
Open a terminal or command prompt, activate the environment, and run the command.
|
133
|
-
|
134
102
|
```bash
|
135
103
|
run-pyadps
|
136
104
|
```
|
137
105
|
|
106
|
+
|
138
107
|
## License
|
139
108
|
|
140
109
|
This project is licensed under the MIT License. See the LICENSE file for details.
|
@@ -1,19 +1,19 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "pyadps"
|
3
|
-
version = "0.1.0"
|
3
|
+
version = "0.1.0-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://example.com"
|
9
|
-
repository = "https://github.com/p-amol/pyadps"
|
10
|
-
documentation = "https://example.com/docs"
|
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
|
-
|
15
|
-
|
16
|
-
|
14
|
+
"Programming Language :: Python :: 3",
|
15
|
+
"License :: OSI Approved :: MIT License",
|
16
|
+
"Operating System :: OS Independent"
|
17
17
|
]
|
18
18
|
|
19
19
|
|
@@ -23,23 +23,22 @@ 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"]
|
37
36
|
|
38
37
|
[tool.poetry.scripts]
|
39
38
|
run-pyadps = "pyadps.__main__:main"
|
40
|
-
run-auto = "pyadps.utils.autoprocess:main"
|
41
|
-
run-script = "pyadps.utils.script:main"
|
42
39
|
|
43
40
|
[build-system]
|
44
41
|
requires = ["poetry-core>=1.0.0"]
|
45
42
|
build-backend = "poetry.core.masonry.api"
|
43
|
+
|
44
|
+
|
@@ -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,6 @@ 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"]
|
117
113
|
|
118
114
|
st.session_state.fname = uploaded_file.name
|
119
115
|
st.session_state.head = ds.fileheader
|
@@ -123,15 +119,6 @@ if uploaded_file is not None:
|
|
123
119
|
st.session_state.echo = ds.echo.data
|
124
120
|
st.session_state.correlation = ds.correlation.data
|
125
121
|
st.session_state.pgood = ds.percentgood.data
|
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
|
-
)
|
135
122
|
|
136
123
|
# st.session_state.flead = flead
|
137
124
|
# st.session_state.vlead = vlead
|
@@ -145,9 +132,6 @@ if uploaded_file is not None:
|
|
145
132
|
elif "flead" in st.session_state:
|
146
133
|
st.write("You selected `%s`" % st.session_state.fname)
|
147
134
|
else:
|
148
|
-
# reset the cache and resources if the user press reload button.
|
149
|
-
st.cache_data.clear()
|
150
|
-
st.cache_resource.clear()
|
151
135
|
st.stop()
|
152
136
|
|
153
137
|
########## TIME AXIS ##############
|
@@ -180,158 +164,8 @@ date_df = pd.DataFrame(
|
|
180
164
|
)
|
181
165
|
|
182
166
|
st.session_state.date = pd.to_datetime(date_df)
|
183
|
-
|
184
|
-
|
185
|
-
st.session_state.ensemble_axis = np.arange(0, st.session_state.head.ensembles, 1)
|
186
|
-
st.session_state.axis_option = "time"
|
187
|
-
|
188
|
-
|
189
|
-
# ---------- Initialize all options -------------
|
190
|
-
# ------------------------
|
191
|
-
# Page: Download Raw File
|
192
|
-
# ------------------------
|
193
|
-
# Widgets
|
194
|
-
st.session_state.add_attributes_DRW = "No"
|
195
|
-
st.session_state.axis_option_DRW = "time"
|
196
|
-
st.session_state.rawnc_download_DRW = False
|
197
|
-
st.session_state.vleadnc_download_DRW = False
|
198
|
-
st.session_state.rawcsv_option_DRW = "Velocity"
|
199
|
-
st.session_state.rawcsv_beam_DRW = 1
|
200
|
-
st.session_state.rawcsv_download_DRW = False
|
201
|
-
|
202
|
-
# ------------------
|
203
|
-
# Page: Sensor Test
|
204
|
-
# ------------------
|
205
|
-
st.session_state.isSensorTest = False
|
206
|
-
st.session_state.isFirstSensorVisit = True
|
207
|
-
|
208
|
-
# -- Tab 1: Depth Correction
|
209
|
-
st.session_state.isDepthModified_ST = False
|
210
|
-
# Widgets
|
211
|
-
# Options: "Fixed Value", "File Upload"
|
212
|
-
st.session_state.depthoption_ST = "Fixed Value"
|
213
|
-
st.session_state.isFixedDepth_ST = False
|
214
|
-
st.session_state.fixeddepth_ST = 0
|
215
|
-
st.session_state.isUploadDepth_ST = False
|
216
|
-
|
217
|
-
# -- Tab 2: Salinity Correction
|
218
|
-
st.session_state.isSalinityModified_ST = False
|
219
|
-
# Widgets
|
220
|
-
st.session_state.salinityoption_ST = "Fixed Value"
|
221
|
-
st.session_state.isFixedSalinity_ST = False
|
222
|
-
st.session_state.fixedsalinity_ST = 35
|
223
|
-
st.session_state.isUploadSalinity_ST = False
|
224
|
-
|
225
|
-
# -- Tab 3: Temperature Correction
|
226
|
-
st.session_state.isTemperatureModified_ST = False
|
227
|
-
# Widgets
|
228
|
-
st.session_state.temperatureoption_ST = "Fixed Value"
|
229
|
-
st.session_state.isFixedTemperature_ST = False
|
230
|
-
st.session_state.fixedtemperature_ST = 0
|
231
|
-
st.session_state.isUploadTemperature_ST = False
|
232
|
-
|
233
|
-
# -- Tab 7: Pitch, Roll, Velocity Correction
|
234
|
-
st.session_state.isRollCheck_ST = False
|
235
|
-
st.session_state.isPitchCheck_ST = False
|
236
|
-
st.session_state.isVelocityModifiedSound_ST = False
|
237
|
-
# Widgets
|
238
|
-
st.session_state.roll_cutoff_ST = 359
|
239
|
-
st.session_state.pitch_cutoff_ST = 359
|
240
|
-
|
241
|
-
# ------------------
|
242
|
-
# Page: QC Test
|
243
|
-
# ------------------
|
244
|
-
# Global Test
|
245
|
-
st.session_state.isQCTest = False
|
246
|
-
st.session_state.isFirstQCVisit = True
|
247
|
-
|
248
|
-
# Tab 2: Apply QC
|
249
|
-
st.session_state.isQCCheck_QCT = False
|
250
|
-
# Widgets
|
251
|
-
st.session_state.ct_QCT = 64
|
252
|
-
st.session_state.et_QCT = 0
|
253
|
-
st.session_state.evt_QCT = 2000
|
254
|
-
st.session_state.ft_QCT = 50
|
255
|
-
st.session_state.is3beam_QCT = True
|
256
|
-
st.session_state.pgt_QCT = 0
|
257
|
-
|
258
|
-
# Data Modifications
|
259
|
-
st.session_state.isBeamModified_QCT = False
|
260
|
-
# Widgets
|
261
|
-
st.session_state.beam_direction_QCT = st.session_state.beam_direction
|
262
|
-
|
263
|
-
# ------------------
|
264
|
-
# Page: Profile Test
|
265
|
-
# ------------------
|
266
|
-
st.session_state.isProfileTest = False
|
267
|
-
st.session_state.isFirstProfileVisit = True
|
268
|
-
|
269
|
-
# Tab1: Trim Ends
|
270
|
-
st.session_state.isTrimEndsCheck_PT = False
|
271
|
-
# Widgets
|
272
|
-
st.session_state.start_ens_PT = 0
|
273
|
-
st.session_state.end_ens_PT = st.session_state.head.ensembles
|
274
|
-
|
275
|
-
# Tab2: Cutbins - Sidelobe
|
276
|
-
st.session_state.isCutBinSideLobeCheck_PT = False
|
277
|
-
st.session_state.extra_cells_PT = 0
|
278
|
-
st.session_state.water_depth_PT = 0
|
279
|
-
|
280
|
-
# Tab3: Cutbins - Manual
|
281
|
-
st.session_state.isCutBinManualCheck_PT = False
|
282
|
-
|
283
|
-
# Tab4: Regrid
|
284
|
-
st.session_state.isRegridCheck_PT = False
|
285
|
-
st.session_state.end_cell_option_PT = "Cell"
|
286
|
-
st.session_state.interpolate_PT = "nearest"
|
287
|
-
st.session_state.manualdepth_PT = 0
|
288
|
-
|
289
|
-
# ------------------
|
290
|
-
# Page: Velocity Test
|
291
|
-
# ------------------
|
292
|
-
# Global Test
|
293
|
-
st.session_state.isVelocityTest = False
|
294
|
-
# Check if visiting the page first time
|
295
|
-
st.session_state.isFirstVelocityVisit = True
|
296
|
-
# Local Tests:
|
297
|
-
# Tab1: Magnetic Declination
|
298
|
-
st.session_state.isMagnetCheck_VT = False
|
299
|
-
# OPTIONS: pygeomag, API, Manual
|
300
|
-
st.session_state.magnet_method_VT = "pygeomag"
|
301
|
-
st.session_state.magnet_lat_VT = 0
|
302
|
-
st.session_state.magnet_lon_VT = 0
|
303
|
-
st.session_state.magnet_year_VT = 2025
|
304
|
-
st.session_state.magnet_depth_VT = 0
|
305
|
-
st.session_state.magnet_user_input_VT = 0
|
306
|
-
|
307
|
-
# Tab2: Velocity Cutoff
|
308
|
-
st.session_state.isCutoffCheck_VT = False
|
309
|
-
st.session_state.maxuvel_VT = 250
|
310
|
-
st.session_state.maxvvel_VT = 250
|
311
|
-
st.session_state.maxwvel_VT = 15
|
312
|
-
|
313
|
-
# Tab3: Despike
|
314
|
-
st.session_state.isDespikeCheck_VT = False
|
315
|
-
st.session_state.despike_kernal_VT = 5
|
316
|
-
st.session_state.despike_cutoff_VT = 3
|
317
|
-
|
318
|
-
# Tab4: Flatline
|
319
|
-
st.session_state.isFlatlineCheck_VT = False
|
320
|
-
st.session_state.flatline_kernal_VT = 5
|
321
|
-
st.session_state.flatline_cutoff_VT = 3
|
322
|
-
|
323
|
-
# ------------------
|
324
|
-
# Page: Write File
|
325
|
-
# ------------------
|
326
|
-
st.session_state.isWriteFile = True
|
327
|
-
st.session_state.isAttributes = False
|
328
|
-
st.session_state.mask_data_WF = "Yes"
|
329
|
-
# FileTypes: NetCDF, CSV
|
330
|
-
st.session_state.file_type_WF = "NetCDF"
|
331
|
-
st.session_state.isProcessedNetcdfDownload_WF = True
|
332
|
-
st.session_state.isProcessedCSVDownload_WF = False
|
333
|
-
|
334
|
-
# MASK DATA
|
167
|
+
|
168
|
+
######### MASK DATA ##############
|
335
169
|
# The velocity data has missing values due to the cutoff
|
336
170
|
# criteria used before deployment. The `default_mask` uses
|
337
171
|
# the velocity to create a mask. This mask file is stored
|
@@ -340,17 +174,16 @@ st.session_state.isProcessedCSVDownload_WF = False
|
|
340
174
|
# WARNING: Never Change `st.session_state.orig_mask` in the code!
|
341
175
|
#
|
342
176
|
if "orig_mask" not in st.session_state:
|
343
|
-
|
344
|
-
|
177
|
+
st.session_state.orig_mask = default_mask(
|
178
|
+
st.session_state.flead, st.session_state.velocity
|
179
|
+
)
|
345
180
|
|
346
|
-
#
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
st.session_state.
|
351
|
-
st.session_state.
|
352
|
-
st.session_state.isProfilePageReturn = False
|
353
|
-
st.session_state.isVelocityPageReturn = False
|
181
|
+
# Checks if the following quality checks are carried out
|
182
|
+
st.session_state.isQCMask = False
|
183
|
+
st.session_state.isProfileMask = False
|
184
|
+
st.session_state.isGrid = False
|
185
|
+
st.session_state.isGridSave = False
|
186
|
+
st.session_state.isVelocityMask = False
|
354
187
|
|
355
188
|
########## FILE HEADER ###############
|
356
189
|
st.header("File Header", divider="blue")
|
@@ -427,18 +260,10 @@ if flead_check_button:
|
|
427
260
|
|
428
261
|
flead_button = st.button("Fixed Leader")
|
429
262
|
if flead_button:
|
430
|
-
# Pandas array should have all elements with same data type.
|
431
|
-
# Except Sl. no., which is np.uint64, rest are np.int64.
|
432
|
-
# Convert all datatype to uint64
|
433
|
-
fl_dict = st.session_state.flead.field().items()
|
434
|
-
new_dict = {}
|
435
|
-
for key, value in fl_dict:
|
436
|
-
new_dict[key] = value.astype(np.uint64)
|
437
|
-
|
438
263
|
df = pd.DataFrame(
|
439
264
|
{
|
440
|
-
"Fields":
|
441
|
-
"Values":
|
265
|
+
"Fields": st.session_state.flead.field().keys(),
|
266
|
+
"Values": st.session_state.flead.field().values(),
|
442
267
|
}
|
443
268
|
)
|
444
269
|
st.dataframe(df, use_container_width=True)
|
@@ -456,3 +281,4 @@ with right:
|
|
456
281
|
df = df.astype("str")
|
457
282
|
st.write((df.style.map(color_bool2)))
|
458
283
|
# st.dataframe(df)
|
284
|
+
|