Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RTM] Add ICA component plots to MRIQC #412

Merged
merged 31 commits into from Apr 5, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
7c0eebe
Added ICA components generation.
chrisgorgo Mar 8, 2017
c8fcb87
enabling compression
chrisgorgo Mar 8, 2017
b9bd528
don't force compression
chrisgorgo Mar 8, 2017
49854d1
update
chrisgorgo Mar 8, 2017
824e47b
update
chrisgorgo Mar 9, 2017
16f6dbd
Add paralelization limits.
chrisgorgo Mar 9, 2017
008b297
Tweaks
chrisgorgo Mar 9, 2017
91839b6
more tweaks
chrisgorgo Mar 9, 2017
72d6835
glitch?
chrisgorgo Mar 9, 2017
1437069
is it multiproc?
chrisgorgo Mar 9, 2017
e3a3ef2
Merge remote-tracking branch 'remotes/origin/fix/header' into enh/ica
chrisgorgo Mar 9, 2017
53c5971
Replace EPI skullstripping
chrisgorgo Mar 9, 2017
e36487f
fine tunning
chrisgorgo Mar 9, 2017
5184d70
niworkflows update
chrisgorgo Mar 10, 2017
0eb125a
Merge branch 'master' of github.com:poldracklab/mriqc into enh/ica
chrisgorgo Mar 10, 2017
953446a
increase limits
chrisgorgo Mar 16, 2017
d9dd6d9
Don't plot iqms with no values
chrisgorgo Mar 16, 2017
1ddcb7a
Merge branch 'fix/group' into enh/ica
chrisgorgo Mar 16, 2017
ecd0c26
Merge branch 'master' into enh/ica
chrisgorgo Mar 16, 2017
40d6aa3
add explicit report masks
chrisgorgo Mar 18, 2017
23df6c7
make ica optional
chrisgorgo Mar 18, 2017
15e5d91
update
chrisgorgo Mar 18, 2017
29676b3
update
chrisgorgo Mar 19, 2017
d4848ec
update
chrisgorgo Mar 19, 2017
ac83fc8
Merge remote-tracking branch 'remotes/origin/enh/use_composite' into …
chrisgorgo Mar 19, 2017
38813a9
Merge branch 'master' into enh/ica
chrisgorgo Mar 22, 2017
bc26a60
version bump
chrisgorgo Mar 22, 2017
3bb276f
changelog [skip ci]
chrisgorgo Mar 22, 2017
0cf6eca
back to poldracklab
chrisgorgo Mar 22, 2017
e1f6461
Merge branch 'master' into enh/ica
oesteban Mar 23, 2017
96092ba
Merge branch 'master' into enh/ica
chrisgorgo Apr 2, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.txt
@@ -1,6 +1,7 @@
Release x.x.x
=============

