rapidtide 3.0.11__py3-none-any.whl → 3.1.1__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 (144) hide show
  1. rapidtide/Colortables.py +492 -27
  2. rapidtide/OrthoImageItem.py +1049 -46
  3. rapidtide/RapidtideDataset.py +1533 -86
  4. rapidtide/_version.py +3 -3
  5. rapidtide/calccoherence.py +196 -29
  6. rapidtide/calcnullsimfunc.py +188 -40
  7. rapidtide/calcsimfunc.py +242 -42
  8. rapidtide/correlate.py +1203 -383
  9. rapidtide/data/examples/src/testLD +56 -0
  10. rapidtide/data/examples/src/testalign +1 -1
  11. rapidtide/data/examples/src/testdelayvar +0 -1
  12. rapidtide/data/examples/src/testfmri +53 -3
  13. rapidtide/data/examples/src/testglmfilt +5 -5
  14. rapidtide/data/examples/src/testhappy +29 -7
  15. rapidtide/data/examples/src/testppgproc +17 -0
  16. rapidtide/data/examples/src/testrolloff +11 -0
  17. rapidtide/data/models/model_cnn_pytorch/best_model.pth +0 -0
  18. rapidtide/data/models/model_cnn_pytorch/loss.png +0 -0
  19. rapidtide/data/models/model_cnn_pytorch/loss.txt +1 -0
  20. rapidtide/data/models/model_cnn_pytorch/model.pth +0 -0
  21. rapidtide/data/models/model_cnn_pytorch/model_meta.json +68 -0
  22. rapidtide/decorators.py +91 -0
  23. rapidtide/dlfilter.py +2226 -110
  24. rapidtide/dlfiltertorch.py +4842 -0
  25. rapidtide/externaltools.py +327 -12
  26. rapidtide/fMRIData_class.py +79 -40
  27. rapidtide/filter.py +1899 -810
  28. rapidtide/fit.py +2011 -581
  29. rapidtide/genericmultiproc.py +93 -18
  30. rapidtide/happy_supportfuncs.py +2047 -172
  31. rapidtide/helper_classes.py +584 -43
  32. rapidtide/io.py +2370 -372
  33. rapidtide/linfitfiltpass.py +346 -99
  34. rapidtide/makelaggedtcs.py +210 -24
  35. rapidtide/maskutil.py +448 -62
  36. rapidtide/miscmath.py +827 -121
  37. rapidtide/multiproc.py +210 -22
  38. rapidtide/patchmatch.py +242 -42
  39. rapidtide/peakeval.py +31 -31
  40. rapidtide/ppgproc.py +2203 -0
  41. rapidtide/qualitycheck.py +352 -39
  42. rapidtide/refinedelay.py +431 -57
  43. rapidtide/refineregressor.py +494 -189
  44. rapidtide/resample.py +671 -185
  45. rapidtide/scripts/applyppgproc.py +28 -0
  46. rapidtide/scripts/showxcorr_legacy.py +7 -7
  47. rapidtide/scripts/stupidramtricks.py +15 -17
  48. rapidtide/simFuncClasses.py +1052 -77
  49. rapidtide/simfuncfit.py +269 -69
  50. rapidtide/stats.py +540 -238
  51. rapidtide/tests/happycomp +9 -0
  52. rapidtide/tests/test_cleanregressor.py +1 -2
  53. rapidtide/tests/test_dlfiltertorch.py +627 -0
  54. rapidtide/tests/test_findmaxlag.py +24 -8
  55. rapidtide/tests/test_fullrunhappy_v1.py +0 -2
  56. rapidtide/tests/test_fullrunhappy_v2.py +0 -2
  57. rapidtide/tests/test_fullrunhappy_v3.py +11 -4
  58. rapidtide/tests/test_fullrunhappy_v4.py +10 -2
  59. rapidtide/tests/test_fullrunrapidtide_v7.py +1 -1
  60. rapidtide/tests/test_getparsers.py +11 -3
  61. rapidtide/tests/test_refinedelay.py +0 -1
  62. rapidtide/tests/test_simroundtrip.py +16 -8
  63. rapidtide/tests/test_stcorrelate.py +3 -1
  64. rapidtide/tests/utils.py +9 -8
  65. rapidtide/tidepoolTemplate.py +142 -38
  66. rapidtide/tidepoolTemplate_alt.py +165 -44
  67. rapidtide/tidepoolTemplate_big.py +189 -52
  68. rapidtide/util.py +1217 -118
  69. rapidtide/voxelData.py +684 -37
  70. rapidtide/wiener.py +136 -23
  71. rapidtide/wiener2.py +113 -7
  72. rapidtide/workflows/adjustoffset.py +105 -3
  73. rapidtide/workflows/aligntcs.py +85 -2
  74. rapidtide/workflows/applydlfilter.py +87 -10
  75. rapidtide/workflows/applyppgproc.py +540 -0
  76. rapidtide/workflows/atlasaverage.py +210 -47
  77. rapidtide/workflows/atlastool.py +100 -3
  78. rapidtide/workflows/calcSimFuncMap.py +288 -69
  79. rapidtide/workflows/calctexticc.py +201 -9
  80. rapidtide/workflows/ccorrica.py +101 -6
  81. rapidtide/workflows/cleanregressor.py +165 -31
  82. rapidtide/workflows/delayvar.py +171 -23
  83. rapidtide/workflows/diffrois.py +81 -3
  84. rapidtide/workflows/endtidalproc.py +144 -4
  85. rapidtide/workflows/fdica.py +195 -15
  86. rapidtide/workflows/filtnifti.py +70 -3
  87. rapidtide/workflows/filttc.py +74 -3
  88. rapidtide/workflows/fitSimFuncMap.py +202 -51
  89. rapidtide/workflows/fixtr.py +73 -3
  90. rapidtide/workflows/gmscalc.py +113 -3
  91. rapidtide/workflows/happy.py +801 -199
  92. rapidtide/workflows/happy2std.py +144 -12
  93. rapidtide/workflows/happy_parser.py +163 -23
  94. rapidtide/workflows/histnifti.py +118 -2
  95. rapidtide/workflows/histtc.py +84 -3
  96. rapidtide/workflows/linfitfilt.py +117 -4
  97. rapidtide/workflows/localflow.py +328 -28
  98. rapidtide/workflows/mergequality.py +79 -3
  99. rapidtide/workflows/niftidecomp.py +322 -18
  100. rapidtide/workflows/niftistats.py +174 -4
  101. rapidtide/workflows/pairproc.py +98 -4
  102. rapidtide/workflows/pairwisemergenifti.py +85 -2
  103. rapidtide/workflows/parser_funcs.py +1421 -40
  104. rapidtide/workflows/physiofreq.py +137 -11
  105. rapidtide/workflows/pixelcomp.py +207 -5
  106. rapidtide/workflows/plethquality.py +103 -21
  107. rapidtide/workflows/polyfitim.py +151 -11
  108. rapidtide/workflows/proj2flow.py +75 -2
  109. rapidtide/workflows/rankimage.py +111 -4
  110. rapidtide/workflows/rapidtide.py +368 -76
  111. rapidtide/workflows/rapidtide2std.py +98 -2
  112. rapidtide/workflows/rapidtide_parser.py +109 -9
  113. rapidtide/workflows/refineDelayMap.py +144 -33
  114. rapidtide/workflows/refineRegressor.py +675 -96
  115. rapidtide/workflows/regressfrommaps.py +161 -37
  116. rapidtide/workflows/resamplenifti.py +85 -3
  117. rapidtide/workflows/resampletc.py +91 -3
  118. rapidtide/workflows/retrolagtcs.py +99 -9
  119. rapidtide/workflows/retroregress.py +176 -26
  120. rapidtide/workflows/roisummarize.py +174 -5
  121. rapidtide/workflows/runqualitycheck.py +71 -3
  122. rapidtide/workflows/showarbcorr.py +149 -6
  123. rapidtide/workflows/showhist.py +86 -2
  124. rapidtide/workflows/showstxcorr.py +160 -3
  125. rapidtide/workflows/showtc.py +159 -3
  126. rapidtide/workflows/showxcorrx.py +190 -10
  127. rapidtide/workflows/showxy.py +185 -15
  128. rapidtide/workflows/simdata.py +264 -38
  129. rapidtide/workflows/spatialfit.py +77 -2
  130. rapidtide/workflows/spatialmi.py +250 -27
  131. rapidtide/workflows/spectrogram.py +305 -32
  132. rapidtide/workflows/synthASL.py +154 -3
  133. rapidtide/workflows/tcfrom2col.py +76 -2
  134. rapidtide/workflows/tcfrom3col.py +74 -2
  135. rapidtide/workflows/tidepool.py +2971 -130
  136. rapidtide/workflows/utils.py +19 -14
  137. rapidtide/workflows/utils_doc.py +293 -0
  138. rapidtide/workflows/variabilityizer.py +116 -3
  139. {rapidtide-3.0.11.dist-info → rapidtide-3.1.1.dist-info}/METADATA +10 -8
  140. {rapidtide-3.0.11.dist-info → rapidtide-3.1.1.dist-info}/RECORD +144 -128
  141. {rapidtide-3.0.11.dist-info → rapidtide-3.1.1.dist-info}/entry_points.txt +1 -0
  142. {rapidtide-3.0.11.dist-info → rapidtide-3.1.1.dist-info}/WHEEL +0 -0
  143. {rapidtide-3.0.11.dist-info → rapidtide-3.1.1.dist-info}/licenses/LICENSE +0 -0
  144. {rapidtide-3.0.11.dist-info → rapidtide-3.1.1.dist-info}/top_level.txt +0 -0
