junifer 0.0.6.dev459__py3-none-any.whl → 0.0.6.dev474__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.
junifer/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.0.6.dev459'
16
- __version_tuple__ = version_tuple = (0, 0, 6, 'dev459')
15
+ __version__ = version = '0.0.6.dev474'
16
+ __version_tuple__ = version_tuple = (0, 0, 6, 'dev474')
@@ -185,7 +185,7 @@ def signals() -> list[np.ndarray]:
185
185
 
186
186
  @pytest.fixture
187
187
  def signals_and_covariances(
188
- cov_estimator: Union[LedoitWolf, EmpiricalCovariance]
188
+ cov_estimator: Union[LedoitWolf, EmpiricalCovariance],
189
189
  ) -> tuple[list[np.ndarray], list[float]]:
190
190
  """Return signals and covariances for a covariance estimator.
191
191
 
@@ -17,6 +17,8 @@ import numpy as np
17
17
  import pandas as pd
18
18
  from nilearn import image as nimg
19
19
  from nilearn._utils.niimg_conversions import check_niimg_4d
20
+ from nilearn.interfaces.fmriprep.load_confounds_components import _load_scrub
21
+ from nilearn.interfaces.fmriprep.load_confounds_utils import prepare_output
20
22
 
21
23
  from ...api.decorators import register_preprocessor
22
24
  from ...data import get_data
@@ -110,13 +112,15 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
110
112
  ----------
111
113
  strategy : dict, optional
112
114
  The strategy to use for each component. If None, will use the *full*
113
- strategy for all components (default None).
115
+ strategy for all components except ``"scrubbing"`` which will be set
116
+ to False (default None).
114
117
  The keys of the dictionary should correspond to names of noise
115
118
  components to include:
116
119
 
117
120
  * ``motion``
118
121
  * ``wm_csf``
119
122
  * ``global_signal``
123
+ * ``scrubbing``
120
124
 
121
125
  The values of dictionary should correspond to types of confounds
122
126
  extracted from each signal:
@@ -126,10 +130,29 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
126
130
  * ``derivatives`` : signal + derivatives
127
131
  * ``full`` : signal + deriv. + quadratic terms + power2 deriv.
128
132
 
133
+ except ``scrubbing`` which needs to be bool.
129
134
  spike : float, optional
130
135
  If None, no spike regressor is added. If spike is a float, it will
131
136
  add a spike regressor for every point at which framewise displacement
132
137
  exceeds the specified float (default None).
138
+ scrub : int, optional
139
+ After accounting for time frames with excessive motion, further remove
140
+ segments shorter than the given number. When the value is 0, remove
141
+ time frames based on excessive framewise displacement and DVARS only.
142
+ If None and no ``"scrubbing"`` in ``strategy``, no scrubbing is
143
+ performed, else the default value is 0. The default value is referred
144
+ as full scrubbing (default None).
145
+ fd_threshold : float, optional
146
+ Framewise displacement threshold for scrub in mm. If None no
147
+ ``"scrubbing"`` in ``strategy``, no scrubbing is performed, else the
148
+ default value is 0.5 (default None).
149
+ std_dvars_threshold : float, optional
150
+ Standardized DVARS threshold for scrub. DVARs is defined as root mean
151
+ squared intensity difference of volume N to volume N+1. D referring to
152
+ temporal derivative of timecourses, VARS referring to root mean squared
153
+ variance over voxels. If None and no ``"scrubbing"`` in ``strategy``,
154
+ no scrubbing is performed, else the default value is 1.5
155
+ (default None).
133
156
  detrend : bool, optional
134
157
  If True, detrending will be applied on timeseries, before confound
135
158
  removal (default True).
@@ -155,8 +178,11 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
155
178
 
156
179
  def __init__(
157
180
  self,
158
- strategy: Optional[dict[str, str]] = None,
181
+ strategy: Optional[dict[str, Union[str, bool]]] = None,
159
182
  spike: Optional[float] = None,
183
+ scrub: Optional[int] = None,
184
+ fd_threshold: Optional[float] = None,
185
+ std_dvars_threshold: Optional[float] = None,
160
186
  detrend: bool = True,
161
187
  standardize: bool = True,
162
188
  low_pass: Optional[float] = None,
@@ -170,9 +196,13 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
170
196
  "motion": "full",
171
197
  "wm_csf": "full",
172
198
  "global_signal": "full",
199
+ "scrubbing": False,
173
200
  }
174
201
  self.strategy = strategy
175
202
  self.spike = spike
203
+ self.scrub = scrub
204
+ self.fd_threshold = fd_threshold
205
+ self.std_dvars_threshold = std_dvars_threshold
176
206
  self.detrend = detrend
177
207
  self.standardize = standardize
178
208
  self.low_pass = low_pass
@@ -180,13 +210,22 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
180
210
  self.t_r = t_r
181
211
  self.masks = masks
182
212
 
183
- self._valid_components = ["motion", "wm_csf", "global_signal"]
213
+ self._valid_components = [
214
+ "motion",
215
+ "wm_csf",
216
+ "global_signal",
217
+ "scrubbing",
218
+ ]
184
219
  self._valid_confounds = ["basic", "power2", "derivatives", "full"]
185
220
 
186
221
  if any(not isinstance(k, str) for k in strategy.keys()):
187
222
  raise_error("Strategy keys must be strings", ValueError)
188
223
 
189
- if any(not isinstance(v, str) for v in strategy.values()):
224
+ if any(
225
+ not isinstance(v, str)
226
+ for k, v in strategy.items()
227
+ if k != "scrubbing"
228
+ ):
190
229
  raise_error("Strategy values must be strings", ValueError)
191
230
 
192
231
  if any(x not in self._valid_components for x in strategy.keys()):
@@ -199,7 +238,11 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
199
238
  klass=ValueError,
200
239
  )
201
240
 
202
- if any(x not in self._valid_confounds for x in strategy.values()):
241
+ if any(
242
+ v not in self._valid_confounds
243
+ for k, v in strategy.items()
244
+ if k != "scrubbing"
245
+ ):
203
246
  raise_error(
204
247
  msg=f"Invalid confound types {list(strategy.values())}. "
205
248
  f"Valid confound types are {self._valid_confounds}.\n"
@@ -302,7 +345,7 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
302
345
 
303
346
  Raises
304
347
  ------
305
- ValueError
348
+ RuntimeError
306
349
  If invalid confounds file is found.
307
350
 
308
351
  """
