├── .circleci
└── config.yml
├── .hadolint.yaml
├── .idea
└── vcs.xml
├── .pre-commit-config.yaml
├── Dockerfile
├── LICENSE
├── README.md
├── run.py
└── version
/.circleci/config.yml:
--------------------------------------------------------------------------------
1 | ---
2 | version: 2.1
3 | jobs:
4 | build:
5 | machine:
6 | image: ubuntu-2204:2022.10.2
7 | steps:
8 | - checkout
9 | - run:
10 | name: Get test data
11 | command: |
12 | wget https://raw.githubusercontent.com/bids-apps/maintenance-tools/main/utils/get_data_from_osf.sh
13 | bash get_data_from_osf.sh ds005-deriv-light
14 | - run:
15 | name: Build Docker image
16 | command: |
17 | wget https://raw.githubusercontent.com/bids-apps/maintenance-tools/main/circleci/build_docker.sh
18 | bash build_docker.sh
19 | - persist_to_workspace:
20 | root: /home/circleci
21 | paths:
22 | - data/ds005-deriv-light
23 | - docker/image.tar
24 |
25 | test:
26 | machine:
27 | image: ubuntu-2204:2022.10.2
28 | steps:
29 | - attach_workspace:
30 | at: /tmp/workspace
31 | - run: docker load -i /tmp/workspace/docker/image.tar
32 | - run: mkdir -p ${HOME}/outputs
33 | - run:
34 | name: run participant 01
35 | command: |
36 | docker run -ti --rm --read-only \
37 | -v /tmp:/tmp -v /var/tmp:/var/tmp \
38 | -v /tmp/workspace/data/ds005-deriv-light/derivatives:/bids_dataset \
39 | -v ${HOME}/outputs:/outputs \
40 | bids/"${CIRCLE_PROJECT_REPONAME,,}" \
41 | /bids_dataset \
42 | /outputs \
43 | participant \
44 | --participant_label 01 \
45 | --task mixedgamblestask \
46 | --run 01
47 | no_output_timeout: 6h
48 | - run:
49 | name: run participant 02
50 | command: |
51 | docker run -ti --rm --read-only \
52 | -v /tmp:/tmp -v /var/tmp:/var/tmp \
53 | -v /tmp/workspace/data/ds005-deriv-light/derivatives:/bids_dataset \
54 | -v ${HOME}/outputs:/outputs \
55 | bids/"${CIRCLE_PROJECT_REPONAME,,}" \
56 | /bids_dataset \
57 | /outputs \
58 | participant \
59 | --participant_label 02 \
60 | --task mixedgamblestask \
61 | --run 01
62 | no_output_timeout: 6h
63 | - run:
64 | name: run participant 03
65 | command: |
66 | docker run -ti --rm --read-only \
67 | -v /tmp:/tmp -v /var/tmp:/var/tmp \
68 | -v /tmp/workspace/data/ds005-deriv-light/derivatives:/bids_dataset \
69 | -v ${HOME}/outputs:/outputs \
70 | bids/"${CIRCLE_PROJECT_REPONAME,,}" \
71 | /bids_dataset \
72 | /outputs \
73 | participant \
74 | --participant_label 03 \
75 | --task mixedgamblestask \
76 | --run 01
77 | no_output_timeout: 6h
78 | - run:
79 | name: run group
80 | command: |
81 | docker run -ti --rm --read-only \
82 | -v /tmp:/tmp -v /var/tmp:/var/tmp \
83 | -v /tmp/workspace/data/ds005-deriv-light/derivatives:/bids_dataset \
84 | -v ${HOME}/outputs:/outputs \
85 | bids/"${CIRCLE_PROJECT_REPONAME,,}" \
86 | /bids_dataset \
87 | /outputs \
88 | group
89 | no_output_timeout: 6h
90 |
91 | deploy:
92 | machine:
93 | image: ubuntu-2204:2022.10.2
94 | steps:
95 | - attach_workspace:
96 | at: /tmp/workspace
97 | - run: docker load -i /tmp/workspace/docker/image.tar
98 | - run:
99 | name: push to dockerhub
100 | command: |
101 | wget https://raw.githubusercontent.com/bids-apps/maintenance-tools/main/circleci/push_docker.sh
102 | bash push_docker.sh
103 |
104 | workflows:
105 | build-test-deploy:
106 | jobs:
107 | - build
108 | - test:
109 | requires:
110 | - build
111 | - deploy:
112 | context:
113 | - dockerhub
114 | requires:
115 | - test
116 | filters:
117 | tags:
118 | only: /.*/
119 |
120 | # VS Code Extension Version: 1.5.1
121 |
--------------------------------------------------------------------------------
/.hadolint.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | ignored:
3 | - DL3003
4 | - DL3008
5 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.pre-commit-config.yaml:
--------------------------------------------------------------------------------
1 | ---
2 | # See https://pre-commit.com for more information
3 | # See https://pre-commit.com/hooks.html for more hooks
4 |
5 | repos:
6 | - repo: https://github.com/pre-commit/pre-commit-hooks
7 | rev: v5.0.0
8 | hooks:
9 | - id: trailing-whitespace
10 | - id: end-of-file-fixer
11 | - id: check-yaml
12 | - id: check-json
13 | - id: check-added-large-files
14 | - id: check-case-conflict
15 | - id: check-merge-conflict
16 |
17 |
18 | - repo: https://github.com/jumanjihouse/pre-commit-hook-yamlfmt
19 | rev: 0.2.3
20 | hooks:
21 | - id: yamlfmt
22 | args: [--mapping, '2', --sequence, '2', --offset, '0']
23 |
24 |
25 | - repo: https://github.com/hadolint/hadolint
26 | rev: v2.13.1-beta
27 | hooks:
28 | - id: hadolint-docker
29 | name: Lint Dockerfiles
30 | description: Runs hadolint Docker image to lint Dockerfiles
31 | language: docker_image
32 | types: [dockerfile]
33 | entry: ghcr.io/hadolint/hadolint hadolint
34 |
35 | ci:
36 | skip: [hadolint-docker]
37 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:18.04
2 |
3 | # Prepare environment
4 | RUN apt-get update -qq && \
5 | apt-get install -qq -y --no-install-recommends \
6 | apt-utils \
7 | autoconf \
8 | build-essential \
9 | bzip2 \
10 | ca-certificates \
11 | curl \
12 | git \
13 | libtool \
14 | lsb-release \
15 | netbase \
16 | pkg-config \
17 | unzip \
18 | xvfb && \
19 | apt-get clean && \
20 | rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
21 |
22 | ENV DEBIAN_FRONTEND="noninteractive" \
23 | LANG="en_US.UTF-8" \
24 | LC_ALL="en_US.UTF-8"
25 |
26 | # PyMVPA
27 | RUN apt-get update -qq && \
28 | apt-get install -qq -y --no-install-recommends python2.7 && \
29 | apt-get clean && \
30 | rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
31 |
32 | RUN apt-get update -qq && \
33 | mkdir /dev/fuse && \
34 | chmod 777 /dev/fuse && \
35 | apt-get install -qq -y --no-install-recommends \
36 | python-mvpa2 && \
37 | apt-get clean && \
38 | rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
39 |
40 | RUN mkdir -p /code
41 | COPY run.py /code/run.py
42 |
43 | COPY version /version
44 |
45 | ENTRYPOINT ["/code/run.py"]
46 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Hyperalignment BIDS App (WiP)
2 |
3 | ### Description
4 |
5 | Hyperalignment is a functional alignment method that aligns subjects' brain data in a
6 | high-dimensional space of voxels/features. We showed that this alignment aligns subjects
7 | at a fine-scale affording between-subject decoding and encoding
8 | [Guntupalli et al. 2016](http://cercor.oxfordjournals.org/content/26/6/2919). This app runs searchlight
9 | hyperalignment, which runs hyperalignment in multiple searchlights across the whole brain and
10 | aggregates them into a single transformation per subject.
11 | For now, many parameters such as searchlight size, sparsity of centers, etc., are fixed.
12 | Please use PyMVPA to modify these and other parameters for your use case.
13 |
14 | ### Documentation
15 |
16 | For a detailed documentation and examples, please see:
17 | Hyperalignment in a ROI:
18 | http://www.pymvpa.org/generated/mvpa2.algorithms.hyperalignment.Hyperalignment.html
19 | Searchlight Hyperalignment:
20 | https://github.com/PyMVPA/PyMVPA/blob/master/mvpa2/algorithms/searchlight_hyperalignment.py
21 | Example in PyMVPA:
22 | http://www.pymvpa.org/examples/hyperalignment.html
23 |
24 | ### Acknowledgements
25 |
26 | If you use this in your project, please cite [Guntupalli et al. 2016](http://cercor.oxfordjournals.org/content/26/6/2919).
27 |
28 | ### Report Bugs/Issues
29 |
30 | Please use PyMVPA on github to report any bugs/issues or to contribute:
31 | https://github.com/PyMVPA/PyMVPA
32 |
33 | ### Usage
34 |
35 | usage: run.py [-h]
36 | [--participant_label PARTICIPANT_LABEL [PARTICIPANT_LABEL ...]
37 | --task TASK_LABEL --run RUN_LABEL]
38 | bids_dir output_dir {participant,group}
39 |
40 | Example BIDS App entrypoint script.
41 |
42 | positional arguments:
43 | bids_dir The directory with the input dataset formatted
44 | according to the BIDS standard.
45 | output_dir The directory where the output files should be stored.
46 | If you are running group level analysis this folder
47 | should be prepopulated with the results of
48 | theparticipant level analysis.
49 | {participant,group} Level of the analysis that will be performed. Multiple
50 | participant level analyses can be run independently
51 | (in parallel).
52 |
53 | optional arguments:
54 | -h, --help show this help message and exit
55 | --participant_label PARTICIPANT_LABEL [PARTICIPANT_LABEL ...]
56 | The label(s) of the participant(s) that should be
57 | analyzed. The label corresponds to
58 | sub- from the BIDS spec (so it does
59 | not include "sub-"). If this parameter is not provided
60 | all subjects should be analyzed. Multiple participants
61 | can be specified with a space separated list.
62 | --task TASK_LABEL Name of the task that should be used for hyperalignment.
63 | This correspnds to task- from the BIDS spec
64 | (so it does not include "task-").
65 | --run RUN_LABEL Name of the run that should be used for hyperalignment.
66 | This correspnds to run- from the BIDS spec
67 | (so it does not include "run-").
68 |
69 |
70 | Participant level mode prepares the data for hyperalignment.
71 | For now, it loads the data from nifti image into PyMVPA readable datasets after applying
72 | brain mask. In future, this will be modified to compute individual subject connectomes.
73 |
74 | docker run -i --rm \
75 | -v /Users/swaroop/ds005-deriv/derivatives:/bids_dataset \
76 | -v /Users/swaroop/outputs:/outputs \
77 | bids/hyperalignment \
78 | /bids_dataset /outputs participant \
79 | --task mixedgamblestask --run 01 --participant_label 01
80 |
81 | After running participant level (potentially in parallel), group level analysis
82 | runs hyperalignment and saves transformation parameters.
83 |
84 | docker run -i --rm -v \
85 | /Users/swaroop/ds005-deriv/derivatives:/bids_dataset \
86 | -v /Users/swaroop/outputs:/outputs \
87 | bids/hyperalignment \
88 | /bids_dataset /outputs group
89 |
90 | ### Special requirements
91 |
92 | Hyperalignment works on preprocessed data with all the subjects' data aligned to the same template.
93 |
94 | ### Relevant references
95 |
96 | 1. Guntupalli, J. S., Hanke, M., Halchenko, Y. O., Connolly, A. C., Ramadge, P. J. & Haxby, J. V. (2016). A Model of Representational Spaces in Human Cortex. Cerebral Cortex.
97 | DOI: http://dx.doi.org/10.1093/cercor/bhw068
98 | 2. Haxby, J. V., Guntupalli, J. S., Connolly, A. C., Halchenko, Y. O., Conroy, B. R., Gobbini, M. I., Hanke, M. & Ramadge, P. J. (2011). A Common, High-Dimensional Model of the Representational Space in Human Ventral Temporal Cortex. Neuron, 72, 404–416.
99 | DOI: http://dx.doi.org/10.1016/j.neuron.2011.08.026
100 |
--------------------------------------------------------------------------------
/run.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | import argparse
3 | import os
4 | from glob import glob
5 | from mvpa2.suite import *
6 | from mvpa2.base.hdf5 import h5save, h5load
7 | from mvpa2.algorithms.searchlight_hyperalignment import SearchlightHyperalignment
8 | from mvpa2.datasets.mri import fmri_dataset
9 | from mvpa2.mappers.zscore import zscore
10 |
11 |
12 | parser = argparse.ArgumentParser(description='Example BIDS App entrypoint script.')
13 | parser.add_argument('bids_dir', help='The directory with the input dataset '
14 | 'formatted according to the BIDS standard.')
15 | parser.add_argument('output_dir', help='The directory where the output files '
16 | 'should be stored. If you are running group level analysis '
17 | 'this folder should be prepopulated with the results of the'
18 | 'participant level analysis.')
19 | parser.add_argument('analysis_level',
20 | help='Level of the analysis that will be performed. '
21 | 'Multiple participant level analyses can be run independently '
22 | '(in parallel) using the same output_dir.',
23 | choices=['participant', 'group'])
24 | parser.add_argument('--participant_label',
25 | help='The label(s) of the participant(s) that should be analyzed. The label '
26 | 'corresponds to sub- from the BIDS spec '
27 | '(so it does not include "sub-"). If this parameter is not '
28 | 'provided all subjects should be analyzed. Multiple '
29 | 'participants can be specified with a space separated list.',
30 | nargs="+")
31 | parser.add_argument('--task',
32 | help='Task from which the data is used for deriving hyperalignment '
33 | 'parameters')
34 | parser.add_argument('--run',
35 | help='Run or runs to be used for deriving hyperalignment parameters')
36 |
37 | args = parser.parse_args()
38 |
39 | subjects_to_analyze = []
40 | # only for a subset of subjects
41 | if args.participant_label:
42 | subjects_to_analyze = args.participant_label
43 | # for all subjects
44 | else:
45 | subject_dirs = glob(os.path.join(args.bids_dir, "sub-*"))
46 | subjects_to_analyze = [subject_dir.split("-")[-1] for subject_dir in subject_dirs]
47 |
48 | """
49 | At the participant level, load nifti data using mask and store it as hdf5 file.
50 | This can be adapted to compute connectomes later.
51 | """
52 |
53 |
54 | def prepare_subject_for_hyperalignment(subject_label, bold_fname, mask_fname, out_dir):
55 | print('Loading data %s with mask %s' % (bold_fname, mask_fname))
56 | ds = fmri_dataset(samples=bold_fname, mask=mask_fname)
57 | zscore(ds, chunks_attr=None)
58 | out_fname = os.path.join(out_dir, 'sub-%s_data.hdf5' % subject_label)
59 | print('Saving to %s' % out_fname)
60 | h5save(out_fname, ds)
61 |
62 |
63 | def run_hyperalignment(subjects_to_analyze, out_dir):
64 | # Load subject data
65 | ds_all = []
66 | for subject_label in subjects_to_analyze:
67 | ds_all.append(h5load('%s/sub-%s_data.hdf5' % (out_dir, subject_label)))
68 | # Initialize searchlight hyperalignment
69 | slhyper = SearchlightHyperalignment(radius=2, nblocks=10, sparse_radius=5,
70 | dtype='float16')
71 | hmappers = slhyper(ds_all)
72 | return hmappers
73 |
74 |
75 | # This can be subject-level and be applied in parallel
76 | def apply_hyperalignment():
77 | raise NotImplementedError
78 |
79 |
80 | """
81 | Helper functions to save and load mappers
82 | """
83 |
84 |
85 | def save_mappers(hmappers, fname):
86 | h5save(fname, hmappers)
87 |
88 |
89 | def load_mappers(fname):
90 | return h5load(fname)
91 |
92 | # running participant level
93 |
94 | if args.analysis_level == "participant":
95 | # sub-01_task-mixedgamblestask_run-02_bold_hmc_mni.nii.gz
96 | prefixes = []
97 | task_prefix = 'task-%s' % args.task
98 | prefixes.append(task_prefix)
99 | run_prefix = 'run-%s' % args.run
100 | prefixes.append(run_prefix)
101 | # XXX TODO Expose this option outside?
102 | preproc_prefix = 'bold_hmc_mni'
103 | prefixes.append(preproc_prefix)
104 | # find all T1s and skullstrip them
105 | prefix = '_'.join(prefixes)
106 | for subject_label in subjects_to_analyze:
107 | bold_fname = 'sub-%s_%s'%(subject_label, prefix)
108 | bold_fname = os.path.join(args.bids_dir, "sub-%s" % subject_label,
109 | "func", bold_fname)
110 | mask_fname = '%s_bmask.nii.gz' % bold_fname
111 | bold_fname = '%s.nii.gz' % bold_fname
112 | prepare_subject_for_hyperalignment(subject_label, bold_fname, mask_fname,
113 | args.output_dir)
114 |
115 | # running group level
116 | elif args.analysis_level == "group":
117 | """
118 | Load data (timeseries or connectomes) stored in first-level
119 | and run hyperalignment. Spit out mappers.
120 | """
121 | hmappers = run_hyperalignment(subjects_to_analyze, out_dir=args.output_dir)
122 | hmappers_fname = os.path.join(args.output_dir, 'hmappers.hdf5')
123 | save_mappers(hmappers=hmappers, fname=hmappers_fname)
124 | with open(os.path.join(args.output_dir, "Transformation_matrix_shapes.txt"), 'w') as fp:
125 | for hm in hmappers:
126 | fp.write("Transformation shape"
127 | " and non-zero elements : %s %d" % ( (hm.proj.shape,), hm.proj.data.size))
128 |
--------------------------------------------------------------------------------
/version:
--------------------------------------------------------------------------------
1 | dev
2 |
--------------------------------------------------------------------------------