@@ -17,24 +17,76 @@
17
17
  #
18
18
  #
19
19
  import gc
20
+ import logging
21
+ from typing import Any
20
22
 
21
23
  import numpy as np
24
+ from numpy.typing import NDArray
22
25
 
23
26
  import rapidtide.genericmultiproc as tide_genericmultiproc
24
27
 
25
28
 
26
29
  def _procOneVoxelMakelagtc(
27
- vox,
28
- voxelargs,
29
- **kwargs,
30
- ):
30
+ vox: int,
31
+ voxelargs: list,
32
+ **kwargs: Any,
33
+ ) -> tuple[int, NDArray]:
34
+ """
35
+ Process a single voxel to compute lag timecourse using lag timecourse generator.
36
+
37
+ This function takes a voxel index and associated arguments to compute a lag
38
+ timecourse using the provided lag timecourse generator. The computation involves
39
+ evaluating the generator at timepoints shifted by the specified lag value.
40
+
41
+ Parameters
42
+ ----------
43
+ vox : int
44
+ Voxel index identifier used for tracking and debugging purposes.
45
+ voxelargs : list
46
+ List containing three elements:
47
+ 1. `lagtcgenerator` - Lag timecourse generator object with `yfromx` method
48
+ 2. `thelag` - Lag value to be subtracted from time axis
49
+ 3. `timeaxis` - Time axis array for evaluation
50
+ **kwargs : Any
51
+ Additional keyword arguments that can override default options:
52
+ - `rt_floattype` : float type for computations (default: np.float64)
53
+ - `debug` : boolean for debug printing (default: False)
54
+
55
+ Returns
56
+ -------
57
+ tuple[int, NDArray]
58
+ Tuple containing:
59
+ - `vox` : Input voxel index
60
+ - `thelagtc` : Computed lag timecourse array
61
+
62
+ Notes
63
+ -----
64
+ The lag value is subtracted from the time axis as of 10/18. Alternative approaches
65
+ of adding the lag value resulted in poor performance.
66
+
67
+ Examples
68
+ --------
69
+ >>> import numpy as np
70
+ >>>
71
+ >>> # Example usage with mock generator
72
+ >>> class MockGenerator:
73
+ ... def yfromx(self, x):
74
+ ... return x**2
75
+ ...
76
+ >>> generator = MockGenerator()
77
+ >>> time_axis = np.array([0, 1, 2, 3, 4])
78
+ >>> voxel_args = [generator, 1.0, time_axis]
79
+ >>> result = _procOneVoxelMakelagtc(0, voxel_args)
80
+ >>> print(result)
81
+ (0, array([0., 1., 4., 9., 16.]))
82
+ """
31
83
  # unpack arguments