@@ -315,45 +358,57 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
315
358
  derivatives_to_compute = {} # the dictionary of missing derivatives
316
359
 
317
360
  for t_kind, t_strategy in self.strategy.items():
318
- t_basics = FMRIPREP_BASICS[t_kind]
319
-
320
- if any(x not in available_vars for x in t_basics):
321
- missing = [x for x in t_basics if x not in available_vars]
322
- raise_error(
323
- "Invalid confounds file. Missing basic confounds: "
324
- f"{missing}. "
325
- "Check if this file is really an fmriprep confounds file. "
326
- "You can also modify the confound removal strategy."
327
- )
328
-
329
- to_select.extend(t_basics)
330
-
331
- if t_strategy in ["power2", "full"]:
332
- for x in t_basics:
333
- x_2 = f"{x}_power2"
334
- to_select.append(x_2)
335
- if x_2 not in available_vars:
336
- squares_to_compute[x_2] = x
337
-
338
- if t_strategy in ["derivatives", "full"]:
339
- for x in t_basics:
340
- x_derivative = f"{x}_derivative1"
341
- to_select.append(x_derivative)
342
- if x_derivative not in available_vars:
343
- derivatives_to_compute[x_derivative] = x
344
- if t_strategy == "full":
345
- x_derivative_2 = f"{x_derivative}_power2"
346
- to_select.append(x_derivative_2)
347
- if x_derivative_2 not in available_vars:
348
- squares_to_compute[x_derivative_2] = x_derivative
361
+ if t_kind != "scrubbing":
362
+ t_basics = FMRIPREP_BASICS[t_kind]
363
+
364
+ if any(x not in available_vars for x in t_basics):
365
+ missing = [x for x in t_basics if x not in available_vars]
366
+ raise_error(
367
+ msg=(
368
+ "Invalid confounds file. Missing basic confounds: "
369
+ f"{missing}. "
370
+ "Check if this file is really an fmriprep "
371
+ "confounds file. You can also modify the confound "
372
+ "removal strategy."
373
+ ),
374
+ klass=RuntimeError,
375
+ )
376
+
377
+ to_select.extend(t_basics)
378
+
379
+ if t_strategy in ["power2", "full"]:
380
+ for x in t_basics:
381
+ x_2 = f"{x}_power2"
382
+ to_select.append(x_2)
383
+ if x_2 not in available_vars:
384
+ squares_to_compute[x_2] = x
385
+
386
+ if t_strategy in ["derivatives", "full"]:
387
+ for x in t_basics:
388
+ x_derivative = f"{x}_derivative1"
389
+ to_select.append(x_derivative)
390
+ if x_derivative not in available_vars:
391
+ derivatives_to_compute[x_derivative] = x
392
+ if t_strategy == "full":
393
+ x_derivative_2 = f"{x_derivative}_power2"
394
+ to_select.append(x_derivative_2)
395
+ if x_derivative_2 not in available_vars:
396
+ squares_to_compute[x_derivative_2] = (
397
+ x_derivative
398
+ )
399
+ # Add spike
349
400
  spike_name = "framewise_displacement"
