shnitsel-tools 2026.1.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 (175) hide show
  1. shnitsel_tools-2026.1.1/LICENSE +21 -0
  2. shnitsel_tools-2026.1.1/PKG-INFO +392 -0
  3. shnitsel_tools-2026.1.1/README.md +335 -0
  4. shnitsel_tools-2026.1.1/pyproject.toml +146 -0
  5. shnitsel_tools-2026.1.1/setup.cfg +4 -0
  6. shnitsel_tools-2026.1.1/shnitsel/__init__.py +37 -0
  7. shnitsel_tools-2026.1.1/shnitsel/_accessors.py +244 -0
  8. shnitsel_tools-2026.1.1/shnitsel/_contracts.py +80 -0
  9. shnitsel_tools-2026.1.1/shnitsel/_generated_accessors.py +511 -0
  10. shnitsel_tools-2026.1.1/shnitsel/_state.py +11 -0
  11. shnitsel_tools-2026.1.1/shnitsel/analyze/__init__.py +0 -0
  12. shnitsel_tools-2026.1.1/shnitsel/analyze/generic.py +314 -0
  13. shnitsel_tools-2026.1.1/shnitsel/analyze/hops.py +504 -0
  14. shnitsel_tools-2026.1.1/shnitsel/analyze/lda.py +73 -0
  15. shnitsel_tools-2026.1.1/shnitsel/analyze/pca.py +806 -0
  16. shnitsel_tools-2026.1.1/shnitsel/analyze/pls.py +130 -0
  17. shnitsel_tools-2026.1.1/shnitsel/analyze/populations.py +314 -0
  18. shnitsel_tools-2026.1.1/shnitsel/analyze/spectra.py +716 -0
  19. shnitsel_tools-2026.1.1/shnitsel/analyze/stats.py +328 -0
  20. shnitsel_tools-2026.1.1/shnitsel/bridges.py +409 -0
  21. shnitsel_tools-2026.1.1/shnitsel/clean/__init__.py +281 -0
  22. shnitsel_tools-2026.1.1/shnitsel/clean/common.py +390 -0
  23. shnitsel_tools-2026.1.1/shnitsel/clean/dispatch_plots.py +52 -0
  24. shnitsel_tools-2026.1.1/shnitsel/clean/filter_energy.py +283 -0
  25. shnitsel_tools-2026.1.1/shnitsel/clean/filter_geo.py +272 -0
  26. shnitsel_tools-2026.1.1/shnitsel/clean/filtration_class.py +140 -0
  27. shnitsel_tools-2026.1.1/shnitsel/cli/convert_to_shnitsel.py +243 -0
  28. shnitsel_tools-2026.1.1/shnitsel/cli/generate_datasheet.py +248 -0
  29. shnitsel_tools-2026.1.1/shnitsel/cli/merge_shnitsel_files.py +117 -0
  30. shnitsel_tools-2026.1.1/shnitsel/core/__init__.py +1 -0
  31. shnitsel_tools-2026.1.1/shnitsel/core/_api_info.py +55 -0
  32. shnitsel_tools-2026.1.1/shnitsel/core/feature_detection.py +19 -0
  33. shnitsel_tools-2026.1.1/shnitsel/core/typedefs.py +60 -0
  34. shnitsel_tools-2026.1.1/shnitsel/data/__init__.py +0 -0
  35. shnitsel_tools-2026.1.1/shnitsel/data/atom_helpers.py +130 -0
  36. shnitsel_tools-2026.1.1/shnitsel/data/charge_helpers.py +92 -0
  37. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/__init__.py +153 -0
  38. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/data_series.py +392 -0
  39. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/dataset_vis.py +65 -0
  40. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/frames.py +151 -0
  41. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/inter_state.py +132 -0
  42. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/multi_layered.py +117 -0
  43. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/multi_series.py +94 -0
  44. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/multi_stacked.py +107 -0
  45. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/per_state.py +109 -0
  46. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/shared.py +693 -0
  47. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/trajectory.py +95 -0
  48. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/trajectory_collection.py +16 -0
  49. shnitsel_tools-2026.1.1/shnitsel/data/dataset_containers/xr_conversion.py +184 -0
  50. shnitsel_tools-2026.1.1/shnitsel/data/helpers.py +302 -0
  51. shnitsel_tools-2026.1.1/shnitsel/data/multi_indices.py +727 -0
  52. shnitsel_tools-2026.1.1/shnitsel/data/proxy_class.py +150 -0
  53. shnitsel_tools-2026.1.1/shnitsel/data/shnitsel_db/__init__.py +0 -0
  54. shnitsel_tools-2026.1.1/shnitsel/data/shnitsel_db/db_function_decorator.py +228 -0
  55. shnitsel_tools-2026.1.1/shnitsel/data/shnitsel_db_helpers.py +199 -0
  56. shnitsel_tools-2026.1.1/shnitsel/data/state_helpers.py +315 -0
  57. shnitsel_tools-2026.1.1/shnitsel/data/traj_combiner_methods.py +778 -0
  58. shnitsel_tools-2026.1.1/shnitsel/data/trajectory_grouping_params.py +12 -0
  59. shnitsel_tools-2026.1.1/shnitsel/data/trajectory_variable_description.py +38 -0
  60. shnitsel_tools-2026.1.1/shnitsel/data/tree/__init__.py +26 -0
  61. shnitsel_tools-2026.1.1/shnitsel/data/tree/child_support_functions.py +85 -0
  62. shnitsel_tools-2026.1.1/shnitsel/data/tree/compound.py +241 -0
  63. shnitsel_tools-2026.1.1/shnitsel/data/tree/data_group.py +308 -0
  64. shnitsel_tools-2026.1.1/shnitsel/data/tree/data_leaf.py +216 -0
  65. shnitsel_tools-2026.1.1/shnitsel/data/tree/datatree_level.py +18 -0
  66. shnitsel_tools-2026.1.1/shnitsel/data/tree/node.py +1572 -0
  67. shnitsel_tools-2026.1.1/shnitsel/data/tree/selection.py +467 -0
  68. shnitsel_tools-2026.1.1/shnitsel/data/tree/support_functions.py +324 -0
  69. shnitsel_tools-2026.1.1/shnitsel/data/tree/tree.py +422 -0
  70. shnitsel_tools-2026.1.1/shnitsel/data/tree/tree_completion.py +133 -0
  71. shnitsel_tools-2026.1.1/shnitsel/data/tree/tree_vis.py +286 -0
  72. shnitsel_tools-2026.1.1/shnitsel/data/tree/xr_conversion.py +333 -0
  73. shnitsel_tools-2026.1.1/shnitsel/data/xr_io_compatibility.py +83 -0
  74. shnitsel_tools-2026.1.1/shnitsel/data/xr_io_registry.py +95 -0
  75. shnitsel_tools-2026.1.1/shnitsel/filtering/__init__.py +22 -0
  76. shnitsel_tools-2026.1.1/shnitsel/filtering/helpers.py +135 -0
  77. shnitsel_tools-2026.1.1/shnitsel/filtering/state_selection.py +2328 -0
  78. shnitsel_tools-2026.1.1/shnitsel/filtering/structure_selection.py +2430 -0
  79. shnitsel_tools-2026.1.1/shnitsel/geo/__init__.py +4 -0
  80. shnitsel_tools-2026.1.1/shnitsel/geo/alignment.py +208 -0
  81. shnitsel_tools-2026.1.1/shnitsel/geo/analogs.py +646 -0
  82. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc.py +225 -0
  83. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc_/algebra.py +145 -0
  84. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc_/angles.py +279 -0
  85. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc_/bla_chromophor.py +181 -0
  86. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc_/dihedrals.py +415 -0
  87. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc_/distances.py +157 -0
  88. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc_/helpers.py +106 -0
  89. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc_/positions.py +141 -0
  90. shnitsel_tools-2026.1.1/shnitsel/geo/geocalc_/pyramids.py +311 -0
  91. shnitsel_tools-2026.1.1/shnitsel/io/__init__.py +11 -0
  92. shnitsel_tools-2026.1.1/shnitsel/io/ase/__init__.py +4 -0
  93. shnitsel_tools-2026.1.1/shnitsel/io/ase/format_reader.py +231 -0
  94. shnitsel_tools-2026.1.1/shnitsel/io/ase/parse.py +1353 -0
  95. shnitsel_tools-2026.1.1/shnitsel/io/ase/write.py +435 -0
  96. shnitsel_tools-2026.1.1/shnitsel/io/format_reader_base.py +581 -0
  97. shnitsel_tools-2026.1.1/shnitsel/io/format_registry.py +79 -0
  98. shnitsel_tools-2026.1.1/shnitsel/io/molcas/molcas_opt.py +90 -0
  99. shnitsel_tools-2026.1.1/shnitsel/io/newtonx/__init__.py +3 -0
  100. shnitsel_tools-2026.1.1/shnitsel/io/newtonx/format_reader.py +238 -0
  101. shnitsel_tools-2026.1.1/shnitsel/io/newtonx/parse.py +840 -0
  102. shnitsel_tools-2026.1.1/shnitsel/io/pyrai2md/__init__.py +3 -0
  103. shnitsel_tools-2026.1.1/shnitsel/io/pyrai2md/format_reader.py +233 -0
  104. shnitsel_tools-2026.1.1/shnitsel/io/pyrai2md/parse.py +778 -0
  105. shnitsel_tools-2026.1.1/shnitsel/io/read.py +1070 -0
  106. shnitsel_tools-2026.1.1/shnitsel/io/sharc/__init__.py +5 -0
  107. shnitsel_tools-2026.1.1/shnitsel/io/sharc/format_reader.py +332 -0
  108. shnitsel_tools-2026.1.1/shnitsel/io/sharc/parse_initial_conditions.py +1026 -0
  109. shnitsel_tools-2026.1.1/shnitsel/io/sharc/parse_trajectory.py +849 -0
  110. shnitsel_tools-2026.1.1/shnitsel/io/sharc/qm_helpers.py +173 -0
  111. shnitsel_tools-2026.1.1/shnitsel/io/shared/helpers.py +215 -0
  112. shnitsel_tools-2026.1.1/shnitsel/io/shared/messages.py +180 -0
  113. shnitsel_tools-2026.1.1/shnitsel/io/shared/trajectory_finalization.py +287 -0
  114. shnitsel_tools-2026.1.1/shnitsel/io/shared/trajectory_setup.py +556 -0
  115. shnitsel_tools-2026.1.1/shnitsel/io/shared/variable_flagging.py +101 -0
  116. shnitsel_tools-2026.1.1/shnitsel/io/shnitsel/__init__.py +4 -0
  117. shnitsel_tools-2026.1.1/shnitsel/io/shnitsel/format_reader.py +264 -0
  118. shnitsel_tools-2026.1.1/shnitsel/io/shnitsel/parse.py +484 -0
  119. shnitsel_tools-2026.1.1/shnitsel/io/shnitsel/write.py +265 -0
  120. shnitsel_tools-2026.1.1/shnitsel/io/xyz/__init__.py +3 -0
  121. shnitsel_tools-2026.1.1/shnitsel/io/xyz/parse.py +85 -0
  122. shnitsel_tools-2026.1.1/shnitsel/rd.py +202 -0
  123. shnitsel_tools-2026.1.1/shnitsel/test_support/trajectory_verification.py +299 -0
  124. shnitsel_tools-2026.1.1/shnitsel/units/__init__.py +5 -0
  125. shnitsel_tools-2026.1.1/shnitsel/units/conversion.py +503 -0
  126. shnitsel_tools-2026.1.1/shnitsel/units/defaults.py +134 -0
  127. shnitsel_tools-2026.1.1/shnitsel/units/definitions.py +292 -0
  128. shnitsel_tools-2026.1.1/shnitsel/vis/__init__.py +0 -0
  129. shnitsel_tools-2026.1.1/shnitsel/vis/colormaps.py +339 -0
  130. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/__init__.py +134 -0
  131. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/datasheet.py +514 -0
  132. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/datasheet_page.py +1584 -0
  133. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/__init__.py +0 -0
  134. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/common.py +158 -0
  135. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/dip_trans_hist.py +598 -0
  136. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/energy_bands.py +166 -0
  137. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/hist.py +112 -0
  138. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/nacs_hist.py +121 -0
  139. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/per_state_hist.py +111 -0
  140. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/soc_trans_hist.py +879 -0
  141. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/socs_hist.py +105 -0
  142. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/structure.py +248 -0
  143. shnitsel_tools-2026.1.1/shnitsel/vis/datasheet/figures/time.py +229 -0
  144. shnitsel_tools-2026.1.1/shnitsel/vis/plot/__init__.py +23 -0
  145. shnitsel_tools-2026.1.1/shnitsel/vis/plot/common.py +342 -0
  146. shnitsel_tools-2026.1.1/shnitsel/vis/plot/filtration.py +272 -0
  147. shnitsel_tools-2026.1.1/shnitsel/vis/plot/kde.py +647 -0
  148. shnitsel_tools-2026.1.1/shnitsel/vis/plot/p3mhelpers.py +143 -0
  149. shnitsel_tools-2026.1.1/shnitsel/vis/plot/pca_biplot.py +799 -0
  150. shnitsel_tools-2026.1.1/shnitsel/vis/plot/polychrom.py +146 -0
  151. shnitsel_tools-2026.1.1/shnitsel/vis/plot/select.py +199 -0
  152. shnitsel_tools-2026.1.1/shnitsel/vis/plot/spectra3d.py +145 -0
  153. shnitsel_tools-2026.1.1/shnitsel/vis/plot/time.py +326 -0
  154. shnitsel_tools-2026.1.1/shnitsel/vis/static/__init__.py +0 -0
  155. shnitsel_tools-2026.1.1/shnitsel/vis/static/css/__init__.py +0 -0
  156. shnitsel_tools-2026.1.1/shnitsel/vis/static/html/__init__.py +0 -0
  157. shnitsel_tools-2026.1.1/shnitsel/vis/support/__init__.py +0 -0
  158. shnitsel_tools-2026.1.1/shnitsel/vis/support/ipython_visualization.py +34 -0
  159. shnitsel_tools-2026.1.1/shnitsel/vis/support/multi_plot.py +44 -0
  160. shnitsel_tools-2026.1.1/shnitsel/vis/support/visualizeable.py +11 -0
  161. shnitsel_tools-2026.1.1/shnitsel/vis/vmd/__init__.py +38 -0
  162. shnitsel_tools-2026.1.1/shnitsel/xarray.py +28 -0
  163. shnitsel_tools-2026.1.1/shnitsel_tools.egg-info/PKG-INFO +392 -0
  164. shnitsel_tools-2026.1.1/shnitsel_tools.egg-info/SOURCES.txt +173 -0
  165. shnitsel_tools-2026.1.1/shnitsel_tools.egg-info/dependency_links.txt +1 -0
  166. shnitsel_tools-2026.1.1/shnitsel_tools.egg-info/entry_points.txt +3 -0
  167. shnitsel_tools-2026.1.1/shnitsel_tools.egg-info/requires.txt +46 -0
  168. shnitsel_tools-2026.1.1/shnitsel_tools.egg-info/top_level.txt +1 -0
  169. shnitsel_tools-2026.1.1/tests/test_accessors.py +122 -0
  170. shnitsel_tools-2026.1.1/tests/test_datasheet.py +91 -0
  171. shnitsel_tools-2026.1.1/tests/test_geom.py +72 -0
  172. shnitsel_tools-2026.1.1/tests/test_plots.py +180 -0
  173. shnitsel_tools-2026.1.1/tests/test_postprocess.py +300 -0
  174. shnitsel_tools-2026.1.1/tests/test_stacked_unstacked.py +69 -0
  175. shnitsel_tools-2026.1.1/tests/test_tree_to_frames.py +30 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 SHNITSEL
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,392 @@
1
+ Metadata-Version: 2.4
2
+ Name: shnitsel-tools
3
+ Version: 2026.1.1
4
+ Summary: Collect, manage, process, analyse & visualize surface hopping data
5
+ Author-email: Theodor Everley Röhrkasten <theodor.roehrkasten@fau.de>, Kevin Höllring <kevin.hoellring@fau.de>, Carolin Müller <carolin.cpc.mueller@fau.de>
6
+ Classifier: Programming Language :: Python :: 3
7
+ Classifier: License :: OSI Approved :: MIT License
8
+ Classifier: Operating System :: OS Independent
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: scipy>=1.16
13
+ Requires-Dist: matplotlib>=3.10
14
+ Requires-Dist: xarray>=2025.7.1
15
+ Requires-Dist: rdkit>=2025
16
+ Requires-Dist: ase>=3
17
+ Requires-Dist: numpy>=2.3
18
+ Requires-Dist: pandas>=2.2
19
+ Requires-Dist: h5netcdf>=1.7.0
20
+ Requires-Dist: scikit-learn>=1.5
21
+ Requires-Dist: jupyter>=1.0.0
22
+ Requires-Dist: py3dmol>=2.0.4
23
+ Requires-Dist: tqdm>=4.66.2
24
+ Requires-Dist: pyparsing>=3.2.5
25
+ Requires-Dist: svgpathtools>=1.7.2
26
+ Requires-Dist: fsspec
27
+ Requires-Dist: requests
28
+ Requires-Dist: aiohttp
29
+ Provides-Extra: vis
30
+ Requires-Dist: bokeh>=3.5; extra == "vis"
31
+ Requires-Dist: datashader; extra == "vis"
32
+ Requires-Dist: numba>=0.60; extra == "vis"
33
+ Requires-Dist: seaborn>=0.13.2; extra == "vis"
34
+ Requires-Dist: holoviews>=1.22.1; extra == "vis"
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest>=5.2; extra == "dev"
37
+ Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
38
+ Requires-Dist: hypothesis>=6; extra == "dev"
39
+ Requires-Dist: tox>=4.10.0; extra == "dev"
40
+ Requires-Dist: tox-uv>=1.29.0; extra == "dev"
41
+ Requires-Dist: pre-commit>=2.20.0; extra == "dev"
42
+ Requires-Dist: ruff>=0.5.3; extra == "dev"
43
+ Requires-Dist: mypy>=1.9.0; extra == "dev"
44
+ Requires-Dist: pandas-stubs; extra == "dev"
45
+ Requires-Dist: scipy-stubs; extra == "dev"
46
+ Requires-Dist: types-tqdm; extra == "dev"
47
+ Requires-Dist: build; extra == "dev"
48
+ Requires-Dist: grayskull; extra == "dev"
49
+ Requires-Dist: sphinx==8.2.3; extra == "dev"
50
+ Requires-Dist: sphinx-autobuild; extra == "dev"
51
+ Requires-Dist: sphinx-autosummary-accessors; extra == "dev"
52
+ Requires-Dist: nbsphinx; extra == "dev"
53
+ Requires-Dist: sphinx-design; extra == "dev"
54
+ Requires-Dist: sphinx-autoapi; extra == "dev"
55
+ Requires-Dist: pydata-sphinx-theme; extra == "dev"
56
+ Dynamic: license-file
57
+
58
+ <div align="center">
59
+ <h1>shnitsel-tools</h1>
60
+ <img src="https://raw.githubusercontent.com/SHNITSEL/shnitsel-tools/main/logo_shnitsel_tools.png" alt="SHNITSEL-TOOLS Logo" width="200px">
61
+ <h3>Surface Hopping Nested Instances Training Set for Excited-state Learning Tools</h3>
62
+ <br>
63
+ <a href="https://shnitsel.github.io/"><img src="https://img.shields.io/badge/Website-shnitsel.github.io-yellow.svg" alt="DOI"></a>
64
+ &nbsp;&nbsp;&nbsp;
65
+ <a href="https://shnitsel.github.io/tools/docs/_build/index.html"><img src="https://img.shields.io/badge/Docs-shnitsel.github.io-yellow.svg" alt="DOI"></a>
66
+ </div>
67
+
68
+ --------------------
69
+
70
+ ## About
71
+
72
+ `shnitsel-tools` is designed to to support the entire data lifecycle of surface hopping (SH) trajectory data upon simulation: data managment, storage, processing, visualization and interpretation.
73
+ The tool is compatible with surface hopping data generated using the software packages [SHARC 3/4](https://sharc-md.org/), [Newton-X](https://newtonx.org/), and [PyRAI2MD](https://github.com/lopez-lab/PyRAI2MD).
74
+ The package leverages [Xarray](https://xarray.dev/) to benefit from efficient multidimensional data handling, improved metadata management, and a structure that aligns naturally with the needs of quantum chemical datasets.
75
+
76
+ ## Installation
77
+
78
+ `shnitsel-tools` is normally used interactively via Jupyter Notebook on a local machine.
79
+ However, some users might find it convenient to convert trajectories to NetCDF
80
+ on-cluster, as the NetCDF file will likely download faster than the raw text files.
81
+ Either way the following should work as usual, ideally in a fresh virtual (e.g. `conda`) environment:
82
+
83
+ ```bash
84
+ pip install shnitsel-tools[vis]
85
+ ```
86
+
87
+ For more detailed installation instructions, see [here](#detailed-installation-instructions)
88
+
89
+ ## Usage
90
+ <!-- TODO: Make documentation more visible -->
91
+ For documentation including an API reference, please see https://shnitsel.github.io/tools/docs/_build/index.html.
92
+
93
+ `shnitsel-tools` mostly exposes data as Xarray (`xr`) objects, so familiarity with that library is beneficial.
94
+ Xarray is somewhat like Pandas for higher-dimensional data, or like Numpy with labels and other metadata.
95
+ - [Overview of data structures](https://tutorial.xarray.dev/intermediate/datastructures-intermediate.html)
96
+ - [Official quick overview](https://docs.xarray.dev/en/stable/getting-started-guide/quick-overview.html)
97
+ - [Xarray in 45 minutes](https://tutorial.xarray.dev/overview/xarray-in-45-min.html) for a more detailed introduction
98
+
99
+ ### Tutorials
100
+ For a quick start, see the [tutorials](https://github.com/SHNITSEL/shnitsel-tools/blob/main/tutorials) directory,
101
+ which contains Jupyter Notebooks showing the workflow for parsing, writing and loading SHNITSEL databases as well as how to postprocess and visualize the respective data.
102
+
103
+ <!--
104
+ TODO: Adapt to new tutorials!
105
+ #### Collection & storage
106
+ - [parsing trajcetory and initial condition data obtained by SHARC](https://github.com/SHNITSEL/shnitsel-tools/blob/main/tutorials/0_1_sharc2hdf5.ipynb)
107
+ - [parsing trajectory data produced with Newton-X](https://github.com/SHNITSEL/shnitsel-tools/blob/main/tutorials/0_2_nx2hdf5.ipynb)
108
+ - [convert ASE databases](https://github.com/SHNITSEL/shnitsel-tools/blob/main/tutorials/0_4_ase2hdf5.ipynb)
109
+ #### Management
110
+ - [exploration of electronic properties](https://github.com/SHNITSEL/shnitsel-tools/blob/main/tutorials/2_2_PS_explore.ipynb)
111
+ #### Postprocessing & visualization of data
112
+ - [datasheet for trajectory data](https://github.com/SHNITSEL/shnitsel-tools/blob/main/tutorials/3_1_datasheet.ipynb)
113
+ - [principal component analysis and trajectory classification](https://github.com/SHNITSEL/shnitsel-tools/blob/main/tutorials/1_1_GS_PCA.ipynb)
114
+
115
+ ### Workflow walkthrough
116
+ Four [notebooks](https://github.com/SHNITSEL/shnitsel-tools/tree/main/tutorials/walkthrough) demonstrate a workflow for the comparative
117
+ analysis of homologous/isoelectronic molecules, from filtration via dimensional reduction and clustering to kinetics.
118
+ -->
119
+
120
+ ## Tests
121
+ Running the test-suite can help confirm that `shnitsel-tools` is correctly installed in your environment.
122
+ To run the tests, please install `shnitsel-tools` by cloning the repo as described [here](#for-tutorials-tests-or-development-conda) (conda users)
123
+ or [here](#for-tutorials-tests-or-development-uv) (uv users).
124
+ Then run the `pytest` program without arguments while inside the repository directory, with the virtual environment activated.
125
+ More information on how to invoke `pytest` is available [here](https://docs.pytest.org/en/stable/how-to/usage.html#usage).
126
+
127
+ If you are a contributor, please consider using the `tox` command to run tests across the different supported Python versions.
128
+
129
+ ## Overview of repository contents
130
+ ```console
131
+ $ tree -I '_*' shnitsel/
132
+ shnitsel
133
+ ├── analyze
134
+ │   ├── generic.py
135
+ │   ├── hops.py
136
+ │   ├── lda.py
137
+ │   ├── pca.py
138
+ │   ├── pls.py
139
+ │   ├── populations.py
140
+ │   ├── spectra.py
141
+ │   └── stats.py
142
+ ├── bridges.py
143
+ ├── clean
144
+ │   ├── common.py
145
+ │   ├── dispatch_plots.py
146
+ │   ├── filter_energy.py
147
+ │   ├── filter_geo.py
148
+ │   └── filtration_class.py
149
+ ├── cli
150
+ │   ├── convert_to_shnitsel.py
151
+ │   ├── generate_datasheet.py
152
+ │   └── merge_shnitsel_files.py
153
+ ├── core
154
+ │   ├── feature_detection.py
155
+ │   └── typedefs.py
156
+ ├── data
157
+ │   ├── atom_helpers.py
158
+ │   ├── charge_helpers.py
159
+ │   ├── dataset_containers
160
+ │   │   ├── data_series.py
161
+ │   │   ├── dataset_vis.py
162
+ │   │   ├── frames.py
163
+ │   │   ├── inter_state.py
164
+ │   │   ├── multi_layered.py
165
+ │   │   ├── multi_series.py
166
+ │   │   ├── multi_stacked.py
167
+ │   │   ├── per_state.py
168
+ │   │   ├── shared.py
169
+ │   │   ├── trajectory_collection.py
170
+ │   │   ├── trajectory.py
171
+ │   │   └── xr_conversion.py
172
+ │   ├── helpers.py
173
+ │   ├── multi_indices.py
174
+ │   ├── proxy_class.py
175
+ │   ├── shnitsel_db
176
+ │   │   └── db_function_decorator.py
177
+ │   ├── shnitsel_db_helpers.py
178
+ │   ├── state_helpers.py
179
+ │   ├── traj_combiner_methods.py
180
+ │   ├── trajectory_grouping_params.py
181
+ │   ├── trajectory_variable_description.py
182
+ │   └── tree
183
+ │   ├── child_support_functions.py
184
+ │   ├── compound.py
185
+ │   ├── data_group.py
186
+ │   ├── data_leaf.py
187
+ │   ├── datatree_level.py
188
+ │   ├── node.py
189
+ │   ├── selection.py
190
+ │   ├── support_functions.py
191
+ │   ├── tree_completion.py
192
+ │   ├── tree.py
193
+ │   ├── tree_vis.py
194
+ │   └── xr_conversion.py
195
+ ├── filtering
196
+ │   ├── filter.md
197
+ │   ├── helpers.py
198
+ │   ├── state_selection.py
199
+ │   └── structure_selection.py
200
+ ├── geo
201
+ │   ├── alignment.py
202
+ │   ├── analogs.py
203
+ │   ├── geocalc_
204
+ │   │   ├── algebra.py
205
+ │   │   ├── angles.py
206
+ │   │   ├── bla_chromophor.py
207
+ │   │   ├── dihedrals.py
208
+ │   │   ├── distances.py
209
+ │   │   ├── helpers.py
210
+ │   │   ├── positions.py
211
+ │   │   └── pyramids.py
212
+ │   └── geocalc.py
213
+ ├── io
214
+ │   ├── ase
215
+ │   │   ├── format_reader.py
216
+ │   │   ├── parse.py
217
+ │   │   └── write.py
218
+ │   ├── format_reader_base.py
219
+ │   ├── format_registry.py
220
+ │   ├── molcas
221
+ │   │   └── molcas_opt.py
222
+ │   ├── newtonx
223
+ │   │   ├── format_reader.py
224
+ │   │   └── parse.py
225
+ │   ├── pyrai2md
226
+ │   │   ├── format_reader.py
227
+ │   │   └── parse.py
228
+ │   ├── read.py
229
+ │   ├── sharc
230
+ │   │   ├── format_reader.py
231
+ │   │   ├── parse_initial_conditions.py
232
+ │   │   ├── parse_trajectory.py
233
+ │   │   └── qm_helpers.py
234
+ │   ├── shared
235
+ │   │   ├── helpers.py
236
+ │   │   ├── messages.py
237
+ │   │   ├── trajectory_finalization.py
238
+ │   │   ├── trajectory_setup.py
239
+ │   │   └── variable_flagging.py
240
+ │   ├── shnitsel
241
+ │   │   ├── format_reader.py
242
+ │   │   ├── parse.py
243
+ │   │   └── write.py
244
+ │   ├── xr_io_compatibility.py
245
+ │   └── xyz
246
+ │   └── parse.py
247
+ ├── rd.py
248
+ ├── test_support
249
+ │   └── trajectory_verification.py
250
+ ├── units
251
+ │   ├── conversion.py
252
+ │   ├── defaults.py
253
+ │   └── definitions.py
254
+ ├── vis
255
+ │   ├── colormaps.py
256
+ │   ├── datasheet
257
+ │   │   ├── datasheet_page.py
258
+ │   │   ├── datasheet.py
259
+ │   │   └── figures
260
+ │   │   ├── common.py
261
+ │   │   ├── dip_trans_hist.py
262
+ │   │   ├── energy_bands.py
263
+ │   │   ├── hist.py
264
+ │   │   ├── nacs_hist.py
265
+ │   │   ├── per_state_hist.py
266
+ │   │   ├── socs_hist.py
267
+ │   │   ├── soc_trans_hist.py
268
+ │   │   ├── structure.py
269
+ │   │   └── time.py
270
+ │   ├── plot
271
+ │   │   ├── common.py
272
+ │   │   ├── filtration.py
273
+ │   │   ├── kde.py
274
+ │   │   ├── p3mhelpers.py
275
+ │   │   ├── pca_biplot.py
276
+ │   │   ├── polychrom.py
277
+ │   │   ├── select.py
278
+ │   │   ├── spectra3d.py
279
+ │   │   └── time.py
280
+ │   ├── static
281
+ │   │   ├── css
282
+ │   │   │   └── style.css
283
+ │   │   └── html
284
+ │   │   └── icons-svg-inline.html
285
+ │   ├── support
286
+ │   │   ├── ipython_visualization.py
287
+ │   │   ├── multi_plot.py
288
+ │   │   └── visualizeable.py
289
+ │   └── vmd
290
+ │   └── script.tcl
291
+ └── xarray.py
292
+ ```
293
+
294
+ ## Detailed installation instructions
295
+
296
+ ### Optional dependencies
297
+ In the following, the `[vis]` suffix causes optional plotting dependencies to be
298
+ installed. If you are using `shnitsel-tools` on an HPC, you can omit it.
299
+
300
+ If you would like to contribute to `shnitsel-tools`, you may find the development
301
+ dependencies useful. These can be obtained by adding `[dev]` at the end of the
302
+ package name.
303
+
304
+ To install all optional dependencies, please add `[vis,dev]` after the package name.
305
+
306
+ ### Installation using conda
307
+
308
+ #### For tutorials, tests or development (conda)
309
+ If you would like to work through the tutorials, run the tests, or modify the code, please use the following commands:
310
+
311
+ ```bash
312
+ git clone 'https://github.com/SHNITSEL/shnitsel-tools.git'
313
+ cd shnitsel-tools
314
+ conda create -n shnitsel python==3.12 pip
315
+ conda activate shnitsel
316
+ pip install -e .[vis,dev]
317
+ ```
318
+
319
+ #### For ordinary use
320
+ If you would just like to use the package, it is unnecessary to clone the repository.
321
+ Instead, it should suffice to run the following command with the conda environment active:
322
+
323
+ ```bash
324
+ conda create -n shnitsel python==3.12 pip
325
+ conda activate shnitsel
326
+ pip install shnitsel-tools[vis]
327
+ ```
328
+
329
+ ### Instalation using uv
330
+ This tool is typically faster and more light-weight than `pip` and `conda`.
331
+ Unlike `conda`, it creates traditional Python virtual environments, which are stored in the folder in which the command is run and activated by sourcing
332
+ a shell-script. It can be installed by following the instructions at https://docs.astral.sh/uv/.
333
+
334
+
335
+ #### For tutorials, tests or development (uv)
336
+ If you would like to work through the tutorials or modify the code, run the tests, please use the following commands:
337
+
338
+ ```bash
339
+ git clone 'https://github.com/SHNITSEL/shnitsel-tools.git'
340
+ cd shnitsel-tools
341
+ uv venv --python 3.12 # create an environment under ./.venv
342
+ source .venv/bin/activate # activate the new environment
343
+ uv pip install -e .[vis,dev]
344
+ ```
345
+
346
+ #### For ordinary use
347
+ If you would just like to use the package, it is unnecessary to clone the repository.
348
+ Instead, it should suffice to run the following commands:
349
+
350
+ ```bash
351
+ uv venv --python 3.12 shnitsel # create a directory here named ./shnitsel
352
+ source shnitsel/bin/activate # activate the new environment
353
+ uv pip install shnitsel-tools[vis]
354
+ ```
355
+
356
+ #### If you only want to use the command-line
357
+ The following will ensure the command-line programs provided are always available,
358
+ without requiring environments to be activated first.
359
+ This may be the easiest approach for use on HPC.
360
+ It is not expected to support interactive notebook-based workflows.
361
+ ```bash
362
+ uv tool install shnitsel-tools
363
+ ```
364
+
365
+ <!--
366
+ ### For developers
367
+
368
+ We recommend installation using the `uv` tool, available at https://docs.astral.sh/uv/.
369
+ Please clone this repo and run the following in the `shnitsel-tools` directory:
370
+
371
+ ```bash
372
+ git clone 'https://github.com/SHNITSEL/shnitsel-tools.git'
373
+ cd shnitsel-tools
374
+ uv venv # create an environment under ./.venv
375
+ source .venv/bin/activate # activate the new environment
376
+ uv pip install -e .[dev] # install shnitsel in editable mode
377
+ ```
378
+
379
+ In the above, the option `-e` installs in editable mode, meaning that Python will see changes you make
380
+ to the source, while `[dev]` installs the optional development dependencies.
381
+
382
+ If you would like to contribute your changes,
383
+ please [fork](https://github.com/SHNITSEL/shnitsel-tools/fork) this repo,
384
+ and make a pull request.
385
+
386
+ -->
387
+
388
+ ## Further Information
389
+
390
+ [![Website](https://img.shields.io/badge/Website-shnitsel.github.io-yellow.svg)](https://shnitsel.github.io/)
391
+
392
+