32
84
  options = {
33
- "rt_floatset": np.float64,
85
+ "rt_floattype": np.float64,
34
86
  "debug": False,
35
87
  }
36
88
  options.update(kwargs)
37
- rt_floatset = options["rt_floatset"]
89
+ rt_floattype = options["rt_floattype"]
38
90
  debug = options["debug"]
39
91
  (lagtcgenerator, thelag, timeaxis) = voxelargs
40
92
  if debug:
@@ -42,7 +94,7 @@ def _procOneVoxelMakelagtc(
42
94
 
43
95
  # question - should maxlag be added or subtracted? As of 10/18, it is subtracted
44
96
  # potential answer - tried adding, results are terrible.
45
- thelagtc = rt_floatset(lagtcgenerator.yfromx(timeaxis - thelag))
97
+ thelagtc = (lagtcgenerator.yfromx(timeaxis - thelag)).astype(rt_floattype)
46
98
 
47
99
  return (
48
100
  vox,
@@ -50,29 +102,163 @@ def _procOneVoxelMakelagtc(
50
102
  )
51
103
 
52
104
 
53
- def _packvoxeldata(voxnum, voxelargs):
105
+ def _packvoxeldata(voxnum: int, voxelargs: list) -> list:
106
+ """
107
+ Pack voxel data into a list format.
108
+
109
+ Parameters
110
+ ----------
111
+ voxnum : int
112
+ The index used to select an element from the second element of voxelargs.
113
+ voxelargs : list
114
+ A list containing three elements where:
115
+ - voxelargs[0] is the first element to be returned
116
+ - voxelargs[1] is a list or array from which an element is selected using voxnum
117
+ - voxelargs[2] is the third element to be returned
118
+
119
+ Returns
120
+ -------
121
+ list
122
+ A list containing three elements: [voxelargs[0], voxelargs[1][voxnum], voxelargs[2]]
123
+
124
+ Notes
125
+ -----
126
+ This function assumes that voxelargs[1] is indexable and that voxnum is a valid index
127
+ for accessing elements in voxelargs[1]. The function does not perform any validation
128
+ of the input parameters.
129
+
130
+ Examples
131
+ --------
132
+ >>> _packvoxeldata(1, [10, [20, 30, 40], 50])
133
+ [10, 30, 50]
134
+
135
+ >>> _packvoxeldata(0, ['a', ['b', 'c', 'd'], 'e'])
136
+ ['a', 'b', 'e']
137
+ """
54
138
  return [voxelargs[0], (voxelargs[1])[voxnum], voxelargs[2]]
55
139
 
56
140
 
57
- def _unpackvoxeldata(retvals, voxelproducts):
141
+ def _unpackvoxeldata(retvals: tuple, voxelproducts: list) -> None:
142
+ """
143
+ Unpack voxel data into the specified voxel products array.
144
+
145
+ This function takes return values and assigns them to a specific location
146
+ in the voxel products array. It is typically used as part of a larger
147
+ voxel processing pipeline.
148
+
149
+ Parameters
150
+ ----------
151
+ retvals : tuple
152
+ A tuple containing the data to be unpacked. The first element is used
153
+ as an index for the voxel products array, and the second element contains
154
+ the actual data to be assigned.
155
+ voxelproducts : list
156
+ A list of arrays where the voxel data will be stored. The function
157
+ modifies the first element of this list in-place.
158
+
159
+ Returns
160
+ -------
161
+ None
162
+ This function modifies the voxelproducts list in-place and does not
163
+ return any value.
164
+
165
+ Notes
166
+ -----
167
+ The function assumes that retvals[0] is a valid index for the first element
168
+ of voxelproducts and that retvals[1] has compatible dimensions for assignment.
169
+
170
+ Examples
171
+ --------
172
+ >>> retvals = (5, [1, 2, 3, 4, 5])
173
+ >>> voxelproducts = [[0] * 10]
174
+ >>> _unpackvoxeldata(retvals, voxelproducts)
175
+ >>> print(voxelproducts[0])
176
+ [0, 0, 0, 0, 0, 1, 2, 3, 4, 5]
177
+ """
58
178
  (voxelproducts[0])[retvals[0], :] = retvals[1]
59
179
 
60
180
 
61
181
  def makelaggedtcs(
62
- lagtcgenerator,
63
- timeaxis,
64
- lagmask,
65
- lagtimes,
66
- lagtc,
67
- LGR=None,
68
- nprocs=1,
69
- alwaysmultiproc=False,
70
- showprogressbar=True,
71
- chunksize=1000,
72
- rt_floatset=np.float64,
73
- rt_floattype="float64",
74
- debug=False,
75
- ):
182
+ lagtcgenerator: Any,
183
+ timeaxis: NDArray,
184
+ lagmask: NDArray,
185
+ lagtimes: NDArray,
186
+ lagtc: NDArray,
187
+ LGR: logging.Logger | None = None,
188
+ nprocs: int = 1,
189
+ alwaysmultiproc: bool = False,
190
+ showprogressbar: bool = True,
191
+ chunksize: int = 1000,
192
+ rt_floattype: np.dtype = np.float64,
193
+ debug: bool = False,
194
+ ) -> int:
195
+ """
196
+ Generate lagged timecourses for a set of voxels using multiprocessing.
197
+
198
+ This function computes lagged timecourses for each voxel specified in the mask,
199
+ using the provided lag timecourse generator and time axis. It supports
200
+ parallel processing for performance optimization.
201
+
202
+ Parameters
203
+ ----------
204
+ lagtcgenerator : Any
205
+ A callable or object that generates lagged timecourses for a single voxel.
206
+ timeaxis : NDArray
207
+ 1D array representing the time axis (e.g., TRs or time points).
208
+ lagmask : NDArray
209
+ 3D or 4D boolean or integer array defining the voxels to process.
210
+ Non-zero entries indicate voxels to be processed.
211
+ lagtimes : NDArray
212
+ 1D array of lag times (in seconds or time units) to be applied.
213
+ lagtc : NDArray
214
+ 4D array of shape (ntimepoints, nvoxels, nlags) to store the output lagged
215
+ timecourses. This is updated in-place.
216
+ LGR : logging.Logger, optional
217
+ Logger instance for logging messages. If None, no logging is performed.
218
+ nprocs : int, optional
219
+ Number of processes to use for multiprocessing. Default is 1.
220
+ alwaysmultiproc : bool, optional
221
+ If True, always use multiprocessing even for single voxel processing.
222
+ Default is False.
223
+ showprogressbar : bool, optional
224
+ If True, display a progress bar during processing. Default is True.
225
+ chunksize : int, optional
226
+ Size of chunks to process in each step when using multiprocessing.
227
+ Default is 1000.
228
+ rt_floattype : str, optional
229
+ String representation of the floating-point type.
230
+ Default is `np.float64`.
231
+ debug : bool, optional
232
+ If True, print debug information. Default is False.
233
+
234
+ Returns
235
+ -------
236
+ int
237
+ Total number of voxels processed.
238
+
239
+ Notes
240
+ -----
241
+ This function uses `tide_genericmultiproc.run_multiproc` internally to
242
+ distribute voxel processing across multiple processes. It is designed for
243
+ efficient batch processing of large 4D datasets.
244
+
245
+ Examples
246
+ --------
247
+ >>> import numpy as np
248
+ >>> timeaxis = np.arange(100)
249
+ >>> lagtimes = np.array([0, 1, 2])
250
+ >>> lagmask = np.ones((10, 10, 10), dtype=bool)
251
+ >>> lagtc = np.zeros((100, 1000, 3))
252
+ >>> result = makelaggedtcs(
253
+ ... lagtcgenerator=my_generator,
254
+ ... timeaxis=timeaxis,
255
+ ... lagmask=lagmask,
256
+ ... lagtimes=lagtimes,
257
+ ... lagtc=lagtc,
258
+ ... nprocs=4
259
+ ... )
260
+ >>> print(f"Processed {result} voxels")
261
+ """
76
262
  if debug:
77
263
  print("makelaggedtcs: Starting")
78
264
  print(f"\t{lagtc.shape=}")
@@ -103,7 +289,7 @@ def makelaggedtcs(
103
289
  alwaysmultiproc,
104
290
  showprogressbar,
105
291
  chunksize,
106
- rt_floatset=rt_floatset,
292
+ rt_floattype=rt_floattype,
107
293
  )
108
294
  if LGR is not None:
109
295
  LGR.info(f"\nLagged timecourses created for {volumetotal} voxels")