350
401
  if self.spike is not None:
351
402
  if spike_name not in available_vars:
352
403
  raise_error(
353
- "Invalid confounds file. Missing framewise_displacement "
354
- "(spike) confound. "
355
- "Check if this file is really an fmriprep confounds file. "
356
- "You can also deactivate spike (set spike = None)."
404
+ msg=(
405
+ "Invalid confounds file. Missing "
406
+ "framewise_displacement (spike) confound. "
407
+ "Check if this file is really an fmriprep confounds "
408
+ "file. You can also deactivate spike "
409
+ "(set spike = None)."
410
+ ),
411
+ klass=RuntimeError,
357
412
  )
358
413
  out = to_select, squares_to_compute, derivatives_to_compute, spike_name
359
414
  return out
@@ -377,14 +432,12 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
377
432
  if confounds_format == "adhoc":
378
433
  self._map_adhoc_to_fmriprep(input)
379
434
 
380
- processed_spec = self._process_fmriprep_spec(input)
381
-
382
435
  (
383
436
  to_select,
384
437
  squares_to_compute,
385
438
  derivatives_to_compute,
386
439
  spike_name,
387
- ) = processed_spec
440
+ ) = self._process_fmriprep_spec(input)
388
441
  # Copy the confounds
389
442
  out_df = input["data"].copy()
390
443
 
@@ -415,6 +468,67 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
415
468
 
416
469
  return out_df
417
470
 
471
+ def _get_scrub_regressors(
472
+ self, confounds_df: pd.DataFrame
473
+ ) -> pd.DataFrame:
474
+ """Get motion outline regressors.
475
+
476
+ Parameters
477
+ ----------
478
+ confounds_df : pandas.DataFrame
479
+ pandas.DataFrame with all confounds.
480
+
481
+ Returns
482
+ -------
483
+ pandas.DataFrame
484
+ pandas.DataFrame of motion outline regressors.
485
+
486
+ Raises
487
+ ------
488
+ RuntimeError
489
+ If ``std_dvars`` and / or ``framewise_displacement`` is not found
490
+ in ``confounds_df``.
491
+
492
+ """
493
+ # Check columns
494
+ if (
495
+ self.std_dvars_threshold is not None
496
+ and "std_dvars" not in confounds_df.columns
497
+ ):
498
+ raise_error(
499
+ msg=(
500
+ "Invalid confounds file. Missing std_dvars "
501
+ "(standardized DVARS) confound. "
502
+ "Check if this file is really an fMRIPrep confounds file. "
503
+ ),
504
+ klass=RuntimeError,
505
+ )
506
+ if (
507
+ self.fd_threshold is not None
508
+ and "framewise_displacement" not in confounds_df.columns
509
+ ):
510
+ raise_error(
511
+ msg=(
512
+ "Invalid confounds file. Missing framewise_displacement "
513
+ "confound. "
514
+ "Check if this file is really an fMRIPrep confounds file. "
515
+ ),
516
+ klass=RuntimeError,
517
+ )
518
+ # Use function from nilearn to not reinvent the wheel
519
+ return _load_scrub(
520
+ confounds_raw=confounds_df,
521
+ scrub=self.scrub if self.scrub is not None else 0,
522
+ fd_threshold=(
523
+ self.fd_threshold if self.fd_threshold is not None else 0.5
524
+ ),
525
+ std_dvars_threshold=(
526
+ self.std_dvars_threshold
527
+ if self.std_dvars_threshold is not None
528
+ else 1.5
529
+ ),
530
+ )
531
+
418
532
  def _validate_data(
419
533
  self,
420
534
  input: dict[str, Any],
@@ -578,12 +692,38 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
578
692
  }
