xnft 0.1.0rc4__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.
- xnft-0.1.0rc4/.gitignore +237 -0
- xnft-0.1.0rc4/LICENSE +9 -0
- xnft-0.1.0rc4/PKG-INFO +241 -0
- xnft-0.1.0rc4/README.md +212 -0
- xnft-0.1.0rc4/pyproject.toml +110 -0
- xnft-0.1.0rc4/src/xnft/__init__.py +46 -0
- xnft-0.1.0rc4/src/xnft/algorithms/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/algorithms/planar_near_field_transform.py +455 -0
- xnft-0.1.0rc4/src/xnft/antennas/aperture/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/antennas/aperture/rectangular.py +231 -0
- xnft-0.1.0rc4/src/xnft/antennas/probes/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/antennas/probes/probes.py +121 -0
- xnft-0.1.0rc4/src/xnft/antennas/probes/standard_probes.py +42 -0
- xnft-0.1.0rc4/src/xnft/antennas/wire/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/antennas/wire/dipole.py +192 -0
- xnft-0.1.0rc4/src/xnft/calibration/gain.py +207 -0
- xnft-0.1.0rc4/src/xnft/common/__init__.py +6 -0
- xnft-0.1.0rc4/src/xnft/common/enums.py +132 -0
- xnft-0.1.0rc4/src/xnft/common/plugins.py +25 -0
- xnft-0.1.0rc4/src/xnft/common/registry.py +325 -0
- xnft-0.1.0rc4/src/xnft/common/types.py +223 -0
- xnft-0.1.0rc4/src/xnft/gui/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/app.py +597 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/analysis/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/analysis/new_planar_nft_dialog.py +326 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/calibrations/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/calibrations/new_gain_calibration_dialog.py +250 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/common.py +169 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/export_data_dialog.py +239 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/export_data_directory_dialog.py +204 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/fields/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/fields/new_field_measurement_dialog.py +554 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/probes/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/probes/new_probe_dialog.py +327 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/project/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/project/new_project_dialog.py +152 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/reports/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/reports/new_field_report_dialog.py +198 -0
- xnft-0.1.0rc4/src/xnft/gui/dialogs/reports/new_trace_dialog.py +728 -0
- xnft-0.1.0rc4/src/xnft/gui/models/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/models/project_tree_model.py +323 -0
- xnft-0.1.0rc4/src/xnft/gui/tasks/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/tasks/bridge.py +60 -0
- xnft-0.1.0rc4/src/xnft/gui/tasks/worker.py +40 -0
- xnft-0.1.0rc4/src/xnft/gui/utils.py +81 -0
- xnft-0.1.0rc4/src/xnft/gui/views/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/gui/views/mdi_area.py +159 -0
- xnft-0.1.0rc4/src/xnft/gui/views/project_tree_view.py +172 -0
- xnft-0.1.0rc4/src/xnft/loaders/__init__.py +19 -0
- xnft-0.1.0rc4/src/xnft/loaders/fields/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/loaders/fields/analytic.py +261 -0
- xnft-0.1.0rc4/src/xnft/loaders/fields/base.py +15 -0
- xnft-0.1.0rc4/src/xnft/loaders/fields/hfss.py +337 -0
- xnft-0.1.0rc4/src/xnft/loaders/fields/nsi.py +5 -0
- xnft-0.1.0rc4/src/xnft/loaders/gain/.gitkeep +0 -0
- xnft-0.1.0rc4/src/xnft/loaders/probes/.gitkeep +0 -0
- xnft-0.1.0rc4/src/xnft/project/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/project/io.py +92 -0
- xnft-0.1.0rc4/src/xnft/project/manager.py +41 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/__init__.py +0 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/analysis.py +220 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/calibrations.py +114 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/coordinates.py +80 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/fields.py +219 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/model.py +34 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/node.py +568 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/probes.py +105 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/project.py +101 -0
- xnft-0.1.0rc4/src/xnft/project/nodes/reports.py +377 -0
- xnft-0.1.0rc4/src/xnft/reports/__init__.py +7 -0
- xnft-0.1.0rc4/src/xnft/reports/data_writers.py +45 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/functions/domains.py +42 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/functions/field_components.py +202 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/functions/field_quantities.py +62 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/functions/functions.py +89 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/functions/normalizations.py +43 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/functions/scales.py +49 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/helpers/coordinate_transforms.py +34 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/helpers/helpers.py +71 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/helpers/trace_parameters.py +49 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/line_plot.py +525 -0
- xnft-0.1.0rc4/src/xnft/reports/plot/surface_plot.py +846 -0
- xnft-0.1.0rc4/src/xnft/reports/table/.gitkeep +0 -0
- xnft-0.1.0rc4/src/xnft/resources/calibration/NSI-MI_ANT-SGA-26.5-40.cal +21 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/array.svg +26 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/calibration.svg +36 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/calibration2.svg +33 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/coordinates.svg +69 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/fields.svg +23 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/function.svg +1 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/model.svg +21 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/plot.svg +32 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/probe.svg +21 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.icns +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.ico +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_128x128.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_128x128@2x.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_16x16.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_16x16@2x.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_256x256.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_256x256@2x.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_32x32.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_32x32@2x.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_512x512.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_512x512@2x.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft.svg +30 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft_flat.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/icons/xnft_flat_192.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/logging.all.yaml +19 -0
- xnft-0.1.0rc4/src/xnft/resources/logging.dev.yaml +19 -0
- xnft-0.1.0rc4/src/xnft/resources/logos/emrg_logo.svg +194 -0
- xnft-0.1.0rc4/src/xnft/resources/logos/emrg_logo_vector.svg +33 -0
- xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo.svg +1 -0
- xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo_transparent.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo_v2.png +0 -0
- xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo_v2.svg +8 -0
- xnft-0.1.0rc4/src/xnft/resources/paths.py +13 -0
xnft-0.1.0rc4/.gitignore
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
*~lock~
|
|
2
|
+
*/figures/*
|
|
3
|
+
|
|
4
|
+
# pixi environments
|
|
5
|
+
.pixi/*
|
|
6
|
+
!.pixi/config.toml
|
|
7
|
+
|
|
8
|
+
# Sphinx
|
|
9
|
+
docs/build
|
|
10
|
+
|
|
11
|
+
# macOS
|
|
12
|
+
.DS_Store
|
|
13
|
+
|
|
14
|
+
# == Python ===
|
|
15
|
+
# Byte-compiled / optimized / DLL files
|
|
16
|
+
__pycache__/
|
|
17
|
+
*.py[codz]
|
|
18
|
+
*$py.class
|
|
19
|
+
|
|
20
|
+
# C extensions
|
|
21
|
+
*.so
|
|
22
|
+
|
|
23
|
+
# Distribution / packaging
|
|
24
|
+
.Python
|
|
25
|
+
build/
|
|
26
|
+
develop-eggs/
|
|
27
|
+
dist/
|
|
28
|
+
downloads/
|
|
29
|
+
eggs/
|
|
30
|
+
.eggs/
|
|
31
|
+
lib/
|
|
32
|
+
lib64/
|
|
33
|
+
parts/
|
|
34
|
+
sdist/
|
|
35
|
+
var/
|
|
36
|
+
wheels/
|
|
37
|
+
share/python-wheels/
|
|
38
|
+
*.egg-info/
|
|
39
|
+
.installed.cfg
|
|
40
|
+
*.egg
|
|
41
|
+
MANIFEST
|
|
42
|
+
|
|
43
|
+
# PyInstaller
|
|
44
|
+
# Usually these files are written by a python script from a template
|
|
45
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
46
|
+
*.manifest
|
|
47
|
+
# *.spec
|
|
48
|
+
|
|
49
|
+
# Installer logs
|
|
50
|
+
pip-log.txt
|
|
51
|
+
pip-delete-this-directory.txt
|
|
52
|
+
|
|
53
|
+
# Unit test / coverage reports
|
|
54
|
+
htmlcov/
|
|
55
|
+
.tox/
|
|
56
|
+
.nox/
|
|
57
|
+
.coverage
|
|
58
|
+
.coverage.*
|
|
59
|
+
.cache
|
|
60
|
+
nosetests.xml
|
|
61
|
+
coverage.xml
|
|
62
|
+
*.cover
|
|
63
|
+
*.py.cover
|
|
64
|
+
.hypothesis/
|
|
65
|
+
.pytest_cache/
|
|
66
|
+
cover/
|
|
67
|
+
report.xml
|
|
68
|
+
|
|
69
|
+
# Translations
|
|
70
|
+
*.mo
|
|
71
|
+
*.pot
|
|
72
|
+
|
|
73
|
+
# Django stuff:
|
|
74
|
+
*.log
|
|
75
|
+
local_settings.py
|
|
76
|
+
db.sqlite3
|
|
77
|
+
db.sqlite3-journal
|
|
78
|
+
|
|
79
|
+
# Flask stuff:
|
|
80
|
+
instance/
|
|
81
|
+
.webassets-cache
|
|
82
|
+
|
|
83
|
+
# Scrapy stuff:
|
|
84
|
+
.scrapy
|
|
85
|
+
|
|
86
|
+
# Sphinx documentation
|
|
87
|
+
docs/_build/
|
|
88
|
+
# Generated api docs
|
|
89
|
+
docs/source/api/
|
|
90
|
+
|
|
91
|
+
# PyBuilder
|
|
92
|
+
.pybuilder/
|
|
93
|
+
target/
|
|
94
|
+
|
|
95
|
+
# Jupyter Notebook
|
|
96
|
+
.ipynb_checkpoints
|
|
97
|
+
|
|
98
|
+
# IPython
|
|
99
|
+
profile_default/
|
|
100
|
+
ipython_config.py
|
|
101
|
+
|
|
102
|
+
# pyenv
|
|
103
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
104
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
105
|
+
# .python-version
|
|
106
|
+
|
|
107
|
+
# pipenv
|
|
108
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
109
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
110
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
111
|
+
# install all needed dependencies.
|
|
112
|
+
# Pipfile.lock
|
|
113
|
+
|
|
114
|
+
# UV
|
|
115
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
116
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
117
|
+
# commonly ignored for libraries.
|
|
118
|
+
# uv.lock
|
|
119
|
+
|
|
120
|
+
# poetry
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
122
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
123
|
+
# commonly ignored for libraries.
|
|
124
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
125
|
+
# poetry.lock
|
|
126
|
+
# poetry.toml
|
|
127
|
+
|
|
128
|
+
# pdm
|
|
129
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
130
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
131
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
132
|
+
# pdm.lock
|
|
133
|
+
# pdm.toml
|
|
134
|
+
.pdm-python
|
|
135
|
+
.pdm-build/
|
|
136
|
+
|
|
137
|
+
# pixi
|
|
138
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
139
|
+
# pixi.lock
|
|
140
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
141
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
142
|
+
.pixi
|
|
143
|
+
|
|
144
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
145
|
+
__pypackages__/
|
|
146
|
+
|
|
147
|
+
# Celery stuff
|
|
148
|
+
celerybeat-schedule
|
|
149
|
+
celerybeat.pid
|
|
150
|
+
|
|
151
|
+
# Redis
|
|
152
|
+
*.rdb
|
|
153
|
+
*.aof
|
|
154
|
+
*.pid
|
|
155
|
+
|
|
156
|
+
# RabbitMQ
|
|
157
|
+
mnesia/
|
|
158
|
+
rabbitmq/
|
|
159
|
+
rabbitmq-data/
|
|
160
|
+
|
|
161
|
+
# ActiveMQ
|
|
162
|
+
activemq-data/
|
|
163
|
+
|
|
164
|
+
# SageMath parsed files
|
|
165
|
+
*.sage.py
|
|
166
|
+
|
|
167
|
+
# Environments
|
|
168
|
+
.env
|
|
169
|
+
.envrc
|
|
170
|
+
.venv
|
|
171
|
+
env/
|
|
172
|
+
venv/
|
|
173
|
+
ENV/
|
|
174
|
+
env.bak/
|
|
175
|
+
venv.bak/
|
|
176
|
+
|
|
177
|
+
# Spyder project settings
|
|
178
|
+
.spyderproject
|
|
179
|
+
.spyproject
|
|
180
|
+
|
|
181
|
+
# Rope project settings
|
|
182
|
+
.ropeproject
|
|
183
|
+
|
|
184
|
+
# mkdocs documentation
|
|
185
|
+
/site
|
|
186
|
+
|
|
187
|
+
# mypy
|
|
188
|
+
.mypy_cache/
|
|
189
|
+
.dmypy.json
|
|
190
|
+
dmypy.json
|
|
191
|
+
|
|
192
|
+
# Pyre type checker
|
|
193
|
+
.pyre/
|
|
194
|
+
|
|
195
|
+
# pytype static type analyzer
|
|
196
|
+
.pytype/
|
|
197
|
+
|
|
198
|
+
# Cython debug symbols
|
|
199
|
+
cython_debug/
|
|
200
|
+
|
|
201
|
+
# PyCharm
|
|
202
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
203
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
204
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
205
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
206
|
+
# .idea/
|
|
207
|
+
|
|
208
|
+
# Abstra
|
|
209
|
+
# Abstra is an AI-powered process automation framework.
|
|
210
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
211
|
+
# Learn more at https://abstra.io/docs
|
|
212
|
+
.abstra/
|
|
213
|
+
|
|
214
|
+
# Visual Studio Code
|
|
215
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
216
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
217
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
218
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
219
|
+
# .vscode/
|
|
220
|
+
|
|
221
|
+
# Ruff stuff:
|
|
222
|
+
.ruff_cache/
|
|
223
|
+
code-quality-report.json
|
|
224
|
+
|
|
225
|
+
# PyPI configuration file
|
|
226
|
+
.pypirc
|
|
227
|
+
|
|
228
|
+
# Marimo
|
|
229
|
+
marimo/_static/
|
|
230
|
+
marimo/_lsp/
|
|
231
|
+
__marimo__/
|
|
232
|
+
|
|
233
|
+
# Streamlit
|
|
234
|
+
.streamlit/secrets.toml
|
|
235
|
+
|
|
236
|
+
# Conda
|
|
237
|
+
*.conda
|
xnft-0.1.0rc4/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright 2026 LEmmA, Electromagnetics Research Group, Michigan State University.
|
|
4
|
+
|
|
5
|
+
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:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
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.
|
xnft-0.1.0rc4/PKG-INFO
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: xnft
|
|
3
|
+
Version: 0.1.0rc4
|
|
4
|
+
Summary: Antenna measurement and analysis software.
|
|
5
|
+
Project-URL: Homepage, https://gitlab.msu.edu/ece-lemma/near-field
|
|
6
|
+
Project-URL: Issues, https://gitlab.msu.edu/ece-lemma/near-field/-/issues
|
|
7
|
+
Author: LEmmA Group, Michigan State University
|
|
8
|
+
Author-email: Jason Merlo <merlojas@msu.edu>, Mauro Ettorre <ettorre@msu.edu>
|
|
9
|
+
Maintainer-email: Jason Merlo <merlojas@msu.edu>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Python: <3.15,>=3.12
|
|
13
|
+
Requires-Dist: colorcet<4,>=3.2.1
|
|
14
|
+
Requires-Dist: dill<0.5,>=0.4.1
|
|
15
|
+
Requires-Dist: finufft<3,>=2.5.1
|
|
16
|
+
Requires-Dist: h5py<4,>=3.16.0
|
|
17
|
+
Requires-Dist: netcdf4<2,>=1.7.4
|
|
18
|
+
Requires-Dist: numba<0.69,>=0.68.0
|
|
19
|
+
Requires-Dist: numpy<3,>=2.5.4
|
|
20
|
+
Requires-Dist: pandas<4,>=3.0.6
|
|
21
|
+
Requires-Dist: pyqtgraph<0.15,>=0.14.0
|
|
22
|
+
Requires-Dist: pyside6<7,>=6.11.2
|
|
23
|
+
Requires-Dist: pyyaml<7,>=6.0.3
|
|
24
|
+
Requires-Dist: quantiphy<3,>=2.23
|
|
25
|
+
Requires-Dist: scipy<2,>=1.18.1
|
|
26
|
+
Requires-Dist: unyt<4,>=3.1.0
|
|
27
|
+
Requires-Dist: xarray<2027,>=2026.9.0
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# _xNFT_: An Open Near-Field Antenna Measurement Software Suite
|
|
31
|
+
|
|
32
|
+
<table>
|
|
33
|
+
<tr>
|
|
34
|
+
<td><a><img src="docs/images/xnft_logo.png" alt="xNFT Logo" ></a></td>
|
|
35
|
+
<td><a href="https://sites.google.com/site/mauroettorre/home"><img src="docs/images/lemma_logo_v2_green.png" alt="LEmmA Group Logo" ></a></td>
|
|
36
|
+
<td><a href="https://www.egr.msu.edu/emrg/"><img src="docs/images/emrg_logo.png" alt="Electromagnetics Research Group Wordmark"></a></td>
|
|
37
|
+
</tr>
|
|
38
|
+
</table>
|
|
39
|
+
|
|
40
|
+
| | |
|
|
41
|
+
| ------ | ------ |
|
|
42
|
+
| Testing | [](../../pipelines)  |
|
|
43
|
+
| Package | [](/../../releases)   |
|
|
44
|
+
| Meta | [](LICENSE) |
|
|
45
|
+
|
|
46
|
+
> [!WARNING]
|
|
47
|
+
> ⚠️ **_xNFT_ is in active development (Beta).**
|
|
48
|
+
> User interfaces and APIs may continue to change.
|
|
49
|
+
|
|
50
|
+
> [!NOTE]
|
|
51
|
+
> The primary source for xNFT is the **[MSU GitLab repository](https://www.gitlab.msu.edu/ece-lemma/public/xnft/xnft)**.
|
|
52
|
+
>
|
|
53
|
+
> Community contributions are welcomed via the **[GitHub Mirror](https://github.com/msu-lemma/xnft)**. Issues and pull requests may be submitted to this location for discussion.
|
|
54
|
+
|
|
55
|
+
## What is _xNFT_?
|
|
56
|
+
|
|
57
|
+
**_xNFT_** is a cross-platform, high-performance, general purpose antenna measurement and analysis software tool, primarily focusing on **near-to-far field transformations (NFTs)**, permissively distributed under the **MIT license**.
|
|
58
|
+
|
|
59
|
+
Check out our **[Video Demo](https://youtu.be/SiD9lgWeYf4?t=24)** to see some of _xNFT_'s features in action!
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
> Screenshot of _xNFT_ running on macOS. Measurements show an NSI-MI ANT-SGH-26.5-40 standard gain horn at 26.5 GHz collected using the LEmmA planar near-field scanner.
|
|
63
|
+
|
|
64
|
+
## Table of Contents
|
|
65
|
+
|
|
66
|
+
1. [Highlights](#highlights)
|
|
67
|
+
2. [System Requirements](#system-requirements)
|
|
68
|
+
3. [Installation](#installation)
|
|
69
|
+
4. [Documentation](#documentation)
|
|
70
|
+
5. [Known Issues](#known-issues)
|
|
71
|
+
6. [Contributing](#contributing)
|
|
72
|
+
7. [Citing _xNFT_](#citing-xnft)
|
|
73
|
+
8. [License](#license)
|
|
74
|
+
9. [Acknowledgements](#acknowledgements)
|
|
75
|
+
|
|
76
|
+
## Highlights
|
|
77
|
+
|
|
78
|
+
Some of the main features currently available in _xNFT_ are:
|
|
79
|
+
|
|
80
|
+
- **Planar near-to-far field transforms (PNFT).** _xNFT_ uses the [FINUFFT](https://finufft.readthedocs.io/en/latest/) library to compute the PNFT, enabling fast and accurate transforms from uniform and nonuniform* sampled source grids directly into uniformly sampled spherical coordinates.
|
|
81
|
+
- **Probe Compensation.** Ideal open-ended waveguide measurement probe correction options are built into _xNFT_.
|
|
82
|
+
- **Gain Calibration.** Gain calibration may be performed using the gain transfer method via a calibrated measurement antenna and gain reference table in `.csv` or `.ngt` format.
|
|
83
|
+
- **Graphical user interface (GUI).** _xNFT_ provides a rich GUI (via [Qt/PySide6](https://doc.qt.io/qtforpython-6/)) designed to look like common professional engineering tools with interactive plotting (via [PyQtGraph](https://www.pyqtgraph.org)) and analysis tools.
|
|
84
|
+
- **Data exporting.** Exporting options are availble in `.h5` and `.csv` formats for imported fields (data conversion) and processed report results. Images may be exported using the underlying PyQtGraph framework (via right-click menu).
|
|
85
|
+
- **Plugin framework.** _xNFT_ has an extensible plugin framework allowing users to create custom data loaders in separate python packages allowing users to separate internal tools from the general _xNFT_ framework. For more information see the [_xNFT_ Plugin Example repository](https://www.gitlab.msu.edu/ece-lemma/public/xnft/xnft-example).
|
|
86
|
+
|
|
87
|
+
*Nonuniform source sampling has not yet been validated.
|
|
88
|
+
|
|
89
|
+
### In Progress
|
|
90
|
+
|
|
91
|
+
- Spherical near-to-far field transform (SNFT)
|
|
92
|
+
- Expanded plugin package capabilities. E.g., custom _Analysis_ options and _Report_ options.
|
|
93
|
+
|
|
94
|
+
## System Requirements
|
|
95
|
+
|
|
96
|
+
_xNFT_ is designed to run on a wide range of operating systems and architectures. A list of system configurations designed to be compatible is included below. Other configurations may work, but are not currently considered supported configurations.
|
|
97
|
+
|
|
98
|
+
### _xNFT_ Design System Compatability Matrix
|
|
99
|
+
|
|
100
|
+
| Operating System | Versions | Architectures |
|
|
101
|
+
| ---------------- | ----------------- | ---------------- |
|
|
102
|
+
| macOS | >= 15.0 (Sequoia) | x86-64, arm-64 |
|
|
103
|
+
| Linux | —— | x86-64, aarch64 |
|
|
104
|
+
| Windows | 10, 11 | x86-64, arm-64* |
|
|
105
|
+
|
|
106
|
+
*Emulated x86 via [Prism](https://learn.microsoft.com/en-us/windows/arm/apps-on-arm-x86-emulation)
|
|
107
|
+
|
|
108
|
+
### Validated Configurations
|
|
109
|
+
|
|
110
|
+
<details>
|
|
111
|
+
<summary>(Click to view table)</summary>
|
|
112
|
+
|
|
113
|
+
| Operating System | Versions | Architecture |
|
|
114
|
+
| ---------------- | ----------------- | -------------------------- |
|
|
115
|
+
| macOS | 26 (Tahoe) | arm-64 |
|
|
116
|
+
| | 27 (Golden Gate) | arm-64 |
|
|
117
|
+
| Linux | Alma 8.10, Alma 9.6, Alma 9.8 | x86-64 |
|
|
118
|
+
| | Ubuntu 26.04 | aarch64 |
|
|
119
|
+
| Windows | 11 | x86-64 |
|
|
120
|
+
| | 11 | arm-64 (via [Prism](https://learn.microsoft.com/en-us/windows/arm/apps-on-arm-x86-emulation)) |
|
|
121
|
+
| Windows (WSL2) | 11 (Ubuntu 24.04) | x86-64 |
|
|
122
|
+
|
|
123
|
+
</details>
|
|
124
|
+
|
|
125
|
+
## Installation
|
|
126
|
+
|
|
127
|
+
To install _xNFT_ and download test data, see **[Installing _xNFT_](docs/installing.md)**.
|
|
128
|
+
|
|
129
|
+
## Documentation
|
|
130
|
+
|
|
131
|
+
Documentation can be found in the **[docs folder](docs)**.
|
|
132
|
+
|
|
133
|
+
- **[Installation](docs/installing.md):** Instructions for installing and packaging _xNFT_, and downloading test data.
|
|
134
|
+
- **[Getting Started](docs/getting_started.md)**: A quick-start guide including a written tutorial and usage video.
|
|
135
|
+
- **[User Guide](docs/user_guide.md)**: Documentation of user interface and antenna analysis workflow.
|
|
136
|
+
|
|
137
|
+
### Developer Documentation
|
|
138
|
+
|
|
139
|
+
There is a minimal API documentation generated by Sphinx from the docstrings. This is built by the CI task available at:
|
|
140
|
+
|
|
141
|
+
- [**PDF Documentation**](https://gitlab.msu.edu/api/v4/projects/28094/jobs/artifacts/main/raw/docs/api/build/xnft-docs.pdf?job=docs-build)
|
|
142
|
+
- [**HTML Documentation**](https://gitlab.msu.edu/api/v4/projects/28094/jobs/artifacts/main/raw/docs/api/build/xnft-docs.tar.gz?job=docs-build)
|
|
143
|
+
|
|
144
|
+
<details>
|
|
145
|
+
<summary>
|
|
146
|
+
<h4>Local API Documentation Generation</h4> (Click to view)
|
|
147
|
+
</summary>
|
|
148
|
+
|
|
149
|
+
To build all docs locally (PDF and HTML), run:
|
|
150
|
+
|
|
151
|
+
```shell
|
|
152
|
+
pixi run -e docs build-docs
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Just the HTML docs or just the PDF docs may be built by running
|
|
156
|
+
|
|
157
|
+
```shell
|
|
158
|
+
pixi run -e docs build-html-docs
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
or
|
|
162
|
+
|
|
163
|
+
```shell
|
|
164
|
+
pixi run -e docs build-pdf-docs
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
</details>
|
|
168
|
+
|
|
169
|
+
## Known Issues
|
|
170
|
+
|
|
171
|
+
A summary of the high-impact issues are included in the [Work Items](https://www.gitlab.msu.edu/ece-lemma/public/xnft/xnft/-/work_items/views/43).
|
|
172
|
+
|
|
173
|
+
## Contributing
|
|
174
|
+
|
|
175
|
+
Community contributions in the form of bug reports, feature requests, and pull requests are welcome!
|
|
176
|
+
|
|
177
|
+
If you find a bug or would like to request a feature, please first check if a similar issue already exists in [Work Items](https://www.gitlab.msu.edu/ece-lemma/public/xnft/xnft/-/work_items) or the [GitHub Issues](https://github.com/msu-lemma/xnft/issues). If not, please [open an issue on the GitHub project](https://github.com/msu-lemma/xnft/issues).
|
|
178
|
+
|
|
179
|
+
Please refer to [CONTRIBUTING](CONTRIBUTING.md) for further guidance.
|
|
180
|
+
|
|
181
|
+
## Citing _xNFT_
|
|
182
|
+
|
|
183
|
+
If you use _xNFT_ in your work, please consider citing it. Citation metadata is available in the **[CFF reference file](CITATION.cff)**.
|
|
184
|
+
|
|
185
|
+
- **When citing the use of the software package**, please specify the version used for reproduceability. The preferred format is:
|
|
186
|
+
|
|
187
|
+
> J. M. Merlo and M. Ettorre. *xNFT - Antenna measurement software.* (v#.#.#). Michigan State University. [Online]. Available: https://www.gitlab.msu.edu/ece-lemma/public/xnft/xnft
|
|
188
|
+
|
|
189
|
+
<details>
|
|
190
|
+
<summary>BibTex Format (click to view)</summary>
|
|
191
|
+
|
|
192
|
+
🚧 TODO 🚧
|
|
193
|
+
|
|
194
|
+
```text
|
|
195
|
+
@software{xnft,
|
|
196
|
+
author={Merlo, Jason M. and Ettorre, Mauro},
|
|
197
|
+
title={{xNFT} - {A}ntenna measurement software},
|
|
198
|
+
month={November},
|
|
199
|
+
year={2026},
|
|
200
|
+
version={v0.1.0},
|
|
201
|
+
keywords={Antenna measurements, near-field measurement, near-field transform, open-source software, probe compensation},
|
|
202
|
+
doi={},
|
|
203
|
+
publisher={Michigan State University},
|
|
204
|
+
url={https://www.gitlab.msu.edu/ece-lemma/public/xnft/xnft}}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
</details>
|
|
208
|
+
|
|
209
|
+
Please replace "(v#.#.#)" with the version of the software you used, e.g. "(v0.1.0)".
|
|
210
|
+
|
|
211
|
+
- **When citing the software package implementation**, please cite our AMTA conference paper. The preferred format is:
|
|
212
|
+
|
|
213
|
+
> J. M. Merlo and M. Ettorre., "xNFT: An open near-field antenna measurement software suite," 2026 Antenna Measurement Techniques Association Symposium (AMTA), Austin, TX, USA, 2026.
|
|
214
|
+
|
|
215
|
+
<details>
|
|
216
|
+
<summary>BibTex Format (click to view)</summary>
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
@inproceedings{xnft2026amta,
|
|
220
|
+
author={Merlo, Jason M. and Ettorre, Mauro},
|
|
221
|
+
booktitle={2026 Antenna Measurement Techniques Association Symposium (AMTA)},
|
|
222
|
+
title={xNFT: An Open Near-Field Antenna Measurement Software Suite},
|
|
223
|
+
year={2026},
|
|
224
|
+
pages={1-6},
|
|
225
|
+
keywords={Antenna measurements, near-field measurement, near-field transform, open-source software, probe compensation},
|
|
226
|
+
doi={}}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
</details>
|
|
230
|
+
|
|
231
|
+
## License
|
|
232
|
+
|
|
233
|
+
Copyright ©️ 2026 Michigan State University. All rights reserved.
|
|
234
|
+
|
|
235
|
+
The original source code for this project is distributed under the [MIT license](LICENSE).
|
|
236
|
+
|
|
237
|
+
This project depends on third-party libraries which are distributed separately and remain subject to their respective licenses. For a complete list of runtime dependencies, see the `workspace.dependencies` section of the [`pixi.toml`](pixi.toml#L13) file.
|
|
238
|
+
|
|
239
|
+
## Acknowledgements
|
|
240
|
+
|
|
241
|
+
This work was sponsored by the Air Force Research Laboratory (AFRL) under grant number FA87502510001. The views expressed are those of the authors and do not reflect the official policy or position of the Department of Defense or the U.S. Government.
|