* [ENH] Optional ICA reports for identifying spatiotemporal artifacts (#412)
* [ENH] Add --profile flag (#435)
* [ENH] Crashfiles are saved in plain text to improve portability (#434)

Expand Down
2 changes: 1 addition & 1 deletion circle.yml
Expand Up @@ -30,7 +30,7 @@ test:
# Test mriqcp
- docker run -i -v /etc/localtime:/etc/localtime:ro -v ${CIRCLE_TEST_REPORTS}:/scratch -w /opt/src/mriqc --entrypoint="/usr/bin/run_tests" poldracklab/mriqc:latest :
timeout: 2600
- docker run -i -v /etc/localtime:/etc/localtime:ro -v ~/data:/data:ro -v $SCRATCH:/scratch -w /scratch poldracklab/mriqc:latest /data/${TEST_DATA_NAME} out/ participant --testing --verbose-reports --profile :
- docker run -i -v /etc/localtime:/etc/localtime:ro -v ~/data:/data:ro -v $SCRATCH:/scratch -w /scratch poldracklab/mriqc:latest /data/${TEST_DATA_NAME} out/ participant --testing --verbose-reports --profile --n_proc 2 --ants-nthreads 1 --ica :
timeout: 3200
- docker run -i -v /etc/localtime:/etc/localtime:ro -v ~/data:/data:ro -v $SCRATCH:/scratch -w /scratch poldracklab/mriqc:latest /data/${TEST_DATA_NAME} out/ group -m bold
- docker run -i -v /etc/localtime:/etc/localtime:ro -v ~/data:/data:ro -v $SCRATCH:/scratch -w /scratch poldracklab/mriqc:latest /data/${TEST_DATA_NAME} out/ group -m T1w
Expand Down
10 changes: 10 additions & 0 deletions docker/Dockerfile_py27
Expand Up @@ -46,6 +46,16 @@ RUN conda config --add channels conda-forge && \
conda install -y numpy>=1.12.0 scipy matplotlib && \
python -c "from matplotlib import font_manager"

# Installing WEBP tools
RUN curl -sSLO "http://downloads.webmproject.org/releases/webp/libwebp-0.5.2-linux-x86-64.tar.gz" && \
tar -xf libwebp-0.5.2-linux-x86-64.tar.gz && cd libwebp-0.5.2-linux-x86-64/bin && \
mv cwebp /usr/local/bin/ && rm -rf libwebp-0.5.2-linux-x86-64

# Installing SVGO
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash -
RUN apt-get install -y nodejs
RUN npm install -g svgo

# Install mriqc
WORKDIR /opt/src/mriqc
COPY . /opt/src/mriqc/
Expand Down
10 changes: 10 additions & 0 deletions docker/Dockerfile_py35
Expand Up @@ -48,6 +48,16 @@ RUN conda config --add channels conda-forge && \
conda install -y numpy>=1.12.0 scipy matplotlib && \
python -c "from matplotlib import font_manager"

# Installing WEBP tools
RUN curl -sSLO "http://downloads.webmproject.org/releases/webp/libwebp-0.5.2-linux-x86-64.tar.gz" && \
tar -xf libwebp-0.5.2-linux-x86-64.tar.gz && cd libwebp-0.5.2-linux-x86-64/bin && \
mv cwebp /usr/local/bin/ && rm -rf libwebp-0.5.2-linux-x86-64

# Installing SVGO
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash -
RUN apt-get install -y nodejs
RUN npm install -g svgo

COPY . /opt/src/mriqc/

RUN pip install -r /opt/src/mriqc/requirements.txt
Expand Down
30 changes: 7 additions & 23 deletions mriqc/bin/mriqc_run.py
Expand Up @@ -76,6 +76,9 @@ def main():
help='Do not run the workflow.')
g_input.add_argument('--use-plugin', action='store', default=None,
help='nipype plugin configuration file')
g_input.add_argument('--ica', action='store_true', default=False,
help='Run ICA on the raw data and include the components'
'in the individual reports (slow but potentially very insightful)')

g_input.add_argument('--testing', action='store_true', default=False,
help='use testing settings for a minimal footprint')
Expand Down Expand Up @@ -136,26 +139,6 @@ def main():
if opts.n_procs is not None:
n_procs = opts.n_procs

# Check physical memory
total_memory = opts.mem_gb
if total_memory < 0:
try:
from psutil import virtual_memory
total_memory = virtual_memory().total // (1024 ** 3) + 1
except ImportError:
MRIQC_LOG.warn('Total physical memory could not be estimated, using %d'
'GB as default', DEFAULT_MEM_GB)
total_memory = DEFAULT_MEM_GB

if total_memory > 0:
av_procs = total_memory // 4
if av_procs < 1:
MRIQC_LOG.warn('Total physical memory is less than 4GB, memory allocation'
' problems are likely to occur.')
n_procs = 1
elif n_procs > av_procs:
n_procs = av_procs

settings = {
'bids_dir': bids_dir,
'write_graph': opts.write_graph,
Expand All @@ -168,7 +151,8 @@ def main():
'output_dir': op.abspath(opts.output_dir),
'work_dir': op.abspath(opts.work_dir),
'verbose_reports': opts.verbose_reports or opts.testing,
'float32': opts.float32
'float32': opts.float32,
'ica': opts.ica
}

if opts.hmc_afni:
Expand Down Expand Up @@ -226,8 +210,8 @@ def main():
if settings['n_procs'] > 1:
plugin_settings['plugin'] = 'MultiProc'
plugin_settings['plugin_args'] = {'n_procs': settings['n_procs']}
if total_memory > 0:
plugin_settings['plugin_args']['memory_gb'] = total_memory
if opts.mem_gb:
plugin_settings['plugin_args']['memory_gb'] = opts.mem_gb

MRIQC_LOG.info(
'Running MRIQC-%s (analysis_levels=[%s], participant_label=%s)\n\tSettings=%s',
Expand Down
54 changes: 33 additions & 21 deletions mriqc/data/reports/group.html
Expand Up @@ -63,29 +63,41 @@ <h2>Summary</h2>
}

});
if (data.length > 0) {
chart1 = makeDistroChart({
data: data,
xName: 'iqm',
yName: 'value',
selector: "#chart-group" + group,
chartSize: {height: 300, width: 100 + 60 * nIQMs},
constrainExtremes: false,
modality: '{{ modality }}'
});
chart1.renderDataPlots();
chart1.dataPlots.change({
showPlot: true,
plotType: 20,
padding: 20,
showBeanLines: false
});
chart1.renderBoxPlot();
chart1.boxPlots.show({
showWhiskers: true,
showOutliers: false,
boxWidth: 15,
lineWidth: 15,
padding: -10,
colors: ['#555']
});

chart1 = makeDistroChart({
data:data,
xName:'iqm',
yName:'value',
selector:"#chart-group" + group,
chartSize:{height:300, width:100 + 60 * nIQMs},
constrainExtremes:false,
modality: '{{ modality }}'
});
chart1.renderDataPlots();
chart1.dataPlots.change({showPlot:true, plotType:20, padding: 20, showBeanLines:false});
chart1.renderBoxPlot();
chart1.boxPlots.show({showWhiskers:true,showOutliers:false,boxWidth:15,lineWidth:15,
padding: -10, colors:['#555']});

// chart1.renderNotchBoxes({showNotchBox:false});
// chart1.renderViolinPlot({showViolinPlot:false});
// chart1.violinPlots.show({reset:true,clamp:0});
// chart1.dataPlots.show({showPlot:false,showBeanLines:true, colors:['#555']})
// chart1.renderNotchBoxes({showNotchBox:false});
// chart1.renderViolinPlot({showViolinPlot:false});
// chart1.violinPlots.show({reset:true,clamp:0});
// chart1.dataPlots.show({showPlot:false,showBeanLines:true, colors:['#555']})

//chart1.notchBoxes.hide();
//chart1.boxPlots.hide();
//chart1.notchBoxes.hide();
//chart1.boxPlots.hide();
}
}

