junifer 0.0.5.dev242__py3-none-any.whl → 0.0.6__py3-none-any.whl

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 (279) hide show
  1. junifer/__init__.py +2 -31
  2. junifer/__init__.pyi +37 -0
  3. junifer/_version.py +9 -4
  4. junifer/api/__init__.py +3 -5
  5. junifer/api/__init__.pyi +4 -0
  6. junifer/api/decorators.py +14 -19
  7. junifer/api/functions.py +165 -109
  8. junifer/api/py.typed +0 -0
  9. junifer/api/queue_context/__init__.py +2 -4
  10. junifer/api/queue_context/__init__.pyi +5 -0
  11. junifer/api/queue_context/gnu_parallel_local_adapter.py +22 -6
  12. junifer/api/queue_context/htcondor_adapter.py +23 -6
  13. junifer/api/queue_context/py.typed +0 -0
  14. junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +3 -3
  15. junifer/api/queue_context/tests/test_htcondor_adapter.py +3 -3
  16. junifer/api/tests/test_functions.py +168 -74
  17. junifer/cli/__init__.py +24 -0
  18. junifer/cli/__init__.pyi +3 -0
  19. junifer/{api → cli}/cli.py +141 -125
  20. junifer/cli/parser.py +235 -0
  21. junifer/cli/py.typed +0 -0
  22. junifer/{api → cli}/tests/test_cli.py +8 -8
  23. junifer/{api/tests/test_api_utils.py → cli/tests/test_cli_utils.py} +5 -4
  24. junifer/{api → cli}/tests/test_parser.py +2 -2
  25. junifer/{api → cli}/utils.py +6 -16
  26. junifer/configs/juseless/__init__.py +2 -2
  27. junifer/configs/juseless/__init__.pyi +3 -0
  28. junifer/configs/juseless/datagrabbers/__init__.py +2 -12
  29. junifer/configs/juseless/datagrabbers/__init__.pyi +13 -0
  30. junifer/configs/juseless/datagrabbers/ixi_vbm.py +2 -2
  31. junifer/configs/juseless/datagrabbers/py.typed +0 -0
  32. junifer/configs/juseless/datagrabbers/tests/test_ucla.py +2 -2
  33. junifer/configs/juseless/datagrabbers/ucla.py +4 -4
  34. junifer/configs/juseless/py.typed +0 -0
  35. junifer/conftest.py +25 -0
  36. junifer/data/__init__.py +2 -42
  37. junifer/data/__init__.pyi +29 -0
  38. junifer/data/_dispatch.py +248 -0
  39. junifer/data/coordinates/__init__.py +9 -0
  40. junifer/data/coordinates/__init__.pyi +5 -0
  41. junifer/data/coordinates/_ants_coordinates_warper.py +104 -0
  42. junifer/data/coordinates/_coordinates.py +385 -0
  43. junifer/data/coordinates/_fsl_coordinates_warper.py +81 -0
  44. junifer/data/{tests → coordinates/tests}/test_coordinates.py +26 -33
  45. junifer/data/masks/__init__.py +9 -0
  46. junifer/data/masks/__init__.pyi +6 -0
  47. junifer/data/masks/_ants_mask_warper.py +177 -0
  48. junifer/data/masks/_fsl_mask_warper.py +106 -0
  49. junifer/data/masks/_masks.py +802 -0
  50. junifer/data/{tests → masks/tests}/test_masks.py +67 -63
  51. junifer/data/parcellations/__init__.py +9 -0
  52. junifer/data/parcellations/__init__.pyi +6 -0
  53. junifer/data/parcellations/_ants_parcellation_warper.py +166 -0
  54. junifer/data/parcellations/_fsl_parcellation_warper.py +89 -0
  55. junifer/data/parcellations/_parcellations.py +1388 -0
  56. junifer/data/{tests → parcellations/tests}/test_parcellations.py +165 -295
  57. junifer/data/pipeline_data_registry_base.py +76 -0
  58. junifer/data/py.typed +0 -0
  59. junifer/data/template_spaces.py +44 -79
  60. junifer/data/tests/test_data_utils.py +1 -2
  61. junifer/data/tests/test_template_spaces.py +8 -4
  62. junifer/data/utils.py +109 -4
  63. junifer/datagrabber/__init__.py +2 -26
  64. junifer/datagrabber/__init__.pyi +27 -0
  65. junifer/datagrabber/aomic/__init__.py +2 -4
  66. junifer/datagrabber/aomic/__init__.pyi +5 -0
  67. junifer/datagrabber/aomic/id1000.py +81 -52
  68. junifer/datagrabber/aomic/piop1.py +83 -55
  69. junifer/datagrabber/aomic/piop2.py +85 -56
  70. junifer/datagrabber/aomic/py.typed +0 -0
  71. junifer/datagrabber/aomic/tests/test_id1000.py +19 -12
  72. junifer/datagrabber/aomic/tests/test_piop1.py +52 -18
  73. junifer/datagrabber/aomic/tests/test_piop2.py +50 -17
  74. junifer/datagrabber/base.py +22 -18
  75. junifer/datagrabber/datalad_base.py +71 -34
  76. junifer/datagrabber/dmcc13_benchmark.py +31 -18
  77. junifer/datagrabber/hcp1200/__init__.py +2 -3
  78. junifer/datagrabber/hcp1200/__init__.pyi +4 -0
  79. junifer/datagrabber/hcp1200/datalad_hcp1200.py +3 -3
  80. junifer/datagrabber/hcp1200/hcp1200.py +26 -15
  81. junifer/datagrabber/hcp1200/py.typed +0 -0
  82. junifer/datagrabber/hcp1200/tests/test_hcp1200.py +8 -2
  83. junifer/datagrabber/multiple.py +14 -9
  84. junifer/datagrabber/pattern.py +132 -96
  85. junifer/datagrabber/pattern_validation_mixin.py +206 -94
  86. junifer/datagrabber/py.typed +0 -0
  87. junifer/datagrabber/tests/test_datalad_base.py +27 -12
  88. junifer/datagrabber/tests/test_dmcc13_benchmark.py +28 -11
  89. junifer/datagrabber/tests/test_multiple.py +48 -2
  90. junifer/datagrabber/tests/test_pattern_datalad.py +1 -1
  91. junifer/datagrabber/tests/test_pattern_validation_mixin.py +6 -6
  92. junifer/datareader/__init__.py +2 -2
  93. junifer/datareader/__init__.pyi +3 -0
  94. junifer/datareader/default.py +6 -6
  95. junifer/datareader/py.typed +0 -0
  96. junifer/external/nilearn/__init__.py +2 -3
  97. junifer/external/nilearn/__init__.pyi +4 -0
  98. junifer/external/nilearn/junifer_connectivity_measure.py +25 -17
  99. junifer/external/nilearn/junifer_nifti_spheres_masker.py +4 -4
  100. junifer/external/nilearn/py.typed +0 -0
  101. junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +17 -16
  102. junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +2 -3
  103. junifer/markers/__init__.py +2 -38
  104. junifer/markers/__init__.pyi +37 -0
  105. junifer/markers/base.py +11 -14
  106. junifer/markers/brainprint.py +12 -14
  107. junifer/markers/complexity/__init__.py +2 -18
  108. junifer/markers/complexity/__init__.pyi +17 -0
  109. junifer/markers/complexity/complexity_base.py +9 -11
  110. junifer/markers/complexity/hurst_exponent.py +7 -7
  111. junifer/markers/complexity/multiscale_entropy_auc.py +7 -7
  112. junifer/markers/complexity/perm_entropy.py +7 -7
  113. junifer/markers/complexity/py.typed +0 -0
  114. junifer/markers/complexity/range_entropy.py +7 -7
  115. junifer/markers/complexity/range_entropy_auc.py +7 -7
  116. junifer/markers/complexity/sample_entropy.py +7 -7
  117. junifer/markers/complexity/tests/test_complexity_base.py +1 -1
  118. junifer/markers/complexity/tests/test_hurst_exponent.py +5 -5
  119. junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +5 -5
  120. junifer/markers/complexity/tests/test_perm_entropy.py +5 -5
  121. junifer/markers/complexity/tests/test_range_entropy.py +5 -5
  122. junifer/markers/complexity/tests/test_range_entropy_auc.py +5 -5
  123. junifer/markers/complexity/tests/test_sample_entropy.py +5 -5
  124. junifer/markers/complexity/tests/test_weighted_perm_entropy.py +5 -5
  125. junifer/markers/complexity/weighted_perm_entropy.py +7 -7
  126. junifer/markers/ets_rss.py +12 -11
  127. junifer/markers/falff/__init__.py +2 -3
  128. junifer/markers/falff/__init__.pyi +4 -0
  129. junifer/markers/falff/_afni_falff.py +38 -45
  130. junifer/markers/falff/_junifer_falff.py +16 -19
  131. junifer/markers/falff/falff_base.py +7 -11
  132. junifer/markers/falff/falff_parcels.py +9 -9
  133. junifer/markers/falff/falff_spheres.py +8 -8
  134. junifer/markers/falff/py.typed +0 -0
  135. junifer/markers/falff/tests/test_falff_spheres.py +3 -1
  136. junifer/markers/functional_connectivity/__init__.py +2 -12
  137. junifer/markers/functional_connectivity/__init__.pyi +13 -0
  138. junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +9 -8
  139. junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +8 -8
  140. junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +7 -7
  141. junifer/markers/functional_connectivity/functional_connectivity_base.py +13 -12
  142. junifer/markers/functional_connectivity/functional_connectivity_parcels.py +8 -8
  143. junifer/markers/functional_connectivity/functional_connectivity_spheres.py +7 -7
  144. junifer/markers/functional_connectivity/py.typed +0 -0
  145. junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +1 -2
  146. junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +1 -2
  147. junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +6 -6
  148. junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +5 -5
  149. junifer/markers/parcel_aggregation.py +22 -17
  150. junifer/markers/py.typed +0 -0
  151. junifer/markers/reho/__init__.py +2 -3
  152. junifer/markers/reho/__init__.pyi +4 -0
  153. junifer/markers/reho/_afni_reho.py +29 -35
  154. junifer/markers/reho/_junifer_reho.py +13 -14
  155. junifer/markers/reho/py.typed +0 -0
  156. junifer/markers/reho/reho_base.py +7 -11
  157. junifer/markers/reho/reho_parcels.py +10 -10
  158. junifer/markers/reho/reho_spheres.py +9 -9
  159. junifer/markers/sphere_aggregation.py +22 -17
  160. junifer/markers/temporal_snr/__init__.py +2 -3
  161. junifer/markers/temporal_snr/__init__.pyi +4 -0
  162. junifer/markers/temporal_snr/py.typed +0 -0
  163. junifer/markers/temporal_snr/temporal_snr_base.py +11 -10
  164. junifer/markers/temporal_snr/temporal_snr_parcels.py +8 -8
  165. junifer/markers/temporal_snr/temporal_snr_spheres.py +7 -7
  166. junifer/markers/tests/test_ets_rss.py +3 -3
  167. junifer/markers/tests/test_parcel_aggregation.py +24 -24
  168. junifer/markers/tests/test_sphere_aggregation.py +6 -6
  169. junifer/markers/utils.py +3 -3
  170. junifer/onthefly/__init__.py +2 -1
  171. junifer/onthefly/_brainprint.py +138 -0
  172. junifer/onthefly/read_transform.py +5 -8
  173. junifer/pipeline/__init__.py +2 -10
  174. junifer/pipeline/__init__.pyi +13 -0
  175. junifer/{markers/collection.py → pipeline/marker_collection.py} +8 -14
  176. junifer/pipeline/pipeline_component_registry.py +294 -0
  177. junifer/pipeline/pipeline_step_mixin.py +15 -11
  178. junifer/pipeline/py.typed +0 -0
  179. junifer/{markers/tests/test_collection.py → pipeline/tests/test_marker_collection.py} +2 -3
  180. junifer/pipeline/tests/test_pipeline_component_registry.py +200 -0
  181. junifer/pipeline/tests/test_pipeline_step_mixin.py +36 -37
  182. junifer/pipeline/tests/test_update_meta_mixin.py +4 -4
  183. junifer/pipeline/tests/test_workdir_manager.py +43 -0
  184. junifer/pipeline/update_meta_mixin.py +21 -17
  185. junifer/pipeline/utils.py +6 -6
  186. junifer/pipeline/workdir_manager.py +19 -5
  187. junifer/preprocess/__init__.py +2 -10
  188. junifer/preprocess/__init__.pyi +11 -0
  189. junifer/preprocess/base.py +10 -10
  190. junifer/preprocess/confounds/__init__.py +2 -2
  191. junifer/preprocess/confounds/__init__.pyi +3 -0
  192. junifer/preprocess/confounds/fmriprep_confound_remover.py +243 -64
  193. junifer/preprocess/confounds/py.typed +0 -0
  194. junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +121 -14
  195. junifer/preprocess/py.typed +0 -0
  196. junifer/preprocess/smoothing/__init__.py +2 -2
  197. junifer/preprocess/smoothing/__init__.pyi +3 -0
  198. junifer/preprocess/smoothing/_afni_smoothing.py +40 -40
  199. junifer/preprocess/smoothing/_fsl_smoothing.py +22 -32
  200. junifer/preprocess/smoothing/_nilearn_smoothing.py +35 -14
  201. junifer/preprocess/smoothing/py.typed +0 -0
  202. junifer/preprocess/smoothing/smoothing.py +11 -13
  203. junifer/preprocess/warping/__init__.py +2 -2
  204. junifer/preprocess/warping/__init__.pyi +3 -0
  205. junifer/preprocess/warping/_ants_warper.py +136 -32
  206. junifer/preprocess/warping/_fsl_warper.py +73 -22
  207. junifer/preprocess/warping/py.typed +0 -0
  208. junifer/preprocess/warping/space_warper.py +39 -11
  209. junifer/preprocess/warping/tests/test_space_warper.py +5 -9
  210. junifer/py.typed +0 -0
  211. junifer/stats.py +5 -5
  212. junifer/storage/__init__.py +2 -10
  213. junifer/storage/__init__.pyi +11 -0
  214. junifer/storage/base.py +47 -13
  215. junifer/storage/hdf5.py +95 -33
  216. junifer/storage/pandas_base.py +12 -11
  217. junifer/storage/py.typed +0 -0
  218. junifer/storage/sqlite.py +11 -11
  219. junifer/storage/tests/test_hdf5.py +86 -4
  220. junifer/storage/tests/test_sqlite.py +2 -2
  221. junifer/storage/tests/test_storage_base.py +5 -2
  222. junifer/storage/tests/test_utils.py +33 -7
  223. junifer/storage/utils.py +95 -9
  224. junifer/testing/__init__.py +2 -3
  225. junifer/testing/__init__.pyi +4 -0
  226. junifer/testing/datagrabbers.py +10 -11
  227. junifer/testing/py.typed +0 -0
  228. junifer/testing/registry.py +4 -7
  229. junifer/testing/tests/test_testing_registry.py +9 -17
  230. junifer/tests/test_stats.py +2 -2
  231. junifer/typing/__init__.py +9 -0
  232. junifer/typing/__init__.pyi +31 -0
  233. junifer/typing/_typing.py +68 -0
  234. junifer/utils/__init__.py +2 -12
  235. junifer/utils/__init__.pyi +18 -0
  236. junifer/utils/_config.py +110 -0
  237. junifer/utils/_yaml.py +16 -0
  238. junifer/utils/helpers.py +6 -6
  239. junifer/utils/logging.py +117 -8
  240. junifer/utils/py.typed +0 -0
  241. junifer/{pipeline → utils}/singleton.py +19 -14
  242. junifer/utils/tests/test_config.py +59 -0
  243. {junifer-0.0.5.dev242.dist-info → junifer-0.0.6.dist-info}/METADATA +43 -38
  244. junifer-0.0.6.dist-info/RECORD +350 -0
  245. {junifer-0.0.5.dev242.dist-info → junifer-0.0.6.dist-info}/WHEEL +1 -1
  246. junifer-0.0.6.dist-info/entry_points.txt +2 -0
  247. junifer/api/parser.py +0 -118
  248. junifer/data/coordinates.py +0 -408
  249. junifer/data/masks.py +0 -670
  250. junifer/data/parcellations.py +0 -1828
  251. junifer/pipeline/registry.py +0 -177
  252. junifer/pipeline/tests/test_registry.py +0 -150
  253. junifer-0.0.5.dev242.dist-info/RECORD +0 -275
  254. junifer-0.0.5.dev242.dist-info/entry_points.txt +0 -2
  255. /junifer/{api → cli}/tests/data/gmd_mean.yaml +0 -0
  256. /junifer/{api → cli}/tests/data/gmd_mean_htcondor.yaml +0 -0
  257. /junifer/{api → cli}/tests/data/partly_cloudy_agg_mean_tian.yml +0 -0
  258. /junifer/data/{VOIs → coordinates/VOIs}/meta/AutobiographicalMemory_VOIs.txt +0 -0
  259. /junifer/data/{VOIs → coordinates/VOIs}/meta/CogAC_VOIs.txt +0 -0
  260. /junifer/data/{VOIs → coordinates/VOIs}/meta/CogAR_VOIs.txt +0 -0
  261. /junifer/data/{VOIs → coordinates/VOIs}/meta/DMNBuckner_VOIs.txt +0 -0
  262. /junifer/data/{VOIs → coordinates/VOIs}/meta/Dosenbach2010_MNI_VOIs.txt +0 -0
  263. /junifer/data/{VOIs → coordinates/VOIs}/meta/Empathy_VOIs.txt +0 -0
  264. /junifer/data/{VOIs → coordinates/VOIs}/meta/Motor_VOIs.txt +0 -0
  265. /junifer/data/{VOIs → coordinates/VOIs}/meta/MultiTask_VOIs.txt +0 -0
  266. /junifer/data/{VOIs → coordinates/VOIs}/meta/PhysioStress_VOIs.txt +0 -0
  267. /junifer/data/{VOIs → coordinates/VOIs}/meta/Power2011_MNI_VOIs.txt +0 -0
  268. /junifer/data/{VOIs → coordinates/VOIs}/meta/Power2013_MNI_VOIs.tsv +0 -0
  269. /junifer/data/{VOIs → coordinates/VOIs}/meta/Rew_VOIs.txt +0 -0
  270. /junifer/data/{VOIs → coordinates/VOIs}/meta/Somatosensory_VOIs.txt +0 -0
  271. /junifer/data/{VOIs → coordinates/VOIs}/meta/ToM_VOIs.txt +0 -0
  272. /junifer/data/{VOIs → coordinates/VOIs}/meta/VigAtt_VOIs.txt +0 -0
  273. /junifer/data/{VOIs → coordinates/VOIs}/meta/WM_VOIs.txt +0 -0
  274. /junifer/data/{VOIs → coordinates/VOIs}/meta/eMDN_VOIs.txt +0 -0
  275. /junifer/data/{VOIs → coordinates/VOIs}/meta/eSAD_VOIs.txt +0 -0
  276. /junifer/data/{VOIs → coordinates/VOIs}/meta/extDMN_VOIs.txt +0 -0
  277. {junifer-0.0.5.dev242.dist-info → junifer-0.0.6.dist-info/licenses}/AUTHORS.rst +0 -0
  278. {junifer-0.0.5.dev242.dist-info → junifer-0.0.6.dist-info/licenses}/LICENSE.md +0 -0
  279. {junifer-0.0.5.dev242.dist-info → junifer-0.0.6.dist-info}/top_level.txt +0 -0
