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.
Files changed (120) hide show
  1. xnft-0.1.0rc4/.gitignore +237 -0
  2. xnft-0.1.0rc4/LICENSE +9 -0
  3. xnft-0.1.0rc4/PKG-INFO +241 -0
  4. xnft-0.1.0rc4/README.md +212 -0
  5. xnft-0.1.0rc4/pyproject.toml +110 -0
  6. xnft-0.1.0rc4/src/xnft/__init__.py +46 -0
  7. xnft-0.1.0rc4/src/xnft/algorithms/__init__.py +0 -0
  8. xnft-0.1.0rc4/src/xnft/algorithms/planar_near_field_transform.py +455 -0
  9. xnft-0.1.0rc4/src/xnft/antennas/aperture/__init__.py +0 -0
  10. xnft-0.1.0rc4/src/xnft/antennas/aperture/rectangular.py +231 -0
  11. xnft-0.1.0rc4/src/xnft/antennas/probes/__init__.py +0 -0
  12. xnft-0.1.0rc4/src/xnft/antennas/probes/probes.py +121 -0
  13. xnft-0.1.0rc4/src/xnft/antennas/probes/standard_probes.py +42 -0
  14. xnft-0.1.0rc4/src/xnft/antennas/wire/__init__.py +0 -0
  15. xnft-0.1.0rc4/src/xnft/antennas/wire/dipole.py +192 -0
  16. xnft-0.1.0rc4/src/xnft/calibration/gain.py +207 -0
  17. xnft-0.1.0rc4/src/xnft/common/__init__.py +6 -0
  18. xnft-0.1.0rc4/src/xnft/common/enums.py +132 -0
  19. xnft-0.1.0rc4/src/xnft/common/plugins.py +25 -0
  20. xnft-0.1.0rc4/src/xnft/common/registry.py +325 -0
  21. xnft-0.1.0rc4/src/xnft/common/types.py +223 -0
  22. xnft-0.1.0rc4/src/xnft/gui/__init__.py +0 -0
  23. xnft-0.1.0rc4/src/xnft/gui/app.py +597 -0
  24. xnft-0.1.0rc4/src/xnft/gui/dialogs/__init__.py +0 -0
  25. xnft-0.1.0rc4/src/xnft/gui/dialogs/analysis/__init__.py +0 -0
  26. xnft-0.1.0rc4/src/xnft/gui/dialogs/analysis/new_planar_nft_dialog.py +326 -0
  27. xnft-0.1.0rc4/src/xnft/gui/dialogs/calibrations/__init__.py +0 -0
  28. xnft-0.1.0rc4/src/xnft/gui/dialogs/calibrations/new_gain_calibration_dialog.py +250 -0
  29. xnft-0.1.0rc4/src/xnft/gui/dialogs/common.py +169 -0
  30. xnft-0.1.0rc4/src/xnft/gui/dialogs/export_data_dialog.py +239 -0
  31. xnft-0.1.0rc4/src/xnft/gui/dialogs/export_data_directory_dialog.py +204 -0
  32. xnft-0.1.0rc4/src/xnft/gui/dialogs/fields/__init__.py +0 -0
  33. xnft-0.1.0rc4/src/xnft/gui/dialogs/fields/new_field_measurement_dialog.py +554 -0
  34. xnft-0.1.0rc4/src/xnft/gui/dialogs/probes/__init__.py +0 -0
  35. xnft-0.1.0rc4/src/xnft/gui/dialogs/probes/new_probe_dialog.py +327 -0
  36. xnft-0.1.0rc4/src/xnft/gui/dialogs/project/__init__.py +0 -0
  37. xnft-0.1.0rc4/src/xnft/gui/dialogs/project/new_project_dialog.py +152 -0
  38. xnft-0.1.0rc4/src/xnft/gui/dialogs/reports/__init__.py +0 -0
  39. xnft-0.1.0rc4/src/xnft/gui/dialogs/reports/new_field_report_dialog.py +198 -0
  40. xnft-0.1.0rc4/src/xnft/gui/dialogs/reports/new_trace_dialog.py +728 -0
  41. xnft-0.1.0rc4/src/xnft/gui/models/__init__.py +0 -0
  42. xnft-0.1.0rc4/src/xnft/gui/models/project_tree_model.py +323 -0
  43. xnft-0.1.0rc4/src/xnft/gui/tasks/__init__.py +0 -0
  44. xnft-0.1.0rc4/src/xnft/gui/tasks/bridge.py +60 -0
  45. xnft-0.1.0rc4/src/xnft/gui/tasks/worker.py +40 -0
  46. xnft-0.1.0rc4/src/xnft/gui/utils.py +81 -0
  47. xnft-0.1.0rc4/src/xnft/gui/views/__init__.py +0 -0
  48. xnft-0.1.0rc4/src/xnft/gui/views/mdi_area.py +159 -0
  49. xnft-0.1.0rc4/src/xnft/gui/views/project_tree_view.py +172 -0
  50. xnft-0.1.0rc4/src/xnft/loaders/__init__.py +19 -0
  51. xnft-0.1.0rc4/src/xnft/loaders/fields/__init__.py +0 -0
  52. xnft-0.1.0rc4/src/xnft/loaders/fields/analytic.py +261 -0
  53. xnft-0.1.0rc4/src/xnft/loaders/fields/base.py +15 -0
  54. xnft-0.1.0rc4/src/xnft/loaders/fields/hfss.py +337 -0
  55. xnft-0.1.0rc4/src/xnft/loaders/fields/nsi.py +5 -0
  56. xnft-0.1.0rc4/src/xnft/loaders/gain/.gitkeep +0 -0
  57. xnft-0.1.0rc4/src/xnft/loaders/probes/.gitkeep +0 -0
  58. xnft-0.1.0rc4/src/xnft/project/__init__.py +0 -0
  59. xnft-0.1.0rc4/src/xnft/project/io.py +92 -0
  60. xnft-0.1.0rc4/src/xnft/project/manager.py +41 -0
  61. xnft-0.1.0rc4/src/xnft/project/nodes/__init__.py +0 -0
  62. xnft-0.1.0rc4/src/xnft/project/nodes/analysis.py +220 -0
  63. xnft-0.1.0rc4/src/xnft/project/nodes/calibrations.py +114 -0
  64. xnft-0.1.0rc4/src/xnft/project/nodes/coordinates.py +80 -0
  65. xnft-0.1.0rc4/src/xnft/project/nodes/fields.py +219 -0
  66. xnft-0.1.0rc4/src/xnft/project/nodes/model.py +34 -0
  67. xnft-0.1.0rc4/src/xnft/project/nodes/node.py +568 -0
  68. xnft-0.1.0rc4/src/xnft/project/nodes/probes.py +105 -0
  69. xnft-0.1.0rc4/src/xnft/project/nodes/project.py +101 -0
  70. xnft-0.1.0rc4/src/xnft/project/nodes/reports.py +377 -0
  71. xnft-0.1.0rc4/src/xnft/reports/__init__.py +7 -0
  72. xnft-0.1.0rc4/src/xnft/reports/data_writers.py +45 -0
  73. xnft-0.1.0rc4/src/xnft/reports/plot/functions/domains.py +42 -0
  74. xnft-0.1.0rc4/src/xnft/reports/plot/functions/field_components.py +202 -0
  75. xnft-0.1.0rc4/src/xnft/reports/plot/functions/field_quantities.py +62 -0
  76. xnft-0.1.0rc4/src/xnft/reports/plot/functions/functions.py +89 -0
  77. xnft-0.1.0rc4/src/xnft/reports/plot/functions/normalizations.py +43 -0
  78. xnft-0.1.0rc4/src/xnft/reports/plot/functions/scales.py +49 -0
  79. xnft-0.1.0rc4/src/xnft/reports/plot/helpers/coordinate_transforms.py +34 -0
  80. xnft-0.1.0rc4/src/xnft/reports/plot/helpers/helpers.py +71 -0
  81. xnft-0.1.0rc4/src/xnft/reports/plot/helpers/trace_parameters.py +49 -0
  82. xnft-0.1.0rc4/src/xnft/reports/plot/line_plot.py +525 -0
  83. xnft-0.1.0rc4/src/xnft/reports/plot/surface_plot.py +846 -0
  84. xnft-0.1.0rc4/src/xnft/reports/table/.gitkeep +0 -0
  85. xnft-0.1.0rc4/src/xnft/resources/calibration/NSI-MI_ANT-SGA-26.5-40.cal +21 -0
  86. xnft-0.1.0rc4/src/xnft/resources/icons/array.svg +26 -0
  87. xnft-0.1.0rc4/src/xnft/resources/icons/calibration.svg +36 -0
  88. xnft-0.1.0rc4/src/xnft/resources/icons/calibration2.svg +33 -0
  89. xnft-0.1.0rc4/src/xnft/resources/icons/coordinates.svg +69 -0
  90. xnft-0.1.0rc4/src/xnft/resources/icons/fields.svg +23 -0
  91. xnft-0.1.0rc4/src/xnft/resources/icons/function.svg +1 -0
  92. xnft-0.1.0rc4/src/xnft/resources/icons/model.svg +21 -0
  93. xnft-0.1.0rc4/src/xnft/resources/icons/plot.svg +32 -0
  94. xnft-0.1.0rc4/src/xnft/resources/icons/probe.svg +21 -0
  95. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.icns +0 -0
  96. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.ico +0 -0
  97. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_128x128.png +0 -0
  98. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_128x128@2x.png +0 -0
  99. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_16x16.png +0 -0
  100. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_16x16@2x.png +0 -0
  101. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_256x256.png +0 -0
  102. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_256x256@2x.png +0 -0
  103. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_32x32.png +0 -0
  104. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_32x32@2x.png +0 -0
  105. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_512x512.png +0 -0
  106. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.iconset/icon_512x512@2x.png +0 -0
  107. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.png +0 -0
  108. xnft-0.1.0rc4/src/xnft/resources/icons/xnft.svg +30 -0
  109. xnft-0.1.0rc4/src/xnft/resources/icons/xnft_flat.png +0 -0
  110. xnft-0.1.0rc4/src/xnft/resources/icons/xnft_flat_192.png +0 -0
  111. xnft-0.1.0rc4/src/xnft/resources/logging.all.yaml +19 -0
  112. xnft-0.1.0rc4/src/xnft/resources/logging.dev.yaml +19 -0
  113. xnft-0.1.0rc4/src/xnft/resources/logos/emrg_logo.svg +194 -0
  114. xnft-0.1.0rc4/src/xnft/resources/logos/emrg_logo_vector.svg +33 -0
  115. xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo.png +0 -0
  116. xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo.svg +1 -0
  117. xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo_transparent.png +0 -0
  118. xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo_v2.png +0 -0
  119. xnft-0.1.0rc4/src/xnft/resources/logos/lemma_logo_v2.svg +8 -0
  120. xnft-0.1.0rc4/src/xnft/resources/paths.py +13 -0
@@ -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 | [![Pipeline Status](https://www.gitlab.msu.edu/ece-lemma/public/xnft/xnft/badges/main/pipeline.svg?ignore_skipped=true&job=test-job)](../../pipelines) ![Test Coverage](https://www.gitlab.msu.edu/ece-lemma/public/xnft/xnft/badges/main/coverage.svg) |
43
+ | Package | [![Latest Release](/../../badges/release.svg)](/../../releases) ![python: 3.12 , 3.13 , 3.14](https://img.shields.io/badge/python-3.12\|3.13\|3.14-orange) ![status: beta](https://img.shields.io/badge/status-beta-blue) |
44
+ | Meta | [![License: MIT](https://img.shields.io/badge/License-MIT-green)](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
+ ![xnft Screenshot](docs/images/xnft_screenshot.png)
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.