From fa776aa05bc430b9e7ccbb560f0fd12a6bad05e3 Mon Sep 17 00:00:00 2001 From: Nasrin Rafiei Date: Wed, 8 Apr 2026 13:48:32 -0400 Subject: [PATCH 1/6] Refactor second-order ensemble pipeline organization and step naming --- trigeminal_second_order.sh | 874 +++++++++++++++++++++++-------------- 1 file changed, 554 insertions(+), 320 deletions(-) diff --git a/trigeminal_second_order.sh b/trigeminal_second_order.sh index 6b241da..45e95ad 100755 --- a/trigeminal_second_order.sh +++ b/trigeminal_second_order.sh @@ -1,413 +1,647 @@ #!/bin/bash +set -euo pipefail + # TRIGEMINAL SYSTEM TRACTOGRAPHY - Samir Akeb (2022-2023) # TRIGEMINAL SYSTEM TRACTOGRAPHY - Arnaud Bore (2023-2024) - -# Input structure +# TRIGEMINAL SYSTEM TRACTOGRAPHY - Nasrin Rafiei (2025-2026) +# +# SECOND-ORDER ENSEMBLE VERSION (organized like first-order) +# +# This version adds ensemble tracking to the second-order tracking stage +# using the same style as first-order: +# step_list=(0.1 0.5 1.0) +# theta_list=(20 30 40) +# +# Organized pipeline: +# 1) pool first-order final spinal / remaining_cp bundles +# 2) prepare second-order seed masks and thalamus ROIs +# 3) run second-order tracking for each (step, theta) combo in ORIG +# 4) merge combo outputs per tracking role in ORIG +# 5) register merged tractograms once to MNI +# 6) prepare second-order MNI ROIs and cut masks +# 7) filter merged second-order tractograms into pathway bundles +# 8) cut filtered bundles with label masks +# 9) reject outliers and save final second-order bundles +# +# INPUT: +# subject folder(s) containing: +# /freesurfer/aparc.DKTatlas+aseg.mgz +# /tractoflow/__fa.nii.gz +# /tractoflow/__fodf.nii.gz +# /tractoflow/__t1_warped.nii.gz +# +# EXPECTED FIRST-ORDER OUTPUTS: +# //mni_space/tracking_first_order/final_merged/final/__spinal.trk +# //mni_space/tracking_first_order/final_merged/final/__remaining_cp.trk # -# [input] -# ├── sub-01 -# │ ├── freesurfer -# │ │ └─── aparc.DKTatlas+aseg.mgz -# │ ├── sub-01__fa.nii.gz -# │ ├── sub-01__fodf.nii.gz -# │ └── sub-01__t1_warped.nii.gz -# │ -# ├── S2 -# . -# . - -usage() { echo "$(basename $0) [-s path/to/subjects] [-m path/to/mni] [-o output_dir] [-g] (if you have a gpu)" 1>&2; exit 1; } - -while getopts "s:m:o:g:" args; do +# USAGE EXAMPLE: +# bash trigeminal_second_order.sh \ +# -s /path/to/data/sub-01 \ +# -m /path/to/ROIs_clean \ +# -o /path/to/first_order_output_root \ +# -f 0.15 \ +# -t 10 \ +# -g true +# +# OPTIONAL: +# -p step_size if used with -e, run single combo only +# -e theta_deg if used with -p, run single combo only +# +# DEFAULT ensemble if -p/-e are not both given: +# step = 0.1 0.5 1.0 +# theta = 20 30 40 + +usage() { + cat <&2 +Usage: + $(basename "$0") -s -m -o + [-f fa_threshold] [-t threads] [-g true|false] + [-p step_size] [-e theta_deg] + [--npv_spinal_long N] [--npv_spinal_short N] [--npv_thalamus N] + +Tracking params: + -p step_size If set with -e, runs SINGLE combo (no ensemble) + -e theta_deg If set with -p, runs SINGLE combo (no ensemble) + If -p/-e not provided, ensemble is used: + step = 0.1 0.5 1.0 + theta = 20 30 40 + +Second-order seed budgets (TOTAL per role; auto-split across combos): + --npv_spinal_long N default: 1000 + --npv_spinal_short N default: 100 + --npv_thalamus N default: 500 + +Notes: + - First-order final expected at: /*/mni_space/tracking_first_order/final_merged/final/ + - This script expects first-order transfo in: + //orig_space/transfo/2orig_0GenericAffine.mat + //orig_space/transfo/2orig_1Warp.nii.gz + //orig_space/transfo/2orig_1InverseWarp.nii.gz +EOF + exit 1 +} + +# ------------------------- +# Parse short options first +# ------------------------- +s="" +m="" +o="" +f="" +t="" +g="" +p="" +e="" + +while getopts ":s:m:o:f:t:g:p:e:" args; do case "${args}" in - s) s=${OPTARG};; - m) m=${OPTARG};; - o) o=${OPTARG};; - g) g=${OPTARG};; - *) usage;; + s) s=${OPTARG} ;; + m) m=${OPTARG} ;; + o) o=${OPTARG} ;; + f) f=${OPTARG} ;; + t) t=${OPTARG} ;; + g) g=${OPTARG} ;; + p) p=${OPTARG} ;; + e) e=${OPTARG} ;; + *) usage ;; esac done shift $((OPTIND-1)) -if [ -z "${s}" ] || [ -z "${m}" ] || [ -z "${o}" ]; then +# ------------------------- +# Parse optional long args +# ------------------------- +npv_spinal_long_total=1000 +npv_spinal_short_total=100 +npv_thalamus_total=500 + +while [[ $# -gt 0 ]]; do + case "$1" in + --npv_spinal_long) + npv_spinal_long_total="$2" + shift 2 + ;; + --npv_spinal_short) + npv_spinal_short_total="$2" + shift 2 + ;; + --npv_thalamus) + npv_thalamus_total="$2" + shift 2 + ;; + *) + echo "Unknown argument: $1" 1>&2 + usage + ;; + esac +done + +if [[ -z "${s}" || -z "${m}" || -z "${o}" ]]; then usage fi +subject_dir="${s}" +mni_dir="${m}" +out_dir="${o}" +fa_threshold="${f:-0.15}" +nb_threads="${t:-1}" + gpu="" -if [ -n "${g}" ]; then +if [[ -n "${g}" ]]; then gpu="--use_gpu" fi -subject_dir=${s} -mni_dir=${m} -out_dir=${o} +# ------------------------- +# Ensemble grid +# ------------------------- +if [[ -n "${p}" && -n "${e}" ]]; then + step_list=("${p}") + theta_list=("${e}") +else + step_list=(0.1 0.5 1.0) + theta_list=(20 30 40) +fi + +n_combos=$(( ${#step_list[@]} * ${#theta_list[@]} )) + +# Split total budgets across combos (ceiling division) +npv_spinal_long_per_combo=$(( (npv_spinal_long_total + n_combos - 1) / n_combos )) +npv_spinal_short_per_combo=$(( (npv_spinal_short_total + n_combos - 1) / n_combos )) +npv_thalamus_per_combo=$(( (npv_thalamus_total + n_combos - 1) / n_combos )) + +echo "Folder subjects: ${subject_dir}" +echo "Folder MNI: ${mni_dir}" +echo "Output folder: ${out_dir}" +echo "FA threshold: ${fa_threshold}" +echo "GPU: ${gpu}" +echo "Threads: ${nb_threads}" +echo "Tracking grid: steps=${step_list[*]} thetas=${theta_list[*]}" +echo "Second-order budgets per combo:" +echo " spinal long: ${npv_spinal_long_per_combo} (from total ${npv_spinal_long_total})" +echo " spinal short: ${npv_spinal_short_per_combo} (from total ${npv_spinal_short_total})" +echo " thalamus: ${npv_thalamus_per_combo} (from total ${npv_thalamus_total})" + +export ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS="${nb_threads}" + +# Detect if -s is one subject folder or a parent folder of many subjects +if [[ -d "${subject_dir}/tractoflow" ]]; then + subject_list=("${subject_dir}") +else + shopt -s nullglob + subject_list=("${subject_dir}"/*/) + shopt -u nullglob +fi + +if [[ ${#subject_list[@]} -eq 0 ]]; then + echo "ERROR: No subject folders found in ${subject_dir}" + exit 1 +fi + +# ============================================================ +# 0) Pool first-order final bundles used by second-order +# ============================================================ +mkdir -p "${out_dir}/mni_space/tracking_first_order/final" -fa_threshold=0.20 +for nside in left right; do + spinal_inputs=() + remaining_inputs=() -npv_from_spinal_track_long=1000 -npv_from_spinal_track_short=100 -npv_from_thalamus_track=500 + for nsub_path in "${subject_list[@]}"; do + nsub=$(basename "${nsub_path}") + spinal_file="${out_dir}/${nsub}/mni_space/tracking_first_order/final_merged/final/${nsub}_${nside}_spinal.trk" + remaining_file="${out_dir}/${nsub}/mni_space/tracking_first_order/final_merged/final/${nsub}_${nside}_remaining_cp.trk" -echo "Folder subjects: " ${subject_dir} -echo "Folder MNI: " ${mni_dir} -echo "Output folder: " ${out_dir} -echo "GPU: " ${gpu} + [[ -f "${spinal_file}" ]] && spinal_inputs+=("${spinal_file}") + [[ -f "${remaining_file}" ]] && remaining_inputs+=("${remaining_file}") + done + + if [[ ${#spinal_inputs[@]} -eq 0 ]]; then + echo "ERROR: No first-order spinal bundles found for side ${nside}." + exit 1 + fi -mkdir -p ${out_dir}/mni_space/tracking_first_order/final/ + if [[ ${#remaining_inputs[@]} -eq 0 ]]; then + echo "ERROR: No first-order remaining_cp bundles found for side ${nside}." + exit 1 + fi -for nside in left right -do - scil_tractogram_math union ${out_dir}/*/mni_space/tracking_first_order/final/*_${nside}_spinal.trk \ - ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal.trk -f + scil_tractogram_math union "${spinal_inputs[@]}" \ + "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal.trk" -f - # Building seeding mask by converting spinal bundle TRK to NII scil_tractogram_compute_density_map \ - ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal.trk \ - ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal_density_second_order_seed_mni.nii.gz \ + "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal.trk" \ + "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ --binary -f - scil_tractogram_math union ${out_dir}/*/mni_space/tracking_first_order/final/*_${nside}_remaining_cp.trk \ - ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp.trk -f + scil_tractogram_math union "${remaining_inputs[@]}" \ + "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp.trk" -f - # Building mask by converting remaining_cp bundle TRK to NII scil_tractogram_compute_density_map \ - ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp.trk \ - ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz \ + "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp.trk" \ + "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz" \ --binary -f done -for nsub in ${subject_dir}/*/ -do - nsub=`basename "$nsub"` +# ============================================================ +# 1) Process each subject +# ============================================================ +for nsub_path in "${subject_list[@]}"; do + nsub=$(basename "${nsub_path}") + + mkdir -p "${out_dir}/${nsub}/orig_space/rois" + mkdir -p "${out_dir}/${nsub}/orig_space/tracking_second_order"/{trials,merged,final} + mkdir -p "${out_dir}/${nsub}/mni_space/rois" + mkdir -p "${out_dir}/${nsub}/mni_space/tracking_second_order"/{orig,filtered,segmented,final,cut} - mkdir -p ${out_dir}/${nsub}/orig_space/{rois,tracking_second_order,transfo} - mkdir -p ${out_dir}/${nsub}/orig_space/tracking_second_order/orig - mkdir -p ${out_dir}/${nsub}/mni_space/{rois,tracking_second_order} - mkdir -p ${out_dir}/${nsub}/mni_space/tracking_second_order/{orig,filtered,segmented,final,cut} + orig_rois_dir="${out_dir}/${nsub}/orig_space/rois" + mni_rois_dir="${out_dir}/${nsub}/mni_space/rois" + orig_tracking_dir="${out_dir}/${nsub}/orig_space/tracking_second_order" + mni_tracking_dir_second_order="${out_dir}/${nsub}/mni_space/tracking_second_order" + first_order_final_dir="${out_dir}/${nsub}/mni_space/tracking_first_order/final_merged/final" - orig_rois_dir=${out_dir}/${nsub}/orig_space/rois - mni_rois_dir=${out_dir}/${nsub}/mni_space/rois - orig_tracking_dir=${out_dir}/${nsub}/orig_space/tracking_second_order - mni_tracking_dir_first_order=${out_dir}/${nsub}/mni_space/tracking_first_order - mni_tracking_dir_second_order=${out_dir}/${nsub}/mni_space/tracking_second_order + orig_trials_root="${orig_tracking_dir}/trials" + orig_merged_root="${orig_tracking_dir}/merged" echo "" - echo "|------------- PROCESSING SECOND-ORDER FIBERS TRACTOGRAPHY FOR TRIGEMINAL SYSTEM -------------|" - echo "|------------- FOR DATASET ${nsub} -------------|" + echo "|------------- PROCESSING SECOND-ORDER ENSEMBLE FOR ${nsub} -------------|" echo "" - echo "|------------- 1) Generate local tractography with spinal bundle -------------|" - echo "|------------- 1.2) Seeding Mask + Registration in orig space -------------|" - for nside in left right - do - cp ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal_density_second_order_seed_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz + # ------------------------- + # Safety checks + # ------------------------- + for nside in left right; do + [[ -f "${first_order_final_dir}/${nsub}_${nside}_spinal.trk" ]] || { + echo "ERROR: Missing first-order file ${first_order_final_dir}/${nsub}_${nside}_spinal.trk" + exit 1 + } + [[ -f "${first_order_final_dir}/${nsub}_${nside}_remaining_cp.trk" ]] || { + echo "ERROR: Missing first-order file ${first_order_final_dir}/${nsub}_${nside}_remaining_cp.trk" + exit 1 + } + done + + [[ -f "${orig_rois_dir}/${nsub}_aparc.DKTatlas+aseg_orig.nii.gz" ]] || { + echo "ERROR: Missing ${orig_rois_dir}/${nsub}_aparc.DKTatlas+aseg_orig.nii.gz" + exit 1 + } + + [[ -f "${mni_rois_dir}/${nsub}_aparc.DKTatlas+aseg_mni.nii.gz" ]] || { + echo "ERROR: Missing ${mni_rois_dir}/${nsub}_aparc.DKTatlas+aseg_mni.nii.gz" + exit 1 + } + + [[ -f "${orig_rois_dir}/${nsub}_wm_mask_${fa_threshold}_orig.nii.gz" ]] || { + echo "ERROR: Missing ${orig_rois_dir}/${nsub}_wm_mask_${fa_threshold}_orig.nii.gz" + echo "Check that -f matches the first-order FA threshold." + exit 1 + } + + [[ -f "${out_dir}/${nsub}/orig_space/transfo/2orig_0GenericAffine.mat" ]] || { + echo "ERROR: Missing affine transform" + exit 1 + } + + [[ -f "${out_dir}/${nsub}/orig_space/transfo/2orig_1Warp.nii.gz" ]] || { + echo "ERROR: Missing forward warp" + exit 1 + } + + [[ -f "${out_dir}/${nsub}/orig_space/transfo/2orig_1InverseWarp.nii.gz" ]] || { + echo "ERROR: Missing inverse warp" + exit 1 + } + + # ------------------------- + # 1) Prepare second-order seed masks and thalamus ROIs + # ------------------------- + echo "|------------- 1) Prepare second-order seed masks and thalamus ROIs -------------|" + + echo "|------------- 1.1) Copy pooled spinal seed masks and transform them to orig space -------------|" + for nside in left right; do + cp "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" - # Register density into orig space antsApplyTransforms \ -d 3 \ - -i ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal_density_second_order_seed_mni.nii.gz \ - -r ${subject_dir}/${nsub}/tractoflow/${nsub}__t1_warped.nii.gz \ - -t ${out_dir}/${nsub}/orig_space/transfo/2orig_1Warp.nii.gz \ - -t ${out_dir}/${nsub}/orig_space/transfo/2orig_0GenericAffine.mat \ - -o ${orig_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_orig.nii.gz + -i "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ + -r "${nsub_path}/tractoflow/${nsub}__t1_warped.nii.gz" \ + -t "${out_dir}/${nsub}/orig_space/transfo/2orig_1Warp.nii.gz" \ + -t "${out_dir}/${nsub}/orig_space/transfo/2orig_0GenericAffine.mat" \ + -o "${orig_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_orig.nii.gz" done - echo "|------------- 1.3) Extract thalamus -------------|" - + echo "|------------- 1.2) Extract thalamus masks from the anatomical segmentation -------------|" Right_Thalamus=(49) Left_Thalamus=(10) - scil_labels_combine ${orig_rois_dir}/${nsub}_right_thalamus_orig.nii.gz \ - --volume_ids ${orig_rois_dir}/${nsub}_aparc.DKTatlas+aseg_orig.nii.gz ${Right_Thalamus[*]} --merge_groups -f - - scil_labels_combine ${mni_rois_dir}/${nsub}_right_thalamus_mni.nii.gz \ - --volume_ids ${mni_rois_dir}/${nsub}_aparc.DKTatlas+aseg_mni.nii.gz ${Right_Thalamus[*]} --merge_groups -f - - scil_labels_combine ${orig_rois_dir}/${nsub}_left_thalamus_orig.nii.gz \ - --volume_ids ${orig_rois_dir}/${nsub}_aparc.DKTatlas+aseg_orig.nii.gz ${Left_Thalamus[*]} --merge_groups -f - - scil_labels_combine ${mni_rois_dir}/${nsub}_left_thalamus_mni.nii.gz \ - --volume_ids ${mni_rois_dir}/${nsub}_aparc.DKTatlas+aseg_mni.nii.gz ${Left_Thalamus[*]} --merge_groups -f - - echo "|------------- 1.4) Tracking -------------|" - for nside in left right - do - # Tracking from Spinal bundle - npv 1000 - echo "|------------- 1.4a) Tracking from Spinal bundle - npv ${npv_from_spinal_track_long} -------------|" - scil_tracking_local \ - ${subject_dir}/${nsub}/tractoflow/${nsub}__fodf.nii.gz \ - ${orig_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_orig.nii.gz \ - ${orig_rois_dir}/${nsub}_wm_mask_${fa_threshold}_orig.nii.gz \ - ${orig_tracking_dir}/orig/${nsub}_${nside}_from_spinal_track_npv1000.trk \ - --npv ${npv_from_spinal_track_long} \ - -v -f ${gpu} - - # Tracking from Spinal bundle - npv 100 - echo "|------------- 1.4b) Tracking from Spinal bundle - npv ${npv_from_spinal_track_short} -------------|" - scil_tracking_local \ - ${subject_dir}/${nsub}/tractoflow/${nsub}__fodf.nii.gz \ - ${orig_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_orig.nii.gz \ - ${orig_rois_dir}/${nsub}_wm_mask_${fa_threshold}_orig.nii.gz \ - ${orig_tracking_dir}/orig/${nsub}_${nside}_from_spinal_track_npv100.trk \ - --npv ${npv_from_spinal_track_short} \ - -v -f ${gpu} - - # Tracking from Thalamus - echo "|------------- 1.4c) Tracking from Thalamus - npv ${npv_from_thalamus_track} -------------|" - scil_tracking_local \ - ${subject_dir}/${nsub}/tractoflow/${nsub}__fodf.nii.gz \ - ${orig_rois_dir}/${nsub}_${nside}_thalamus_orig.nii.gz \ - ${orig_rois_dir}/${nsub}_wm_mask_${fa_threshold}_orig.nii.gz\ - ${orig_tracking_dir}/orig/${nsub}_${nside}_from_thalamus_npv500.trk \ - --npv ${npv_from_thalamus_track} \ - -v -f ${gpu} + scil_labels_combine "${orig_rois_dir}/${nsub}_right_thalamus_orig.nii.gz" \ + --volume_ids "${orig_rois_dir}/${nsub}_aparc.DKTatlas+aseg_orig.nii.gz" ${Right_Thalamus[*]} \ + --merge_groups -f + + scil_labels_combine "${mni_rois_dir}/${nsub}_right_thalamus_mni.nii.gz" \ + --volume_ids "${mni_rois_dir}/${nsub}_aparc.DKTatlas+aseg_mni.nii.gz" ${Right_Thalamus[*]} \ + --merge_groups -f + + scil_labels_combine "${orig_rois_dir}/${nsub}_left_thalamus_orig.nii.gz" \ + --volume_ids "${orig_rois_dir}/${nsub}_aparc.DKTatlas+aseg_orig.nii.gz" ${Left_Thalamus[*]} \ + --merge_groups -f + + scil_labels_combine "${mni_rois_dir}/${nsub}_left_thalamus_mni.nii.gz" \ + --volume_ids "${mni_rois_dir}/${nsub}_aparc.DKTatlas+aseg_mni.nii.gz" ${Left_Thalamus[*]} \ + --merge_groups -f + + # ------------------------- + # 2) Run second-order ensemble tracking in orig space + # ------------------------- + echo "|------------- 2) Run second-order ensemble tracking in orig space -------------|" + for step_size in "${step_list[@]}"; do + for theta in "${theta_list[@]}"; do + combo_tag="step_${step_size}_theta_${theta}" + mkdir -p "${orig_trials_root}/${combo_tag}" + + echo "|=== Second-order combo: ${combo_tag} ===|" + + for nside in left right; do + # spinal long + scil_tracking_local \ + "${nsub_path}/tractoflow/${nsub}__fodf.nii.gz" \ + "${orig_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_orig.nii.gz" \ + "${orig_rois_dir}/${nsub}_wm_mask_${fa_threshold}_orig.nii.gz" \ + "${orig_trials_root}/${combo_tag}/${nsub}_${nside}_from_spinal_track_npv1000_${combo_tag}.trk" \ + --npv "${npv_spinal_long_per_combo}" \ + --step "${step_size}" \ + --theta "${theta}" \ + ${gpu} -v -f + + # spinal short + scil_tracking_local \ + "${nsub_path}/tractoflow/${nsub}__fodf.nii.gz" \ + "${orig_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_orig.nii.gz" \ + "${orig_rois_dir}/${nsub}_wm_mask_${fa_threshold}_orig.nii.gz" \ + "${orig_trials_root}/${combo_tag}/${nsub}_${nside}_from_spinal_track_npv100_${combo_tag}.trk" \ + --npv "${npv_spinal_short_per_combo}" \ + --step "${step_size}" \ + --theta "${theta}" \ + ${gpu} -v -f + + # thalamus + scil_tracking_local \ + "${nsub_path}/tractoflow/${nsub}__fodf.nii.gz" \ + "${orig_rois_dir}/${nsub}_${nside}_thalamus_orig.nii.gz" \ + "${orig_rois_dir}/${nsub}_wm_mask_${fa_threshold}_orig.nii.gz" \ + "${orig_trials_root}/${combo_tag}/${nsub}_${nside}_from_thalamus_npv500_${combo_tag}.trk" \ + --npv "${npv_thalamus_per_combo}" \ + --step "${step_size}" \ + --theta "${theta}" \ + ${gpu} -v -f + done + done done - echo "|------------- 1.5) Register Tracking in MNI space -------------|" - for ntracking in from_thalamus_npv500.trk from_spinal_track_npv100.trk from_spinal_track_npv1000.trk - do - for nside in left right - do - scil_tractogram_apply_transform \ - ${orig_tracking_dir}/orig/${nsub}_${nside}_${ntracking} \ - ${mni_dir}/MNI/mni_masked.nii.gz \ - ${out_dir}/${nsub}/orig_space/transfo/2orig_0GenericAffine.mat \ - ${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_${ntracking} \ - --in_deformation ${out_dir}/${nsub}/orig_space/transfo/2orig_1Warp.nii.gz \ - --remove_invalid \ - --reverse_operation -f + # ------------------------- + # 3) Merge second-order combo tractograms in orig space + # ------------------------- + echo "|------------- 3) Merge second-order combo tractograms in orig space -------------|" + for nside in left right; do + for role in from_thalamus_npv500 from_spinal_track_npv100 from_spinal_track_npv1000; do + files=() + for step_size in "${step_list[@]}"; do + for theta in "${theta_list[@]}"; do + combo_tag="step_${step_size}_theta_${theta}" + f="${orig_trials_root}/${combo_tag}/${nsub}_${nside}_${role}_${combo_tag}.trk" + [[ -f "${f}" ]] && files+=("${f}") + done + done + + if (( ${#files[@]} )); then + scil_tractogram_math concatenate "${files[@]}" \ + "${orig_merged_root}/${nsub}_${nside}_${role}.trk" -f + else + echo "WARN: no files found for ${nside} ${role}" + fi done done - echo "|------------- 1) Done -------------|" - echo "" - echo "|------------- 2) Generate ROIs -------------|" - echo "|------------- 2.1) Registration VPM -------------|" - - for nside in left right - do - cp ${mni_dir}/MNI/Distal/${nside}/VPM.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz - for nroi in ${mni_dir}/MNI/from_${nside}/*; - do - ROI_basename=$(basename $nroi) - cp $nroi ${mni_rois_dir}/${nsub}_second_order_${ROI_basename/nii/_mni.nii} + # ------------------------- + # 4) Register merged second-order tractograms to MNI space + # ------------------------- + echo "|------------- 4) Register merged second-order tractograms to MNI space -------------|" + for nside in left right; do + for role in from_thalamus_npv500 from_spinal_track_npv100 from_spinal_track_npv1000; do + in_trk="${orig_merged_root}/${nsub}_${nside}_${role}.trk" + out_trk="${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_${role}.trk" + + if [[ -f "${in_trk}" ]]; then + scil_tractogram_apply_transform \ + "${in_trk}" \ + "${mni_dir}/MNI/mni_masked.nii.gz" \ + "${out_dir}/${nsub}/orig_space/transfo/2orig_0GenericAffine.mat" \ + "${out_trk}" \ + --in_deformation "${out_dir}/${nsub}/orig_space/transfo/2orig_1Warp.nii.gz" \ + --remove_invalid \ + --reverse_operation -f + else + echo "WARN: merged orig tractogram not found for ${nside} ${role}" + fi + done + done + + # ------------------------- + # 5) Prepare second-order MNI ROIs and cut masks + # ------------------------- + echo "|------------- 5) Prepare second-order MNI ROIs and cut masks -------------|" + echo "|------------- 5.1) Copy VPM and pathway-specific MNI ROIs -------------|" + + for nside in left right; do + cp "${mni_dir}/MNI/Distal/${nside}/VPM.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" + + for nroi in "${mni_dir}/MNI/from_${nside}"/*.nii.gz; do + [[ -f "${nroi}" ]] || continue + ROI_basename=$(basename "${nroi}") + cp "${nroi}" "${mni_rois_dir}/${nsub}_second_order_${ROI_basename/nii/_mni.nii}" done done - echo "|------------- 2.2) Generate masks -------------|" - for nside in left right - do - if [ "$nside" == "left" ]; then - contra_nside="right"; - else - contra_nside="left"; - fi - - # Generate Cutting masks for DTTT (ipsilateral) - ## For dPSN : Remaining_CP to VPM - scil_volume_math union ${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz \ - ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_mni.nii.gz \ + echo "|------------- 5.2) Build cut masks for second-order pathway extraction -------------|" + for nside in left right; do + if [[ "${nside}" == "left" ]]; then + contra_nside="right" + else + contra_nside="left" + fi + + scil_volume_math union \ + "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" \ + "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_mni.nii.gz" \ --data_type uint8 -f - scil_labels_from_mask ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_labels_mni.nii.gz \ + scil_labels_from_mask \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_labels_mni.nii.gz" \ -f - ## For CS : Spinal bundle to VPM - scil_volume_math union ${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_mni.nii.gz \ + scil_volume_math union \ + "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_mni.nii.gz" \ --data_type uint8 -f - scil_labels_from_mask ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_labels_mni.nii.gz \ + scil_labels_from_mask \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_labels_mni.nii.gz" \ -f - # Generate Cutting masks for DTTT (controlateral) - ## For CS : Spinal bundle to Thalamus - scil_volume_math union ${mni_rois_dir}/${nsub}_${contra_nside}_thalamus_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_mni.nii.gz \ + scil_volume_math union \ + "${mni_rois_dir}/${nsub}_${contra_nside}_thalamus_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_mni.nii.gz" \ --data_type uint8 -f - scil_labels_from_mask ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_labels_mni.nii.gz \ + scil_labels_from_mask \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_labels_mni.nii.gz" \ -f - ## Generate Cutting masks for VTTT (controlateral) - ## For OS and IS : Spinal bundle to Thalamus - scil_volume_math union ${mni_rois_dir}/${nsub}_${contra_nside}_thalamus_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_mni.nii.gz \ + scil_volume_math union \ + "${mni_rois_dir}/${nsub}_${contra_nside}_thalamus_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_mni.nii.gz" \ --data_type uint8 -f - scil_labels_from_mask ${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_labels_mni.nii.gz \ + scil_labels_from_mask \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_labels_mni.nii.gz" \ -f - #For vPSN : Remaining_CP to VPM - scil_volume_math union ${mni_rois_dir}/${nsub}_${contra_nside}_VPM_mni.nii.gz \ - ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_mni.nii.gz \ + scil_volume_math union \ + "${mni_rois_dir}/${nsub}_${contra_nside}_VPM_mni.nii.gz" \ + "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_mni.nii.gz" \ --data_type uint8 -f - scil_labels_from_mask ${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_mni.nii.gz \ - ${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_labels_mni.nii.gz \ + scil_labels_from_mask \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_mni.nii.gz" \ + "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_labels_mni.nii.gz" \ -f done - echo "|------------- 2) Done -------------|" - echo "" - echo "|------------- 3) Generate Second-order bundles for trigeminal system -------------|" - for nside in left right - do - if [ "$nside" == "left" ]; then - contra_nside="right"; - else - contra_nside="left"; - fi - - echo "|------------- 3.1) From ${nside} - VTTT (only controlateral) - OS/IS and vPSN -------------|" - # OS and IS + # ------------------------- + # 6) Filter merged second-order tractograms into pathway bundles + # ------------------------- + echo "|------------- 6) Filter merged second-order tractograms into pathway bundles -------------|" + for nside in left right; do + if [[ "${nside}" == "left" ]]; then + contra_nside="right" + else + contra_nside="left" + fi + + echo "|------------- 6.1) From ${nside} - VTTT (contralateral) - OS/IS and vPSN -------------|" + scil_tractogram_filter_by_roi \ - ${mni_tracking_dir_second_order}/orig/${nsub}_${contra_nside}_from_thalamus_npv500.trk \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk \ - --drawn_roi ${mni_rois_dir}/${nsub}_left_cerebellum_wm_mni.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_rois_dir}/${nsub}_right_cerebellum_wm_mni.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz 'any' 'include' \ - --drawn_roi ${mni_rois_dir}/${nsub}_${contra_nside}_thalamus_mni.nii.gz 'any' 'include' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_INC_Pons_Controlat.nii.gz 'any' 'include' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_CaudalMedulla_Controlat.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_INC_VTT_Area.nii.gz 'any' 'include' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Pons_Ipsilat.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_dir}/MNI/cs_plaque.nii.gz 'any' 'exclude' -f - - ## vPSN - ## VPM + "${mni_tracking_dir_second_order}/orig/${nsub}_${contra_nside}_from_thalamus_npv500.trk" \ + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk" \ + --drawn_roi "${mni_rois_dir}/${nsub}_left_cerebellum_wm_mni.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_rois_dir}/${nsub}_right_cerebellum_wm_mni.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_rois_dir}/${nsub}_${contra_nside}_thalamus_mni.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_INC_Pons_Controlat.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_CaudalMedulla_Controlat.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_INC_VTT_Area.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Pons_Ipsilat.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_dir}/MNI/cs_plaque.nii.gz" 'any' 'exclude' -f + scil_tractogram_filter_by_roi \ - ${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv1000.trk \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk \ - --drawn_roi ${mni_rois_dir}/${nsub}_left_cerebellum_wm_mni.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_rois_dir}/${nsub}_right_cerebellum_wm_mni.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz 'either_end' 'include' \ - --drawn_roi ${mni_rois_dir}/${nsub}_${contra_nside}_VPM_mni.nii.gz 'any' 'include' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_CaudalMedulla_Controlat.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_INC_VTT_Area.nii.gz 'any' 'include'\ - --bdo ${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_1.bdo 'any' 'exclude'\ - --bdo ${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_2.bdo 'any' 'exclude'\ - --bdo ${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_3.bdo 'any' 'exclude'\ - --bdo ${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_4.bdo 'any' 'exclude'\ - --bdo ${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_5.bdo 'any' 'exclude'\ - --bdo ${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_6.bdo 'any' 'exclude' -f - - - - echo "|------------- 3.2) ${nside} - DTTT (controlateral) - CS -------------|" + "${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv1000.trk" \ + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk" \ + --drawn_roi "${mni_rois_dir}/${nsub}_left_cerebellum_wm_mni.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_rois_dir}/${nsub}_right_cerebellum_wm_mni.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" 'either_end' 'include' \ + --drawn_roi "${mni_rois_dir}/${nsub}_${contra_nside}_VPM_mni.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_CaudalMedulla_Controlat.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_INC_VTT_Area.nii.gz" 'any' 'include' \ + --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_1.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_2.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_3.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_4.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_5.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_6.bdo" 'any' 'exclude' -f + + echo "|------------- 6.2) ${nside} - DTTT (contralateral) - CS -------------|" scil_tractogram_filter_by_roi \ - ${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_thalamus_npv500.trk \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${contra_nside}_DTTT_Controlat_CS.trk \ - --drawn_roi ${mni_rois_dir}/${nsub}_${contra_nside}_spinal_density_second_order_seed_mni.nii.gz 'any' 'include' \ - --drawn_roi ${mni_rois_dir}/${nsub}_${nside}_thalamus_mni.nii.gz 'any' 'include' \ - --drawn_roi ${mni_dir}/MNI/from_${contra_nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_INC_CaudalMedulla_Ipsilat.nii.gz 'any' 'include' \ - --drawn_roi ${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_INC_Medulla_Controlat.nii.gz 'any' 'include' \ - --drawn_roi ${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_EXC_Midbrain_Ipsilat.nii.gz 'any' 'exclude' -f - - echo "|------------- 3.3) ${nside} - DTTT (ipsilateral) - dPSN and CS -------------|" - ## CS - ## VPM/Thalamus + "${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_thalamus_npv500.trk" \ + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${contra_nside}_DTTT_Controlat_CS.trk" \ + --drawn_roi "${mni_rois_dir}/${nsub}_${contra_nside}_spinal_density_second_order_seed_mni.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_thalamus_mni.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_INC_CaudalMedulla_Ipsilat.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_INC_Medulla_Controlat.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_EXC_Midbrain_Ipsilat.nii.gz" 'any' 'exclude' -f + + echo "|------------- 6.3) ${nside} - DTTT (ipsilateral) - dPSN and CS -------------|" scil_tractogram_filter_by_roi \ - ${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv100.trk \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk \ - --drawn_roi ${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz 'either_end' 'include' \ - --drawn_roi ${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz 'any' 'include' \ - --drawn_roi ${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz 'any' 'exclude' \ - --drawn_roi ${mni_dir}/MNI/midsagittal_plane.nii.gz 'any' 'exclude' -f - - ## dPSN - ## VPM/Thalamus + "${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv100.trk" \ + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" \ + --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" 'either_end' 'include' \ + --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" 'any' 'include' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_dir}/MNI/midsagittal_plane.nii.gz" 'any' 'exclude' -f + scil_tractogram_filter_by_roi \ - ${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv1000.trk \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk \ - --drawn_roi ${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz 'any' 'include' \ - --drawn_roi ${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz 'either_end' 'include' -f + "${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv1000.trk" \ + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk" \ + --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" 'any' 'include' \ + --drawn_roi "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz" 'either_end' 'include' -f done - echo "|------------- 3) Done -------------|" - echo "" - echo "|------------- 4) Cutting the Second-order bundles -------------|" - for nside in left right - do - if [ "$nside" == "left" ]; then - contra_nside="right"; - else - contra_nside="left"; - fi - echo "|------------- 4.1) ${nside} - VTTT (only controlateral) - vPSN and OS/IS -------------|" - #OS and IS - STEP 1 + # ------------------------- + # 7) Cut filtered second-order bundles with label masks + # ------------------------- + echo "|------------- 7) Cut filtered second-order bundles with label masks -------------|" + for nside in left right; do scil_tractogram_cut_streamlines \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk \ - --labels ${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_labels_mni.nii.gz \ - ${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk \ - -f + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk" \ + --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_labels_mni.nii.gz" \ + "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk" -f - #vPSN scil_tractogram_cut_streamlines \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk \ - --labels ${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_labels_mni.nii.gz \ - ${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk \ - -f + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk" \ + --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_labels_mni.nii.gz" \ + "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk" -f - echo "|------------- 4.2) ${nside} - DTTT (controlateral) - CS -------------|" - #CS scil_tractogram_cut_streamlines \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Controlat_CS.trk \ - --labels ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_labels_mni.nii.gz \ - ${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Controlat_CS.trk \ - -f - - echo "|------------- 4.3) ${nside} - DTTT (ipsilateral) - dPSN and CS -------------|" + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Controlat_CS.trk" \ + --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_labels_mni.nii.gz" \ + "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Controlat_CS.trk" -f - #CS scil_tractogram_cut_streamlines \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk \ - --labels ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_labels_mni.nii.gz \ - ${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk \ - -f + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" \ + --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_labels_mni.nii.gz" \ + "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" -f - #dPSN scil_tractogram_cut_streamlines \ - ${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk \ - --labels ${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_labels_mni.nii.gz \ - ${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk \ - -f + "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk" \ + --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_labels_mni.nii.gz" \ + "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk" -f done - echo "|------------- 4) Done -------------|" - echo "" - echo "|------------- 5) Cleaning the Second-order bundles -------------|" - for nside in left right - do - #CS + # ------------------------- + # 8) Reject outliers and save final second-order bundles + # ------------------------- + echo "|------------- 8) Reject outliers and save final second-order bundles -------------|" + for nside in left right; do scil_bundle_reject_outliers \ - ${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk \ - ${mni_tracking_dir_second_order}/final/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk \ - --alpha 0.30 \ - -f + "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" \ + "${mni_tracking_dir_second_order}/final/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" \ + --alpha 0.30 -f - for nbundle in DTTT_Ipsilat_dPSN DTTT_Controlat_CS VTTT_Controlat_OSandIS VTTT_Controlat_vPSN - do + for nbundle in DTTT_Ipsilat_dPSN DTTT_Controlat_CS VTTT_Controlat_OSandIS VTTT_Controlat_vPSN; do scil_bundle_reject_outliers \ - ${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_${nbundle}.trk \ - ${mni_tracking_dir_second_order}/final/${nsub}_from_${nside}_${nbundle}.trk \ - --alpha 0.50 \ - -f + "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_${nbundle}.trk" \ + "${mni_tracking_dir_second_order}/final/${nsub}_from_${nside}_${nbundle}.trk" \ + --alpha 0.50 -f done done - echo "|------------- 5) Done -------------|" - echo "" - echo "|------------- SECOND-ORDER FIBERS TRACTOGRAPHY FOR ${nsub} IS COMPLETED -------------|" - echo "" + echo "|------------- SECOND-ORDER ENSEMBLE FOR ${nsub} IS COMPLETED -------------|" echo "" -done +done \ No newline at end of file From e957718c576e6a4cdb855e7a0b14d17de5195a58 Mon Sep 17 00:00:00 2001 From: Nasrin Rafiei Date: Wed, 8 Apr 2026 14:46:15 -0400 Subject: [PATCH 2/6] Refactor second-order ensemble pipeline organization and step naming --- trigeminal_second_order.sh | 111 ++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 58 deletions(-) diff --git a/trigeminal_second_order.sh b/trigeminal_second_order.sh index 45e95ad..4558f3e 100755 --- a/trigeminal_second_order.sh +++ b/trigeminal_second_order.sh @@ -5,51 +5,20 @@ set -euo pipefail # TRIGEMINAL SYSTEM TRACTOGRAPHY - Arnaud Bore (2023-2024) # TRIGEMINAL SYSTEM TRACTOGRAPHY - Nasrin Rafiei (2025-2026) # -# SECOND-ORDER ENSEMBLE VERSION (organized like first-order) -# -# This version adds ensemble tracking to the second-order tracking stage -# using the same style as first-order: -# step_list=(0.1 0.5 1.0) -# theta_list=(20 30 40) +# SECOND-ORDER ENSEMBLE VERSION +# Compatible with the newer original second-order ROI/BDO logic +# while keeping the organized ensemble structure. # # Organized pipeline: -# 1) pool first-order final spinal / remaining_cp bundles -# 2) prepare second-order seed masks and thalamus ROIs -# 3) run second-order tracking for each (step, theta) combo in ORIG -# 4) merge combo outputs per tracking role in ORIG -# 5) register merged tractograms once to MNI -# 6) prepare second-order MNI ROIs and cut masks -# 7) filter merged second-order tractograms into pathway bundles -# 8) cut filtered bundles with label masks -# 9) reject outliers and save final second-order bundles -# -# INPUT: -# subject folder(s) containing: -# /freesurfer/aparc.DKTatlas+aseg.mgz -# /tractoflow/__fa.nii.gz -# /tractoflow/__fodf.nii.gz -# /tractoflow/__t1_warped.nii.gz -# -# EXPECTED FIRST-ORDER OUTPUTS: -# //mni_space/tracking_first_order/final_merged/final/__spinal.trk -# //mni_space/tracking_first_order/final_merged/final/__remaining_cp.trk -# -# USAGE EXAMPLE: -# bash trigeminal_second_order.sh \ -# -s /path/to/data/sub-01 \ -# -m /path/to/ROIs_clean \ -# -o /path/to/first_order_output_root \ -# -f 0.15 \ -# -t 10 \ -# -g true -# -# OPTIONAL: -# -p step_size if used with -e, run single combo only -# -e theta_deg if used with -p, run single combo only -# -# DEFAULT ensemble if -p/-e are not both given: -# step = 0.1 0.5 1.0 -# theta = 20 30 40 +# 0) pool first-order final spinal / remaining_cp bundles +# 1) prepare second-order seed masks and thalamus ROIs +# 2) run second-order tracking for each (step, theta) combo in ORIG +# 3) merge combo outputs per tracking role in ORIG +# 4) register merged tractograms once to MNI +# 5) prepare second-order MNI ROIs and cut masks +# 6) filter merged second-order tractograms into pathway bundles +# 7) cut filtered bundles with label masks +# 8) reject outliers and save final second-order bundles usage() { cat <&2 @@ -70,13 +39,6 @@ Second-order seed budgets (TOTAL per role; auto-split across combos): --npv_spinal_long N default: 1000 --npv_spinal_short N default: 100 --npv_thalamus N default: 500 - -Notes: - - First-order final expected at: /*/mni_space/tracking_first_order/final_merged/final/ - - This script expects first-order transfo in: - //orig_space/transfo/2orig_0GenericAffine.mat - //orig_space/transfo/2orig_1Warp.nii.gz - //orig_space/transfo/2orig_1InverseWarp.nii.gz EOF exit 1 } @@ -362,7 +324,7 @@ for nsub_path in "${subject_list[@]}"; do echo "|=== Second-order combo: ${combo_tag} ===|" for nside in left right; do - # spinal long + # Tracking from Spinal bundle - long scil_tracking_local \ "${nsub_path}/tractoflow/${nsub}__fodf.nii.gz" \ "${orig_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_orig.nii.gz" \ @@ -373,7 +335,7 @@ for nsub_path in "${subject_list[@]}"; do --theta "${theta}" \ ${gpu} -v -f - # spinal short + # Tracking from Spinal bundle - short scil_tracking_local \ "${nsub_path}/tractoflow/${nsub}__fodf.nii.gz" \ "${orig_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_orig.nii.gz" \ @@ -384,7 +346,7 @@ for nsub_path in "${subject_list[@]}"; do --theta "${theta}" \ ${gpu} -v -f - # thalamus + # Tracking from Thalamus scil_tracking_local \ "${nsub_path}/tractoflow/${nsub}__fodf.nii.gz" \ "${orig_rois_dir}/${nsub}_${nside}_thalamus_orig.nii.gz" \ @@ -471,6 +433,7 @@ for nsub_path in "${subject_list[@]}"; do contra_nside="left" fi + # DTTT ipsilateral dPSN : remaining_cp to VPM scil_volume_math union \ "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" \ "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz" \ @@ -481,6 +444,7 @@ for nsub_path in "${subject_list[@]}"; do "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_labels_mni.nii.gz" \ -f + # DTTT ipsilateral CS : spinal to VPM scil_volume_math union \ "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" \ "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ @@ -491,6 +455,7 @@ for nsub_path in "${subject_list[@]}"; do "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_labels_mni.nii.gz" \ -f + # DTTT contralateral CS : spinal to thalamus scil_volume_math union \ "${mni_rois_dir}/${nsub}_${contra_nside}_thalamus_mni.nii.gz" \ "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ @@ -501,6 +466,7 @@ for nsub_path in "${subject_list[@]}"; do "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_labels_mni.nii.gz" \ -f + # VTTT contralateral OS and IS : spinal to thalamus scil_volume_math union \ "${mni_rois_dir}/${nsub}_${contra_nside}_thalamus_mni.nii.gz" \ "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" \ @@ -511,6 +477,7 @@ for nsub_path in "${subject_list[@]}"; do "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_labels_mni.nii.gz" \ -f + # VTTT contralateral vPSN : remaining_cp to VPM scil_volume_math union \ "${mni_rois_dir}/${nsub}_${contra_nside}_VPM_mni.nii.gz" \ "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz" \ @@ -535,6 +502,7 @@ for nsub_path in "${subject_list[@]}"; do echo "|------------- 6.1) From ${nside} - VTTT (contralateral) - OS/IS and vPSN -------------|" + # OS and IS scil_tractogram_filter_by_roi \ "${mni_tracking_dir_second_order}/orig/${nsub}_${contra_nside}_from_thalamus_npv500.trk" \ "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk" \ @@ -547,8 +515,13 @@ for nsub_path in "${subject_list[@]}"; do --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_CaudalMedulla_Controlat.nii.gz" 'any' 'exclude' \ --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_INC_VTT_Area.nii.gz" 'any' 'include' \ --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Pons_Ipsilat.nii.gz" 'any' 'exclude' \ - --drawn_roi "${mni_dir}/MNI/cs_plaque.nii.gz" 'any' 'exclude' -f + --drawn_roi "${mni_dir}/MNI/cs_plaque.nii.gz" 'any' 'exclude' \ + --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_INC_VTT_Area.nii.gz" 'any' 'include' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/VTTT_Controlat_OSandIS_1.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/VTTT_Controlat_OSandIS_2.bdo" 'any' 'exclude' \ + -f + # vPSN scil_tractogram_filter_by_roi \ "${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv1000.trk" \ "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk" \ @@ -564,7 +537,8 @@ for nsub_path in "${subject_list[@]}"; do --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_3.bdo" 'any' 'exclude' \ --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_4.bdo" 'any' 'exclude' \ --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_5.bdo" 'any' 'exclude' \ - --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_6.bdo" 'any' 'exclude' -f + --bdo "${mni_dir}/MNI/from_${nside}/VTTT_Controlat/VTTT_Controlat_vPSN_6.bdo" 'any' 'exclude' \ + -f echo "|------------- 6.2) ${nside} - DTTT (contralateral) - CS -------------|" scil_tractogram_filter_by_roi \ @@ -575,22 +549,43 @@ for nsub_path in "${subject_list[@]}"; do --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz" 'any' 'exclude' \ --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_INC_CaudalMedulla_Ipsilat.nii.gz" 'any' 'include' \ --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_INC_Medulla_Controlat.nii.gz" 'any' 'include' \ - --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_EXC_Midbrain_Ipsilat.nii.gz" 'any' 'exclude' -f + --drawn_roi "${mni_dir}/MNI/from_${contra_nside}/DTTT_Controlat_EXC_Midbrain_Ipsilat.nii.gz" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Controlat_1.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Controlat_2.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Controlat_3.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Controlat_4.bdo" 'any' 'exclude' \ + -f echo "|------------- 6.3) ${nside} - DTTT (ipsilateral) - dPSN and CS -------------|" + + # CS scil_tractogram_filter_by_roi \ "${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv100.trk" \ "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" \ --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_spinal_density_second_order_seed_mni.nii.gz" 'either_end' 'include' \ --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" 'any' 'include' \ --drawn_roi "${mni_dir}/MNI/from_${nside}/VTTT_Controlat_EXC_Ventral_Brainstem.nii.gz" 'any' 'exclude' \ - --drawn_roi "${mni_dir}/MNI/midsagittal_plane.nii.gz" 'any' 'exclude' -f + --drawn_roi "${mni_dir}/MNI/midsagittal_plane.nii.gz" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_CS_1.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_CS_2.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_CS_3.bdo" 'any' 'exclude' \ + -f + # dPSN scil_tractogram_filter_by_roi \ "${mni_tracking_dir_second_order}/orig/${nsub}_${nside}_from_spinal_track_npv1000.trk" \ "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk" \ --drawn_roi "${mni_rois_dir}/${nsub}_${nside}_VPM_mni.nii.gz" 'any' 'include' \ - --drawn_roi "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz" 'either_end' 'include' -f + --drawn_roi "${out_dir}/mni_space/tracking_first_order/final/all_${nside}_remaining_cp_density_mni.nii.gz" 'either_end' 'include' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo" 'any' 'exclude' \ + --bdo "${mni_dir}/MNI/from_${nside}/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo" 'any' 'exclude' \ + -f done # ------------------------- From 5d5c0b07fc6a0f9248207aac047dbcc68e174089 Mon Sep 17 00:00:00 2001 From: Nasrin Rafiei Date: Thu, 9 Apr 2026 12:59:56 -0400 Subject: [PATCH 3/6] Add missing new_ROIs folder from upstream --- ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_1.bdo | 9 +++++++++ ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_2.bdo | 9 +++++++++ ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_3.bdo | 9 +++++++++ ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_4.bdo | 9 +++++++++ ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_1.bdo | 9 +++++++++ ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_2.bdo | 9 +++++++++ ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_3.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_1.bdo | 9 +++++++++ .../MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_2.bdo | 9 +++++++++ 17 files changed, 153 insertions(+) create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_1.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_2.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_3.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_4.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_1.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_2.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_3.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_1.bdo create mode 100644 ROIs_clean/MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_2.bdo diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_1.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_1.bdo new file mode 100644 index 0000000..d5648c9 --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_1.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_2.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_2.bdo new file mode 100644 index 0000000..c4c3900 --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_2.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_3.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_3.bdo new file mode 100644 index 0000000..5d4a41c --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_3.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_4.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_4.bdo new file mode 100644 index 0000000..0120a3c --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Controlat_4.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_1.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_1.bdo new file mode 100644 index 0000000..efdc7ef --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_1.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_2.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_2.bdo new file mode 100644 index 0000000..c27979e --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_2.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_3.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_3.bdo new file mode 100644 index 0000000..69d1b98 --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_CS_3.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo new file mode 100644 index 0000000..fabfd30 --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo new file mode 100644 index 0000000..67f00ef --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo new file mode 100644 index 0000000..5a261b7 --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo new file mode 100644 index 0000000..53cbc7c --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo new file mode 100644 index 0000000..e9be78c --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo new file mode 100644 index 0000000..4482d68 --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo new file mode 100644 index 0000000..02faeed --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo new file mode 100644 index 0000000..61ea6d0 --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_1.bdo b/ROIs_clean/MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_1.bdo new file mode 100644 index 0000000..bbc7149 --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_1.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_2.bdo b/ROIs_clean/MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_2.bdo new file mode 100644 index 0000000..6becd1f --- /dev/null +++ b/ROIs_clean/MNI/from_left/new_ROIs/VTTT_Controlat_OSandIS_2.bdo @@ -0,0 +1,9 @@ + + + + + + + + + From 04c15c8c2e72e4bbec1b87eff40f091e346dc171 Mon Sep 17 00:00:00 2001 From: Nasrin Rafiei Date: Mon, 13 Apr 2026 10:24:32 -0400 Subject: [PATCH 4/6] step 9 was added --- .../from_right/new_ROIs/DTTT_Controlat_1.bdo | 9 +++++++ .../from_right/new_ROIs/DTTT_Controlat_2.bdo | 9 +++++++ .../from_right/new_ROIs/DTTT_Controlat_3.bdo | 9 +++++++ .../from_right/new_ROIs/DTTT_Controlat_4.bdo | 9 +++++++ .../from_right/new_ROIs/DTTT_Ipsilat_CS_1.bdo | 9 +++++++ .../from_right/new_ROIs/DTTT_Ipsilat_CS_2.bdo | 9 +++++++ .../from_right/new_ROIs/DTTT_Ipsilat_CS_3.bdo | 9 +++++++ .../new_ROIs/DTTT_Ipsilat_dPSN_1.bdo | 9 +++++++ .../new_ROIs/DTTT_Ipsilat_dPSN_2.bdo | 9 +++++++ .../new_ROIs/DTTT_Ipsilat_dPSN_3.bdo | 9 +++++++ .../new_ROIs/DTTT_Ipsilat_dPSN_4.bdo | 9 +++++++ .../new_ROIs/DTTT_Ipsilat_dPSN_5.bdo | 9 +++++++ .../new_ROIs/DTTT_Ipsilat_dPSN_6.bdo | 9 +++++++ .../new_ROIs/DTTT_Ipsilat_dPSN_7.bdo | 9 +++++++ .../new_ROIs/DTTT_Ipsilat_dPSN_8.bdo | 9 +++++++ .../new_ROIs/VTTT_Controlat_OSandIS_1.bdo | 9 +++++++ .../new_ROIs/VTTT_Controlat_OSandIS_2.bdo | 9 +++++++ trigeminal_second_order.sh | 25 ++++++++++++++++++- 18 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_1.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_2.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_3.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_4.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_1.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_2.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_3.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/VTTT_Controlat_OSandIS_1.bdo create mode 100644 ROIs_clean/MNI/from_right/new_ROIs/VTTT_Controlat_OSandIS_2.bdo diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_1.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_1.bdo new file mode 100644 index 0000000..abeb8bd --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_1.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_2.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_2.bdo new file mode 100644 index 0000000..cdca61c --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_2.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_3.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_3.bdo new file mode 100644 index 0000000..827c260 --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_3.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_4.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_4.bdo new file mode 100644 index 0000000..480308d --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Controlat_4.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_1.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_1.bdo new file mode 100644 index 0000000..54eb273 --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_1.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_2.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_2.bdo new file mode 100644 index 0000000..4d63d3a --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_2.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_3.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_3.bdo new file mode 100644 index 0000000..36fa8a6 --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_CS_3.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo new file mode 100644 index 0000000..4c4b7a4 --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_1.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo new file mode 100644 index 0000000..d4f1c5d --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_2.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo new file mode 100644 index 0000000..c68c84d --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_3.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo new file mode 100644 index 0000000..54dca32 --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_4.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo new file mode 100644 index 0000000..ce041af --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_5.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo new file mode 100644 index 0000000..01fad24 --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_6.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo new file mode 100644 index 0000000..636001a --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_7.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo new file mode 100644 index 0000000..d69d97d --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/DTTT_Ipsilat_dPSN_8.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/VTTT_Controlat_OSandIS_1.bdo b/ROIs_clean/MNI/from_right/new_ROIs/VTTT_Controlat_OSandIS_1.bdo new file mode 100644 index 0000000..bbc7149 --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/VTTT_Controlat_OSandIS_1.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ROIs_clean/MNI/from_right/new_ROIs/VTTT_Controlat_OSandIS_2.bdo b/ROIs_clean/MNI/from_right/new_ROIs/VTTT_Controlat_OSandIS_2.bdo new file mode 100644 index 0000000..6becd1f --- /dev/null +++ b/ROIs_clean/MNI/from_right/new_ROIs/VTTT_Controlat_OSandIS_2.bdo @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/trigeminal_second_order.sh b/trigeminal_second_order.sh index 4558f3e..f71cae1 100755 --- a/trigeminal_second_order.sh +++ b/trigeminal_second_order.sh @@ -213,7 +213,7 @@ for nsub_path in "${subject_list[@]}"; do mkdir -p "${out_dir}/${nsub}/orig_space/rois" mkdir -p "${out_dir}/${nsub}/orig_space/tracking_second_order"/{trials,merged,final} mkdir -p "${out_dir}/${nsub}/mni_space/rois" - mkdir -p "${out_dir}/${nsub}/mni_space/tracking_second_order"/{orig,filtered,segmented,final,cut} + mkdir -p "${out_dir}/${nsub}/mni_space/tracking_second_order"/{orig,filtered,final,cut} orig_rois_dir="${out_dir}/${nsub}/orig_space/rois" mni_rois_dir="${out_dir}/${nsub}/mni_space/rois" @@ -639,4 +639,27 @@ for nsub_path in "${subject_list[@]}"; do echo "|------------- SECOND-ORDER ENSEMBLE FOR ${nsub} IS COMPLETED -------------|" echo "" +done + + +echo "|------------- 9) [BACK-TO-ORIG] Register final MNI bundles to orig space -------------|" + +for nside in left right; do + for nbundle in DTTT_Ipsilat_CS DTTT_Ipsilat_dPSN DTTT_Controlat_CS VTTT_Controlat_OSandIS VTTT_Controlat_vPSN; do + in_trk="${mni_tracking_dir_second_order}/final/${nsub}_from_${nside}_${nbundle}.trk" + out_trk="${orig_tracking_dir}/final/${nsub}_from_${nside}_${nbundle}_orig.trk" + + if [[ -f "${in_trk}" ]]; then + scil_tractogram_apply_transform \ + "${in_trk}" \ + "${nsub_path}/tractoflow/${nsub}__t1_warped.nii.gz" \ + "${out_dir}/${nsub}/orig_space/transfo/2orig_0GenericAffine.mat" \ + "${out_trk}" \ + --inverse \ + --in_deformation "${out_dir}/${nsub}/orig_space/transfo/2orig_1InverseWarp.nii.gz" \ + --remove_invalid -f + else + echo "WARN: Final MNI bundle not found for ${nside} ${nbundle}, skipping back-to-orig." + fi + done done \ No newline at end of file From 6f0bf0436ce8d0a9485013d02adbe5b8644ccd90 Mon Sep 17 00:00:00 2001 From: Nasrin Rafiei Date: Tue, 14 Apr 2026 14:10:56 -0400 Subject: [PATCH 5/6] countinue the code if .trk is empty --- trigeminal_second_order.sh | 141 ++++++++++++++++++++++++++++++++----- 1 file changed, 124 insertions(+), 17 deletions(-) diff --git a/trigeminal_second_order.sh b/trigeminal_second_order.sh index f71cae1..9775ae5 100755 --- a/trigeminal_second_order.sh +++ b/trigeminal_second_order.sh @@ -113,6 +113,29 @@ if [[ -n "${g}" ]]; then gpu="--use_gpu" fi + + +trk_is_empty() { + local f="$1" + + if [[ ! -f "${f}" ]]; then + return 0 + fi + + local n_str + n_str=$(scil_tractogram_count_streamlines "${f}" 2>/dev/null | grep -Eo '[0-9]+' | tail -n 1 || true) + + if [[ -z "${n_str}" || "${n_str}" -eq 0 ]]; then + return 0 + else + return 1 + fi +} + + + + + # ------------------------- # Ensemble grid # ------------------------- @@ -354,7 +377,22 @@ for nsub_path in "${subject_list[@]}"; do "${orig_trials_root}/${combo_tag}/${nsub}_${nside}_from_thalamus_npv500_${combo_tag}.trk" \ --npv "${npv_thalamus_per_combo}" \ --step "${step_size}" \ - --theta "${theta}" \ + --theta "${theta}" \trk_is_empty() { + local f="$1" + + if [[ ! -f "${f}" ]]; then + return 0 + fi + + local n_str + n_str=$(scil_tractogram_count_streamlines "${f}" 2>/dev/null | grep -Eo '[0-9]+' | tail -n 1 || true) + + if [[ -z "${n_str}" || "${n_str}" -eq 0 ]]; then + return 0 + else + return 1 + fi +} ${gpu} -v -f done done @@ -588,36 +626,105 @@ for nsub_path in "${subject_list[@]}"; do -f done - # ------------------------- - # 7) Cut filtered second-order bundles with label masks - # ------------------------- - echo "|------------- 7) Cut filtered second-order bundles with label masks -------------|" - for nside in left right; do + + +# ------------------------- +# 7) Cut filtered second-order bundles with label masks +# ------------------------- +echo "|------------- 7) Cut filtered second-order bundles with label masks -------------|" +for nside in left right; do + + in_trk="${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk" + out_trk="${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk" + if trk_is_empty "${in_trk}"; then + echo "WARN: ${in_trk} is missing or empty, skipping cut." + else scil_tractogram_cut_streamlines \ - "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk" \ + "${in_trk}" \ --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_OSandIS_Cuts_labels_mni.nii.gz" \ - "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_VTTT_Controlat_OSandIS.trk" -f + "${out_trk}" -f + if trk_is_empty "${out_trk}"; then + echo "WARN: ${out_trk} is empty after cut, removing." + rm -f "${out_trk}" + fi + fi + + in_trk="${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk" + out_trk="${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk" + if trk_is_empty "${in_trk}"; then + echo "WARN: ${in_trk} is missing or empty, skipping cut." + else scil_tractogram_cut_streamlines \ - "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk" \ + "${in_trk}" \ --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_VTTT_Controlat_vPSN_Cuts_labels_mni.nii.gz" \ - "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_VTTT_Controlat_vPSN.trk" -f + "${out_trk}" -f + + if trk_is_empty "${out_trk}"; then + echo "WARN: ${out_trk} is empty after cut, removing." + rm -f "${out_trk}" + fi + fi + in_trk="${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Controlat_CS.trk" + out_trk="${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Controlat_CS.trk" + if trk_is_empty "${in_trk}"; then + echo "WARN: ${in_trk} is missing or empty, skipping cut." + else scil_tractogram_cut_streamlines \ - "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Controlat_CS.trk" \ + "${in_trk}" \ --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Controlat_CS_Cuts_labels_mni.nii.gz" \ - "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Controlat_CS.trk" -f + "${out_trk}" -f + if trk_is_empty "${out_trk}"; then + echo "WARN: ${out_trk} is empty after cut, removing." + rm -f "${out_trk}" + fi + fi + + in_trk="${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" + out_trk="${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" + if trk_is_empty "${in_trk}"; then + echo "WARN: ${in_trk} is missing or empty, skipping cut." + else scil_tractogram_cut_streamlines \ - "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" \ + "${in_trk}" \ --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_CS_Cuts_labels_mni.nii.gz" \ - "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_CS.trk" -f + "${out_trk}" -f + if trk_is_empty "${out_trk}"; then + echo "WARN: ${out_trk} is empty after cut, removing." + rm -f "${out_trk}" + fi + fi + + in_trk="${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk" + out_trk="${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk" + if trk_is_empty "${in_trk}"; then + echo "WARN: ${in_trk} is missing or empty, skipping cut." + else scil_tractogram_cut_streamlines \ - "${mni_tracking_dir_second_order}/filtered/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk" \ + "${in_trk}" \ --labels "${mni_rois_dir}/${nsub}_${nside}_second_order_DTTT_Ipsilat_dPSN_Cuts_labels_mni.nii.gz" \ - "${mni_tracking_dir_second_order}/cut/${nsub}_from_${nside}_DTTT_Ipsilat_dPSN.trk" -f - done + "${out_trk}" -f + + if trk_is_empty "${out_trk}"; then + echo "WARN: ${out_trk} is empty after cut, removing." + rm -f "${out_trk}" + fi + fi +done + + + + + + + + + + + # ------------------------- # 8) Reject outliers and save final second-order bundles From 74e02d9c533d57995c7cc109562104860a5299c1 Mon Sep 17 00:00:00 2001 From: Nasrin Rafiei Date: Tue, 14 Apr 2026 14:29:07 -0400 Subject: [PATCH 6/6] countinue the code if .trk is empty --- trigeminal_second_order.sh | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/trigeminal_second_order.sh b/trigeminal_second_order.sh index 9775ae5..a019c58 100755 --- a/trigeminal_second_order.sh +++ b/trigeminal_second_order.sh @@ -377,22 +377,7 @@ for nsub_path in "${subject_list[@]}"; do "${orig_trials_root}/${combo_tag}/${nsub}_${nside}_from_thalamus_npv500_${combo_tag}.trk" \ --npv "${npv_thalamus_per_combo}" \ --step "${step_size}" \ - --theta "${theta}" \trk_is_empty() { - local f="$1" - - if [[ ! -f "${f}" ]]; then - return 0 - fi - - local n_str - n_str=$(scil_tractogram_count_streamlines "${f}" 2>/dev/null | grep -Eo '[0-9]+' | tail -n 1 || true) - - if [[ -z "${n_str}" || "${n_str}" -eq 0 ]]; then - return 0 - else - return 1 - fi -} + --theta "${theta}" \ ${gpu} -v -f done done