@@ -8,10 +8,7 @@ from pathlib import Path
8
8
  from typing import (
9
9
  Any,
10
10
  ClassVar,
11
- Dict,
12
- List,
13
11
  Optional,
14
- Set,
15
12
  Union,
16
13
  )
17
14
 
@@ -25,6 +22,7 @@ from ..external.BrainPrint.brainprint.brainprint import (
25
22
  )
26
23
  from ..external.BrainPrint.brainprint.surfaces import surf_to_vtk
27
24
  from ..pipeline import WorkDirManager
25
+ from ..typing import Dependencies, ExternalDependencies, MarkerInOutMappings
28
26
  from ..utils import logger, run_ext_cmd
29
27
  from .base import BaseMarker
30
28
 
@@ -68,7 +66,7 @@ class BrainPrint(BaseMarker):
68
66
 
69
67
  """
70
68
 
71
- _EXT_DEPENDENCIES: ClassVar[List[Dict[str, Union[str, List[str]]]]] = [
69
+ _EXT_DEPENDENCIES: ClassVar[ExternalDependencies] = [
72
70
  {
73
71
  "name": "freesurfer",
74
72
  "commands": [
@@ -80,9 +78,9 @@ class BrainPrint(BaseMarker):
80
78
  },
81
79
  ]
82
80
 
83
- _DEPENDENCIES: ClassVar[Set[str]] = {"lapy", "numpy"}
81
+ _DEPENDENCIES: ClassVar[Dependencies] = {"lapy", "numpy"}
84
82
 
85
- _MARKER_INOUT_MAPPINGS: ClassVar[Dict[str, Dict[str, str]]] = {
83
+ _MARKER_INOUT_MAPPINGS: ClassVar[MarkerInOutMappings] = {
86
84
  "FreeSurfer": {
87
85
  "eigenvalues": "scalar_table",
88
86
  "areas": "vector",
@@ -117,7 +115,7 @@ class BrainPrint(BaseMarker):
117
115
  self,
118
116
  aseg_path: Path,
119
117
  norm_path: Path,
120
- indices: List,
118
+ indices: list,
121
119
  ) -> Path:
122
120
  """Generate a surface from the aseg and label files.
