diff --git a/.circleci/config.yml b/.circleci/config.yml index 71418ad8..6a3830c8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -214,8 +214,6 @@ jobs: - run: name: Get intermediate transforms command: | - mkdir -p /tmp/pooch - cd /tmp/pooch # Caching intermediate templates so no need to constantly fetch XFM="from-MNI152NLin6Asym_to-MNIInfant+1_xfm.h5" echo "Downloading $XFM" @@ -229,7 +227,6 @@ jobs: paths: - fslicense - bcp/nipype.cfg - - pooch/* test_pytest: !!merge <<: *machine_defaults @@ -348,8 +345,7 @@ jobs: --nthreads 4 -vv --age-months 2 --sloppy \ --surface-recon-method infantfs \ --derivatives precomputed=/tmp/data/${DATASET}/derivatives/bibsnet \ - --output-layout bids --anat-only \ - --pooch-cache-dir /tmp/pooch + --output-layout bids --anat-only - run: name: Checking outputs of anatomical nibabies run command: | @@ -378,8 +374,7 @@ jobs: --nthreads 4 -vv --age-months 2 \ --surface-recon-method infantfs \ --derivatives precomputed=/tmp/data/${DATASET}/derivatives/bibsnet \ - --output-layout bids \ - --pooch-cache-dir /tmp/pooch + --output-layout bids - run: name: Checking outputs of full nibabies run command: | @@ -425,8 +420,7 @@ jobs: --nthreads 4 -vv --age-months 2 \ --surface-recon-method infantfs \ --derivatives precomputed=/tmp/data/${DATASET}-t2only/derivatives/bibsnet \ - --output-layout bids --anat-only --cifti-output \ - --pooch-cache-dir /tmp/pooch + --output-layout bids --anat-only --cifti-output - run: name: Checking outputs of T2-only nibabies anat command: | diff --git a/nibabies/interfaces/download.py b/nibabies/interfaces/download.py deleted file mode 100644 index ba91fbdd..00000000 --- a/nibabies/interfaces/download.py +++ /dev/null @@ -1,73 +0,0 @@ -import json -import os -from pathlib import Path - -import pooch -from nipype.interfaces.base import ( - DynamicTraitedSpec, - File, - SimpleInterface, - TraitedSpec, - traits, -) - -import nibabies - - -class _RetrievePoochFilesInputSpec(DynamicTraitedSpec): - intermediate = traits.Str(required=True, desc='the intermediate space') - target = traits.Str(required=True, desc='the target space') - - -class _RetrievePoochFilesOutputSpec(TraitedSpec): - int2tgt_xfm = File(desc='Intermediate to target transform') - tgt2int_xfm = File(desc='Target to intermediate transform') - - -class RetrievePoochFiles(SimpleInterface): - input_spec = _RetrievePoochFilesInputSpec - output_spec = _RetrievePoochFilesOutputSpec - - def _run_interface(self, runtime): - int2tgt, tgt2int = _retrieve_xfms(self.inputs.intermediate, self.inputs.target) - self._results['int2tgt_xfm'] = int2tgt - self._results['tgt2int_xfm'] = tgt2int - return runtime - - -def _retrieve_xfms( - intermediate: str, - target: str, -): - """Fetch transforms from the OSF repository (https://osf.io/y763j/).""" - - manifest = json.loads(nibabies.data.load('xfm_manifest.json').read_text()) - - def sanitize(space): - # MNIInfant:cohort-1 -> MNIInfant+1 - return space.replace(':cohort-', '+') - - intmd = sanitize(intermediate) - tgt = sanitize(target) - - cache_dir = Path(os.getenv('NIBABIES_POOCH_DIR', Path.cwd())) - - int2std_name = f'from-{intmd}_to-{tgt}_xfm.h5' - int2std_meta = manifest[int2std_name] - int2std = pooch.retrieve( - url=int2std_meta['url'], - path=cache_dir, - known_hash=int2std_meta['hash'], - fname=int2std_name, - ) - - std2int_name = f'from-{tgt}_to-{intmd}_xfm.h5' - std2int_meta = manifest[std2int_name] - std2int = pooch.retrieve( - url=std2int_meta['url'], - path=cache_dir, - known_hash=std2int_meta['hash'], - fname=std2int_name, - ) - - return int2std, std2int diff --git a/nibabies/interfaces/tests/test_download.py b/nibabies/interfaces/tests/test_download.py deleted file mode 100644 index af2a1a66..00000000 --- a/nibabies/interfaces/tests/test_download.py +++ /dev/null @@ -1,19 +0,0 @@ -from pathlib import Path - -from nibabies.interfaces.download import RetrievePoochFiles - - -def test_RetrievePoochFiles(tmp_path, monkeypatch): - monkeypatch.chdir(tmp_path) - getter = RetrievePoochFiles(intermediate='MNIInfant:cohort-1', target='MNI152NLin6Asym') - outputs = getter.run().outputs - assert Path(outputs.int2tgt_xfm).exists() - assert Path(outputs.tgt2int_xfm).exists() - - cache = tmp_path / 'mycache' - monkeypatch.setenv('NIBABIES_POOCH_DIR', cache) - getter = RetrievePoochFiles(intermediate='MNIInfant:cohort-1', target='MNI152NLin6Asym') - outputs = getter.run().outputs - - assert Path(outputs.int2tgt_xfm) == cache / 'from-MNIInfant+1_to-MNI152NLin6Asym_xfm.h5' - assert Path(outputs.tgt2int_xfm) == cache / 'from-MNI152NLin6Asym_to-MNIInfant+1_xfm.h5' diff --git a/nibabies/workflows/anatomical/registration.py b/nibabies/workflows/anatomical/registration.py index ad8199d2..6f9d9cd1 100644 --- a/nibabies/workflows/anatomical/registration.py +++ b/nibabies/workflows/anatomical/registration.py @@ -345,7 +345,6 @@ def init_concat_registrations_wf( further use in downstream nodes. """ - from nibabies.interfaces.download import RetrievePoochFiles from nibabies.interfaces.patches import CompositeTransformUtil ntpls = len(templates) @@ -405,9 +404,9 @@ def init_concat_registrations_wf( ] outputnode = pe.Node(niu.IdentityInterface(fields=out_fields), name='outputnode') - intermed_xfms = pe.MapNode( - RetrievePoochFiles(), - name='retrieve_xfms', + fetch_tf_xfms = pe.MapNode( + niu.Function(function=_get_intermediate_xfms, output_names=['int2tgt_xfm', 'tgt2int_xfm']), + name='fetch_tf_xfms', iterfield=['target'], run_without_submitting=True, ) @@ -460,10 +459,10 @@ def init_concat_registrations_wf( # Transform concatenation (inputnode, dis_anat2int, [('anat2int_xfm', 'in_file')]), (inputnode, dis_int2anat, [('int2anat_xfm', 'in_file')]), - (inputnode, intermed_xfms, [('intermediate', 'intermediate'), + (inputnode, fetch_tf_xfms, [('intermediate', 'intermediate'), ('template', 'target')]), - (intermed_xfms, dis_int2std, [('int2tgt_xfm', 'in_file')]), - (intermed_xfms, dis_std2int, [('tgt2int_xfm', 'in_file')]), + (fetch_tf_xfms, dis_int2std, [('int2tgt_xfm', 'in_file')]), + (fetch_tf_xfms, dis_std2int, [('tgt2int_xfm', 'in_file')]), (dis_anat2int, order_anat2std, [ ('affine_transform', 'in1'), ('displacement_field', 'in2'), @@ -499,3 +498,28 @@ def init_concat_registrations_wf( ]) # fmt:skip return workflow + + +def _get_intermediate_xfms(intermediate, target): + import templateflow.api as tf + + # Native -> MNIInfant:cohort-X (int) -> Target (std) + ispace, _, icohort = intermediate.partition(':cohort-') + ispaceid = f'{ispace}+{icohort}' if icohort else ispace + + int2std = tf.get( + target, + suffix='xfm', + **{'from': ispaceid}, + raise_empty=True, + ) + + std2int = tf.get( + ispace, + cohort=icohort or None, + suffix='xfm', + **{'from': target}, + raise_empty=True, + ) + + return int2std, std2int diff --git a/pyproject.toml b/pyproject.toml index cad12183..e03c00ea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,6 @@ dependencies = [ "numpy >= 1.21.0", "packaging", "pandas < 3", - "pooch", "psutil >= 5.4", "pybids >= 0.15.0", "requests", diff --git a/wrapper/src/nibabies_wrapper/__main__.py b/wrapper/src/nibabies_wrapper/__main__.py index a0d46121..7a961d3e 100755 --- a/wrapper/src/nibabies_wrapper/__main__.py +++ b/wrapper/src/nibabies_wrapper/__main__.py @@ -476,12 +476,6 @@ def _is_file(path, parser): type=os.path.abspath, help='Filter file', ) - g_wrap.add_argument( - '--pooch-cache-dir', - metavar='DIR', - type=os.path.abspath, - help='Directory to serve as cache for pooch files' - ) # Developer patch/shell options g_dev = parser.add_argument_group( @@ -649,9 +643,6 @@ def main(): if opts.deriv_filter_file: container.add_mount(opts.deriv_filter_file, '/opt/derivative_filters.json') unknown_args.extend(['--deriv-filter-file', '/opt/derivative_filters.json']) - if opts.pooch_cache_dir: - container.add_mount(opts.pooch_cache_dir, '/tmp/pooch_cache', read_only=False) - container.add_envvar(('NIBABIES_POOCH_DIR', '/tmp/pooch_cache')) # Patch derivatives for searching if opts.derivatives: deriv_args = ['--derivatives']