579
693
  }
580
694
  )
695
+
696
+ signal_clean_kwargs = {}
697
+ # Set up scrubbing mask if needed
698
+ if self.strategy.get("scrubbing", False):
699
+ motion_outline_regressors = self._get_scrub_regressors(
700
+ input["confounds"]["data"]
701
+ )
702
+ # Add regressors to confounds
703
+ confounds_df = pd.concat(
704
+ [confounds_df, motion_outline_regressors], axis=1
705
+ )
706
+ # Get sample mask
707
+ sample_mask, confounds_df = prepare_output(
708
+ confounds=confounds_df, demean=False
709
+ )
710
+ signal_clean_kwargs.update(
711
+ {
712
+ "clean__sample_mask": sample_mask,
713
+ }
714
+ )
581
715
  # Clean image
582
716
  logger.info("Cleaning image using nilearn")
717
+ logger.debug(f"\tstrategy: {self.strategy}")
718
+ logger.debug(f"\tspike: {self.spike}")
719
+ logger.debug(f"\tscrub: {self.scrub}")
720
+ logger.debug(f"\tfd_threshold: {self.fd_threshold}")
721
+ logger.debug(f"\tstd_dvars_threshold: {self.std_dvars_threshold}")
583
722
  logger.debug(f"\tdetrend: {self.detrend}")
584
723
  logger.debug(f"\tstandardize: {self.standardize}")
585
724
  logger.debug(f"\tlow_pass: {self.low_pass}")
586
725
  logger.debug(f"\thigh_pass: {self.high_pass}")
726
+ logger.debug(f"\tt_r: {self.t_r}")
587
727
 
588
728
  # Deconfound data
589
729
  cleaned_img = nimg.clean_img(
@@ -595,6 +735,7 @@ class fMRIPrepConfoundRemover(BasePreprocessor):
595
735
  high_pass=self.high_pass,
596
736
  t_r=t_r,
597
737
  mask_img=mask_img,
738
+ **signal_clean_kwargs,
598
739
  )
599
740
  # Fix t_r as nilearn messes it up
600
741
  cleaned_img.header["pixdim"][4] = t_r
@@ -10,6 +10,7 @@ import numpy as np
10
10
  import pandas as pd
11
11
  import pytest
12
12
  from nilearn._utils.exceptions import DimensionError
13
+ from nilearn.interfaces.fmriprep.load_confounds_utils import prepare_output
13
14
  from numpy.testing import assert_array_equal, assert_raises
14
15
  from pandas.testing import assert_frame_equal
15
16
 
@@ -211,7 +212,7 @@ def test_fMRIPrepConfoundRemover__process_fmriprep_spec() -> None:
211
212
  )
212
213
 
213
214
  msg = r"Missing basic confounds: \['white_matter'\]"
214
- with pytest.raises(ValueError, match=msg):
215
+ with pytest.raises(RuntimeError, match=msg):
215
216
  confound_remover._process_fmriprep_spec({"data": confounds_df})
216
217
 
217
218
  var_names = ["csf", "white_matter"]
@@ -220,7 +221,7 @@ def test_fMRIPrepConfoundRemover__process_fmriprep_spec() -> None:
220
221
  )