123
121
 
@@ -143,7 +141,7 @@ class BrainPrint(BaseMarker):
143
141
  mri_binarize_cmd = [
144
142
  "mri_binarize",
145
143
  f"--i {aseg_path.resolve()}",
146
- f"--match {''.join(indices)}",
144
+ f"--match {' '.join(indices)}",
147
145
  f"--o {mri_binarize_output_path.resolve()}",
148
146
  ]
149
147
  # Call mri_binarize command
@@ -193,7 +191,7 @@ class BrainPrint(BaseMarker):
193
191
  self,
194
192
  aseg_path: Path,
195
193
  norm_path: Path,
196
- ) -> Dict[str, Path]:
194
+ ) -> dict[str, Path]:
197
195
  """Create surfaces from FreeSurfer aseg labels.
198
196
 
199
197
  Parameters
@@ -268,7 +266,7 @@ class BrainPrint(BaseMarker):
268
266
  rh_white_path: Path,
269
267
  lh_pial_path: Path,
270
268
  rh_pial_path: Path,
271
- ) -> Dict[str, Path]:
269
+ ) -> dict[str, Path]:
272
270
  """Create cortical surfaces from FreeSurfer labels.
273
271
 
274
272
  Parameters
@@ -309,7 +307,7 @@ class BrainPrint(BaseMarker):
309
307
 
