arpes-viewer 1.2.1__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 (147) hide show
  1. arpes_viewer-1.2.1/LICENSE.md +75 -0
  2. arpes_viewer-1.2.1/NOTICE +43 -0
  3. arpes_viewer-1.2.1/PKG-INFO +246 -0
  4. arpes_viewer-1.2.1/README.md +218 -0
  5. arpes_viewer-1.2.1/arpes_viewer/__init__.py +11 -0
  6. arpes_viewer-1.2.1/arpes_viewer/__main__.py +6 -0
  7. arpes_viewer-1.2.1/arpes_viewer/app.py +2867 -0
  8. arpes_viewer-1.2.1/arpes_viewer/loader/README.md +405 -0
  9. arpes_viewer-1.2.1/arpes_viewer/loader/__init__.py +13 -0
  10. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/__init__.py +6 -0
  11. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/alba.py +212 -0
  12. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/ape.py +57 -0
  13. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/bessy.py +87 -0
  14. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/cassiopee.py +1196 -0
  15. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/cassiopee_spin.py +541 -0
  16. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/diamond.py +280 -0
  17. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/maestro.py +1032 -0
  18. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/maxiv.py +33 -0
  19. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/sgm4.py +300 -0
  20. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/solaris.py +60 -0
  21. arpes_viewer-1.2.1/arpes_viewer/loader/beamlines/soleil.py +79 -0
  22. arpes_viewer-1.2.1/arpes_viewer/loader/cubecache.py +273 -0
  23. arpes_viewer-1.2.1/arpes_viewer/loader/formats/__init__.py +6 -0
  24. arpes_viewer-1.2.1/arpes_viewer/loader/formats/nexus_arpes.py +605 -0
  25. arpes_viewer-1.2.1/arpes_viewer/loader/formats/ses.py +790 -0
  26. arpes_viewer-1.2.1/arpes_viewer/loader/native.py +87 -0
  27. arpes_viewer-1.2.1/arpes_viewer/loader/nxs_file.py +2096 -0
  28. arpes_viewer-1.2.1/arpes_viewer/loader/registry.py +342 -0
  29. arpes_viewer-1.2.1/arpes_viewer/loader/session.py +531 -0
  30. arpes_viewer-1.2.1/arpes_viewer/tools/README.md +131 -0
  31. arpes_viewer-1.2.1/arpes_viewer/tools/__init__.py +16 -0
  32. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/__init__.py +8 -0
  33. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/bandfiles.py +1286 -0
  34. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/bands.py +615 -0
  35. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/bz2d.py +282 -0
  36. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/bz3d.py +557 -0
  37. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/cleavage.py +207 -0
  38. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/compare.py +279 -0
  39. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/fermisurface.py +254 -0
  40. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/highsym.py +370 -0
  41. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/last_crystal.py +83 -0
  42. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/lattice.py +379 -0
  43. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/moire.py +192 -0
  44. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/planecut.py +151 -0
  45. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/spacegroups.py +744 -0
  46. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/structure.py +578 -0
  47. arpes_viewer-1.2.1/arpes_viewer/tools/crystal/tightbinding.py +327 -0
  48. arpes_viewer-1.2.1/arpes_viewer/tools/momentum/README.md +97 -0
  49. arpes_viewer-1.2.1/arpes_viewer/tools/momentum/__init__.py +6 -0
  50. arpes_viewer-1.2.1/arpes_viewer/tools/momentum/cutk.py +292 -0
  51. arpes_viewer-1.2.1/arpes_viewer/tools/momentum/kspace.py +550 -0
  52. arpes_viewer-1.2.1/arpes_viewer/tools/momentum/kzconv.py +440 -0
  53. arpes_viewer-1.2.1/arpes_viewer/tools/momentum/kzmap.py +343 -0
  54. arpes_viewer-1.2.1/arpes_viewer/tools/momentum/rebin.py +129 -0
  55. arpes_viewer-1.2.1/arpes_viewer/tools/output/README.md +94 -0
  56. arpes_viewer-1.2.1/arpes_viewer/tools/output/__init__.py +6 -0
  57. arpes_viewer-1.2.1/arpes_viewer/tools/output/colormaps.py +68 -0
  58. arpes_viewer-1.2.1/arpes_viewer/tools/output/explog.py +826 -0
  59. arpes_viewer-1.2.1/arpes_viewer/tools/output/export.py +486 -0
  60. arpes_viewer-1.2.1/arpes_viewer/tools/output/figfile.py +429 -0
  61. arpes_viewer-1.2.1/arpes_viewer/tools/output/figure.py +1089 -0
  62. arpes_viewer-1.2.1/arpes_viewer/tools/output/igor.py +378 -0
  63. arpes_viewer-1.2.1/arpes_viewer/tools/processing/README.md +125 -0
  64. arpes_viewer-1.2.1/arpes_viewer/tools/processing/__init__.py +8 -0
  65. arpes_viewer-1.2.1/arpes_viewer/tools/processing/analysis.py +199 -0
  66. arpes_viewer-1.2.1/arpes_viewer/tools/processing/combine.py +276 -0
  67. arpes_viewer-1.2.1/arpes_viewer/tools/processing/cutops.py +508 -0
  68. arpes_viewer-1.2.1/arpes_viewer/tools/processing/dataops.py +262 -0
  69. arpes_viewer-1.2.1/arpes_viewer/tools/processing/degrid.py +626 -0
  70. arpes_viewer-1.2.1/arpes_viewer/tools/processing/detector.py +371 -0
  71. arpes_viewer-1.2.1/arpes_viewer/tools/processing/process.py +924 -0
  72. arpes_viewer-1.2.1/arpes_viewer/tools/processing/repeats.py +343 -0
  73. arpes_viewer-1.2.1/arpes_viewer/tools/processing/ridge.py +167 -0
  74. arpes_viewer-1.2.1/arpes_viewer/tools/processing/stackcuts.py +120 -0
  75. arpes_viewer-1.2.1/arpes_viewer/tools/processing/volume.py +793 -0
  76. arpes_viewer-1.2.1/arpes_viewer/tools/runtime/__init__.py +6 -0
  77. arpes_viewer-1.2.1/arpes_viewer/tools/runtime/console.py +89 -0
  78. arpes_viewer-1.2.1/arpes_viewer/tools/runtime/errorlog.py +183 -0
  79. arpes_viewer-1.2.1/arpes_viewer/tools/runtime/memory.py +151 -0
  80. arpes_viewer-1.2.1/arpes_viewer/tools/runtime/remembered.py +72 -0
  81. arpes_viewer-1.2.1/arpes_viewer/tools/runtime/system.py +100 -0
  82. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/README.md +184 -0
  83. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/__init__.py +7 -0
  84. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/corelevel.py +1175 -0
  85. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/corelevel_table.py +207 -0
  86. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/curves.py +254 -0
  87. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/dispersion.py +478 -0
  88. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/fermi.py +495 -0
  89. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/peaks.py +683 -0
  90. arpes_viewer-1.2.1/arpes_viewer/tools/spectra/spin.py +380 -0
  91. arpes_viewer-1.2.1/arpes_viewer/ui/README.md +229 -0
  92. arpes_viewer-1.2.1/arpes_viewer/ui/__init__.py +12 -0
  93. arpes_viewer-1.2.1/arpes_viewer/ui/common/__init__.py +8 -0
  94. arpes_viewer-1.2.1/arpes_viewer/ui/common/crashguard.py +68 -0
  95. arpes_viewer-1.2.1/arpes_viewer/ui/common/enterkeys.py +80 -0
  96. arpes_viewer-1.2.1/arpes_viewer/ui/common/gcguard.py +79 -0
  97. arpes_viewer-1.2.1/arpes_viewer/ui/common/jobs.py +426 -0
  98. arpes_viewer-1.2.1/arpes_viewer/ui/common/notify.py +23 -0
  99. arpes_viewer-1.2.1/arpes_viewer/ui/common/platform_style.py +55 -0
  100. arpes_viewer-1.2.1/arpes_viewer/ui/common/remember.py +143 -0
  101. arpes_viewer-1.2.1/arpes_viewer/ui/common/screen.py +161 -0
  102. arpes_viewer-1.2.1/arpes_viewer/ui/common/stepper.py +310 -0
  103. arpes_viewer-1.2.1/arpes_viewer/ui/launcher/__init__.py +6 -0
  104. arpes_viewer-1.2.1/arpes_viewer/ui/launcher/list_actions.py +162 -0
  105. arpes_viewer-1.2.1/arpes_viewer/ui/launcher/loader_dialog.py +307 -0
  106. arpes_viewer-1.2.1/arpes_viewer/ui/launcher/main_window.py +665 -0
  107. arpes_viewer-1.2.1/arpes_viewer/ui/panels/__init__.py +8 -0
  108. arpes_viewer-1.2.1/arpes_viewer/ui/panels/bandfinder.py +216 -0
  109. arpes_viewer-1.2.1/arpes_viewer/ui/panels/bands.py +2377 -0
  110. arpes_viewer-1.2.1/arpes_viewer/ui/panels/corelevel.py +1623 -0
  111. arpes_viewer-1.2.1/arpes_viewer/ui/panels/crystal.py +1428 -0
  112. arpes_viewer-1.2.1/arpes_viewer/ui/panels/cutops.py +543 -0
  113. arpes_viewer-1.2.1/arpes_viewer/ui/panels/degrid.py +530 -0
  114. arpes_viewer-1.2.1/arpes_viewer/ui/panels/detector.py +410 -0
  115. arpes_viewer-1.2.1/arpes_viewer/ui/panels/explog.py +732 -0
  116. arpes_viewer-1.2.1/arpes_viewer/ui/panels/figure.py +4275 -0
  117. arpes_viewer-1.2.1/arpes_viewer/ui/panels/fit.py +1637 -0
  118. arpes_viewer-1.2.1/arpes_viewer/ui/panels/fsview.py +469 -0
  119. arpes_viewer-1.2.1/arpes_viewer/ui/panels/kzconv.py +851 -0
  120. arpes_viewer-1.2.1/arpes_viewer/ui/panels/kzmap.py +365 -0
  121. arpes_viewer-1.2.1/arpes_viewer/ui/panels/process.py +1537 -0
  122. arpes_viewer-1.2.1/arpes_viewer/ui/panels/repeats.py +392 -0
  123. arpes_viewer-1.2.1/arpes_viewer/ui/panels/ridge.py +354 -0
  124. arpes_viewer-1.2.1/arpes_viewer/ui/panels/stackcuts.py +413 -0
  125. arpes_viewer-1.2.1/arpes_viewer/ui/panels/tightbinding.py +733 -0
  126. arpes_viewer-1.2.1/arpes_viewer/ui/panels/volume.py +2321 -0
  127. arpes_viewer-1.2.1/arpes_viewer/ui/viewers/__init__.py +7 -0
  128. arpes_viewer-1.2.1/arpes_viewer/ui/viewers/cursorlink.py +226 -0
  129. arpes_viewer-1.2.1/arpes_viewer/ui/viewers/curves.py +1407 -0
  130. arpes_viewer-1.2.1/arpes_viewer/ui/viewers/functions_menu.py +139 -0
  131. arpes_viewer-1.2.1/arpes_viewer/ui/viewers/plot_tools.py +762 -0
  132. arpes_viewer-1.2.1/arpes_viewer/ui/viewers/widgets.py +4967 -0
  133. arpes_viewer-1.2.1/arpes_viewer/ui/viewers/windows.py +6711 -0
  134. arpes_viewer-1.2.1/arpes_viewer/version.py +19 -0
  135. arpes_viewer-1.2.1/arpes_viewer.egg-info/PKG-INFO +246 -0
  136. arpes_viewer-1.2.1/arpes_viewer.egg-info/SOURCES.txt +145 -0
  137. arpes_viewer-1.2.1/arpes_viewer.egg-info/dependency_links.txt +1 -0
  138. arpes_viewer-1.2.1/arpes_viewer.egg-info/entry_points.txt +2 -0
  139. arpes_viewer-1.2.1/arpes_viewer.egg-info/requires.txt +5 -0
  140. arpes_viewer-1.2.1/arpes_viewer.egg-info/top_level.txt +1 -0
  141. arpes_viewer-1.2.1/pyproject.toml +47 -0
  142. arpes_viewer-1.2.1/setup.cfg +4 -0
  143. arpes_viewer-1.2.1/test/test_imports.py +231 -0
  144. arpes_viewer-1.2.1/test/test_mac_launcher.py +55 -0
  145. arpes_viewer-1.2.1/test/test_pypi_readme.py +16 -0
  146. arpes_viewer-1.2.1/test/test_version_consistency.py +36 -0
  147. arpes_viewer-1.2.1/test/test_windows_launch.py +111 -0