221
222
 
222
223
  msg = r"Missing framewise_displacement"
223
- with pytest.raises(ValueError, match=msg):
224
+ with pytest.raises(RuntimeError, match=msg):
224
225
  confound_remover._process_fmriprep_spec({"data": confounds_df})
225
226
 
226
227
 
@@ -320,6 +321,32 @@ def test_fMRIPRepConfoundRemover__pick_confounds_fmriprep_compute() -> None:
320
321
  assert_frame_equal(out_junifer, out_fmriprep)
321
322
 
322
323
 
324
+ @pytest.mark.parametrize(
325
+ "preprocessor",
326
+ [
327
+ fMRIPrepConfoundRemover(
328
+ std_dvars_threshold=1.5,
329
+ ),
330
+ fMRIPrepConfoundRemover(
331
+ fd_threshold=0.5,
332
+ ),
333
+ ],
334
+ )
335
+ def test_fMRIPrepConfoundRemover__get_scrub_regressors_errors(
336
+ preprocessor: type,
337
+ ) -> None:
338
+ """Test fMRIPrepConfoundRemover scrub regressors errors.
339
+
340
+ Parameters
341
+ ----------
342
+ preprocessor : object
343
+ The parametrized preprocessor.
344
+
345
+ """
346
+ with pytest.raises(RuntimeError, match="Invalid confounds file."):
347
+ preprocessor._get_scrub_regressors(pd.DataFrame({"a": [1, 2]}))
348
+
349
+
323
350
  def test_fMRIPrepConfoundRemover__validate_data() -> None:
324
351
  """Test fMRIPrepConfoundRemover validate data."""
325
352
  confound_remover = fMRIPrepConfoundRemover(strategy={"wm_csf": "full"})
@@ -567,3 +594,64 @@ def test_fMRIPrepConfoundRemover_fit_transform_masks() -> None:
567
594
  assert "dependencies" in output["BOLD"]["meta"]
568
595
  dependencies = output["BOLD"]["meta"]["dependencies"]
569
596
  assert dependencies == {"numpy", "nilearn"}
597
+
598
+
599
+ def test_fMRIPrepConfoundRemover_scrubbing() -> None:
600
+ """Test fMRIPrepConfoundRemover with scrubbing."""
601
+ confound_remover = fMRIPrepConfoundRemover(
602
+ strategy={
603
+ "motion": "full",
604
+ "wm_csf": "full",
605
+ "global_signal": "full",
606
+ "scrubbing": True,
607
+ },
608
+ )
609
+
610
+ with PartlyCloudyTestingDataGrabber(reduce_confounds=False) as dg:
611
+ element_data = DefaultDataReader().fit_transform(dg["sub-01"])
612
+ orig_bold = element_data["BOLD"]["data"].get_fdata().copy()
613
+ orig_confounds = element_data["BOLD"]["confounds"].copy()
614
+ pre_input = element_data["BOLD"]
615
+ pre_extra_input = {
616
+ "BOLD": {"confounds": element_data["BOLD"]["confounds"]}
617
+ }
618
+ output, _ = confound_remover.preprocess(pre_input, pre_extra_input)
619
+ trans_bold = output["data"].get_fdata()
620
+ # Transformation is in place
621
+ assert_array_equal(
622
+ trans_bold, element_data["BOLD"]["data"].get_fdata()
623
+ )
624
+
625
+ # Data should have different shape
626
+ assert_raises(
627
+ AssertionError,
628
+ assert_array_equal,
629
+ orig_bold.shape,
630
+ trans_bold.shape,
631
+ )
632
+ # and be different
633
+ assert_raises(
634
+ AssertionError, assert_array_equal, orig_bold, trans_bold
635
+ )
636
+
637
+ # Check scrubbing process
638
+ # Should be at the start
639
+ confounds_df = confound_remover._pick_confounds(orig_confounds)
640
+ assert confounds_df.shape == (168, 36)
641
+ # Should have 4 motion outliers based on threshold
642
+ motion_outline_regressors = confound_remover._get_scrub_regressors(
643
+ orig_confounds["data"]
644
+ )
645
+ assert motion_outline_regressors.shape == (168, 4)
646
+ # Add regressors to confounds
647
+ concat_confounds_df = pd.concat(
648
+ [confounds_df, motion_outline_regressors], axis=1
649
+ )
650
+ assert concat_confounds_df.shape == (168, 40)
651
+ # Get sample mask and correct confounds
652
+ sample_mask, final_confounds_df = prepare_output(
653
+ confounds=concat_confounds_df, demean=False
654
+ )
655
+ assert not confounds_df.equals(final_confounds_df)
656
+ assert sample_mask.shape == (164,)
657
+ assert not (np.isin([91, 92, 93, 113], sample_mask)).all()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: junifer
3
- Version: 0.0.6.dev459
3
+ Version: 0.0.6.dev474
4
4
  Summary: JUelich NeuroImaging FEature extractoR