310
308
  def _fix_nan(
311
309
  self,
312
- input_data: List[Union[float, str, npt.ArrayLike]],
310
+ input_data: list[Union[float, str, npt.ArrayLike]],
313
311
  ) -> np.ndarray:
314
312
  """Convert BrainPrint output with string NaN to ``numpy.nan``.
315
313
 
@@ -330,9 +328,9 @@ class BrainPrint(BaseMarker):
330
328
 
331
329
  def compute(
332
330
  self,
333
- input: Dict[str, Any],
334
- extra_input: Optional[Dict] = None,
335
- ) -> Dict:
331
+ input: dict[str, Any],
332
+ extra_input: Optional[dict] = None,
333
+ ) -> dict:
336
334
  """Compute.
337
335
 
338
336
  Parameters
@@ -4,7 +4,6 @@
4
4
  # Synchon Mandal <s.mandal@fz-juelich.de>
5
5
  # License: AGPL
6
6
 
7
-
8
7
  from importlib.util import find_spec
9
8
 
10
9
  from ..utils import raise_error
@@ -17,21 +16,6 @@ if find_spec("neurokit2") is None:
17
16
  klass=ImportError,
18
17
  )
19
18
  else:
20
- # Import markers
21
- from .hurst_exponent import HurstExponent
22
- from .range_entropy import RangeEntropy
23
- from .range_entropy_auc import RangeEntropyAUC
24
- from .perm_entropy import PermEntropy
25
- from .weighted_perm_entropy import WeightedPermEntropy
26
- from .sample_entropy import SampleEntropy
27
- from .multiscale_entropy_auc import MultiscaleEntropyAUC
19
+ import lazy_loader as lazy
28
20
 
