Functional network mapping¶
In this tutorial, you will explore the functional network mapping functionalities of Lacuna using the CLI.
What you'll learn:
- Fetch a functional connectome
- Obtain voxel-level lesion network maps
- Compute ROI-wise lesion network scores
Setup¶
Get the tutorial data.
# Get tutorial data
!lacuna tutorial /tmp/tutorial_bids --force
Fetch functional connectome¶
Functional lesion network mapping requires a functional connectome in the form of resting-state functional MR images of a normative cohort.
Lacuna facilitates to download the GSP1000 dataset which is openly available and the current standard. For the download you have to obtain an access token. For this register on Harvard Dataverse, click on your username and then API Token.
Here, we will only fetch a test version of GSP1000 to keep the tutorial lightweight via the --test-mode flag. You should remove the flag for an actual analysis. Please mind that the original dataset comprises ~200gb of data so you need space for that. To maximize processing efficiency, store the connectome on an SSD.
!lacuna fetch gsp1000 \
--output-dir /tmp/gsp1000_data \
--api-key $DATAVERSE_API_KEY \
--test-mode \
--skip-checksum \
--no-keep-original
Analysis¶
Functional lesion network mapping seeks to identify the functional brain circuitry connecting to the lesion. Based on the connectome the average functional connectivity between the lesion and every voxel in the connectome space is quantified.
Lacuna's implementation consists of multiple steps:
- Ensure spatial alignment.
- Compute the lesion timeseries.
- Compute voxel-wise statistics: Pearson correlations between the lesion timeseries and whole-brain timeseries, Fisher z, t-statistics, and optionally p-value maps and FDR-corrected p-values (Benjamini–Hochberg) and thresholded significance maps.
- Export results as NIfTI VoxelMaps (rmap, zmap, tmap, pmap, FDR-corrected pmap, threshold masks).
You can adapt the analysis with different parameters including the choice between the original method implemented by Boes, Fox et al. as well as by Pini et al. By default the analysis uses the former.
Run the analysis.
!lacuna run fnm \
/tmp/tutorial_bids/ \
/tmp/outputs_fnm/ \
--connectome-path /tmp/gsp1000_data/processed/ \
--participant-label 01 \
--mask-space MNI152NLin6Asym
Visualize the output
import nibabel as nib
from nilearn import plotting
tmap_path = '/tmp/outputs_fnm/sub-01/ses-01/anat/sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-tmap.nii.gz'
tmap_img = nib.load(tmap_path)
plotting.plot_stat_map(tmap_img,
radiological=True,
title="T-statistic map from FNM",
draw_cross=False,
colorbar=True,
cmap='seismic',
vmin=-5,
vmax=5
)
<nilearn.plotting.displays._slicers.OrthoSlicer at 0x7f188c46b400>
The map looks a bit speckled but this is expected due to only a small fraction of connectome subjects being considered in this test run. Once the full connectome is used the map will be smoother.
Obtain parcel-level lesion network scores¶
Beyond voxel-level maps, Lacuna can aggregate the signal in atlas parcels. An atlas can be specified via --parcel-atlases. The argument also takes multiple atlases.
!lacuna run fnm \
/tmp/tutorial_bids/ \
/tmp/outputs_fnm/ \
--connectome-path /tmp/gsp1000_data/processed/ \
--participant-label 01 \
--mask-space MNI152NLin6Asym \
--parcel-atlases schaefer2018parcels200networks7 schaefer2018parcels400networks7 \
--verbose
2026-04-01 09:40:14 - lacuna.cli.main - INFO - Lacuna CLI starting 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Input: /tmp/tutorial_bids 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Output directory: /tmp/outputs_fnm 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Analysis: fnm 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Registering functional connectome: processed 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Running analysis: FunctionalNetworkMapping 2026-04-01 09:40:14 - lacuna.cli.main - INFO - 2026-04-01 09:40:14 - lacuna.cli.main - INFO - ============================================================ 2026-04-01 09:40:14 - lacuna.cli.main - INFO - DISCOVERY SUMMARY 2026-04-01 09:40:14 - lacuna.cli.main - INFO - ============================================================ 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Total mask images: 1 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Unique subjects: 1 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Unique sessions: 1 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Labels: acuteinfarct 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Filters: subjects=['01'] 2026-04-01 09:40:14 - lacuna.cli.main - INFO - ============================================================ 2026-04-01 09:40:14 - lacuna.cli.main - INFO - 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Masks to process: 2026-04-01 09:40:14 - lacuna.cli.main - INFO - 1. sub-01/ses-01/acuteinfarct 2026-04-01 09:40:14 - lacuna.cli.main - INFO - Processing subjects: 0%| | 0/1 [00:00<?, ?it/s]2026-04-01 09:40:14 - lacuna.analysis - INFO - 2026-04-01 09:40:14 - lacuna.analysis - INFO - ====================================================================== 2026-04-01 09:40:14 - lacuna.analysis - INFO - Running FunctionalNetworkMapping 2026-04-01 09:40:14 - lacuna.analysis - INFO - ====================================================================== 2026-04-01 09:40:14 - lacuna.spatial.transform - INFO - Resampling image 'mask' from 1.0mm to 2mm in MNI152NLin6Asym 2026-04-01 09:40:14 - lacuna.analysis - INFO - Loading mask information from connectome... 2026-04-01 09:40:14 - lacuna.analysis - INFO - Mask loaded 2026-04-01 09:40:14 - lacuna.analysis - INFO - shape: (91, 109, 91) 2026-04-01 09:40:14 - lacuna.analysis - INFO - n_voxels: 228,483 2026-04-01 09:40:14 - lacuna.analysis - INFO - Computing mask-connectome overlap... 2026-04-01 09:40:14 - lacuna.analysis - INFO - Found 1,791 overlapping mask voxels 2026-04-01 09:40:14 - lacuna.analysis - INFO - Processing connectome... 2026-04-01 09:40:14 - lacuna.analysis - INFO - Loading gsp1000_chunk_000.h5 [1/1] 2026-04-01 09:40:44 - lacuna.analysis - INFO - Aggregating results across 50 subjects... 2026-04-01 09:40:44 - lacuna.analysis - INFO - Computing t-statistics... 2026-04-01 09:40:44 - lacuna.analysis - INFO - Computing p-values... 2026-04-01 09:40:44 - lacuna.analysis - INFO - Computing FDR-corrected p-values (alpha=0.05)... 2026-04-01 09:40:44 - lacuna.analysis - INFO - Found 73,021 voxels (31.96%) significant at FDR q < 0.05 2026-04-01 09:40:44 - lacuna.analysis - INFO - Creating 3D output volumes... 2026-04-01 09:40:44 - lacuna.analysis - INFO - Analysis complete 2026-04-01 09:40:44 - lacuna.analysis - INFO - mean_correlation: 0.03 2026-04-01 09:40:44 - lacuna.analysis - INFO - std_correlation: 0.14 2026-04-01 09:40:44 - lacuna.analysis - INFO - correlation_range: [-0.2094, 0.8471] 2026-04-01 09:40:44 - lacuna.analysis - INFO - n_subjects: 50 2026-04-01 09:40:44 - lacuna.analysis - INFO - t_range: [-7.83, 31.77] 2026-04-01 09:40:44 - lacuna.analysis - INFO - Transforming VoxelMap outputs from MNI152NLin6Asym@2mm to MNI152NLin6Asym@1.0mm 2026-04-01 09:40:44 - lacuna.spatial.transform - INFO - Resampling image from 2mm to 1.0mm in MNI152NLin6Asym 2026-04-01 09:40:46 - lacuna.spatial.transform - INFO - Resampling image from 2mm to 1.0mm in MNI152NLin6Asym 2026-04-01 09:40:48 - lacuna.spatial.transform - INFO - Resampling image from 2mm to 1.0mm in MNI152NLin6Asym 2026-04-01 09:40:50 - lacuna.spatial.transform - INFO - Resampling image from 2mm to 1.0mm in MNI152NLin6Asym 2026-04-01 09:40:51 - lacuna.spatial.transform - INFO - Resampling image from 2mm to 1.0mm in MNI152NLin6Asym 2026-04-01 09:40:53 - lacuna.spatial.transform - INFO - Resampling image from 2mm to 1.0mm in MNI152NLin6Asym 2026-04-01 09:40:53 - lacuna.analysis - INFO - Analysis complete (7 results) 2026-04-01 09:40:53 - lacuna.analysis - INFO - 2026-04-01 09:40:53 - lacuna.analysis - INFO - ====================================================================== 2026-04-01 09:40:53 - lacuna.analysis - INFO - Running ParcelAggregation 2026-04-01 09:40:53 - lacuna.analysis - INFO - ====================================================================== 2026-04-01 09:40:54 - lacuna.analysis - INFO - Aggregating 3 source(s) across 2 atlas(es): schaefer2018parcels200networks7, schaefer2018parcels400networks7 2026-04-01 09:41:05 - lacuna.analysis - INFO - Aggregation complete (6 results) Processing subjects: 100%|████████████████████████| 1/1 [00:54<00:00, 54.20s/it] 2026-04-01 09:41:08 - lacuna.cli.main - INFO - Successfully processed 1 subject(s) 2026-04-01 09:41:08 - lacuna.cli.main - INFO - Results saved to: /tmp/outputs_fnm 2026-04-01 09:41:08 - lacuna.cli.main - INFO - Lacuna CLI completed successfully
!ls /tmp/outputs_fnm/sub-01/ses-01/anat/
sub-01_ses-01_desc-provenance.json sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels200networks7_desc-rmap_parcelstats.json sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels200networks7_desc-rmap_parcelstats.tsv sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels200networks7_desc-tmap_parcelstats.json sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels200networks7_desc-tmap_parcelstats.tsv sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels200networks7_desc-zmap_parcelstats.json sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels200networks7_desc-zmap_parcelstats.tsv sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels400networks7_desc-rmap_parcelstats.json sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels400networks7_desc-rmap_parcelstats.tsv sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels400networks7_desc-tmap_parcelstats.json sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels400networks7_desc-tmap_parcelstats.tsv sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels400networks7_desc-zmap_parcelstats.json sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels400networks7_desc-zmap_parcelstats.tsv sub-01_ses-01_label-acuteinfarct_method-fnm_desc-summarystatistics_stats.json sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-pfdrmap.json sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-pfdrmap.nii.gz sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-pfdrthresholdmap.json sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-pfdrthresholdmap.nii.gz sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-pmap.json sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-pmap.nii.gz sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-rmap.json sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-rmap.nii.gz sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-tmap.json sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-tmap.nii.gz sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-zmap.json sub-01_ses-01_label-acuteinfarct_method-fnm_space-MNI152NLin6Asym_desc-zmap.nii.gz sub-01_ses-01_label-acuteinfarct_space-MNI152NLin6Asym_mask.nii.gz
Visualize the parcel-level lesion network scores on the cortical surface with yabplot
import warnings
import pandas as pd
import pyvista as pv
import yabplot as yab
warnings.simplefilter("ignore", pv.PyVistaDeprecationWarning)
pv.set_jupyter_backend('static')
pv.global_theme.notebook = True
pv.start_xvfb()
file_path = "/tmp/outputs_fnm/sub-01/ses-01/anat/sub-01_ses-01_label-acuteinfarct_method-fnm_atlas-schaefer2018parcels400networks7_desc-rmap_parcelstats.tsv"
df = pd.read_csv(file_path, sep="\t", index_col=0)
values = df.values.flatten()
yab.plot_cortical(
data=values,
atlas='schaefer_400',
views=['left_lateral', 'left_medial', 'right_lateral', 'right_medial'],
figsize=(800, 300),
vminmax=(-0.2,0.2),
cmap="RdBu_r",
display_type="static",
)
Run functional network mapping on multiple subjects¶
Lacuna supports processing multiple subjects within a single run. If the --participant-label flag is omitted, the pipeline automatically executes for all subjects detected in the BIDS dataset. Using --verbose enables inspection of the detected lesion masks.
Execution strategies are internally optimized per analysis type. For functional network mapping, subjects are processed in parallel, and multi-subject computation is implemented via vectorization. This improves throughput but has implications for memory usage.
These optimizations allow large cohorts to be processed efficiently with relatively modest computational overhead. However, RAM consumption scales with the number of subjects and should be monitored accordingly.
Internally, Lacuna loads batches of lesion masks alongside batches of resting-state fMRI data from the connectome, which together determine memory usage. Resource demands can be controlled in two ways: (1) limiting the number of lesion masks processed simultaneously via lacuna run fnm (...) --batch-size <N>, and (2) changing the connectome batch number during retrieval using lacuna fetch GSP1000 (...) --batches <N> (more batches ⟶ less size per batch ⟶ less memory demands).
For demonstration purposes, replicate the first tutorial subject to create a dataset of 40 subjects instead of 3.
import shutil
from pathlib import Path
tutorial_data = Path("/tmp/tutorial_bids")
tutorial_data_multiple = Path("/tmp/tutorial_bids_multiple")
src_id = "01"
src_file = tutorial_data / f"sub-{src_id}" / "ses-01" / "anat" / f"sub-{src_id}_ses-01_space-MNI152NLin6Asym_label-acuteinfarct_mask.nii.gz"
for i in range(0, 40):
sub_id = f"{i+1:02d}"
target_dir = tutorial_data_multiple / f"sub-{sub_id}" / "ses-01" / "anat"
target_file = target_dir / f"sub-{sub_id}_ses-01_space-MNI152NLin6Asym_label-acuteinfarct_mask.nii.gz"
target_dir.mkdir(parents=True, exist_ok=True)
shutil.copy2(src_file, target_file)
!ls /tmp/tutorial_bids_multiple/
sub-01 sub-05 sub-09 sub-13 sub-17 sub-21 sub-25 sub-29 sub-33 sub-37 sub-02 sub-06 sub-10 sub-14 sub-18 sub-22 sub-26 sub-30 sub-34 sub-38 sub-03 sub-07 sub-11 sub-15 sub-19 sub-23 sub-27 sub-31 sub-35 sub-39 sub-04 sub-08 sub-12 sub-16 sub-20 sub-24 sub-28 sub-32 sub-36 sub-40
Run the analysis on the whole dataset in participant batches of n = 10.
!lacuna run fnm \
/tmp/tutorial_bids_multiple/ \
/tmp/outputs_fnm_multiple/ \
--connectome-path /tmp/gsp1000_data/processed/ \
--mask-space MNI152NLin6Asym \
--batch-size 10 \
--nprocs -1 \
--verbose
2026-04-01 09:41:49 - lacuna.cli.main - INFO - Lacuna CLI starting 2026-04-01 09:41:49 - lacuna.cli.main - INFO - Input: /tmp/tutorial_bids_multiple 2026-04-01 09:41:49 - lacuna.cli.main - INFO - Output directory: /tmp/outputs_fnm_multiple 2026-04-01 09:41:49 - lacuna.cli.main - INFO - Analysis: fnm 2026-04-01 09:41:49 - lacuna.cli.main - INFO - Registering functional connectome: processed 2026-04-01 09:41:49 - lacuna.cli.main - INFO - Running analysis: FunctionalNetworkMapping 2026-04-01 09:41:53 - lacuna.cli.main - INFO - 2026-04-01 09:41:53 - lacuna.cli.main - INFO - ============================================================ 2026-04-01 09:41:53 - lacuna.cli.main - INFO - DISCOVERY SUMMARY 2026-04-01 09:41:53 - lacuna.cli.main - INFO - ============================================================ 2026-04-01 09:41:53 - lacuna.cli.main - INFO - Total mask images: 40 2026-04-01 09:41:53 - lacuna.cli.main - INFO - Unique subjects: 40 2026-04-01 09:41:53 - lacuna.cli.main - INFO - Unique sessions: 1 2026-04-01 09:41:53 - lacuna.cli.main - INFO - Labels: acuteinfarct 2026-04-01 09:41:53 - lacuna.cli.main - INFO - ============================================================ 2026-04-01 09:41:53 - lacuna.cli.main - INFO - 2026-04-01 09:41:53 - lacuna.cli.main - INFO - Batch processing: 40 masks in batches of 10 2026-04-01 09:41:53 - lacuna.cli.main - INFO - --- Batch 1/4 (10 masks) --- 2026-04-01 09:41:53 - lacuna.cli.main - INFO - ─── FunctionalNetworkMapping ─── FunctionalNetworkMapping: 0%| | 0/10 [00:00<?, ?mask/s]2026-04-01 09:41:53 - lacuna.analysis - INFO - Vectorized batch processing: 10 masks 2026-04-01 09:41:53 - lacuna.analysis - INFO - Loaded connectome metadata 2026-04-01 09:41:53 - lacuna.analysis - INFO - connectome_batches: 1 2026-04-01 09:41:53 - lacuna.analysis - INFO - mask_shape: (91, 109, 91) 2026-04-01 09:41:53 - lacuna.analysis - INFO - n_masks: 10 2026-04-01 09:41:54 - lacuna.analysis - INFO - Processing connectome batches... 2026-04-01 09:42:33 - lacuna.analysis - INFO - Batch completed in 39.27s [1/1] 2026-04-01 09:42:33 - lacuna.analysis - INFO - Batch processing complete 2026-04-01 09:42:33 - lacuna.analysis - INFO - n_batches: 1 2026-04-01 09:42:33 - lacuna.analysis - INFO - total_time: 39.27s 2026-04-01 09:42:33 - lacuna.analysis - INFO - avg_time_per_batch: 39.27s 2026-04-01 09:42:33 - lacuna.analysis - INFO - Aggregating results... 2026-04-01 09:42:33 - lacuna.analysis - INFO - Aggregating 10 subjects in parallel (n_jobs=-1) 2026-04-01 09:42:52 - lacuna.analysis - INFO - Batch processing complete 2026-04-01 09:42:52 - lacuna.analysis - INFO - n_masks_processed: 10 FunctionalNetworkMapping: 100%|███████████████| 10/10 [00:58<00:00, 5.81s/mask] 2026-04-01 09:43:23 - lacuna.cli.main - INFO - --- Batch 2/4 (10 masks) --- 2026-04-01 09:43:23 - lacuna.cli.main - INFO - ─── FunctionalNetworkMapping ─── FunctionalNetworkMapping: 0%| | 0/10 [00:00<?, ?mask/s]2026-04-01 09:43:23 - lacuna.analysis - INFO - Vectorized batch processing: 10 masks 2026-04-01 09:43:23 - lacuna.analysis - INFO - Loaded connectome metadata 2026-04-01 09:43:23 - lacuna.analysis - INFO - connectome_batches: 1 2026-04-01 09:43:23 - lacuna.analysis - INFO - mask_shape: (91, 109, 91) 2026-04-01 09:43:23 - lacuna.analysis - INFO - n_masks: 10 2026-04-01 09:43:23 - lacuna.analysis - INFO - Processing connectome batches... 2026-04-01 09:44:01 - lacuna.analysis - INFO - Batch completed in 37.35s [1/1] 2026-04-01 09:44:01 - lacuna.analysis - INFO - Batch processing complete 2026-04-01 09:44:01 - lacuna.analysis - INFO - n_batches: 1 2026-04-01 09:44:01 - lacuna.analysis - INFO - total_time: 37.35s 2026-04-01 09:44:01 - lacuna.analysis - INFO - avg_time_per_batch: 37.35s 2026-04-01 09:44:01 - lacuna.analysis - INFO - Aggregating results... 2026-04-01 09:44:01 - lacuna.analysis - INFO - Aggregating 10 subjects in parallel (n_jobs=-1) 2026-04-01 09:44:20 - lacuna.analysis - INFO - Batch processing complete 2026-04-01 09:44:20 - lacuna.analysis - INFO - n_masks_processed: 10 FunctionalNetworkMapping: 100%|███████████████| 10/10 [00:56<00:00, 5.65s/mask] 2026-04-01 09:44:51 - lacuna.cli.main - INFO - --- Batch 3/4 (10 masks) --- 2026-04-01 09:44:51 - lacuna.cli.main - INFO - ─── FunctionalNetworkMapping ─── FunctionalNetworkMapping: 0%| | 0/10 [00:00<?, ?mask/s]2026-04-01 09:44:51 - lacuna.analysis - INFO - Vectorized batch processing: 10 masks 2026-04-01 09:44:51 - lacuna.analysis - INFO - Loaded connectome metadata 2026-04-01 09:44:51 - lacuna.analysis - INFO - connectome_batches: 1 2026-04-01 09:44:51 - lacuna.analysis - INFO - mask_shape: (91, 109, 91) 2026-04-01 09:44:51 - lacuna.analysis - INFO - n_masks: 10 2026-04-01 09:44:52 - lacuna.analysis - INFO - Processing connectome batches... 2026-04-01 09:45:28 - lacuna.analysis - INFO - Batch completed in 36.41s [1/1] 2026-04-01 09:45:28 - lacuna.analysis - INFO - Batch processing complete 2026-04-01 09:45:28 - lacuna.analysis - INFO - n_batches: 1 2026-04-01 09:45:28 - lacuna.analysis - INFO - total_time: 36.41s 2026-04-01 09:45:28 - lacuna.analysis - INFO - avg_time_per_batch: 36.41s 2026-04-01 09:45:28 - lacuna.analysis - INFO - Aggregating results... 2026-04-01 09:45:28 - lacuna.analysis - INFO - Aggregating 10 subjects in parallel (n_jobs=-1) 2026-04-01 09:45:44 - lacuna.analysis - INFO - Batch processing complete 2026-04-01 09:45:44 - lacuna.analysis - INFO - n_masks_processed: 10 FunctionalNetworkMapping: 100%|███████████████| 10/10 [00:52<00:00, 5.30s/mask] 2026-04-01 09:46:16 - lacuna.cli.main - INFO - --- Batch 4/4 (10 masks) --- 2026-04-01 09:46:16 - lacuna.cli.main - INFO - ─── FunctionalNetworkMapping ─── FunctionalNetworkMapping: 0%| | 0/10 [00:00<?, ?mask/s]2026-04-01 09:46:16 - lacuna.analysis - INFO - Vectorized batch processing: 10 masks 2026-04-01 09:46:16 - lacuna.analysis - INFO - Loaded connectome metadata 2026-04-01 09:46:16 - lacuna.analysis - INFO - connectome_batches: 1 2026-04-01 09:46:16 - lacuna.analysis - INFO - mask_shape: (91, 109, 91) 2026-04-01 09:46:16 - lacuna.analysis - INFO - n_masks: 10 2026-04-01 09:46:16 - lacuna.analysis - INFO - Processing connectome batches... 2026-04-01 09:46:52 - lacuna.analysis - INFO - Batch completed in 35.95s [1/1] 2026-04-01 09:46:52 - lacuna.analysis - INFO - Batch processing complete 2026-04-01 09:46:52 - lacuna.analysis - INFO - n_batches: 1 2026-04-01 09:46:52 - lacuna.analysis - INFO - total_time: 35.95s 2026-04-01 09:46:52 - lacuna.analysis - INFO - avg_time_per_batch: 35.95s 2026-04-01 09:46:52 - lacuna.analysis - INFO - Aggregating results... 2026-04-01 09:46:52 - lacuna.analysis - INFO - Aggregating 10 subjects in parallel (n_jobs=-1) 2026-04-01 09:47:08 - lacuna.analysis - INFO - Batch processing complete 2026-04-01 09:47:08 - lacuna.analysis - INFO - n_masks_processed: 10 FunctionalNetworkMapping: 100%|███████████████| 10/10 [00:52<00:00, 5.27s/mask] 2026-04-01 09:47:40 - lacuna.cli.main - INFO - Successfully processed 40 subject(s) 2026-04-01 09:47:40 - lacuna.cli.main - INFO - Results saved to: /tmp/outputs_fnm_multiple 2026-04-01 09:47:40 - lacuna.cli.main - INFO - Lacuna CLI completed successfully
!ls /tmp/outputs_fnm_multiple
dataset_description.json sub-06 sub-12 sub-18 sub-24 sub-30 sub-36 sub-01 sub-07 sub-13 sub-19 sub-25 sub-31 sub-37 sub-02 sub-08 sub-14 sub-20 sub-26 sub-32 sub-38 sub-03 sub-09 sub-15 sub-21 sub-27 sub-33 sub-39 sub-04 sub-10 sub-16 sub-22 sub-28 sub-34 sub-40 sub-05 sub-11 sub-17 sub-23 sub-29 sub-35