From 83ed2940aead4e2facbf52b2f0fa8d94ef360316 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 29 Aug 2023 12:33:51 -0400 Subject: [PATCH 01/32] * introduced synb0 task * completed input/output of synb0 task * chained with Ukf task * kept run() section of synb0 task dormant --- workflows/dwi_pipe.py | 78 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/workflows/dwi_pipe.py b/workflows/dwi_pipe.py index d4b85a6..c5c350e 100755 --- a/workflows/dwi_pipe.py +++ b/workflows/dwi_pipe.py @@ -87,7 +87,7 @@ def output(self): dwi = local.path(re.sub('_desc-Xc_', '_desc-XcUn_', self.input()['dwi'])) bval = dwi.with_suffix('.bval', depth=2) bvec = dwi.with_suffix('.bvec', depth=2) - + return dict(dwi=dwi, bval=bval, bvec=bvec) @@ -323,6 +323,78 @@ def output(self): +@requires(GibbsUn,CnnMask,StructMask) +class SynB0(Task): + + mask_qc= BoolParameter(default=False) + acqp = Parameter() + index = Parameter() + + + def run(self): + + pass + # synb0 wrapper + # cmd = (' ').join(['fsl_eddy.py', + # '--dwi', self.input()[0]['dwi'], + # '--bvals', self.input()[0]['bval'], + # '--bvecs', self.input()[0]['bvec'], + # '--mask', self.output()['mask'], + # '--acqp', self.acqp, + # '--index', self.index, + # '--config', self.config, + # '--eddy-cuda' if self.useGpu else '', + # '--out', outDir]) + # p = Popen(cmd, shell=True) + # p.wait() + # + # version_file= outDir.join('fsl_version.txt') + # check_call(f'eddy_openmp 2>&1 | grep Part > {version_file}', shell= True) + # + # # fsl_eddy.py writes with this outPrefix + # outPrefix= outDir.join(self.input()[0]['dwi'].stem)+'_Ed' + # move(outPrefix+'.nii.gz',self.output()['dwi']) + # move(outPrefix+'.bval',self.output()['bval']) + # move(outPrefix+'.bvec',self.output()['bvec']) + + # break + + + write_provenance(self, self.output()['dwi']) + + + # self.dwi= self.output()['dwi'] + # yield self.clone(BseExtract) + + + def output(self): + + eddy_epi_prefix= self.input()[0]['dwi'].rsplit('_dwi.nii.gz')[0] + eddy_epi_prefix= eddy_epi_prefix.replace('_acq-PA','') + eddy_epi_prefix= eddy_epi_prefix.replace('_acq-AP','') + eddy_epi_prefix+= 'EdEp' + + dwi = local.path(eddy_epi_prefix+ '_dwi.nii.gz') + bval = dwi.with_suffix('.bval', depth= 2) + bvec = dwi.with_suffix('.bvec', depth= 2) + + + mask_prefix = dwi.rsplit('_desc-')[0] + desc= re.search('_desc-(.+?)_dwi.nii.gz', basename(dwi)).group(1) + desc= 'dwi'+ desc + mask_prefix= mask_prefix+ '_desc-'+ desc + mask = local.path(mask_prefix+ '_mask.nii.gz') + + bse_prefix= dwi._path + desc= re.search('_desc-(.+?)_dwi.nii.gz', bse_prefix).group(1) + desc= 'dwi'+ desc + bse= local.path(bse_prefix.split('_desc-')[0]+ '_desc-'+ desc+ '_bse.nii.gz') + + + return dict(dwi=dwi, bval=bval, bvec=bvec, bse=bse, mask=mask) + + + @inherits(FslEddy, PnlEddy, StructMask, BseExtract) class EddyEpi(Task): debug = BoolParameter(default=False) @@ -595,7 +667,7 @@ def output(self): -@inherits(PnlEddy, FslEddy, EddyEpi, TopupEddy, HcpPipe) +@inherits(PnlEddy, FslEddy, SynB0, EddyEpi, TopupEddy, HcpPipe) class Ukf(Task): ukf_params = Parameter(default='') @@ -609,6 +681,8 @@ def requires(self): return self.clone(PnlEddy) elif self.eddy_epi_task=='fsleddy': return self.clone(FslEddy) + elif self.eddy_epi_task=='synb0': + return self.clone(SynB0) elif self.eddy_epi_task=='eddyepi': return self.clone(EddyEpi) elif self.eddy_epi_task=='topupeddy': From 357439b2c7b872e2d1cab5a8090f549f6a8d2a30 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Wed, 30 Aug 2023 11:40:50 -0400 Subject: [PATCH 02/32] * remove dead code * remove BET masking method (it simply does not work) * remove the inactive source steps * rework the mask_prefix and copy baseline image Co-authored-by: Ryan Zurrin --- workflows/synb0_eddy.sh | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/workflows/synb0_eddy.sh b/workflows/synb0_eddy.sh index 386096a..4b15d0f 100755 --- a/workflows/synb0_eddy.sh +++ b/workflows/synb0_eddy.sh @@ -35,7 +35,6 @@ fi echo "1. run Luigi pipeline and prepare DWI for synb0 container" export LUIGI_CONFIG_PATH -# source /rfanfs/pnl-zorro/software/pnlpipe3/bashrc3-gpu \ /rfanfs/pnl-zorro/software/pnlpipe3/luigi-pnlpipe/exec/ExecuteTask --task CnnMask \ --bids-data-dir $BIDS_DATA_DIR \ --dwi-template "$DWI_TEMPLATE" \ @@ -64,7 +63,6 @@ unring_prefix=${_unring_prefix//.nii.gz} unring_mask=`ls dwi/sub-${c}_ses-${s}_*desc-dwiXcUnCNN_mask.nii.gz` if [ ! -f INPUTS/b0.nii.gz ] then - # source /rfanfs/pnl-zorro/software/pnlpipe3/bashrc3-gpu && \ fslmaths ${unring_prefix}.nii.gz -mul $unring_mask ${unring_prefix}.nii.gz && \ bse.py -i ${unring_prefix}.nii.gz -o INPUTS/b0.nii.gz fi @@ -98,16 +96,9 @@ echo "4. create mask of topup (synb0) corrected b0" _caselist=$(mktemp --suffix=.txt) realpath OUTPUTS/b0_all_topup.nii.gz > $_caselist echo "0 0" > OUTPUTS/b0_all_topup.bval -# source /rfanfs/pnl-zorro/software/pnlpipe3/bashrc3-gpu && \ dwi_masking.py -i $_caselist -f ${NEW_SOFT_DIR}/CNN-Diffusion-MRIBrain-Segmentation/model_folder mask=`ls OUTPUTS/*-multi_BrainMask.nii.gz` rm $_caselist -# BET method -# cd OUTPUTS/ -# fslroi b0_all_topup.nii.gz _b0.nii.gz 0 1 -# bet _b0.nii.gz b0_all_topup -m -n -# mask=`realpath b0_all_topup_mask.nii.gz` -# cd .. if [ -z $mask ] then @@ -123,7 +114,6 @@ eddy_out=OUTPUTS/sub-${c}_ses-${s}_dir-${dir}_desc-XcUnEdEp_dwi # so omit masking at this step # fslmaths ${unring_prefix}.nii.gz -mul $mask ${unring_prefix}.nii.gz echo "5. run eddy_cuda" -# source /rfanfs/pnl-zorro/software/pnlpipe3/bashrc3-gpu-cuda-10.2 && \ eddy_cuda \ --imain=${unring_prefix}.nii.gz \ --bvecs=${unring_prefix}.bvec \ @@ -145,7 +135,11 @@ bids_prefix=dwi/sub-${c}_ses-${s}_dir-${dir}_desc-XcUnEdEp_dwi mv ${eddy_out}.nii.gz ${bids_prefix}.nii.gz mv ${eddy_out}.eddy_rotated_bvecs ${bids_prefix}.bvec cp ${unring_prefix}.bval ${bids_prefix}.bval -mv $mask dwi/sub-${c}_ses-${s}_dir-${dir}_desc-dwiXcUnEdEp_mask.nii.gz + +mask_prefix=${unring_prefix//dwi/} +mask_prefix=${mask_prefix//XcUn/dwiXcUn} +mv $mask ${mask_prefix}_mask.nii.gz +mv OUTPUTS/b0_all_topup_bse.nii.gz ${mask_prefix}_bse.nii.gz From fa8156a0c1e6e38d5e1c5a3f81d23816173492ce Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Wed, 30 Aug 2023 11:42:13 -0400 Subject: [PATCH 03/32] completed SynB0 task --- workflows/dwi_pipe.py | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/workflows/dwi_pipe.py b/workflows/dwi_pipe.py index c5c350e..bc1b686 100755 --- a/workflows/dwi_pipe.py +++ b/workflows/dwi_pipe.py @@ -333,40 +333,30 @@ class SynB0(Task): def run(self): - pass # synb0 wrapper - # cmd = (' ').join(['fsl_eddy.py', - # '--dwi', self.input()[0]['dwi'], - # '--bvals', self.input()[0]['bval'], - # '--bvecs', self.input()[0]['bvec'], - # '--mask', self.output()['mask'], - # '--acqp', self.acqp, - # '--index', self.index, - # '--config', self.config, - # '--eddy-cuda' if self.useGpu else '', - # '--out', outDir]) - # p = Popen(cmd, shell=True) - # p.wait() - # - # version_file= outDir.join('fsl_version.txt') - # check_call(f'eddy_openmp 2>&1 | grep Part > {version_file}', shell= True) - # - # # fsl_eddy.py writes with this outPrefix - # outPrefix= outDir.join(self.input()[0]['dwi'].stem)+'_Ed' - # move(outPrefix+'.nii.gz',self.output()['dwi']) - # move(outPrefix+'.bval',self.output()['bval']) - # move(outPrefix+'.bvec',self.output()['bvec']) - - # break + cmd = (' ').join(['_synb0_eddy.sh', + self.input()[0]['dwi'].strip('.nii.gz'), + self.input()[1]['bse']._path, + self.input()[2]['n4corr']._path, + self.output()['dwi'].strip('.nii.gz'), + self.output()['mask'], + self.output()['bse'], + self.acqp, + self.index]) + p = Popen(cmd, shell=True) + p.wait() + + version_file= outDir.join('fsl_version.txt') + check_call(f'eddy_openmp 2>&1 | grep Part > {version_file}', shell= True) write_provenance(self, self.output()['dwi']) - # self.dwi= self.output()['dwi'] # yield self.clone(BseExtract) + def output(self): eddy_epi_prefix= self.input()[0]['dwi'].rsplit('_dwi.nii.gz')[0] From 8f207212c1d76cdf28a29a2b10058ae83f23edd9 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Wed, 30 Aug 2023 11:43:23 -0400 Subject: [PATCH 04/32] just singularity and eddy steps of synb0_eddy.sh Co-authored-by: Ryan Zurrin --- workflows/_synb0_eddy.sh | 90 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100755 workflows/_synb0_eddy.sh diff --git a/workflows/_synb0_eddy.sh b/workflows/_synb0_eddy.sh new file mode 100755 index 0000000..64cbdc8 --- /dev/null +++ b/workflows/_synb0_eddy.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# for time profiling +date + +unring_prefix=$1 +b0=$2 +T1=$3 +eddy_prefix=$4 +eddy_mask=$5 +eddy_bse=$6 +ACQPARAMS=$7 +INDEX=$8 + + +pushd . +SES_FOLDER=$(dirname $(dirname dwi)) +cd $SES_FOLDER +mkdir -p INPUTS OUTPUTS + +cp $b0 INPUTS/b0.nii.gz +cp $T1 INPUTS/T1.nii.gz + +cp $ACQPARAMS INPUTS/ +cp $INDEX INPUTS/ + + +echo "3. run synb0 container" +TMPDIR=$HOME/tmp/ +mkdir -p $TMPDIR +if [ ! -f OUTPUTS/b0_all_topup.nii.gz ] +then + TMPDIR=$TMPDIR \ + singularity run -B INPUTS/:/INPUTS -B OUTPUTS/:/OUTPUTS \ + -B ${NEW_SOFT_DIR}/fs7.1.0/license.txt:/extra/freesurfer/license.txt \ + ${NEW_SOFT_DIR}/containers/synb0-disco_v3.0.sif --stripped +fi + +echo "4. create mask of topup (synb0) corrected b0" +# CNN method +_caselist=$(mktemp --suffix=.txt) +realpath OUTPUTS/b0_all_topup.nii.gz > $_caselist +echo "0 0" > OUTPUTS/b0_all_topup.bval +dwi_masking.py -i $_caselist -f ${NEW_SOFT_DIR}/CNN-Diffusion-MRIBrain-Segmentation/model_folder +mask=`ls OUTPUTS/*-multi_BrainMask.nii.gz` +rm $_caselist + +if [ -z $mask ] +then + echo topup mask creation failed + exit 1 +fi + + +_eddy_out=OUTPUTS/$(basename $eddy_out) +echo "5. run eddy_cuda" +eddy_cuda \ + --imain=${unring_prefix}.nii.gz \ + --bvecs=${unring_prefix}.bvec \ + --bvals=${unring_prefix}.bval \ + --mask=$mask \ + --topup=OUTPUTS/topup \ + --acqp=INPUTS/acqparams.txt \ + --index=INPUTS/index.txt \ + --repol --data_is_shelled --verbose \ + --out=${_eddy_out} || { exit 1; } + + + +echo "6. organize outputs" +# provide masked eddy_out for clarity, quality, and convenience +fslmaths ${_eddy_out}.nii.gz -mul $mask ${_eddy_out}.nii.gz + +mv ${_eddy_out}.nii.gz ${eddy_prefix}.nii.gz +mv ${_eddy_out}.eddy_rotated_bvecs ${eddy_prefix}.bvec +cp ${unring_prefix}.bval ${eddy_prefix}.bval + +mv $mask $eddy_mask +mv OUTPUTS/b0_all_toupup_bse.nii.gz $eddy_bse + + + +echo "Luigi-SynB0-Eddy pipeline has completed" +echo "See outputs at $PWD/dwi/" + +popd + +# for time profiling +date + From 746c7dd92c239966bd95e63d291b817c73be850e Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Wed, 30 Aug 2023 11:50:29 -0400 Subject: [PATCH 05/32] full path for _synb0_eddy.sh is needed Co-authored-by: Ryan Zurrin --- workflows/dwi_pipe.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflows/dwi_pipe.py b/workflows/dwi_pipe.py index bc1b686..0b31318 100755 --- a/workflows/dwi_pipe.py +++ b/workflows/dwi_pipe.py @@ -334,7 +334,8 @@ class SynB0(Task): def run(self): # synb0 wrapper - cmd = (' ').join(['_synb0_eddy.sh', + DIR= abspath(dirname(__file__)) + cmd = (' ').join([f'{DIR}/_synb0_eddy.sh', self.input()[0]['dwi'].strip('.nii.gz'), self.input()[1]['bse']._path, self.input()[2]['n4corr']._path, From 2bb65ca620cb5f73c159331c348ffdaa1516941d Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Thu, 31 Aug 2023 11:15:08 -0400 Subject: [PATCH 06/32] print duration in minutes/seconds Co-authored-by: Ryan Zurrin --- workflows/synb0_eddy.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workflows/synb0_eddy.sh b/workflows/synb0_eddy.sh index 4b15d0f..19e110e 100755 --- a/workflows/synb0_eddy.sh +++ b/workflows/synb0_eddy.sh @@ -2,6 +2,7 @@ # for time profiling date +START_TIME=$(date +%s) # User will edit only this block ========================================================= caselist=$1 @@ -150,4 +151,5 @@ popd # for time profiling date - +ELAPSED_TIME=$(($(date +%s) - $START_TIME)) +echo "Elapsed time: $(($ELAPSED_TIME/60)) min $(($ELAPSED_TIME%60)) sec" From a07152bab7d0b53f39e484745b74fff9a724b262 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Thu, 31 Aug 2023 13:56:52 -0400 Subject: [PATCH 07/32] SES_FOLDER determination was incorrect --- workflows/_synb0_eddy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/_synb0_eddy.sh b/workflows/_synb0_eddy.sh index 64cbdc8..62dfa6e 100755 --- a/workflows/_synb0_eddy.sh +++ b/workflows/_synb0_eddy.sh @@ -14,7 +14,7 @@ INDEX=$8 pushd . -SES_FOLDER=$(dirname $(dirname dwi)) +SES_FOLDER=$(dirname $(dirname $unring_prefix)) cd $SES_FOLDER mkdir -p INPUTS OUTPUTS From a706fe48d5ae40704e9464d5b46a7f09ff437758 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Thu, 31 Aug 2023 15:32:21 -0400 Subject: [PATCH 08/32] eddy_out determination was incorrect before Co-authored-by: Ryan Zurrin --- workflows/_synb0_eddy.sh | 2 +- workflows/synb0_eddy.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/_synb0_eddy.sh b/workflows/_synb0_eddy.sh index 62dfa6e..6a548d8 100755 --- a/workflows/_synb0_eddy.sh +++ b/workflows/_synb0_eddy.sh @@ -52,7 +52,7 @@ then fi -_eddy_out=OUTPUTS/$(basename $eddy_out) +_eddy_out=OUTPUTS/$(basename $eddy_prefix) echo "5. run eddy_cuda" eddy_cuda \ --imain=${unring_prefix}.nii.gz \ diff --git a/workflows/synb0_eddy.sh b/workflows/synb0_eddy.sh index 19e110e..670ad47 100755 --- a/workflows/synb0_eddy.sh +++ b/workflows/synb0_eddy.sh @@ -137,7 +137,7 @@ mv ${eddy_out}.nii.gz ${bids_prefix}.nii.gz mv ${eddy_out}.eddy_rotated_bvecs ${bids_prefix}.bvec cp ${unring_prefix}.bval ${bids_prefix}.bval -mask_prefix=${unring_prefix//dwi/} +mask_prefix=${unring_prefix//_dwi/} mask_prefix=${mask_prefix//XcUn/dwiXcUn} mv $mask ${mask_prefix}_mask.nii.gz mv OUTPUTS/b0_all_topup_bse.nii.gz ${mask_prefix}_bse.nii.gz From 0ef40c157ef0be433ee16ff12172185de1461c2e Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:36:10 -0400 Subject: [PATCH 09/32] TYPO: unring_prefix-->bids_prefix --- workflows/synb0_eddy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/synb0_eddy.sh b/workflows/synb0_eddy.sh index 670ad47..a4bf611 100755 --- a/workflows/synb0_eddy.sh +++ b/workflows/synb0_eddy.sh @@ -137,7 +137,7 @@ mv ${eddy_out}.nii.gz ${bids_prefix}.nii.gz mv ${eddy_out}.eddy_rotated_bvecs ${bids_prefix}.bvec cp ${unring_prefix}.bval ${bids_prefix}.bval -mask_prefix=${unring_prefix//_dwi/} +mask_prefix=${bids_prefix//_dwi/} mask_prefix=${mask_prefix//XcUn/dwiXcUn} mv $mask ${mask_prefix}_mask.nii.gz mv OUTPUTS/b0_all_topup_bse.nii.gz ${mask_prefix}_bse.nii.gz From 1961f013e7267a0b22bb8bd07a928d643cd75e2b Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Thu, 31 Aug 2023 17:51:56 -0400 Subject: [PATCH 10/32] typo --- workflows/_synb0_eddy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/_synb0_eddy.sh b/workflows/_synb0_eddy.sh index 6a548d8..fb68e79 100755 --- a/workflows/_synb0_eddy.sh +++ b/workflows/_synb0_eddy.sh @@ -76,7 +76,7 @@ mv ${_eddy_out}.eddy_rotated_bvecs ${eddy_prefix}.bvec cp ${unring_prefix}.bval ${eddy_prefix}.bval mv $mask $eddy_mask -mv OUTPUTS/b0_all_toupup_bse.nii.gz $eddy_bse +mv OUTPUTS/b0_all_topup_bse.nii.gz $eddy_bse From 7b5f1d232cae0d0c40509f840cbc4edbe20ef8a9 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 1 Sep 2023 00:54:09 -0400 Subject: [PATCH 11/32] instead of strip() within python, use ${1//.nii.gz/} to get prefix --- workflows/_synb0_eddy.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/_synb0_eddy.sh b/workflows/_synb0_eddy.sh index fb68e79..bac2046 100755 --- a/workflows/_synb0_eddy.sh +++ b/workflows/_synb0_eddy.sh @@ -3,10 +3,10 @@ # for time profiling date -unring_prefix=$1 +unring_prefix=${1//.nii.gz/} b0=$2 T1=$3 -eddy_prefix=$4 +eddy_prefix=${4//.nii.gz/} eddy_mask=$5 eddy_bse=$6 ACQPARAMS=$7 From d0088ca9f7ed9c6b1ab6a550e4fcde528cd116b6 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 1 Sep 2023 00:56:10 -0400 Subject: [PATCH 12/32] * instead of StructMask, we need to chain N4BiasCorrect * do not use strip(), it reduces _dwi to _dw * provide outDir for fsl_version.txt --- workflows/dwi_pipe.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workflows/dwi_pipe.py b/workflows/dwi_pipe.py index 0b31318..f6eac34 100755 --- a/workflows/dwi_pipe.py +++ b/workflows/dwi_pipe.py @@ -12,7 +12,7 @@ from time import sleep import re -from struct_pipe import StructMask +from struct_pipe import StructMask, N4BiasCorrect from _task_util import _mask_name from scripts.util import N_PROC, B0_THRESHOLD, BET_THRESHOLD, QC_POLL, LIBDIR, \ @@ -323,7 +323,7 @@ def output(self): -@requires(GibbsUn,CnnMask,StructMask) +@requires(GibbsUn,CnnMask,N4BiasCorrect) class SynB0(Task): mask_qc= BoolParameter(default=False) @@ -336,10 +336,10 @@ def run(self): # synb0 wrapper DIR= abspath(dirname(__file__)) cmd = (' ').join([f'{DIR}/_synb0_eddy.sh', - self.input()[0]['dwi'].strip('.nii.gz'), + self.input()[0]['dwi']._path, self.input()[1]['bse']._path, self.input()[2]['n4corr']._path, - self.output()['dwi'].strip('.nii.gz'), + self.output()['dwi']._path, self.output()['mask'], self.output()['bse'], self.acqp, @@ -347,7 +347,7 @@ def run(self): p = Popen(cmd, shell=True) p.wait() - version_file= outDir.join('fsl_version.txt') + version_file= self.output()['dwi'].dirname.join('fsl_version.txt') check_call(f'eddy_openmp 2>&1 | grep Part > {version_file}', shell= True) From 757b34d14c5a64a6c6c0624dba3b9d2686e9a74a Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 12 Sep 2023 11:14:12 -0400 Subject: [PATCH 13/32] use 800-cluster csv files as target output, not wma800 directory --- workflows/dwi_pipe.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/workflows/dwi_pipe.py b/workflows/dwi_pipe.py index f6eac34..0282793 100755 --- a/workflows/dwi_pipe.py +++ b/workflows/dwi_pipe.py @@ -468,9 +468,9 @@ class TopupEddy(Task): config = Parameter(default=pjoin(LIBDIR, 'scripts', 'eddy_config.txt')) useGpu = BoolParameter(default=False) - numb0 = Parameter(default=1) + numb0 = Parameter(default='1') whichVol = Parameter(default='1') - scale = Parameter(default=2) + scale = Parameter(default='2') TopupOutDir= Parameter(default='fsl_eddy') @@ -719,7 +719,6 @@ class Wma800(Task): wma_cleanup= IntParameter(default=0) def run(self): - cmd = (' ').join(['wm_apply_ORG_atlas_to_subject.sh', '-i', self.input(), '-a', self.atlas, @@ -729,12 +728,19 @@ def run(self): f'-n {self.wma_nproc}', f'-c {self.wma_cleanup}', '-d 1', - '-o', self.output()]) + '-o', self.input().dirname.join('wma800')]) p = Popen(cmd, shell=True) p.wait() write_provenance(self) def output(self): - return self.input().dirname.join('wma800') + prefix= self.input().dirname.join('wma800',self.input().basename.split('.vtk')[0], + 'FiberClustering/SeparatedClusters') + + clusters=[] + for region in 'commissural left_hemisphere right_hemisphere'.split(): + clusters.append( local.path(f'{prefix}/diffusion_measurements_{region}.csv') ) + + return clusters From a669d30885d463a191bfbb9f75aa338e1c819157 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 12 Sep 2023 11:37:07 -0400 Subject: [PATCH 14/32] both SynB0 and Ukf-SynB0 tasks work But we are not satisfied with this design still. There are many duplications within ExecuteTask.py that should be dealt with --- workflows/ExecuteTask.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/workflows/ExecuteTask.py b/workflows/ExecuteTask.py index ffc933c..e821e6b 100755 --- a/workflows/ExecuteTask.py +++ b/workflows/ExecuteTask.py @@ -6,7 +6,7 @@ from _define_outputs import IO from struct_pipe import StructMask, Freesurfer from dwi_pipe import DwiAlign, GibbsUn, CnnMask, \ - PnlEddy, FslEddy, TopupEddy, HcpPipe, EddyEpi, Ukf + PnlEddy, FslEddy, SynB0, TopupEddy, HcpPipe, EddyEpi, Ukf, Wma800 from fs2dwi_pipe import Fs2Dwi, Wmql, Wmqlqc, TractMeasures from scripts.util import abspath, isfile, pjoin, LIBDIR from os import getenv, stat, remove @@ -56,9 +56,9 @@ def _rm_tempfiles(names): default= argparse.SUPPRESS, choices=['StructMask', 'Freesurfer', 'DwiAlign', 'GibbsUn', 'CnnMask', - 'PnlEddy', 'FslEddy', 'TopupEddy', 'HcpPipe', + 'PnlEddy', 'FslEddy', 'SynB0', 'TopupEddy', 'HcpPipe', 'EddyEpi', - 'Ukf', + 'Ukf', 'Wma800', 'Fs2Dwi', 'Wmql', 'Wmqlqc', 'TractMeasures']) parser.add_argument('--num-workers', type=int, default=1, help='number of Luigi workers') @@ -191,6 +191,15 @@ def _rm_tempfiles(names): dwi_template=args.dwi_template)) + elif args.task=='SynB0': + jobs.append(SynB0(bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + struct_template=args.t1_template)) + + elif args.task=='TopupEddy': jobs.append(TopupEddy(bids_data_dir=args.bids_data_dir, derivatives_dir=derivatives_dir, @@ -206,7 +215,8 @@ def _rm_tempfiles(names): id=id, ses=ses, dwi_template=args.dwi_template, - pa_ap_template=args.dwi_template)) + pa_ap_template=args.dwi_template, + struct_template=args.t1_template)) elif args.task=='Fs2Dwi': @@ -244,7 +254,7 @@ def _rm_tempfiles(names): build(jobs, workers=args.num_workers) - print('Removing temporary provenance files') + # print('Removing temporary provenance files') _rm_tempfiles(glob(pjoin(gettempdir(), 'hashes-*.txt'))) _rm_tempfiles(glob(pjoin(gettempdir(), 'env-*.yml'))) From d7c8d43bf9ee5eca89b06ec9ae3ab427d5b0b28c Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 13 Oct 2023 16:35:06 -0400 Subject: [PATCH 15/32] add Wma800 task to both with & w/o --t2-template block --- workflows/ExecuteTask.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/workflows/ExecuteTask.py b/workflows/ExecuteTask.py index e821e6b..6d77fa9 100755 --- a/workflows/ExecuteTask.py +++ b/workflows/ExecuteTask.py @@ -130,6 +130,15 @@ def _rm_tempfiles(names): struct_template=args.t2_template)) + elif args.task=='Wma800': + jobs.append(Ukf(bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + struct_template=args.t2_template)) + + elif args.task=='Fs2Dwi': jobs.append(Fs2Dwi(bids_data_dir=args.bids_data_dir, derivatives_dir=derivatives_dir, @@ -219,6 +228,16 @@ def _rm_tempfiles(names): struct_template=args.t1_template)) + elif args.task=='Wma800': + jobs.append(Ukf(bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + pa_ap_template=args.dwi_template, + struct_template=args.t1_template)) + + elif args.task=='Fs2Dwi': jobs.append(Fs2Dwi(bids_data_dir=args.bids_data_dir, derivatives_dir=derivatives_dir, From a4b7a430c149d0d71e6459cff9f68d90c6b3d528 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 17 Oct 2023 12:18:32 -0400 Subject: [PATCH 16/32] minor correction --- workflows/ExecuteTask.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/workflows/ExecuteTask.py b/workflows/ExecuteTask.py index 6d77fa9..758c13a 100755 --- a/workflows/ExecuteTask.py +++ b/workflows/ExecuteTask.py @@ -109,12 +109,12 @@ def _rm_tempfiles(names): elif args.task=='EddyEpi': - jobs.append(eval(args.task)(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) + jobs.append(EddyEpi(bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + struct_template=args.t2_template)) From f6a221b7ab544b68d5bdc6e5fadea64e5e30ede3 Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 17 Oct 2023 12:28:25 -0400 Subject: [PATCH 17/32] typo: UKF-->Wma800 --- workflows/ExecuteTask.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/workflows/ExecuteTask.py b/workflows/ExecuteTask.py index 758c13a..3ab3ad5 100755 --- a/workflows/ExecuteTask.py +++ b/workflows/ExecuteTask.py @@ -131,12 +131,12 @@ def _rm_tempfiles(names): elif args.task=='Wma800': - jobs.append(Ukf(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) + jobs.append(Wma800(bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + struct_template=args.t2_template)) elif args.task=='Fs2Dwi': @@ -229,13 +229,13 @@ def _rm_tempfiles(names): elif args.task=='Wma800': - jobs.append(Ukf(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - pa_ap_template=args.dwi_template, - struct_template=args.t1_template)) + jobs.append(Wma800(bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + pa_ap_template=args.dwi_template, + struct_template=args.t1_template)) elif args.task=='Fs2Dwi': From 66bd120874c90ed6ccfd881bab6ecedb82a7d57e Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:10:46 -0400 Subject: [PATCH 18/32] consolidated tasks with same inputs --- workflows/ExecuteTask.py | 256 +++++++++++++++------------------------ 1 file changed, 97 insertions(+), 159 deletions(-) diff --git a/workflows/ExecuteTask.py b/workflows/ExecuteTask.py index 3ab3ad5..cc546fe 100755 --- a/workflows/ExecuteTask.py +++ b/workflows/ExecuteTask.py @@ -93,181 +93,119 @@ def _rm_tempfiles(names): if args.t2_template: if args.task=='StructMask': - jobs.append(StructMask(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - struct_template=args.t2_template)) + jobs.append(StructMask( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + struct_template=args.t2_template)) elif args.task=='Freesurfer': - jobs.append(Freesurfer(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - t1_template=args.t1_template, - t2_template=args.t2_template)) + jobs.append(Freesurfer( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + t1_template=args.t1_template, + t2_template=args.t2_template)) - elif args.task=='EddyEpi': - jobs.append(EddyEpi(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) - - - - # Ukf task does not have pa_ap_template because - # when axt2 is available, pa_ap acquisition should be unavailable - # in other words, PnlEpi and TopupEddy are mutually exclusive - elif args.task=='Ukf': - jobs.append(Ukf(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) - - - elif args.task=='Wma800': - jobs.append(Wma800(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) - - - elif args.task=='Fs2Dwi': - jobs.append(Fs2Dwi(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) - - elif args.task=='Wmql': - jobs.append(Wmql(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) - - elif args.task=='TractMeasures': - jobs.append(TractMeasures(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) - - - - elif args.task=='Wmqlqc': - jobs.append(Wmqlqc(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t2_template)) - + jobs.append(EddyEpi( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + struct_template=args.t2_template)) + + + # This Ukf task does not have pa_ap_template because + # when AXT2 is available, pa_ap acquisition should be unavailable. + # In other words, PnlEpi and TopupEddy are mutually exclusive + elif args.task in ['Ukf','Wma800']: + jobs.append(eval(args.task)( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + struct_template=args.t2_template)) + + elif args.task in ['Fs2Dwi','Wmql','TractMeasures','Wmqlqc']: + jobs.append(eval(args.task)( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + struct_template=args.t2_template)) + + # just t1_template else: if args.task=='StructMask': - jobs.append(StructMask(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - struct_template=args.t1_template)) + jobs.append(StructMask( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + struct_template=args.t1_template)) elif args.task=='Freesurfer': - jobs.append(Freesurfer(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - t1_template=args.t1_template)) - - + jobs.append(Freesurfer( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + t1_template=args.t1_template)) elif args.task in ['DwiAlign','GibbsUn','CnnMask','PnlEddy','FslEddy','HcpPipe']: - jobs.append(eval(args.task)(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template)) - + jobs.append(eval(args.task)( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template)) elif args.task=='SynB0': - jobs.append(SynB0(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - struct_template=args.t1_template)) - + jobs.append(SynB0( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + struct_template=args.t1_template)) elif args.task=='TopupEddy': - jobs.append(TopupEddy(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - pa_ap_template=args.dwi_template)) - - # Ukf task has both dwi_template and pa_ap_template - # because a user may want to run {PnlEddy,FslEddy} or TopupEddy - elif args.task=='Ukf': - jobs.append(Ukf(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - pa_ap_template=args.dwi_template, - struct_template=args.t1_template)) - - - elif args.task=='Wma800': - jobs.append(Wma800(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template, - pa_ap_template=args.dwi_template, - struct_template=args.t1_template)) - - - elif args.task=='Fs2Dwi': - jobs.append(Fs2Dwi(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template)) - - - elif args.task == 'Wmql': - jobs.append(Wmql(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template)) - - - elif args.task=='Wmqlqc': - jobs.append(Wmqlqc(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template)) - - - elif args.task=='TractMeasures': - jobs.append(TractMeasures(bids_data_dir=args.bids_data_dir, - derivatives_dir=derivatives_dir, - id=id, - ses=ses, - dwi_template=args.dwi_template)) + jobs.append(TopupEddy( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + pa_ap_template=args.dwi_template)) + + + # This Ukf task has both dwi_template and pa_ap_template + # because a user may want to run {PnlEddy,FslEddy,HcpPipe} or TopupEddy + elif args.task in ['Ukf','Wma800']: + jobs.append(eval(args.task)( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template, + pa_ap_template=args.dwi_template, + struct_template=args.t1_template)) + + elif args.task in ['Fs2Dwi','Wmql','TractMeasures','Wmqlqc']: + jobs.append(eval(args.task)( + bids_data_dir=args.bids_data_dir, + derivatives_dir=derivatives_dir, + id=id, + ses=ses, + dwi_template=args.dwi_template)) + build(jobs, workers=args.num_workers) From 04ad713bf945090f4c672e2aa4c65fce1908e447 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:21:56 -0400 Subject: [PATCH 19/32] add Wma800 DAG --- docs/Wma800.png | Bin 0 -> 21662 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/Wma800.png diff --git a/docs/Wma800.png b/docs/Wma800.png new file mode 100644 index 0000000000000000000000000000000000000000..d445f2f57eeaa46bd53d0fc99ac4de59f0c90957 GIT binary patch literal 21662 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 literal 0 HcmV?d00001 From cf03520114332ccb6eeadc46f045b64dc3f3eba9 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:23:51 -0400 Subject: [PATCH 20/32] add SynB0-Wma800 DAG --- docs/SynB0-Wma800.png | Bin 0 -> 21662 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/SynB0-Wma800.png diff --git a/docs/SynB0-Wma800.png b/docs/SynB0-Wma800.png new file mode 100644 index 0000000000000000000000000000000000000000..d445f2f57eeaa46bd53d0fc99ac4de59f0c90957 GIT binary patch literal 21662 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 literal 0 HcmV?d00001 From 8cebaf7ee444e436a059e17ea1e99fdf0b4c4ae0 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:24:51 -0400 Subject: [PATCH 21/32] rename Wma800.png--> SynB0-Wma800.png --- docs/Wma800.png | Bin 21662 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/Wma800.png diff --git a/docs/Wma800.png b/docs/Wma800.png deleted file mode 100644 index d445f2f57eeaa46bd53d0fc99ac4de59f0c90957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21662 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 From 4a9cca0efe0b763bb2df9d5a2b275830f2ee8268 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:03:28 -0400 Subject: [PATCH 22/32] add HcpPipe, SynB0 tasks, update TUTORIAL.md --- docs/TUTORIAL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/TUTORIAL.md b/docs/TUTORIAL.md index c03036a..1d4f160 100644 --- a/docs/TUTORIAL.md +++ b/docs/TUTORIAL.md @@ -384,7 +384,9 @@ Different methods for eddy and epi corrections are described below: * PnlEddy + PnlEpi (EddyEpi) * FslEddy + PnlEpi (EddyEpi) +* SynB0 * TopupEddy +* HcpPipe ### EddyEpi From 0d2229e1f27fcc6b02825e9a147c0146924eae43 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:28:17 -0400 Subject: [PATCH 23/32] elaborate HcpPipe task --- docs/TUTORIAL.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/TUTORIAL.md b/docs/TUTORIAL.md index 1d4f160..7865936 100644 --- a/docs/TUTORIAL.md +++ b/docs/TUTORIAL.md @@ -508,6 +508,22 @@ for corrected data is determined as follows: *_dir-214_* +### HcpPipe + +This task supersedes *TopupEddy* task. The *HcpPipe* way of processing opposing pair of DWIs is inherited +from [Washington-University/HCPpipelines](https://github.com/Washington-University/HCPpipelines). +PNL introduced some improvements in that pipeline including: + + * Use [CNN brain masking](https://github.com/pnlbwh/CNN-Diffusion-MRIBrain-Segmentation) program to generate topup mask + * Replace outliers (`--repol` flag) for >500 b-shells + +Since external processing is involved in this task, it is run via a [separate script](https://github.com/pnlbwh/luigi-pnlpipe/blob/b311000073047b40db9b7b8c1752cdbba883aa6c/workflows/hcp_pnl_topup.lsf) in three steps: + + * Gibbs unringing of opposing pair of DWIs via Luigi + * HCP pipeline via shell scripts + * Creation of soft links in `sub-*/ses-*/dwi/` directory according to BIDS convention via Luigi + +This *HcpPipe* task has been used to process *HCP-EP* data. ## UKFTractography From 630bdc8e8aa956d2e32068a00df36ce020066ca1 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:00:00 -0400 Subject: [PATCH 24/32] document SynB0 task --- docs/TUTORIAL.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/TUTORIAL.md b/docs/TUTORIAL.md index 7865936..c916538 100644 --- a/docs/TUTORIAL.md +++ b/docs/TUTORIAL.md @@ -461,6 +461,47 @@ The mask and baseline image provided to `FslEddy` are approximated as eddy corre be fed into later task FslEddyEpi. +### SynB0 + +When an axial T2w image is absent and there is only AP or PA acquisition, we make use of [Synb0-DISCO](https://github.com/MASILab/Synb0-DISCO) +program to perform EPI distortion correction. The Synb0-DISCO program is a replacement of topup. It creates a distortion corrected B0 from a single +AP or PA acquisition. It also provides the usual topup correction parameters that are used to perform eddy correction later. +However, Synb0-DISCO requires a T1w image. + +![](https://github.com/pnlbwh/luigi-pnlpipe/blob/0d2229e1f27fcc6b02825e9a147c0146924eae43/docs/SynB0-Wma800.png) + + +The configuration file used for `SynB0` task is same as the above [dwi_pipe_params.cfg](../params/dwi_pipe_params.cfg). Specifically, `SynB0` requires +the following parameters definition: + +```cfg +## [SynB0] ## +acqp: /path/to/acqp.txt +index: /path/to/index.txt +``` + +Where `acqp.txt` just: + +``` +0 1 0 0.05 +0 1 0 0 +``` + +Run it: + +```bash +export LUIGI_CONFIG_PATH=/path/to/dwi_pipe_params.cfg + +exec/ExecuteTask --task SynB0 \ +--bids-data-dir /data/pnl/Collaborators/EDCRP/1110/1110_ses-002_T1_nii/rawdata/ \ +-c ne00181 -s 002 \ +--dwi-template sub-*/ses-*/dwi/*_dwi.nii.gz \ +--t1-template sub-*/ses-*/anat/*_T1w.nii.gz +``` + +Note that, `SynB0` task is run in coordination with [_synb0_eddy.sh](_synb0_eddy.sh) . + + ### TopupEddy When two opposing acquisitions--AP and PA are available such as in Human Connectom Project (HCP), From 341c6248846295615d6ee3132550576203467215 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:02:24 -0400 Subject: [PATCH 25/32] add SynB0 and HcpPipe in table of contents --- docs/TUTORIAL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/TUTORIAL.md b/docs/TUTORIAL.md index c916538..c682b6b 100644 --- a/docs/TUTORIAL.md +++ b/docs/TUTORIAL.md @@ -23,7 +23,9 @@ Table of Contents * [Correct eddy and epi](#correct-eddy-and-epi) * [EddyEpi](#eddyepi) * [FslEddy and PnlEddy](#fsleddy-and-pnleddy) + * [SynB0](#synb0) * [TopupEddy](#topupeddy) + * [HcpPipe](#hcppipe) * [UKFTractography](#ukftractography) * [Wma800](#wma800) * [Fs2Dwi pipeline](#fs2dwi-pipeline) From 8e2c5cf8327541b6a8813db63120e0e051550015 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:05:43 -0400 Subject: [PATCH 26/32] routes of luigi-pnlpipe WIP --- docs/Pipeline_Branches.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 docs/Pipeline_Branches.md diff --git a/docs/Pipeline_Branches.md b/docs/Pipeline_Branches.md new file mode 100644 index 0000000..e0bb6a6 --- /dev/null +++ b/docs/Pipeline_Branches.md @@ -0,0 +1,34 @@ +Luigi pipeline routes: + +T1+T2 templates: + StructMask, Freesurfer + +dwi+T2 templates: + EddyEpi, Ukf, Wma800 + +Provided that Freesurfer pipeline was run: + dwi+T2 templates: + EddyEpi, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures + + +Only T1 template + StructMask, Freesurfer + +dwi+T1 template + SynB0, Ukf, Wma800 + +ap_pa_template + TopupEddy, Ukf, Wma800 + +Only dwi template: + DwiAlign, GibbsUn, CnnMask, PnlEddy, FslEddy, Ukf, Wma800 + + +Upto GibbsUn run via Luigi, HcpPipe run outside Luigi: + Only dwi template: + HcpPipe, Ukf, Wma800 + + +Provided that Freesurfer task was run before: + Only dwi template: + DwiAlign, GibbUn, CnnMask, PnlEddy, FslEddy, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures From 9ac8a6c0369bf8fdd239b25508f1774ce95992fb Mon Sep 17 00:00:00 2001 From: "Billah, Tashrif" <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 20 Oct 2023 13:39:48 -0400 Subject: [PATCH 27/32] wma800 provenance writing needs to be based off outDir --- workflows/dwi_pipe.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workflows/dwi_pipe.py b/workflows/dwi_pipe.py index 0282793..6b5ec25 100755 --- a/workflows/dwi_pipe.py +++ b/workflows/dwi_pipe.py @@ -719,6 +719,7 @@ class Wma800(Task): wma_cleanup= IntParameter(default=0) def run(self): + outDir = self.input().dirname.join('wma800') cmd = (' ').join(['wm_apply_ORG_atlas_to_subject.sh', '-i', self.input(), '-a', self.atlas, @@ -728,11 +729,11 @@ def run(self): f'-n {self.wma_nproc}', f'-c {self.wma_cleanup}', '-d 1', - '-o', self.input().dirname.join('wma800')]) + '-o', outDir]) p = Popen(cmd, shell=True) p.wait() - - write_provenance(self) + + write_provenance(self, outDir) def output(self): prefix= self.input().dirname.join('wma800',self.input().basename.split('.vtk')[0], From 28f0986f644e2c52332a729ea6a1322159a5bbb1 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:31:05 -0400 Subject: [PATCH 28/32] wip: various routes of Luigi pipeline --- docs/Pipeline_Branches.md | 48 +++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/docs/Pipeline_Branches.md b/docs/Pipeline_Branches.md index e0bb6a6..4ffaaf6 100644 --- a/docs/Pipeline_Branches.md +++ b/docs/Pipeline_Branches.md @@ -1,34 +1,48 @@ -Luigi pipeline routes: +--- + +There are many tasks in our Luigi pipeline defined in [different modules](../workflows): + +* struct_pipe.py +* dwi_pipe.py +* fs2dwi_pipe.py + +Some of them can be run standalone. Others require a task to be run beforehand. Such various routes are outlined below: + +#### T1 + T2 templates -T1+T2 templates: StructMask, Freesurfer -dwi+T2 templates: +#### dwi + T2 templates + EddyEpi, Ukf, Wma800 Provided that Freesurfer pipeline was run: - dwi+T2 templates: - EddyEpi, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures + + EddyEpi, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures -Only T1 template +#### Only T1 template + StructMask, Freesurfer -dwi+T1 template +#### dwi+T1 template + SynB0, Ukf, Wma800 -ap_pa_template +#### ap_pa_template + TopupEddy, Ukf, Wma800 -Only dwi template: +#### Only dwi template + DwiAlign, GibbsUn, CnnMask, PnlEddy, FslEddy, Ukf, Wma800 - -Upto GibbsUn run via Luigi, HcpPipe run outside Luigi: - Only dwi template: - HcpPipe, Ukf, Wma800 - +Provided that Freesurfer task was run: + + DwiAlign, GibbsUn, CnnMask, PnlEddy, FslEddy, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures + +Provided that GibbsUn was run: + + HcpPipe, Ukf, Wma800 + -Provided that Freesurfer task was run before: - Only dwi template: - DwiAlign, GibbUn, CnnMask, PnlEddy, FslEddy, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures From c3c20705913542267aa6a2fc7eb2829f8a2d850c Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:33:33 -0400 Subject: [PATCH 29/32] wip: Luigi pipeline routes --- docs/Pipeline_Branches.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Pipeline_Branches.md b/docs/Pipeline_Branches.md index 4ffaaf6..46a583e 100644 --- a/docs/Pipeline_Branches.md +++ b/docs/Pipeline_Branches.md @@ -18,7 +18,7 @@ Some of them can be run standalone. Others require a task to be run beforehand. Provided that Freesurfer pipeline was run: - EddyEpi, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures + Fs2Dwi, Wmql, Wmqlqc, TractMeasures #### Only T1 template From 3360bae38064339c24411e765dcca9de0b9e043c Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:41:14 -0400 Subject: [PATCH 30/32] wip: routes of Luigi pipeline --- docs/Pipeline_Branches.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/Pipeline_Branches.md b/docs/Pipeline_Branches.md index 46a583e..ce0e31f 100644 --- a/docs/Pipeline_Branches.md +++ b/docs/Pipeline_Branches.md @@ -1,5 +1,3 @@ ---- - There are many tasks in our Luigi pipeline defined in [different modules](../workflows): * struct_pipe.py @@ -8,6 +6,8 @@ There are many tasks in our Luigi pipeline defined in [different modules](../wor Some of them can be run standalone. Others require a task to be run beforehand. Such various routes are outlined below: +--- + #### T1 + T2 templates StructMask, Freesurfer @@ -16,10 +16,11 @@ Some of them can be run standalone. Others require a task to be run beforehand. EddyEpi, Ukf, Wma800 -Provided that Freesurfer pipeline was run: +Provided that `Freesurfer` task was run: - Fs2Dwi, Wmql, Wmqlqc, TractMeasures - + EddyEpi, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures + +--- #### Only T1 template @@ -32,16 +33,18 @@ Provided that Freesurfer pipeline was run: #### ap_pa_template TopupEddy, Ukf, Wma800 + +--- #### Only dwi template DwiAlign, GibbsUn, CnnMask, PnlEddy, FslEddy, Ukf, Wma800 -Provided that Freesurfer task was run: +Provided that `Freesurfer` task was run: DwiAlign, GibbsUn, CnnMask, PnlEddy, FslEddy, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures -Provided that GibbsUn was run: +Provided that `GibbsUn` task was run: HcpPipe, Ukf, Wma800 From 6b9f25da1888d5df7a01d3e133f454c12316c470 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:46:01 -0400 Subject: [PATCH 31/32] wip: routes of Luigi pipeline --- docs/Pipeline_Branches.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/Pipeline_Branches.md b/docs/Pipeline_Branches.md index ce0e31f..27fb725 100644 --- a/docs/Pipeline_Branches.md +++ b/docs/Pipeline_Branches.md @@ -44,6 +44,9 @@ Provided that `Freesurfer` task was run: DwiAlign, GibbsUn, CnnMask, PnlEddy, FslEddy, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures +However, note that `Ukf` is interfaced to both `PnlEddy, FslEddy` via `EddyEpi` task. + + Provided that `GibbsUn` task was run: HcpPipe, Ukf, Wma800 From 50c5ef5d0c3ba064dc799dfb65ee7ac1f68becd9 Mon Sep 17 00:00:00 2001 From: Tashrif Billah <35086881+tashrifbillah@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:54:19 -0400 Subject: [PATCH 32/32] wip: routes of Luigi pnlpipe --- docs/Pipeline_Branches.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/Pipeline_Branches.md b/docs/Pipeline_Branches.md index 27fb725..4e3cfa5 100644 --- a/docs/Pipeline_Branches.md +++ b/docs/Pipeline_Branches.md @@ -44,11 +44,6 @@ Provided that `Freesurfer` task was run: DwiAlign, GibbsUn, CnnMask, PnlEddy, FslEddy, Ukf, Fs2Dwi, Wmql, Wmqlqc, TractMeasures -However, note that `Ukf` is interfaced to both `PnlEddy, FslEddy` via `EddyEpi` task. - - Provided that `GibbsUn` task was run: HcpPipe, Ukf, Wma800 - -