{% for data_csv in csv_groups %}
Expand Down
2 changes: 2 additions & 0 deletions mriqc/workflows/anatomical.py
Expand Up @@ -97,6 +97,8 @@ def anat_qc_workflow(dataset, settings, mod='T1w', name='anatMRIQC'):
norm = pe.Node(RobustMNINormalization(
num_threads=settings.get('ants_nthreads', 6), template='mni_icbm152_nlin_asym_09c',
testing=settings.get('testing', False), generate_report=True), name='SpatialNormalization')
norm.interface.num_threads = settings.get('ants_nthreads', 6)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is it necessary to set the num_threads at the level of the interface?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the MultiProc plugin to work correctly.


if mod == 'T1w':
norm.inputs.reference = 'T1'
elif mod == 'T2w':
Expand Down
11 changes: 11 additions & 0 deletions mriqc/workflows/core.py
Expand Up @@ -10,11 +10,14 @@
from __future__ import print_function, division, absolute_import, unicode_literals
from mriqc.workflows.anatomical import anat_qc_workflow
from mriqc.workflows.functional import fmri_qc_workflow
import os


def build_workflow(dataset, mod, settings=None):
""" Multi-subject anatomical workflow wrapper """

settings["biggest_file_size_gb"] = _get_biggest_file_size_gb(dataset)

if mod == 'bold':
workflow = fmri_qc_workflow(dataset, settings=settings)
elif mod == 'T1w':
Expand All @@ -28,3 +31,11 @@ def build_workflow(dataset, mod, settings=None):
if settings.get('write_graph', False):
workflow.write_graph()
return workflow

def _get_biggest_file_size_gb(files):
max_size = 0
for file in files:
size = os.path.getsize(file)/(1024*1024*1024)
if size > max_size:
max_size = size
return max_size