Larg-scale multimodal fMRI dataset of visual and haptic 3D object category learning.
The 9 matches · 4 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
- [1] § Experimental Design › fMRI data preprocessing pipeline › Task-based fMRI ↔ task-based-fMRI-preprocesing/08-Registration.ipynb, lines 1–140 · score 0.86 · MNI152_T1_2mm, high resolution, anatomical images, nonlinear, rigid, intensity
- [2] § Experimental Design › fMRI data preprocessing pipeline › rs-fMRI ↔ resting-state-fMRI-preprocessing/10-Denoising.ipynb, the whole file · a weak match · score 0.79 · ICA AROMA, cerebrospinal fluid, global signals, WM, CSF, filtering
- [3] § Experimental Design › fMRI data preprocessing pipeline › rs-fMRI ↔ resting-state-fMRI-preprocessing/11-TemporalFilterring.ipynb, the whole file · a weak match · score 0.75 · bandpass filtering, global signals, 0.01–0.1 Hz, CSF, regressed, temporal
- [4] § Experimental Design › fMRI data preprocessing pipeline › Task-based fMRI ↔ resting-state-fMRI-preprocessing/10-Denoising.ipynb, the whole file · a weak match · score 0.71 · ICA AROMA, motion artifacts, motion related, tissue, filter, regressors
- [5] § Experimental Design › Data acquisition ↔ task-based-fMRI-preprocesing/04-SliceTimeCorrection.ipynb, the whole file · a weak match · score 0.58 · multiband acceleration factor, single shot, slices, repetition, fMRI
- [6] § Technical Validation › Motion parameters ↔ resting-state-fMRI-preprocessing/01- Framewise_displacment_FD.ipynb, lines 1–98 · score 0.58 · fsl_motion_outliers, framewise displacement, confound, FD, threshold, head
- [7] § Technical Validation › Motion parameters ↔ task-based-fMRI-preprocesing/01- Framewise_displacment_FD.ipynb, lines 1–98 · score 0.58 · fsl_motion_outliers, framewise displacement, confound, FD, threshold, head
- [8] § Technical Validation › Stimuli ↔ PlotSimilarity_Correlation_Stress_MDS.m, lines 87–125 · score 0.58 · dissimilarity matrices, MDS, correlation, stress, dimensions, modalities
- [9] § Experimental Design › Data acquisition ↔ task-based-fMRI-preprocesing/08-Registration.ipynb, lines 1–140 · score 0.55 · High resolution anatomical, slices, EPI
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Jupyter notebook · 494 lines · 19 KB · no license · 2 matches
- # %% [markdown]
- # # Registration
- # This script will creat "reg" directory in ses-01 directory and get registration infromation from functional space to anatomical space and from anatomical space to standard space. At the end, it will concatinate the results to have transformation from funrtional space to standard space.
- #
- # Linear registration: functional space >>> anatomical space (epi_reg from FSL)
- #
- # Non-Lineare registration: anatomical space >>> standard space (antsRegistration from ANT's)
- #
- # Converting ANTs output into the FSL format:
- #
- # c3d_affine_too: https://gist.github.com/MSchnei/240bc49f504ef93540d33b02f12bbe8d
- #
- # Workbench Command: https://www.humanconnectome.org/software/workbench-command
- #
- #
- #
- # -----------------------------------------------------------
- # Script written by Sepideh Tabrik& Mehdi Behroozi
- # <br>
- # Biopsychology,
- # <br>
- # Ruhr-University Bochum, Bochum, Germany
- # <br>
- # (2024.11)
- #
- # -----------------------------------------------------------
- # %% [markdown]
- # ## Anatomical >> Standard space registration
- # %%
- import glob
- import os
- from pathlib import Path
- # Define data paths
- data_path = Path("/mnt/d/Data/Human/ObjectCategorization/analysis2")
- reference_path = Path("/home/mehdi/fsl/data/standard")
- # Find subject directories
- sub_dirs = list(data_path.glob("sub*/ses-02"))
- # Process each subject directory
- for curr_sub in sub_dirs:
- subject_id = curr_sub.parts[-2]
- session_id = curr_sub.parts[-1]
- print("1) Creating 'reg' directory.")
- print(f"\t - Current subject is >> {subject_id}/{session_id}")
- reg_directory = curr_sub / "reg"
- # Check if the directory exists and remove if necessary
- if reg_directory.exists():
- print(f"\t {reg_directory} already exists! Removing...")
- os.system(f"rm -r {reg_directory}")
- # Create new reg directory
- print(f"\t Creating directory {reg_directory}...")
- reg_directory.mkdir(parents=True, exist_ok=True)
- # Copy atlas images to reg directory
- print("2) Copying standard images to the reg directory.")
- os.system(f"fslmaths {reference_path}/MNI152_T1_2mm_brain {reg_directory}/standard")
- os.system(f"fslmaths {reference_path}/MNI152_T1_2mm {reg_directory}/standard_head")
- os.system(f"fslmaths {reference_path}/MNI152_T1_2mm_brain_mask_dil {reg_directory}/standard_mask")
- # Copy anatomical images to reg directory
- print("3) Copying anatomical images to reg directory.")
- anat_dir = curr_sub / "anat"
- # Find T1w image
- t1w_files = list(anat_dir.glob("*T1w.nii.gz"))
- if not t1w_files:
- print("Warning: No T1w file found, skipping brain masking step.")
- else:
- t1w_image = t1w_files[0] # Get first matching file
- print(f"Processing T1w image: {t1w_image}")
- # Copy high-resolution anatomical head
- os.system(f"fslmaths {t1w_image} {reg_directory}/highres_head")
- # Copy mask and brain images
- mask_file = anat_dir / "mask.nii.gz"
- brain_file = anat_dir / "brain.nii.gz"
- if mask_file.exists():
- print(f"Copying anatomical mask: {mask_file} to reg directory...")
- os.system(f"fslmaths {mask_file} {reg_directory}/highres_mask")
- # Apply mask only if T1w exists
- if t1w_files:
- print(f"Applying mask: Multiplying {t1w_image} with {mask_file} to generate highres...")
- os.system(f"fslmaths {t1w_image} -mul {mask_file} {reg_directory}/highres")
- # Change directory to reg
- print("\t Changing the working directory to reg directory.")
- os.chdir(reg_directory)
- # Nonlinear registration using ANTs
- print("4) Running nonlinear registration using ANTs.")
- os.system("antsRegistration --dimensionality 3 --float 0 "
- "--output [highres2standard_,highres2standard.nii.gz] "
- "--interpolation Linear "
- "--winsorize-image-intensities [0.005,0.995] "
- "--use-histogram-matching 0 "
- "--initial-moving-transform [standard.nii.gz,highres.nii.gz,1] "
- "--transform Rigid[0.1] "
- "--metric MI[standard.nii.gz,highres.nii.gz,1,32,Regular,0.25] "
- "--convergence [1000x500x250x100,1e-6,10] "
- "--shrink-factors 8x4x2x1 "
- "--smoothing-sigmas 3x2x1x0vox "
- "--transform Affine[0.1] "
- "--metric MI[standard.nii.gz,highres.nii.gz,1,32,Regular,0.25] "
- "--convergence [1000x500x250x100,1e-6,10] "
- "--shrink-factors 8x4x2x1 "
- "--smoothing-sigmas 3x2x1x0vox "
- "--transform SyN[0.1,3,0] "
- "--metric CC[standard.nii.gz,highres.nii.gz,1,4] "
- "--convergence [100x70x50x20,1e-6,10] "
- "--shrink-factors 8x4x2x1 "
- "--smoothing-sigmas 3x2x1x0vox ")
- # Generate slices and visualization
- os.system("slicer highres2standard standard -s 2 -x 0.35 sla.png -x 0.45 slb.png -x 0.55 slc.png -x 0.65 sld.png "
- "-y 0.35 sle.png -y 0.45 slf.png -y 0.55 slg.png -y 0.65 slh.png "
- "-z 0.35 sli.png -z 0.45 slj.png -z 0.55 slk.png -z 0.65 sll.png ; "
- "pngappend sla.png + slb.png + slc.png + sld.png + sle.png + slf.png + slg.png + slh.png "
- "+ sli.png + slj.png + slk.png + sll.png highres2standard1.png ; "
- "slicer standard highres2standard -s 2 -x 0.35 sla.png -x 0.45 slb.png -x 0.55 slc.png -x 0.65 sld.png "
- "-y 0.35 sle.png -y 0.45 slf.png -y 0.55 slg.png -y 0.65 slh.png "
- "-z 0.35 sli.png -z 0.45 slj.png -z 0.55 slk.png -z 0.65 sll.png ; "
- "pngappend sla.png + slb.png + slc.png + sld.png + sle.png + slf.png + slg.png + slh.png "
- "+ sli.png + slj.png + slk.png + sll.png highres2standard2.png ; "
- "pngappend highres2standard1.png - highres2standard2.png highres2standard.png; "
- "rm -f sl?.png highres2standard2.png")
- os.system("rm highres2standard1.png")
- print("\n")
- # %% [markdown]
- # ### Plot Anatomical >> Atlas registration results
- # %%
- %matplotlib inline
- from IPython.display import display, Image
- import matplotlib.pyplot as plt
- from pathlib import Path
- import glob
- # Define data path
- data_path = Path("/mnt/d/Data/Human/ObjectCategorization/analysis2")
- # Find registration directories
- reg_dirs = list(data_path.glob("sub*/ses-02/reg"))
- # Process each registration directory
- for curr_reg in reg_dirs:
- subject_id = curr_reg.parts[-3] # Extract subject ID dynamically
- print(f"Processing subject: {subject_id}")
- # Ensure the image file exists before displaying
- image_path = curr_reg / "highres2standard.png"
- if image_path.exists():
- display(Image(filename=str(image_path)))
- else:
- print(f"Warning: {image_path} not found, skipping.")
- # %% [markdown]
- # # copy reg directory for each resting-state sessions
- # %%
- import glob
- import os
- from pathlib import Path
- # Define data path
- data_path = Path("/mnt/d/Data/Human/ObjectCategorization/analysis2")
- # Find subject directories
- sub_dirs = list(data_path.glob("sub*/ses-02"))
- # Process each subject directory
- for curr_sub in sub_dirs:
- subject_id = curr_sub.parts[-2] # Extract subject ID dynamically
- print(f"Processing subject: {subject_id}")
- # Copy reg directory to different sessions
- reg_src = curr_sub / "reg"
- sessions = curr_sub.glob("func/run*")
- for curr_sess in sessions:
- exp_name = curr_sess.parts[-1]
- print(f"\t Creating reg directory at {exp_name}.")
- reg_dst = curr_sess / "reg" # Fixed indentation issue
- reg_dst.mkdir(parents=True, exist_ok=True) # Ensures the directory is created safely
- print(f"\t Copying the reg folder to {exp_name}.")
- if reg_src.exists():
- os.system(f"cp -R {reg_src}/* {reg_dst}")
- else:
- print(f"\t Warning: Source directory {reg_src} does not exist, skipping copy.")
- # Create example_func file using mean function images
- print(f"\t Copying the mean_function as example_func file for {exp_name}.")
- mean_Img = curr_sess / "mean_func.nii.gz"
- mean_Img_Brain = curr_sess / "mean_func_brain.nii.gz"
- mean_Img_Brain_mask = curr_sess / "mean_func_brain_mask.nii.gz"
- for img_file, output_file in [(mean_Img, "example_func.nii.gz"),
- (mean_Img_Brain, "example_func_brain.nii.gz"),
- (mean_Img_Brain_mask, "example_func_brain_mask.nii.gz")]:
- if img_file.exists():
- os.system(f"cp -R {img_file} {reg_dst}/{output_file}")
- else:
- print(f"\t Warning: {img_file} not found, skipping copy.")
- print()
- # %% [markdown]
- # ## Linear registration of Functional data into the Anatomical space
- #
- # You must check the results to make sure the registration is done in correct way.
- # %%
- import glob
- import os
- from pathlib import Path
- # Define data path
- data_path = Path("/mnt/d/Data/Human/ObjectCategorization/analysis2")
- # Find registration directories
- reg_dirs = list(data_path.glob("sub*/ses-02/func/run*/reg"))
- # Process each registration directory
- for curr_reg in reg_dirs:
- subject_id = curr_reg.parts[-5]
- session_id = curr_reg.parts[-4]
- task_id = curr_reg.parts[-2]
- print(f"Current subject: {subject_id}")
- print(f"\tCurrent session: {session_id}")
- print(f"\tCurrent task: {task_id}")
- # Change path only if it exists
- if curr_reg.exists():
- os.chdir(curr_reg)
- else:
- print(f"\tWarning: {curr_reg} does not exist, skipping.")
- continue
- # FSL Registration: func2highres
- print("\tRunning FSL registration...")
- # Check if epi_reg is applicable
- epi_reg_command = "epi_reg --epi=example_func --t1=highres_head --t1brain=highres --out=example_func2highres"
- flirt_command = "flirt -in example_func_brain -ref highres -out example_func2highres -omat example_func2highres.mat -bins 256 -cost corratio -searchrx 0 0 -searchry 0 0 -searchrz 0 0 -dof 7 -interp trilinear"
- if os.system(epi_reg_command) != 0:
- print("\tWarning: epi_reg failed, falling back to flirt.")
- os.system(flirt_command)
- # Generate transformation matrix
- os.system("convert_xfm -inverse -omat highres2example_func.mat example_func2highres.mat")
- # Generate visualization
- print("\tGenerating visualization...")
- os.system("slicer example_func2highres highres -s 2 "
- "-x 0.35 sla.png -x 0.45 slb.png -x 0.55 slc.png -x 0.65 sld.png "
- "-y 0.35 sle.png -y 0.45 slf.png -y 0.55 slg.png -y 0.65 slh.png "
- "-z 0.35 sli.png -z 0.45 slj.png -z 0.55 slk.png -z 0.65 sll.png ; "
- "pngappend sla.png + slb.png + slc.png + sld.png + sle.png + slf.png + slg.png + slh.png "
- "+ sli.png + slj.png + slk.png + sll.png example_func2highres1.png ; "
- "slicer highres example_func2highres -s 2 "
- "-x 0.35 sla.png -x 0.45 slb.png -x 0.55 slc.png -x 0.65 sld.png "
- "-y 0.35 sle.png -y 0.45 slf.png -y 0.55 slg.png -y 0.65 slh.png "
- "-z 0.35 sli.png -z 0.45 slj.png -z 0.55 slk.png -z 0.65 sll.png ; "
- "pngappend sla.png + slb.png + slc.png + sld.png + sle.png + slf.png + slg.png + slh.png "
- "+ sli.png + slj.png + slk.png + sll.png example_func2highres2.png ; "
- "pngappend example_func2highres1.png - example_func2highres2.png example_func2highres.png; "
- "rm -f sl?.png example_func2highres2.png")
- os.system("rm example_func2highres1.png")
- print()
- # %% [markdown]
- # ### Plot example_func >> anatomical space registeration results
- # %%
- %matplotlib inline
- from IPython.display import display, Image
- import matplotlib.pyplot as plt
- from pathlib import Path
- # Define data path
- data_path = Path("/mnt/d/Data/Human/ObjectCategorization/analysis2")
- # Find registration directories
- reg_dirs = list(data_path.glob("sub*/ses-02/func/run*/reg"))
- # Process first 10 registration directories
- for curr_reg in reg_dirs:
- subject_id = curr_reg.parts[-5]
- session_id = curr_reg.parts[-4]
- task_id = curr_reg.parts[-2]
- print(f"Current subject: {subject_id}, Session: {session_id}, Task: {task_id}")
- # Ensure the image file exists before displaying
- image_path = curr_reg / "example_func2highres.png"
- if image_path.exists():
- display(Image(filename=str(image_path)))
- else:
- print(f"Warning: {image_path} not found, skipping.")
- # %% [markdown]
- # # Conver Ants file to FSL formt
- # %%
- import glob
- import os
- from pathlib import Path
- # Define data path
- data_path = Path("/mnt/d/Data/Human/ObjectCategorization/analysis2")
- # Find registration directories
- reg_dirs = list(data_path.glob("sub*/ses-02/func/run*/reg"))
- # Process each registration directory
- for curr_reg in reg_dirs:
- subject_id = curr_reg.parts[-5]
- session_id = curr_reg.parts[-4]
- task_id = curr_reg.parts[-2]
- print(f"Current subject: {subject_id}, Session: {session_id}, Task: {task_id}")
- # Change path only if it exists
- if curr_reg.exists():
- os.chdir(curr_reg)
- else:
- print(f"\tWarning: {curr_reg} does not exist, skipping.")
- continue
- # Convert Transform Files
- print("\tConverting transformation files...")
- os.system("c3d_affine_tool -itk highres2standard_0GenericAffine.mat -o ants_affine_world.txt")
- os.system("wb_command -convert-affine -from-world ants_affine_world.txt -to-flirt ants_affine_flirt.txt standard.nii.gz highres.nii.gz")
- os.system("convert_xfm -inverse ants_affine_flirt.txt -omat ants_affine_inv_flirt.txt")
- # Apply X and Y flips to warp fields
- print("\tApplying flips to warp fields...")
- os.system("wb_command -volume-math '-x' ants_warponly_negative.nii.gz -var x highres2standard_1Warp.nii.gz")
- os.system("wb_command -volume-merge ants_warponly_world.nii.gz -volume ants_warponly_negative.nii.gz -subvolume 1 -up-to 2 -volume highres2standard_1Warp.nii.gz -subvolume 3")
- os.system("wb_command -convert-warpfield -from-world ants_warponly_world.nii.gz -to-fnirt ants_warponly_fnirt.nii.gz standard.nii.gz")
- # Compose transformation
- print("\tComposing transformation...")
- os.system("convertwarp --ref=standard.nii.gz --premat=ants_affine_inv_flirt.txt --warp1=ants_warponly_fnirt.nii.gz --out=highres2standard_warp.nii.gz")
- # Resample for sanity check
- print("\tResampling for sanity check...")
- os.system("applywarp --ref=standard.nii.gz --in=highres.nii.gz --warp=highres2standard_warp.nii.gz --out=highres2standard.nii.gz")
- # Generate visualization
- print("\tGenerating visualization...")
- os.system("slicer highres2standard standard -s 2 "
- "-x 0.35 sla.png -x 0.45 slb.png -x 0.55 slc.png -x 0.65 sld.png "
- "-y 0.35 sle.png -y 0.45 slf.png -y 0.55 slg.png -y 0.65 slh.png "
- "-z 0.35 sli.png -z 0.45 slj.png -z 0.55 slk.png -z 0.65 sll.png ; "
- "pngappend sla.png + slb.png + slc.png + sld.png + sle.png + slf.png + slg.png + slh.png "
- "+ sli.png + slj.png + slk.png + sll.png highres2standard1.png ; "
- "slicer standard highres2standard -s 2 "
- "-x 0.35 sla.png -x 0.45 slb.png -x 0.55 slc.png -x 0.65 sld.png "
- "-y 0.35 sle.png -y 0.45 slf.png -y 0.55 slg.png -y 0.65 slh.png "
- "-z 0.35 sli.png -z 0.45 slj.png -z 0.55 slk.png -z 0.65 sll.png ; "
- "pngappend sla.png + slb.png + slc.png + sld.png + sle.png + slf.png + slg.png + slh.png "
- "+ sli.png + slj.png + slk.png + sll.png highres2standard2.png ; "
- "pngappend highres2standard1.png - highres2standard2.png highres2standard.png; "
- "rm -f sl?.png highres2standard2.png")
- os.system("rm highres2standard1.png")
- # Apply transformation to functional image
- print("\tApplying transformation to functional image...")
- os.system("convertwarp --ref=standard --premat=example_func2highres.mat --warp1=highres2standard_warp --out=example_func2standard_warp")
- os.system("applywarp --ref=standard --in=example_func_brain --out=example_func2standard --warp=example_func2standard_warp")
- # Generate visualization for functional transformation
- print("\tGenerating visualization for functional transformation...")
- os.system("slicer example_func2standard standard -s 2 "
- "-x 0.35 sla.png -x 0.45 slb.png -x 0.55 slc.png -x 0.65 sld.png "
- "-y 0.35 sle.png -y 0.45 slf.png -y 0.55 slg.png -y 0.65 slh.png "
- "-z 0.35 sli.png -z 0.45 slj.png -z 0.55 slk.png -z 0.65 sll.png ; "
- "pngappend sla.png + slb.png + slc.png + sld.png + sle.png + slf.png + slg.png + slh.png "
- "+ sli.png + slj.png + slk.png + sll.png example_func2standard1.png ; "
- "slicer standard example_func2standard -s 2 "
- "-x 0.35 sla.png -x 0.45 slb.png -x 0.55 slc.png -x 0.65 sld.png "
- "-y 0.35 sle.png -y 0.45 slf.png -y 0.55 slg.png -y 0.65 slh.png "
- "-z 0.35 sli.png -z 0.45 slj.png -z 0.55 slk.png -z 0.65 sll.png ; "
- "pngappend sla.png + slb.png + slc.png + sld.png + sle.png + slf.png + slg.png + slh.png "
- "+ sli.png + slj.png + slk.png + sll.png example_func2standard2.png ; "
- "pngappend example_func2standard1.png - example_func2standard2.png example_func2standard.png; "
- "rm -f sl?.png example_func2standard2.png")
- print()
- # %% [markdown]
- # # plot registration results: functional >> Atlas space
- # %%
- %matplotlib inline
- from IPython.display import display, Image
- import matplotlib.pyplot as plt
- from pathlib import Path
- # Define data path
- data_path = Path("/mnt/d/Data/Human/ObjectCategorization/analysis2")
- # Find registration directories
- reg_dirs = list(data_path.glob("sub*/ses-02/func/run*/reg"))
- # Process each registration directory
- for curr_reg in reg_dirs:
- subject_id = curr_reg.parts[-5]
- session_id = curr_reg.parts[-4]
- task_id = curr_reg.parts[-2]
- print(f"Current subject: {subject_id}, Session: {session_id}, Task: {task_id}")
- # Ensure the image file exists before displaying
- image_path = curr_reg / "example_func2standard.png"
- if image_path.exists():
- display(Image(filename=str(image_path)))
- else:
- print(f"Warning: {image_path} not found, skipping.")
- # %% [markdown]
- # # Invert the warp from MNI 2 functional space
- # %%
- import glob
- import os
- from pathlib import Path
- # Define data path
- data_path = Path("/mnt/d/Data/Human/ObjectCategorization/analysis2")
- # Find registration directories
- sub_dirs = list(data_path.glob("sub*/ses-02/func/run*/reg"))
- # Process each registration directory
- for curr_reg in sub_dirs:
- print(f"Processing: {curr_reg}")
- # Change directory only if it exists
- if curr_reg.exists():
- os.chdir(curr_reg)
- else:
- print(f"\tWarning: {curr_reg} does not exist, skipping.")
- continue
- # Define warp file paths
- warp_file = curr_reg / "example_func2standard_warp.nii.gz"
- ref_image = curr_reg / "example_func_brain.nii.gz"
- output_warp = curr_reg / "standard2example_func_warp.nii.gz"
- output_image = curr_reg / "standard2example_func.nii.gz"
- # Ensure warp file exists before running transformations
- if warp_file.exists():
- print("\tRunning inverse warp...")
- os.system(f"invwarp --ref={ref_image} --warp={warp_file} --out={output_warp}")
- print("\tApplying warp transformation...")
- os.system(f"applywarp --ref={ref_image} --in=standard --out={output_image} --warp={output_warp}")
- else:
- print(f"\tWarning: Warp file {warp_file} not found, skipping transformations.")
- # %%
08-Registration.ipynb at commit c67a3d2, no license · at the source
Overview
- Department of Neurology, BG-University Hospital Bergmannsheil, Ruhr University Bochum,44789 Bochum, Germany
- Department of Information Technology, University of Applied Sciences and Arts Dortmund,Dortmund, Germany
- Department of Neurosurgery, Medical University of Vienna,Vienna, Austria
- High Field MR Centre, Department of Biomedical Imaging and Image-guided Therapy, Medical University of Vienna,Vienna, Austria
- Institute of Cognitive Neuroscience, Department of Biopsychology, Faculty of Psychology, Ruhr University Bochum,44780 Bochum, Germany
- Cognitive Neurobiology, Research Center “One Health” Ruhr, University Alliance Ruhr, Faculty of Biology and Biotechnology, Ruhr-University Bochum,Universitätsstraße 150, 44801 Bochum, Germany
Abstract
How do humans recognize objects in their environment using either vision or touch, even when only one sense is available? Humans routinely integrate visual and haptic sensory systems for object recognition, yet the mechanisms behind cross-modal transfer of category information are not fully understood. In this study, we collected behavioral and fMRI data from 134 participants. Fifty participants (25 per group; 13 females each) performed a similarity rating task with novel 3D objects (“digital embryos”) using either visual or haptic modalities. The remaining 84 participants completed a 3D object category learning experiment in unimodal (Visual-Visual: n = 19, 11 females; Haptic-Haptic: n = 22, 10 females) or cross-modal (Visual-Haptic: n = 22, 11 females; Haptic-Visual: n = 21, 10 females) conditions. Alongside task-based fMRI, we acquired resting-state fMRI data at four time points: pre-training, post-training, pre-test, and post-test. High-resolution T1-weighted images were also obtained for each MRI session. These data support investigations into visual and haptic representations of the environment, representational similarity across modalities, cross-modal transfer of category information for object recognition, and neural plasticity in brain networks.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 9 matches between paragraphs and lines of code.
Sepideh-Tabrik/Similarity-Rating-Task
ded9f64b08f0ff67e00753b999fd4648507a2a6c, 15 May 2025Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
2 files
- PlotSimilarity_Correlati
on_Stress_MDS.m , MATLAB, 261 lines, 1 match - README.md, Text, 29 lines
Sepideh-Tabrik/Neural-mechanisms-underlying-cross-modal-3D-category-learning
c67a3d2286492d113a66a496ab0cee3b80178d21, 26 May 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
32 files
- resting-state-fMRI-prepr
ocessing/ , Jupyter, 274 lines, 1 match01- Framewise_displacment_FD .ipynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 125 lines02-BrainExtraction_recon all.ipynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 108 lines03-MotionCorrection.ipyn b - resting-state-fMRI-prepr
ocessing/ , Jupyter, 80 lines04-SliceTimeCorrection.i pynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 70 lines05-NonBrainTissuRemoving .ipynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 67 lines06-SpatialSmoothing.ipyn b - resting-state-fMRI-prepr
ocessing/ , Jupyter, 97 lines07-IntensityNormalizatio n.ipynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 474 lines08-Registration.ipynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 115 lines09-Tissue_segmentation.i pynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 67 lines, 2 matches10-Denoising.ipynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 92 lines, 1 match11-TemporalFilterring.ip ynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 90 lines12-Remove_dummy_scans.ip ynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 32 lines13-Register_func2Atlas.i pynb - resting-state-fMRI-prepr
ocessing/ , Jupyter, 53 lines14-Group_ICA.ipynb - task-based-fMRI-preproce
sing/ , Jupyter, 292 lines, 1 match01- Framewise_displacment_FD .ipynb - task-based-fMRI-preproce
sing/ , Jupyter, 128 lines02-BrainExtraction_recon all.ipynb - task-based-fMRI-preproce
sing/ , Jupyter, 112 lines03-MotionCorrection.ipyn b - task-based-fMRI-preproce
sing/ , Jupyter, 46 lines, 1 match04-SliceTimeCorrection.i pynb - task-based-fMRI-preproce
sing/ , Jupyter, 48 lines05-NonBrainTissuRemoving .ipynb - task-based-fMRI-preproce
sing/ , Jupyter, 45 lines06-SpatialSmoothing.ipyn b - task-based-fMRI-preproce
sing/ , Jupyter, 67 lines07-IntensityNormalizatio n.ipynb - task-based-fMRI-preproce
sing/ , Jupyter, 494 lines, 2 matches08-Registration.ipynb - task-based-fMRI-preproce
sing/ , Jupyter, 51 lines09-Denoising.ipynb - task-based-fMRI-preproce
sing/ , Jupyter, 91 lines10-TemporalFilterring.ip ynb - task-based-fMRI-preproce
sing/ , Jupyter, 90 lines11-Remove_dummy_scans.ip ynb - task-based-fMRI-preproce
sing/ , Jupyter, 47 linesConvert_ROIs2Atlas.ipynb - task-based-fMRI-preproce
sing/ , MATLAB, 85 linesCreating_FSL_EVs.m - task-based-fMRI-preproce
sing/ , MATLAB, 242 linesPlot_motion.m - task-based-fMRI-preproce
sing/ , MATLAB, 346 linesViolin.m - task-based-fMRI-preproce
sing/ , MATLAB, 154 linesplot_FD.m - task-based-fMRI-preproce
sing/ , MATLAB, 127 linesviolinplot.m - README.md, Text, 99 lines
Zenodo 15646449
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
Code availability
The stimuli and data preprocessing scripts for the similarity rating task are available on GitHub at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 32 scripts, each with its path and the digest of its content;
- 9 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
Datasets cited
- data.mendeley.com/
datasets/ , at Mendeley Data; found in “Data availability”8k7ys2xw4h - doi:10.17632/
8k7ys2xw4h.1 , at the source; found in the references
Data availability
The datasets described in this manuscript are openly available at the following repositories: raw neuroimaging data (10.60517/
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 2 keywords, 7 MeSH terms, 1 funder, 38 references.
Cite
This paper
Tabrik, S., Rahnemayan, S., Tegenthoff, M., & Behroozi, M. (2026). Larg-scale multimodal fMRI dataset of visual and haptic 3D object category learning. Scientific data, 13(1), 1064. https://
BibTeX
@article{tabrik2026larg,
author = {Tabrik, Sepideh and Rahnemayan, Sama and Tegenthoff, Martin and Behroozi, Mehdi},
title = {{Larg-scale multimodal fMRI dataset of visual and haptic 3D object category learning}},
journal = {Scientific data},
year = {2026},
month = jul,
volume = {13},
number = {1},
pages = {1064},
publisher = {Nature Publishing Group},
issn = {2052-4463},
doi = {10.1038/
url = {https://
pmid = {42463676},
pmcid = {PMC13376767}
}
RIS
TY - JOUR
AU - Tabrik, Sepideh
AU - Rahnemayan, Sama
AU - Tegenthoff, Martin
AU - Behroozi, Mehdi
TI - Larg-scale multimodal fMRI dataset of visual and haptic 3D object category learning
T2 - Scientific data
J2 - Sci Data
PY - 2026
DA - 2026/
VL - 13
IS - 1
SP - 1064
SN - 2052-4463
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Larg-scale multimodal fMRI dataset of visual and haptic 3D object category learning",
"container-title": "Scientific data",
"author": [
{
"family": "Tabrik",
"given": "Sepideh"
},
{
"family": "Rahnemayan",
"given": "Sama"
},
{
"family": "Tegenthoff",
"given": "Martin"
},
{
"family": "Behroozi",
"given": "Mehdi"
}
],
"container-title-short":
"volume": "13",
"issue": "1",
"page": "1064",
"DOI": "10.1038/
"PMID": "42463676",
"PMCID": "PMC13376767",
"ISSN": "2052-4463",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
16
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s41467-026-71151-2 [code]
- Common and distinct neural correlates of social interaction processing and theory of mind in narratives.Journal: Nature communicationsIn common: Violinplot-Matlab, Connectome Workbench, AFNI, 7 other tools
- [2] doi:10.1002/hbm.70483 [code]
- Untamed: Unconstrained Tensor Decomposition and Graph Node Embedding for Cortical Parcellation.Journal: Human brain mappingIn common: Connectome Workbench, AFNI, ANTs, 5 other tools, fMRI, 2 references
- [3] doi:10.1002/hbm.70577 [code]
- Disgust Propensity, Not Disgust Sensitivity, Shapes the Reactivity of a Subjective Disgust Circuit in Humans.Journal: Human brain mappingIn common: Violinplot-Matlab, Connectome Workbench, AFNI, 6 other tools, fMRI
- [4] doi:10.1371/journal.pbio.3003856 [code]
- Aging and metabolism contribute separately to brain-body health.Journal: PLoS biologyIn common: Connectome Workbench, AFNI, ANTs, 6 other tools, 1 reference
- [5] doi:10.1016/j.neuroimage.2026.122171 [code]
- A conserved node degree-based backbone and flexible hub organization of brain connectome during naturalistic movie watching.Journal: NeuroImageIn common: Connectome Workbench, AFNI, ANTs, 5 other tools, fMRI, 1 reference
- [6] doi:10.1016/j.isci.2026.116903 [code]
- Neurobiological and behavioral relevance of intrinsic functional connectome constraints on task-evoked neural activation.Journal: iScienceIn common: Connectome Workbench, AFNI, ANTs, 5 other tools, fMRI, 1 reference
- [7] doi:10.1016/j.neuron.2026.04.011 [code]
- Precision fMRI reveals densely interdigitated network patches with conserved motifs in the lateral prefrontal cortex.Journal: NeuronIn common: Connectome Workbench, AFNI, ANTs, 5 other tools, fMRI, 1 reference
- [8] doi:10.1038/s41467-026-73668-y [code]
- Convergent and divergent brain-cognition development in early adolescence.Journal: Nature communicationsIn common: Connectome Workbench, AFNI, ANTs, 6 other tools, fMRI
- [9] doi:10.1038/s41467-026-74565-0 [code]
- The functional neurobiology of dispositions towards negative emotions.Journal: Nature communicationsIn common: Violinplot-Matlab, Connectome Workbench, AFNI, 6 other tools
- [10] doi:10.1038/s41467-026-76011-7 [code]
- Human cortex organizes dynamic co-fluctuations along the sensorimotor-association
axis. Journal: Nature communicationsIn common: Connectome Workbench, AFNI, ANTs, 5 other tools, 1 reference
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 3 repositories of the authors' code, each at its verified commit and with its license, 32 scripts, and 9 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:a4d794180c3041d1…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