5
5
  Author-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
6
6
  Maintainer-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
@@ -1,6 +1,6 @@
1
1
  junifer/__init__.py,sha256=2McgH1yNue6Z1V26-uN_mfMjbTcx4CLhym-DMBl5xA4,266
2
2
  junifer/__init__.pyi,sha256=SsTvgq2Dod6UqJN96GH1lCphH6hJQQurEJHGNhHjGUI,508
3
- junifer/_version.py,sha256=mHgU7i-2pUPZjIS1fJd2icWX-sd_Mww7MGNNfUY5ydo,428
3
+ junifer/_version.py,sha256=7pHd6ArG455iLMBZqotX1HK02XIn0_bVzFW_V2q9t54,428
4
4
  junifer/conftest.py,sha256=PWYkkRDU8ly2lYwv7VBKMHje4et6HX7Yey3Md_I2KbA,613
5
5
  junifer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  junifer/stats.py,sha256=e9aaagMGtgpRfW3Wdpz9ocpnYld1IWylCDcjFUgX9Mk,6225
@@ -176,7 +176,7 @@ junifer/external/nilearn/__init__.pyi,sha256=bcCz7O02UameBxbtPjhUal-Z9rI01pv3ikt
176
176
  junifer/external/nilearn/junifer_connectivity_measure.py,sha256=R868Z6ltm2OiMgEVEBBtqTTtWkwhU5O7yhNSQDYudDA,17316
177
177
  junifer/external/nilearn/junifer_nifti_spheres_masker.py,sha256=1CqtGFpfgVR2sK_pDYsBlgAEg-fIG5CkKzXzTTXG7EY,16533
178
178
  junifer/external/nilearn/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- junifer/external/nilearn/tests/test_junifer_connectivity_measure.py,sha256=NEYVq5mrc9VMDkrm8Aq7gLgWk5XrzVriDFCw34R3XbI,33927
179
+ junifer/external/nilearn/tests/test_junifer_connectivity_measure.py,sha256=wOk8BOK_MZWJ0cdvN1lBRAVf8CHIlOi2A3-ZRqG894k,33928
180
180
  junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py,sha256=9UvBAVO-uo0nMIHYfAQ85kJMrwpBxpVRsN1-mHLk7ik,12244
181
181
  junifer/markers/__init__.py,sha256=wHAxljlZppxgXimSJw21mp9oUYYyaID4LYfeBolva30,310
182
182
  junifer/markers/__init__.pyi,sha256=9a72D9k6esTzLvmvULXHOeaQtIchjtN7VELpCeaddsM,957
@@ -280,9 +280,9 @@ junifer/preprocess/base.py,sha256=hARO4Yq9sQ8m2tATeuBmPMbI4BSnwNxLf2prF8Iq_Tk,66
280
280
  junifer/preprocess/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
281
281
  junifer/preprocess/confounds/__init__.py,sha256=L3CquKcndFb2b8yVo-XLi-zsNCe8MMKUN41UOVdooWc,270
282
282
  junifer/preprocess/confounds/__init__.pyi,sha256=iC70cqcWNMX4JM42RcUgKb9YX8ciK8oVERdWWjo-13c,102