29
- __all__ = [
30
- "HurstExponent",
31
- "RangeEntropy",
32
- "RangeEntropyAUC",
33
- "PermEntropy",
34
- "WeightedPermEntropy",
35
- "SampleEntropy",
36
- "MultiscaleEntropyAUC",
37
- ]
21
+ __getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)
@@ -0,0 +1,17 @@
1
+ __all__ = [
2
+ "HurstExponent",
3
+ "RangeEntropy",
4
+ "RangeEntropyAUC",
5
+ "PermEntropy",
6
+ "WeightedPermEntropy",
7
+ "SampleEntropy",
8
+ "MultiscaleEntropyAUC",
9
+ ]
10
+
11
+ from .hurst_exponent import HurstExponent
12
+ from .range_entropy import RangeEntropy
13
+ from .range_entropy_auc import RangeEntropyAUC
14
+ from .perm_entropy import PermEntropy
15
+ from .weighted_perm_entropy import WeightedPermEntropy
16
+ from .sample_entropy import SampleEntropy
17
+ from .multiscale_entropy_auc import MultiscaleEntropyAUC
@@ -8,13 +8,11 @@ from typing import (
8
8
  TYPE_CHECKING,
9
9
  Any,
10
10
  ClassVar,
11
- Dict,
12
- List,
13
11
  Optional,
14
- Set,
15
12
  Union,
16
13
  )
17
14
 
15
+ from ...typing import Dependencies, MarkerInOutMappings
18
16
  from ...utils import raise_error
19
17
  from ..base import BaseMarker
20
18
  from ..parcel_aggregation import ParcelAggregation
@@ -51,9 +49,9 @@ class ComplexityBase(BaseMarker):
51
49
 
52
50
  """
53
51
 
54
- _DEPENDENCIES: ClassVar[Set[str]] = {"nilearn", "neurokit2"}
52
+ _DEPENDENCIES: ClassVar[Dependencies] = {"nilearn", "neurokit2"}
55
53
 
56
- _MARKER_INOUT_MAPPINGS: ClassVar[Dict[str, Dict[str, str]]] = {
54
+ _MARKER_INOUT_MAPPINGS: ClassVar[MarkerInOutMappings] = {
57
55
  "BOLD": {
58
56
  "complexity": "vector",
59
57
  },
@@ -61,10 +59,10 @@ class ComplexityBase(BaseMarker):
61
59
 
62
60
  def __init__(
63
61
  self,
64
- parcellation: Union[str, List[str]],
62
+ parcellation: Union[str, list[str]],
65
63
  agg_method: str = "mean",
66
- agg_method_params: Optional[Dict] = None,
67
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
64
+ agg_method_params: Optional[dict] = None,
65
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
68
66
  name: Optional[str] = None,
69
67
  ) -> None:
70
68
  self.parcellation = parcellation
@@ -86,9 +84,9 @@ class ComplexityBase(BaseMarker):
86
84
 
87
85
  def compute(
88
86
  self,
89
- input: Dict[str, Any],
90
- extra_input: Optional[Dict[str, Any]] = None,
91
- ) -> Dict[str, Any]:
87
+ input: dict[str, Any],
88
+ extra_input: Optional[dict[str, Any]] = None,
89
+ ) -> dict[str, Any]:
92
90
  """Compute.
93
91
 
94
92
  Parameters
@@ -4,7 +4,7 @@
4
4
  # Leonard Sasse <l.sasse@fz-juelich.de>
5
5
  # License: AGPL
6
6
 
7
- from typing import Dict, List, Optional, Union
7
+ from typing import Optional, Union
8
8
 
9
9
  import neurokit2 as nk
10
10
  import numpy as np
@@ -24,8 +24,8 @@ class HurstExponent(ComplexityBase):
24
24
  Parameters
25
25
  ----------
26
26
  parcellation : str or list of str
27
- The name(s) of the parcellation(s). Check valid options by calling
28
- :func:`junifer.data.parcellations.list_parcellations`.
27
+ The name(s) of the parcellation(s) to use.
28
+ See :func:`.list_data` for options.
29
29
  agg_method : str, optional
30
30
  The method to perform aggregation using. Check valid options in
31
31
  :func:`junifer.stats.get_aggfunc_by_name` (default "mean").
@@ -55,11 +55,11 @@ class HurstExponent(ComplexityBase):
55
55
 
56
56
  def __init__(
57
57
  self,
58
- parcellation: Union[str, List[str]],
58
+ parcellation: Union[str, list[str]],
59
59
  agg_method: str = "mean",
60
- agg_method_params: Optional[Dict] = None,
61
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
62
- params: Optional[Dict] = None,
60
+ agg_method_params: Optional[dict] = None,
61
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
62
+ params: Optional[dict] = None,
63
63
  name: Optional[str] = None,
64
64
  ) -> None:
65
65
  super().__init__(
@@ -4,7 +4,7 @@
4
4
  # Leonard Sasse <l.sasse@fz-juelich.de>
5
5
  # License: AGPL
6
6
 
7
- from typing import Dict, List, Optional, Union
7
+ from typing import Optional, Union
8
8
 
9
9
  import neurokit2 as nk
10
10
  import numpy as np
@@ -24,8 +24,8 @@ class MultiscaleEntropyAUC(ComplexityBase):
24
24
  Parameters
25
25
  ----------
26
26
  parcellation : str or list of str
27
- The name(s) of the parcellation(s). Check valid options by calling
28
- :func:`junifer.data.parcellations.list_parcellations`.
27
+ The name(s) of the parcellation(s) to use.
28
+ See :func:`.list_data` for options.
29
29
  agg_method : str, optional
30
30
  The method to perform aggregation using. Check valid options in
31
31
  :func:`junifer.stats.get_aggfunc_by_name` (default "mean").
@@ -56,11 +56,11 @@ class MultiscaleEntropyAUC(ComplexityBase):
56
56
 
57
57
  def __init__(
58
58
  self,
59
- parcellation: Union[str, List[str]],
59
+ parcellation: Union[str, list[str]],
60
60
  agg_method: str = "mean",
61
- agg_method_params: Optional[Dict] = None,
62
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
63
- params: Optional[Dict] = None,
61
+ agg_method_params: Optional[dict] = None,
62
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
63
+ params: Optional[dict] = None,
64
64
  name: Optional[str] = None,
65
65
  ) -> None:
66
66
  super().__init__(
@@ -4,7 +4,7 @@
4
4
  # Leonard Sasse <l.sasse@fz-juelich.de>
5
5
  # License: AGPL
6
6
 
7
- from typing import Dict, List, Optional, Union
7
+ from typing import Optional, Union
8
8
 
9
9
  import neurokit2 as nk
10
10
  import numpy as np
@@ -24,8 +24,8 @@ class PermEntropy(ComplexityBase):
24
24
  Parameters
25
25
  ----------
26
26
  parcellation : str or list of str
27
- The name(s) of the parcellation(s). Check valid options by calling
28
- :func:`junifer.data.parcellations.list_parcellations`.
27
+ The name(s) of the parcellation(s) to use.
28
+ See :func:`.list_data` for options.
29
29
  agg_method : str, optional
30
30
  The method to perform aggregation using. Check valid options in
31
31
  :func:`junifer.stats.get_aggfunc_by_name` (default "mean").
@@ -56,11 +56,11 @@ class PermEntropy(ComplexityBase):
56
56
 
57
57
  def __init__(
58
58
  self,
59
- parcellation: Union[str, List[str]],
59
+ parcellation: Union[str, list[str]],
60
60
  agg_method: str = "mean",
61
- agg_method_params: Optional[Dict] = None,
62
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
63
- params: Optional[Dict] = None,
61
+ agg_method_params: Optional[dict] = None,
62
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
63
+ params: Optional[dict] = None,
64
64
  name: Optional[str] = None,
65
65
  ) -> None:
66
66
  super().__init__(
File without changes
@@ -4,7 +4,7 @@
4
4
  # Leonard Sasse <l.sasse@fz-juelich.de>
5
5
  # License: AGPL
6
6
 
7
- from typing import Dict, List, Optional, Union
7
+ from typing import Optional, Union
8
8
 
9
9
  import neurokit2 as nk
10
10
  import numpy as np
@@ -24,8 +24,8 @@ class RangeEntropy(ComplexityBase):
24
24
  Parameters
25
25
  ----------
26
26
  parcellation : str or list of str
27
- The name(s) of the parcellation(s). Check valid options by calling
28
- :func:`junifer.data.parcellations.list_parcellations`.
27
+ The name(s) of the parcellation(s) to use.
28
+ See :func:`.list_data` for options.
29
29
  agg_method : str, optional
30
30
  The method to perform aggregation using. Check valid options in
31
31
  :func:`junifer.stats.get_aggfunc_by_name` (default "mean").
@@ -56,11 +56,11 @@ class RangeEntropy(ComplexityBase):
56
56
 
57
57
  def __init__(
58
58
  self,
59
- parcellation: Union[str, List[str]],
59
+ parcellation: Union[str, list[str]],
60
60
  agg_method: str = "mean",
61
- agg_method_params: Optional[Dict] = None,
62
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
63
- params: Optional[Dict] = None,
61
+ agg_method_params: Optional[dict] = None,
62
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
63
+ params: Optional[dict] = None,
64
64
  name: Optional[str] = None,
65
65
  ) -> None:
66
66
  super().__init__(
@@ -4,7 +4,7 @@
4
4
  # Leonard Sasse <l.sasse@fz-juelich.de>
5
5
  # License: AGPL
6
6
 
7
- from typing import Dict, List, Optional, Union
7
+ from typing import Optional, Union
8
8
 
9
9
  import neurokit2 as nk
10
10
  import numpy as np
@@ -24,8 +24,8 @@ class RangeEntropyAUC(ComplexityBase):
24
24
  Parameters
25
25
  ----------
26
26
  parcellation : str or list of str
27
- The name(s) of the parcellation(s). Check valid options by calling
28
- :func:`junifer.data.parcellations.list_parcellations`.
27
+ The name(s) of the parcellation(s) to use.
28
+ See :func:`.list_data` for options.
29
29
  agg_method : str, optional
30
30
  The method to perform aggregation using. Check valid options in
31
31
  :func:`junifer.stats.get_aggfunc_by_name` (default "mean").
@@ -56,11 +56,11 @@ class RangeEntropyAUC(ComplexityBase):
56
56
 
57
57
  def __init__(
58
58
  self,
59
- parcellation: Union[str, List[str]],
59
+ parcellation: Union[str, list[str]],
60
60
  agg_method: str = "mean",
61
- agg_method_params: Optional[Dict] = None,
62
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
63
- params: Optional[Dict] = None,
61
+ agg_method_params: Optional[dict] = None,
62
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
63
+ params: Optional[dict] = None,
64
64
  name: Optional[str] = None,
65
65
  ) -> None:
66
66
  super().__init__(
@@ -4,7 +4,7 @@
4
4
  # Leonard Sasse <l.sasse@fz-juelich.de>
5
5
  # License: AGPL
6
6
 
7
- from typing import Dict, List, Optional, Union
7
+ from typing import Optional, Union
8
8
 
9
9
  import neurokit2 as nk
10
10
  import numpy as np
@@ -24,8 +24,8 @@ class SampleEntropy(ComplexityBase):
24
24
  Parameters
25
25
  ----------
26
26
  parcellation : str or list of str
27
- The name(s) of the parcellation(s). Check valid options by calling
28
- :func:`junifer.data.parcellations.list_parcellations`.
27
+ The name(s) of the parcellation(s) to use.
28
+ See :func:`.list_data` for options.
29
29
  agg_method : str, optional
30
30
  The method to perform aggregation using. Check valid options in
31
31
  :func:`junifer.stats.get_aggfunc_by_name` (default "mean").
@@ -57,11 +57,11 @@ class SampleEntropy(ComplexityBase):
57
57
 
58
58
  def __init__(
59
59
  self,
60
- parcellation: Union[str, List[str]],
60
+ parcellation: Union[str, list[str]],
61
61
  agg_method: str = "mean",
62
- agg_method_params: Optional[Dict] = None,
63
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
64
- params: Optional[Dict] = None,
62
+ agg_method_params: Optional[dict] = None,
63
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
64
+ params: Optional[dict] = None,
65
65
  name: Optional[str] = None,
66
66
  ) -> None:
67
67
  super().__init__(
@@ -8,7 +8,7 @@ import pytest
8
8
 
9
9
  pytest.importorskip("neurokit2")
10
10
 
11
- from junifer.markers.complexity.complexity_base import ( # noqa: E402
11
+ from junifer.markers.complexity.complexity_base import (
12
12
  ComplexityBase,
13
13
  )
14
14
 
@@ -12,11 +12,11 @@ import pytest
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
14
 
15
- from junifer.datareader import DefaultDataReader # noqa: E402
16
- from junifer.markers.complexity import HurstExponent # noqa: E402
17
- from junifer.pipeline.utils import _check_ants # noqa: E402
18
- from junifer.storage import SQLiteFeatureStorage # noqa: E402
19
- from junifer.testing.datagrabbers import ( # noqa: E402
15
+ from junifer.datareader import DefaultDataReader
16
+ from junifer.markers.complexity import HurstExponent
17
+ from junifer.pipeline.utils import _check_ants
18
+ from junifer.storage import SQLiteFeatureStorage
19
+ from junifer.testing.datagrabbers import (
20
20
  SPMAuditoryTestingDataGrabber,
21
21
  )
22
22
 
@@ -11,11 +11,11 @@ import pytest
11
11
 
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
- from junifer.datareader import DefaultDataReader # noqa: E402
15
- from junifer.markers.complexity import MultiscaleEntropyAUC # noqa: E402
16
- from junifer.pipeline.utils import _check_ants # noqa: E402
17
- from junifer.storage import SQLiteFeatureStorage # noqa: E402
18
- from junifer.testing.datagrabbers import ( # noqa: E402
14
+ from junifer.datareader import DefaultDataReader
15
+ from junifer.markers.complexity import MultiscaleEntropyAUC
16
+ from junifer.pipeline.utils import _check_ants
17
+ from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.testing.datagrabbers import (
19
19
  SPMAuditoryTestingDataGrabber,
20
20
  )
21
21
 
@@ -11,11 +11,11 @@ import pytest
11
11
 
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
- from junifer.datareader import DefaultDataReader # noqa: E402
15
- from junifer.markers.complexity import PermEntropy # noqa: E402
16
- from junifer.pipeline.utils import _check_ants # noqa: E402
17
- from junifer.storage import SQLiteFeatureStorage # noqa: E402
18
- from junifer.testing.datagrabbers import ( # noqa: E402
14
+ from junifer.datareader import DefaultDataReader
15
+ from junifer.markers.complexity import PermEntropy
16
+ from junifer.pipeline.utils import _check_ants
17
+ from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.testing.datagrabbers import (
19
19
  SPMAuditoryTestingDataGrabber,
20
20
  )
21
21
 
@@ -12,11 +12,11 @@ import pytest
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
14
 
15
- from junifer.datareader import DefaultDataReader # noqa: E402
16
- from junifer.markers.complexity import RangeEntropy # noqa: E402
17
- from junifer.pipeline.utils import _check_ants # noqa: E402
18
- from junifer.storage import SQLiteFeatureStorage # noqa: E402
19
- from junifer.testing.datagrabbers import ( # noqa: E402
15
+ from junifer.datareader import DefaultDataReader
16
+ from junifer.markers.complexity import RangeEntropy
17
+ from junifer.pipeline.utils import _check_ants
18
+ from junifer.storage import SQLiteFeatureStorage
19
+ from junifer.testing.datagrabbers import (
20
20
  SPMAuditoryTestingDataGrabber,
21
21
  )
22
22
 
@@ -12,11 +12,11 @@ import pytest
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
14
 
15
- from junifer.datareader import DefaultDataReader # noqa: E402
16
- from junifer.markers.complexity import RangeEntropyAUC # noqa: E402
17
- from junifer.pipeline.utils import _check_ants # noqa: E402
18
- from junifer.storage import SQLiteFeatureStorage # noqa: E402
19
- from junifer.testing.datagrabbers import ( # noqa: E402
15
+ from junifer.datareader import DefaultDataReader
16
+ from junifer.markers.complexity import RangeEntropyAUC
17
+ from junifer.pipeline.utils import _check_ants
18
+ from junifer.storage import SQLiteFeatureStorage
19
+ from junifer.testing.datagrabbers import (
20
20
  SPMAuditoryTestingDataGrabber,
21
21
  )
22
22
 
@@ -11,11 +11,11 @@ import pytest
11
11
 
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
- from junifer.datareader import DefaultDataReader # noqa: E402
15
- from junifer.markers.complexity import SampleEntropy # noqa: E402
16
- from junifer.pipeline.utils import _check_ants # noqa: E402
17
- from junifer.storage import SQLiteFeatureStorage # noqa: E402
18
- from junifer.testing.datagrabbers import ( # noqa: E402
14
+ from junifer.datareader import DefaultDataReader
15
+ from junifer.markers.complexity import SampleEntropy
16
+ from junifer.pipeline.utils import _check_ants
17
+ from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.testing.datagrabbers import (
19
19
  SPMAuditoryTestingDataGrabber,
20
20
  )
21
21
 
@@ -11,11 +11,11 @@ import pytest
11
11
 
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
- from junifer.datareader import DefaultDataReader # noqa: E402
15
- from junifer.markers.complexity import WeightedPermEntropy # noqa: E402
16
- from junifer.pipeline.utils import _check_ants # noqa: E402
17
- from junifer.storage import SQLiteFeatureStorage # noqa: E402
18
- from junifer.testing.datagrabbers import ( # noqa: E402
14
+ from junifer.datareader import DefaultDataReader
15
+ from junifer.markers.complexity import WeightedPermEntropy
16
+ from junifer.pipeline.utils import _check_ants
17
+ from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.testing.datagrabbers import (
19
19
  SPMAuditoryTestingDataGrabber,
20
20
  )
21
21
 
@@ -4,7 +4,7 @@
4
4
  # Leonard Sasse <l.sasse@fz-juelich.de>
5
5
  # License: AGPL
6
6
 
7
- from typing import Dict, List, Optional, Union
7
+ from typing import Optional, Union
8
8
 
9
9
  import neurokit2 as nk
10
10
  import numpy as np
@@ -24,8 +24,8 @@ class WeightedPermEntropy(ComplexityBase):
24
24
  Parameters
25
25
  ----------
26
26
  parcellation : str or list of str
27
- The name(s) of the parcellation(s). Check valid options by calling
28
- :func:`junifer.data.parcellations.list_parcellations`.
27
+ The name(s) of the parcellation(s) to use.
28
+ See :func:`.list_data` for options.
29
29
  agg_method : str, optional
30
30
  The method to perform aggregation using. Check valid options in
31
31
  :func:`junifer.stats.get_aggfunc_by_name` (default "mean").
@@ -57,11 +57,11 @@ class WeightedPermEntropy(ComplexityBase):
57
57
 
58
58
  def __init__(
59
59
  self,
60
- parcellation: Union[str, List[str]],
60
+ parcellation: Union[str, list[str]],
61
61
  agg_method: str = "mean",
62
- agg_method_params: Optional[Dict] = None,
63
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
64
- params: Optional[Dict] = None,
62
+ agg_method_params: Optional[dict] = None,
63
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
64
+ params: Optional[dict] = None,
65
65
  name: Optional[str] = None,
66
66
  ) -> None:
67
67
  super().__init__(
@@ -6,11 +6,12 @@
6
6
  # Synchon Mandal <s.mandal@fz-juelich.de>
7
7
  # License: AGPL
8
8
 
9
- from typing import Any, ClassVar, Dict, List, Optional, Set, Union
9
+ from typing import Any, ClassVar, Optional, Union
10
10
 
11
11
  import numpy as np
12
12
 
13
13
  from ..api.decorators import register_marker
14
+ from ..typing import Dependencies, MarkerInOutMappings
14
15
  from ..utils import logger
15
16
  from .base import BaseMarker
16
17
  from .parcel_aggregation import ParcelAggregation
@@ -27,8 +28,8 @@ class RSSETSMarker(BaseMarker):
27
28
  Parameters
28
29
  ----------
29
30
  parcellation : str or list of str
30
- The name(s) of the parcellation(s). Check valid options by calling
31
- :func:`.list_parcellations`.
31
+ The name(s) of the parcellation(s) to use.
32
+ See :func:`.list_data` for options.
32
33
  agg_method : str, optional
33
34
  The method to perform aggregation using. Check valid options in
34
35
  :func:`.get_aggfunc_by_name` (default "mean").
@@ -45,9 +46,9 @@ class RSSETSMarker(BaseMarker):
45
46
 
46
47
  """
47
48
 
48
- _DEPENDENCIES: ClassVar[Set[str]] = {"nilearn"}
49
+ _DEPENDENCIES: ClassVar[Dependencies] = {"nilearn"}
49
50
 
50
- _MARKER_INOUT_MAPPINGS: ClassVar[Dict[str, Dict[str, str]]] = {
51
+ _MARKER_INOUT_MAPPINGS: ClassVar[MarkerInOutMappings] = {
51
52
  "BOLD": {
52
53
  "rss_ets": "timeseries",
53
54
  },
@@ -55,10 +56,10 @@ class RSSETSMarker(BaseMarker):
55
56
 
56
57
  def __init__(
57
58
  self,
58
- parcellation: Union[str, List[str]],
59
+ parcellation: Union[str, list[str]],
59
60
  agg_method: str = "mean",
60
- agg_method_params: Optional[Dict] = None,
61
- masks: Union[str, Dict, List[Union[Dict, str]], None] = None,
61
+ agg_method_params: Optional[dict] = None,
62
+ masks: Union[str, dict, list[Union[dict, str]], None] = None,
62
63
  name: Optional[str] = None,
63
64
  ) -> None:
64
65
  self.parcellation = parcellation
@@ -69,9 +70,9 @@ class RSSETSMarker(BaseMarker):
69
70
 
70
71
  def compute(
71
72
  self,
72
- input: Dict[str, Any],
73
- extra_input: Optional[Dict] = None,
74
- ) -> Dict:
73
+ input: dict[str, Any],
74
+ extra_input: Optional[dict] = None,
75
+ ) -> dict:
75
76
  """Compute.
76
77
 
77
78
  Take a timeseries of brain areas, and calculate timeseries for each
@@ -3,8 +3,7 @@
3
3
  # Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
4
4
  # License: AGPL
5
5
 
6
- from .falff_parcels import ALFFParcels
7
- from .falff_spheres import ALFFSpheres
6
+ import lazy_loader as lazy
8
7
 
9
8
 
10
- __all__ = ["ALFFParcels", "ALFFSpheres"]
9
+ __getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)