@@ -0,0 +1,75 @@
1
+ Required Notice: Copyright (c) 2026 Ding Pei (https://github.com/DingPei1995/ARPES-data-browser)
2
+
3
+ # PolyForm Noncommercial License 1.0.0
4
+
5
+ <https://polyformproject.org/licenses/noncommercial/1.0.0>
6
+
7
+ ## Acceptance
8
+
9
+ In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
10
+
11
+ ## Copyright License
12
+
13
+ The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
14
+
15
+ ## Distribution License
16
+
17
+ The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
18
+
19
+ ## Notices
20
+
21
+ You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
22
+
23
+ > Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
24
+
25
+ ## Changes and New Works License
26
+
27
+ The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
28
+
29
+ ## Patent License
30
+
31
+ The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
32
+
33
+ ## Noncommercial Purposes
34
+
35
+ Any noncommercial purpose is a permitted purpose.
36
+
37
+ ## Personal Uses
38
+
39
+ Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose.
40
+
41
+ ## Noncommercial Organizations
42
+
43
+ Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding.
44
+
45
+ ## Fair Use
46
+
47
+ You may have "fair use" rights for the software under the law. These terms do not limit them.
48
+
49
+ ## No Other Rights
50
+
51
+ These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
52
+
53
+ ## Patent Defense
54
+
55
+ If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
56
+
57
+ ## Violations
58
+
59
+ The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
60
+
61
+ ## No Liability
62
+
63
+ ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
64
+
65
+ ## Definitions
66
+
67
+ The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
68
+
69
+ **You** refers to the individual or entity agreeing to these terms.
70
+
71
+ **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
72
+
73
+ **Your licenses** are all the licenses granted to you for the software under these terms.
74
+
75
+ **Use** means anything you do with the software requiring one of your licenses.
@@ -0,0 +1,43 @@
1
+ ARPES viewer
2
+ Copyright (c) 2026 Ding Pei
3
+ https://github.com/DingPei1995/ARPES-data-browser
4
+
5
+ Licensed under the PolyForm Noncommercial License 1.0.0 (see LICENSE.md):
6
+ free for any noncommercial purpose -- research, teaching, personal use --
7
+ and not for commercial use.
8
+
9
+ Authorship
10
+ ----------
11
+ ARPES viewer is the work of Ding Pei. It began as Ding Pei's own earlier
12
+ code for ARPES data and was developed from it independently: it is not a
13
+ work made for hire, and no institution funded or commissioned it.
14
+
15
+ The requirements, the design decisions and their trade-offs, the choice of
16
+ what to build and what not to, the physics, the testing on real
17
+ experimental data and the feedback from it, and the review and acceptance
18
+ of every change are Ding Pei's. The real-data tests drew on the
19
+ measurements and calculations of these papers:
20
+ - Phys. Rev. B 103, 245121 (2021), https://doi.org/10.1103/PhysRevB.103.245121
21
+ - Phys. Rev. B 95, 125126 (2017), https://doi.org/10.1103/PhysRevB.95.125126
22
+
23
+ The implementation was carried out with the assistance of Claude, an AI
24
+ model by Anthropic, as a coding assistant working under Ding Pei's
25
+ direction; the commits it helped write name it as a
26
+ co-author ("Co-Authored-By: Claude").
27
+
28
+ Third-party data
29
+ ----------------
30
+ The X-ray line energies in the synthetic demo data, and the core-level
31
+ binding energies of the core-level check, are standard tabulated values
32
+ (the X-ray Data Booklet, Lawrence Berkeley National Laboratory; core levels
33
+ from its Table 1-1, J. A. Bearden & A. F. Burr).
34
+
35
+ The space-group tables (arpes_viewer/tools/crystal/spacegroups.py) were
36
+ generated once from the database of spglib (devtools/gen_spacegroups.py),
37
+ Copyright (c) Atsushi Togo, distributed under the BSD 3-Clause licence.
38
+
39
+ The colour tables (arpes_viewer/tools/output/colormaps.py) were converted
40
+ from a laboratory file, Colormap.mat, together with re-creations of
41
+ MATLAB's gray, jet, hsv, hot and copper (devtools/gen_colormaps.py). Several
42
+ of them carry the names of Igor Pro's colour tables; where they reproduce
43
+ those, they remain WaveMetrics' and are not covered by the licence above.
@@ -0,0 +1,246 @@
1
+ Metadata-Version: 2.4
2
+ Name: arpes-viewer
3
+ Version: 1.2.1
4
+ Summary: Browse, convert, analyse and compare ARPES data with calculations, and lay the results out as publication figures.
5
+ Author: Ding Pei
6
+ License-Expression: PolyForm-Noncommercial-1.0.0
7
+ Project-URL: Homepage, https://github.com/DingPei1995/ARPES-data-browser
8
+ Project-URL: Documentation, https://github.com/DingPei1995/ARPES-data-browser/blob/main/docs/USER_GUIDE_en.md
9
+ Project-URL: Issues, https://github.com/DingPei1995/ARPES-data-browser/issues
10
+ Project-URL: Changelog, https://github.com/DingPei1995/ARPES-data-browser/blob/main/CHANGELOG.md
11
+ Keywords: ARPES,photoemission,synchrotron,band structure,Fermi surface
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Environment :: X11 Applications :: Qt
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Scientific/Engineering :: Physics
17
+ Classifier: Topic :: Scientific/Engineering :: Visualization
18
+ Requires-Python: >=3.9
19
+ Description-Content-Type: text/markdown
20
+ License-File: LICENSE.md
21
+ License-File: NOTICE
22
+ Requires-Dist: PyQt5>=5.12
23
+ Requires-Dist: pyqtgraph>=0.12
24
+ Requires-Dist: numpy>=1.20
25
+ Requires-Dist: scipy>=1.6
26
+ Requires-Dist: h5py>=3.0
27
+ Dynamic: license-file
28
+
29
+ # ARPES viewer
30
+
31
+ **Version 1.2.1** (last modified 29 October 2026) — see
32
+ [CHANGELOG.md](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/CHANGELOG.md) for what changed. The version is in
33
+ `arpes_viewer/version.py` and is shown in the main window's title bar and at its foot,
34
+ with a link to this repository for bug reports and the latest version
35
+ (<https://github.com/DingPei1995/ARPES-data-browser>). Please quote it when
36
+ reporting a bug, and upload the error log with the report ([below](#bug-reports)).
37
+
38
+ > **Terms of use.** This program is for **non-commercial use only**
39
+ > (academic research and teaching); any commercial use is not permitted.
40
+ > New and updated loaders cover data from **public large-scale facilities**
41
+ > (synchrotrons and similar user facilities) only -- formats of individual
42
+ > laboratories' own set-ups are not supported. If you use this program for
43
+ > a paper on ARPES experiments, please cite this repository in its
44
+ > references (<https://github.com/DingPei1995/ARPES-data-browser>). A paper
45
+ > related to AI that uses this program or its code **must** first be
46
+ > discussed with the author by e-mail. For collaborations, or
47
+ > questions about the details, contact
48
+ > [ding.pei@synchrotron-soleil.fr](mailto:ding.pei@synchrotron-soleil.fr).
49
+ >
50
+ > **Licence and authorship.** Copyright (c) 2026 Ding Pei. Licensed under
51
+ > the [PolyForm Noncommercial License 1.0.0](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/LICENSE.md); see also
52
+ > [NOTICE](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/NOTICE). This is the author's personal work, developed from the
53
+ > author's own earlier code; no institution funded it. The requirements, design
54
+ > decisions, trade-offs, physics, the testing on real experimental data
55
+ > and the feedback from it (drawing on
56
+ > [Phys. Rev. B 103, 245121 (2021)](https://doi.org/10.1103/PhysRevB.103.245121) and
57
+ > [Phys. Rev. B 95, 125126 (2017)](https://doi.org/10.1103/PhysRevB.95.125126)),
58
+ > and the review and acceptance of every change are Ding Pei's; the
59
+ > implementation was assisted by Claude (Anthropic), credited as co-author
60
+ > in the commits.
61
+
62
+ A Python/PyQt5 program for ARPES data: browse the measurements of a
63
+ beamtime, open them in their own windows, convert to momentum, cut, fit,
64
+ process, compare with a band-structure calculation, and lay the results out
65
+ as a publication figure.
66
+
67
+ ---
68
+
69
+ ## From raw data to a publication figure -- and an AI agent can drive it
70
+
71
+ ![Example figure 1: a notched cube, measured and calculated constant-energy contours, stacked contours](https://raw.githubusercontent.com/DingPei1995/ARPES-data-browser/v1.2.1/docs/images/example_figure_1.png)
72
+
73
+ > **These are not real experimental data.** Every panel above is made from
74
+ > the program's **synthetic demo data** (`devtools/demo_data.py`): an
75
+ > invented tight-binding toy model -- a triangular lattice, a = 3.3 Å,
76
+ > stacked with c = 6 Å, a few bands with orbital labels and a k_z
77
+ > dispersion -- turned into spectra with a Fermi-Dirac cut-off, the
78
+ > analyser resolution and Poisson counting noise, and written as beamline
79
+ > files. The "calculation" in panel (b) is the same toy Hamiltonian made
80
+ > deliberately 1/0.8 times wider and 50 meV higher, so that comparing it
81
+ > with the "measurement" has something to find. **No published data or
82
+ > literature were used to generate them**: the model and its parameters are
83
+ > invented, and names such as "Se-pxy" or "1T-TiSe₂-like" are labels for the
84
+ > toy, not a description of a real material. (The only tabulated values in
85
+ > the demo set are the X-ray line energies of its synthetic EDS spectrum,
86
+ > standard emission energies as listed in the X-ray Data Booklet; that
87
+ > spectrum is not part of this figure.)
88
+
89
+ <p align="center">
90
+ <img src="https://raw.githubusercontent.com/DingPei1995/ARPES-data-browser/v1.2.1/docs/images/composer_colour_bar.png" width="96%"
91
+ alt="Example figure 1 in the figure composer, its colour bar being set">
92
+ </p>
93
+ <p align="center">
94
+ <img src="https://raw.githubusercontent.com/DingPei1995/ARPES-data-browser/v1.2.1/docs/images/main_window_advanced.png" width="50%"
95
+ alt="The main panel: the beamtime's datasets and the tools for the selected ones">
96
+ <img src="https://raw.githubusercontent.com/DingPei1995/ARPES-data-browser/v1.2.1/docs/images/map_k_contour.png" width="47%"
97
+ alt="A Fermi-surface map converted to momentum, in its viewer">
98
+ </p>
99
+ <p align="center"><sub>Example figure 1 in the figure composer (top); the
100
+ main panel and a Fermi-surface map in momentum, in its viewer (bottom) --
101
+ also on the synthetic demo data.</sub></p>
102
+
103
+ Every step from the files to the finished figure is the program's own,
104
+ and every step is plain Python that a script -- or an **AI agent** -- can
105
+ run, without a screen:
106
+
107
+ | Step | In the program | In code |
108
+ |---|---|---|
109
+ | 1. Raw data | the beamline files, as the main panel lists them | `arpes_viewer.loader.registry.load(path, entry)` |
110
+ | 2. To momentum | the Γ-plane Fermi-surface map → k-map | `arpes_viewer.tools.momentum.kspace.convert_map(...)` |
111
+ | 3. The calculation | **Calculated bands**: a Wannier Hamiltonian; Z and the shift fitted on a cut | `BandsDialog.open_file(...)`, `.fit_alignment()` |
112
+ | 4. Measured vs calculated | constant-energy maps over the calculated contours, coloured by orbital weight (b) | `BandsDialog.series_panels(...)` |
113
+ | 5. 3-D views | the notched cube (a), the stacked contours (c) | `VolumeWindow(...).figure_panel()` |
114
+ | 6. The figure | the **figure composer**: arranged, lettered, exported as PNG / PDF, saved as `.afig` with the data and the files it came from | `FigureWindow(...)`, `.arrange(...)`, `.write(...)` |
115
+
116
+ `devtools/figure_tests.py` is exactly this script -- it writes the demo
117
+ files, reads them back, and builds this figure (and its companion, example
118
+ figure 2) in under a minute:
119
+
120
+ ```
121
+ python devtools/figure_tests.py out_png/ out_afig/
122
+ ```
123
+
124
+ In the step 3 fit it recovers what was built into the demo calculation
125
+ (Z = 0.798 ± 0.001 and a shift of −49.8 ± 0.4 meV, against 0.8 and −50 meV).
126
+
127
+ **Why an AI agent can drive it.** The computations live in `arpes_viewer/tools/`,
128
+ free of any user interface; the windows can run off-screen
129
+ (`QT_QPA_PLATFORM=offscreen`) and be driven call by call as a user drives
130
+ them; each step is documented in the [user guide](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md)
131
+ and in the technical references beside the code; and a saved figure records
132
+ the data and the original files behind every panel. So a coding agent given
133
+ this repository and a folder of data can be asked in plain words -- *"convert
134
+ the Γ-plane map to momentum, compare it with the Wannier calculation in
135
+ `calc/`, and make a figure like example figure 1, with constant-energy maps
136
+ at E_F, −0.3, −0.6 and −0.9 eV"* -- write and run the script, look at the
137
+ PNG it made, and refine it, through to a figure ready for a manuscript. The
138
+ user guide's [worked example](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#30-worked-example-two-figures-in-the-figure-composer)
139
+ does the same by hand, step by step. As with any analysis, check what an
140
+ agent produced before you publish it -- and see the terms of use above for
141
+ papers related to AI.
142
+
143
+ ---
144
+
145
+ ## What it does
146
+
147
+ - **Reads** SOLEIL ANTARES and CASSIOPEE (including whole folders and the
148
+ spin end station), ALS MAESTRO, ALBA LOREA, Diamond I05 and I05-1, MAX IV
149
+ Bloch, Elettra APE, BESSY One Cube / One Square, SOLARIS URANOS, ASTRID2
150
+ SGM4, and its own saved format ([loading data](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#4-loading-data)).
151
+ - **Shows** cuts, Fermi-surface maps, photon-energy scans, spatially resolved
152
+ scans and spin-resolved curves, each in its own window with linked cursors
153
+ ([the viewers](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#5-what-the-viewers-have-in-common)).
154
+ - **Converts** maps and cuts to momentum, photon-energy scans to k_z, with the
155
+ Brillouin zone drawn over them
156
+ ([§13](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#13-converting-a-map-to-momentum),
157
+ [§14](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#14-photon-energy-scans-kz),
158
+ [§15](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#15-brillouin-zone)).
159
+ - **Analyses**: Fermi-edge fits, Fermi-surface correction, MDC / EDC fits,
160
+ ridge detection, curvature and second derivatives, dichroism, core levels,
161
+ spin, de-gridding, detector corrections
162
+ ([§7–§24](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#7-arbitrary-cuts-and-fermi-surface-correction)).
163
+ - **Compares with theory**: crystal structures, tight-binding fits, and
164
+ calculated bands from Wien2k, VASP, Quantum ESPRESSO, Wannier90 and the
165
+ FPLO + Wannier tools -- along a path, as constant-energy contours on any
166
+ (hkl) plane, or as a 3-D Fermi surface
167
+ ([§25–§27](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#27-calculated-bands)).
168
+ - **Makes figures**: the figure composer, laid out like a manuscript page,
169
+ exported as PNG, PDF or SVG, and saved with its data
170
+ ([§28–§30](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#28-the-figure-composer)).
171
+ - **Loses nothing**: every derived dataset is autosaved, a crash is recovered
172
+ from, and long steps show a progress bar
173
+ ([§31](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#31-autosave-memory-and-recovery)).
174
+
175
+ ---
176
+
177
+ ## Installing and starting
178
+
179
+ Needs Python 3.9+. With pip, which installs PyQt5, pyqtgraph, numpy,
180
+ h5py and scipy with it:
181
+
182
+ ```
183
+ pip install arpes-viewer
184
+ arpes-viewer
185
+ ```
186
+
187
+ (`python -m arpes_viewer` does the same; for the latest, unreleased
188
+ version: `pip install git+https://github.com/DingPei1995/ARPES-data-browser`.)
189
+ Installed this way, the error logs go to `~/.arpes_viewer/error_logs/`.
190
+
191
+ From a downloaded copy of this repository, with those packages installed:
192
+
193
+ ```
194
+ python ARPES_viewer.py
195
+ ```
196
+
197
+ - **Windows:** double-click **`ARPES viewer.pyw`** in this folder: no
198
+ console window to close by mistake (the output goes to
199
+ `~/.arpes_viewer/launcher.log`).
200
+ - **macOS:** double-click **`ARPES viewer.app`** in this folder. It finds a
201
+ Python that has the packages (conda included), remembers it, and says what
202
+ to install if none has. The first time, if macOS calls it an app from an
203
+ unidentified developer: **System Settings → Privacy & Security → Open
204
+ Anyway**.
205
+ - **No beamtime at hand?** `python devtools/demo_data.py` writes the
206
+ synthetic demo data above to `demo_data/`
207
+ ([trying it with demo data](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#2-trying-it-with-demo-data)).
208
+
209
+ ---
210
+
211
+ ## Bug reports
212
+
213
+ The program saves what went wrong by itself, in
214
+ `error_logs/errors_<date>_<time>.txt` in its folder (in `~/.arpes_viewer/` when installed with pip), and keeps running. With
215
+ a bug report on [GitHub Issues](https://github.com/DingPei1995/ARPES-data-browser/issues),
216
+ **upload that file** (drag it into the text box) **or paste its text** -- the
217
+ main panel's foot has **Copy the newest error log** and **Open the error
218
+ logs** -- and give the version number.
219
+
220
+ ---
221
+
222
+ ## Documentation
223
+
224
+ - **User guide**, with screenshots: [English](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md) ·
225
+ [中文](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_zh.md) · [Français](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_fr.md); as PDF:
226
+ [English](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/pdf/ARPES_viewer_user_guide_en.pdf) ·
227
+ [中文](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/pdf/ARPES_viewer_user_guide_zh.pdf) ·
228
+ [Français](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/pdf/ARPES_viewer_user_guide_fr.pdf).
229
+ - **What changed, and why**: [CHANGELOG.md](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/CHANGELOG.md).
230
+ - **Technical references**, beside the code they describe -- the formulas,
231
+ the file layouts, the assumptions and the tests behind each step:
232
+ - [Reading data](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/loader/README.md) -- every facility's files, the data
233
+ kinds, adding a beamline, the assumptions the formats force;
234
+ - [The windows](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/ui/README.md) -- the main panel, the viewers, autosave
235
+ and recovery, long operations;
236
+ - [Analysis](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/README.md) -- what each tool does and what it assumes;
237
+ the tools ported from the MATLAB programs;
238
+ - [Momentum conversion](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/momentum/README.md) -- k conversion, k_z
239
+ maps;
240
+ - [Spectra](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/spectra/README.md) -- core levels, curves, curve fits,
241
+ spin;
242
+ - [Processing](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/processing/README.md) -- de-gridding, cut
243
+ arithmetic;
244
+ - [Figures, export and the experiment log](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/output/README.md);
245
+ - [For developers](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/DEVELOPER.md) -- the layout of the code, and the
246
+ tests (`python -m pytest`).
@@ -0,0 +1,218 @@
1
+ # ARPES viewer
2
+
3
+ **Version 1.2.1** (last modified 29 October 2026) — see
4
+ [CHANGELOG.md](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/CHANGELOG.md) for what changed. The version is in
5
+ `arpes_viewer/version.py` and is shown in the main window's title bar and at its foot,
6
+ with a link to this repository for bug reports and the latest version
7
+ (<https://github.com/DingPei1995/ARPES-data-browser>). Please quote it when
8
+ reporting a bug, and upload the error log with the report ([below](#bug-reports)).
9
+
10
+ > **Terms of use.** This program is for **non-commercial use only**
11
+ > (academic research and teaching); any commercial use is not permitted.
12
+ > New and updated loaders cover data from **public large-scale facilities**
13
+ > (synchrotrons and similar user facilities) only -- formats of individual
14
+ > laboratories' own set-ups are not supported. If you use this program for
15
+ > a paper on ARPES experiments, please cite this repository in its
16
+ > references (<https://github.com/DingPei1995/ARPES-data-browser>). A paper
17
+ > related to AI that uses this program or its code **must** first be
18
+ > discussed with the author by e-mail. For collaborations, or
19
+ > questions about the details, contact
20
+ > [ding.pei@synchrotron-soleil.fr](mailto:ding.pei@synchrotron-soleil.fr).
21
+ >
22
+ > **Licence and authorship.** Copyright (c) 2026 Ding Pei. Licensed under
23
+ > the [PolyForm Noncommercial License 1.0.0](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/LICENSE.md); see also
24
+ > [NOTICE](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/NOTICE). This is the author's personal work, developed from the
25
+ > author's own earlier code; no institution funded it. The requirements, design
26
+ > decisions, trade-offs, physics, the testing on real experimental data
27
+ > and the feedback from it (drawing on
28
+ > [Phys. Rev. B 103, 245121 (2021)](https://doi.org/10.1103/PhysRevB.103.245121) and
29
+ > [Phys. Rev. B 95, 125126 (2017)](https://doi.org/10.1103/PhysRevB.95.125126)),
30
+ > and the review and acceptance of every change are Ding Pei's; the
31
+ > implementation was assisted by Claude (Anthropic), credited as co-author
32
+ > in the commits.
33
+
34
+ A Python/PyQt5 program for ARPES data: browse the measurements of a
35
+ beamtime, open them in their own windows, convert to momentum, cut, fit,
36
+ process, compare with a band-structure calculation, and lay the results out
37
+ as a publication figure.
38
+
39
+ ---
40
+
41
+ ## From raw data to a publication figure -- and an AI agent can drive it
42
+
43
+ ![Example figure 1: a notched cube, measured and calculated constant-energy contours, stacked contours](https://raw.githubusercontent.com/DingPei1995/ARPES-data-browser/v1.2.1/docs/images/example_figure_1.png)
44
+
45
+ > **These are not real experimental data.** Every panel above is made from
46
+ > the program's **synthetic demo data** (`devtools/demo_data.py`): an
47
+ > invented tight-binding toy model -- a triangular lattice, a = 3.3 Å,
48
+ > stacked with c = 6 Å, a few bands with orbital labels and a k_z
49
+ > dispersion -- turned into spectra with a Fermi-Dirac cut-off, the
50
+ > analyser resolution and Poisson counting noise, and written as beamline
51
+ > files. The "calculation" in panel (b) is the same toy Hamiltonian made
52
+ > deliberately 1/0.8 times wider and 50 meV higher, so that comparing it
53
+ > with the "measurement" has something to find. **No published data or
54
+ > literature were used to generate them**: the model and its parameters are
55
+ > invented, and names such as "Se-pxy" or "1T-TiSe₂-like" are labels for the
56
+ > toy, not a description of a real material. (The only tabulated values in
57
+ > the demo set are the X-ray line energies of its synthetic EDS spectrum,
58
+ > standard emission energies as listed in the X-ray Data Booklet; that
59
+ > spectrum is not part of this figure.)
60
+
61
+ <p align="center">
62
+ <img src="https://raw.githubusercontent.com/DingPei1995/ARPES-data-browser/v1.2.1/docs/images/composer_colour_bar.png" width="96%"
63
+ alt="Example figure 1 in the figure composer, its colour bar being set">
64
+ </p>
65
+ <p align="center">
66
+ <img src="https://raw.githubusercontent.com/DingPei1995/ARPES-data-browser/v1.2.1/docs/images/main_window_advanced.png" width="50%"
67
+ alt="The main panel: the beamtime's datasets and the tools for the selected ones">
68
+ <img src="https://raw.githubusercontent.com/DingPei1995/ARPES-data-browser/v1.2.1/docs/images/map_k_contour.png" width="47%"
69
+ alt="A Fermi-surface map converted to momentum, in its viewer">
70
+ </p>
71
+ <p align="center"><sub>Example figure 1 in the figure composer (top); the
72
+ main panel and a Fermi-surface map in momentum, in its viewer (bottom) --
73
+ also on the synthetic demo data.</sub></p>
74
+
75
+ Every step from the files to the finished figure is the program's own,
76
+ and every step is plain Python that a script -- or an **AI agent** -- can
77
+ run, without a screen:
78
+
79
+ | Step | In the program | In code |
80
+ |---|---|---|
81
+ | 1. Raw data | the beamline files, as the main panel lists them | `arpes_viewer.loader.registry.load(path, entry)` |
82
+ | 2. To momentum | the Γ-plane Fermi-surface map → k-map | `arpes_viewer.tools.momentum.kspace.convert_map(...)` |
83
+ | 3. The calculation | **Calculated bands**: a Wannier Hamiltonian; Z and the shift fitted on a cut | `BandsDialog.open_file(...)`, `.fit_alignment()` |
84
+ | 4. Measured vs calculated | constant-energy maps over the calculated contours, coloured by orbital weight (b) | `BandsDialog.series_panels(...)` |
85
+ | 5. 3-D views | the notched cube (a), the stacked contours (c) | `VolumeWindow(...).figure_panel()` |
86
+ | 6. The figure | the **figure composer**: arranged, lettered, exported as PNG / PDF, saved as `.afig` with the data and the files it came from | `FigureWindow(...)`, `.arrange(...)`, `.write(...)` |
87
+
88
+ `devtools/figure_tests.py` is exactly this script -- it writes the demo
89
+ files, reads them back, and builds this figure (and its companion, example
90
+ figure 2) in under a minute:
91
+
92
+ ```
93
+ python devtools/figure_tests.py out_png/ out_afig/
94
+ ```
95
+
96
+ In the step 3 fit it recovers what was built into the demo calculation
97
+ (Z = 0.798 ± 0.001 and a shift of −49.8 ± 0.4 meV, against 0.8 and −50 meV).
98
+
99
+ **Why an AI agent can drive it.** The computations live in `arpes_viewer/tools/`,
100
+ free of any user interface; the windows can run off-screen
101
+ (`QT_QPA_PLATFORM=offscreen`) and be driven call by call as a user drives
102
+ them; each step is documented in the [user guide](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md)
103
+ and in the technical references beside the code; and a saved figure records
104
+ the data and the original files behind every panel. So a coding agent given
105
+ this repository and a folder of data can be asked in plain words -- *"convert
106
+ the Γ-plane map to momentum, compare it with the Wannier calculation in
107
+ `calc/`, and make a figure like example figure 1, with constant-energy maps
108
+ at E_F, −0.3, −0.6 and −0.9 eV"* -- write and run the script, look at the
109
+ PNG it made, and refine it, through to a figure ready for a manuscript. The
110
+ user guide's [worked example](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#30-worked-example-two-figures-in-the-figure-composer)
111
+ does the same by hand, step by step. As with any analysis, check what an
112
+ agent produced before you publish it -- and see the terms of use above for
113
+ papers related to AI.
114
+
115
+ ---
116
+
117
+ ## What it does
118
+
119
+ - **Reads** SOLEIL ANTARES and CASSIOPEE (including whole folders and the
120
+ spin end station), ALS MAESTRO, ALBA LOREA, Diamond I05 and I05-1, MAX IV
121
+ Bloch, Elettra APE, BESSY One Cube / One Square, SOLARIS URANOS, ASTRID2
122
+ SGM4, and its own saved format ([loading data](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#4-loading-data)).
123
+ - **Shows** cuts, Fermi-surface maps, photon-energy scans, spatially resolved
124
+ scans and spin-resolved curves, each in its own window with linked cursors
125
+ ([the viewers](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#5-what-the-viewers-have-in-common)).
126
+ - **Converts** maps and cuts to momentum, photon-energy scans to k_z, with the
127
+ Brillouin zone drawn over them
128
+ ([§13](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#13-converting-a-map-to-momentum),
129
+ [§14](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#14-photon-energy-scans-kz),
130
+ [§15](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#15-brillouin-zone)).
131
+ - **Analyses**: Fermi-edge fits, Fermi-surface correction, MDC / EDC fits,
132
+ ridge detection, curvature and second derivatives, dichroism, core levels,
133
+ spin, de-gridding, detector corrections
134
+ ([§7–§24](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#7-arbitrary-cuts-and-fermi-surface-correction)).
135
+ - **Compares with theory**: crystal structures, tight-binding fits, and
136
+ calculated bands from Wien2k, VASP, Quantum ESPRESSO, Wannier90 and the
137
+ FPLO + Wannier tools -- along a path, as constant-energy contours on any
138
+ (hkl) plane, or as a 3-D Fermi surface
139
+ ([§25–§27](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#27-calculated-bands)).
140
+ - **Makes figures**: the figure composer, laid out like a manuscript page,
141
+ exported as PNG, PDF or SVG, and saved with its data
142
+ ([§28–§30](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#28-the-figure-composer)).
143
+ - **Loses nothing**: every derived dataset is autosaved, a crash is recovered
144
+ from, and long steps show a progress bar
145
+ ([§31](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#31-autosave-memory-and-recovery)).
146
+
147
+ ---
148
+
149
+ ## Installing and starting
150
+
151
+ Needs Python 3.9+. With pip, which installs PyQt5, pyqtgraph, numpy,
152
+ h5py and scipy with it:
153
+
154
+ ```
155
+ pip install arpes-viewer
156
+ arpes-viewer
157
+ ```
158
+
159
+ (`python -m arpes_viewer` does the same; for the latest, unreleased
160
+ version: `pip install git+https://github.com/DingPei1995/ARPES-data-browser`.)
161
+ Installed this way, the error logs go to `~/.arpes_viewer/error_logs/`.
162
+
163
+ From a downloaded copy of this repository, with those packages installed:
164
+
165
+ ```
166
+ python ARPES_viewer.py
167
+ ```
168
+
169
+ - **Windows:** double-click **`ARPES viewer.pyw`** in this folder: no
170
+ console window to close by mistake (the output goes to
171
+ `~/.arpes_viewer/launcher.log`).
172
+ - **macOS:** double-click **`ARPES viewer.app`** in this folder. It finds a
173
+ Python that has the packages (conda included), remembers it, and says what
174
+ to install if none has. The first time, if macOS calls it an app from an
175
+ unidentified developer: **System Settings → Privacy & Security → Open
176
+ Anyway**.
177
+ - **No beamtime at hand?** `python devtools/demo_data.py` writes the
178
+ synthetic demo data above to `demo_data/`
179
+ ([trying it with demo data](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md#2-trying-it-with-demo-data)).
180
+
181
+ ---
182
+
183
+ ## Bug reports
184
+
185
+ The program saves what went wrong by itself, in
186
+ `error_logs/errors_<date>_<time>.txt` in its folder (in `~/.arpes_viewer/` when installed with pip), and keeps running. With
187
+ a bug report on [GitHub Issues](https://github.com/DingPei1995/ARPES-data-browser/issues),
188
+ **upload that file** (drag it into the text box) **or paste its text** -- the
189
+ main panel's foot has **Copy the newest error log** and **Open the error
190
+ logs** -- and give the version number.
191
+
192
+ ---
193
+
194
+ ## Documentation
195
+
196
+ - **User guide**, with screenshots: [English](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_en.md) ·
197
+ [中文](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_zh.md) · [Français](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/USER_GUIDE_fr.md); as PDF:
198
+ [English](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/pdf/ARPES_viewer_user_guide_en.pdf) ·
199
+ [中文](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/pdf/ARPES_viewer_user_guide_zh.pdf) ·
200
+ [Français](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/pdf/ARPES_viewer_user_guide_fr.pdf).
201
+ - **What changed, and why**: [CHANGELOG.md](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/CHANGELOG.md).
202
+ - **Technical references**, beside the code they describe -- the formulas,
203
+ the file layouts, the assumptions and the tests behind each step:
204
+ - [Reading data](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/loader/README.md) -- every facility's files, the data
205
+ kinds, adding a beamline, the assumptions the formats force;
206
+ - [The windows](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/ui/README.md) -- the main panel, the viewers, autosave
207
+ and recovery, long operations;
208
+ - [Analysis](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/README.md) -- what each tool does and what it assumes;
209
+ the tools ported from the MATLAB programs;
210
+ - [Momentum conversion](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/momentum/README.md) -- k conversion, k_z
211
+ maps;
212
+ - [Spectra](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/spectra/README.md) -- core levels, curves, curve fits,
213
+ spin;
214
+ - [Processing](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/processing/README.md) -- de-gridding, cut
215
+ arithmetic;
216
+ - [Figures, export and the experiment log](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/arpes_viewer/tools/output/README.md);
217
+ - [For developers](https://github.com/DingPei1995/ARPES-data-browser/blob/v1.2.1/docs/DEVELOPER.md) -- the layout of the code, and the
218
+ tests (`python -m pytest`).
@@ -0,0 +1,11 @@
1
+ """ARPES viewer: browse, convert, analyse and lay out ARPES data as
2
+ publication figures. ``arpes-viewer`` (or ``python -m arpes_viewer``)
3
+ starts the program; :mod:`arpes_viewer.tools` holds the computations, free
4
+ of any user interface, for scripts.
5
+
6
+ Copyright (c) 2026 Ding Pei. Licensed under the PolyForm Noncommercial
7
+ License 1.0.0 (LICENSE.md).
8
+ """
9
+ from arpes_viewer.version import VERSION as __version__
10
+
11
+ __all__ = ["__version__"]
@@ -0,0 +1,6 @@
1
+ """``python -m arpes_viewer``: start the program."""
2
+ import sys
3
+
4
+ from arpes_viewer.app import main
5
+
6
+ sys.exit(main())