283
- junifer/preprocess/confounds/fmriprep_confound_remover.py,sha256=Mf93SKgrfIDcig3R8Pfu_SaK-E6-JCOSITLtITOmFa0,21615
283
+ junifer/preprocess/confounds/fmriprep_confound_remover.py,sha256=sWAvo09TY0KD1nFjev7G6t56mJopvdOh3Wp7PvN9yrk,27053
284
284
  junifer/preprocess/confounds/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
285
- junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py,sha256=L1L9yllAyneOL3YgcNRf3a2zXGZjjyPMdjSy0fRGpWc,20517
285
+ junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py,sha256=O_2wOZa7YvPtpEisZ2vWXUAgl6R4h4jAsjU3vfVRsTg,23532
286
286
  junifer/preprocess/smoothing/__init__.py,sha256=7aTwvAG522kA76QQwqxwY5zV_6asyPaaH2uSMTaKQls,216
287
287
  junifer/preprocess/smoothing/__init__.pyi,sha256=5sjw61Eyon9gE_SWoktND9raw6IkgqcT2rtGNhVV9EA,58
288
288
  junifer/preprocess/smoothing/_afni_smoothing.py,sha256=4mdZk9YkA02wZ8rS6sbLnXL_7SIX7M0NwHPLckJgCmI,3325
@@ -341,10 +341,10 @@ junifer/utils/tests/test_config.py,sha256=7ltIXuwb_W4Mv_1dxQWyiyM10XgUAfsWKV6D_i
341
341
  junifer/utils/tests/test_fs.py,sha256=WQS7cKlKEZ742CIuiOYYpueeAhY9PqlastfDVpVVtvE,923
342
342
  junifer/utils/tests/test_helpers.py,sha256=k5qqfxK8dFyuewTJyR1Qn6-nFaYNuVr0ysc18bfPjyU,929
343
343
  junifer/utils/tests/test_logging.py,sha256=duO4ou365hxwa_kwihFtKPLaL6LC5XHiyhOijrrngbA,8009
344
- junifer-0.0.6.dev459.dist-info/AUTHORS.rst,sha256=rmULKpchpSol4ExWFdm-qu4fkpSZPYqIESVJBZtGb6E,163
345
- junifer-0.0.6.dev459.dist-info/LICENSE.md,sha256=MqCnOBu8uXsEOzRZWh9EBVfVz-kE9NkXcLCrtGXo2yU,34354
346
- junifer-0.0.6.dev459.dist-info/METADATA,sha256=DVNM9OEMkhbATGZgotZ-ZRhQqyvB2E48OgpwKVzoCLE,8420
347
- junifer-0.0.6.dev459.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
348
- junifer-0.0.6.dev459.dist-info/entry_points.txt,sha256=6O8ru0BP-SP7YMUZiizFNoaZ2HvJpadO2G7nKk4PwjI,48
349
- junifer-0.0.6.dev459.dist-info/top_level.txt,sha256=4bAq1R2QFQ4b3hohjys2JBvxrl0GKk5LNFzYvz9VGcA,8
350
- junifer-0.0.6.dev459.dist-info/RECORD,,
344
+ junifer-0.0.6.dev474.dist-info/AUTHORS.rst,sha256=rmULKpchpSol4ExWFdm-qu4fkpSZPYqIESVJBZtGb6E,163
345
+ junifer-0.0.6.dev474.dist-info/LICENSE.md,sha256=MqCnOBu8uXsEOzRZWh9EBVfVz-kE9NkXcLCrtGXo2yU,34354
346
+ junifer-0.0.6.dev474.dist-info/METADATA,sha256=Sjar7qmcfo9hYznQ30SodgBc9kPRWigIwGTo1xpXRFI,8420
347
+ junifer-0.0.6.dev474.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
348
+ junifer-0.0.6.dev474.dist-info/entry_points.txt,sha256=6O8ru0BP-SP7YMUZiizFNoaZ2HvJpadO2G7nKk4PwjI,48
349
+ junifer-0.0.6.dev474.dist-info/top_level.txt,sha256=4bAq1R2QFQ4b3hohjys2JBvxrl0GKk5LNFzYvz9VGcA,8
350
+ junifer-0.0.6.dev474.dist-info/RECORD,,