Laminar CBV and BOLD response characteristics over time and space in the human primary somatosensory cortex at 7T.
The 16 matches · 1 of them tie a paragraph to a whole file without given lines: a weak match, whose lines are not tinted
- [1] § Functional Data Processing › Definition of digit ROIs ↔ code/analysis/func/05_registerFuncToAnat.py, the whole file · a weak match · score 0.85 · antsRegistration, registration mask, MP2RAGE, functional EPI, T1w image, spline · Report a mismatch
- [2] § Methods › Anatomical data processing ↔ code/analysis/anat/01_registerHighResSlabs.py, lines 17 to 100 · score 0.75 · n4_bias_field_correction, antsPy, rigid, anatomical, MP2RAGE, transformations · Report a mismatch
- [3] § Functional Data Processing › Pre-processing ↔ code/analysis/func/01-0_mocoCoregistration.py, lines 68 to 126 · score 0.71 · antsPy, motion outliers, motion correction, transformations, volumes · Report a mismatch
- [4] § Functional Data Processing › Definition of digit ROIs ↔ code/analysis/retired/08_selectROIs.py, lines 89 to 138 · score 0.71 · LN2_UVD_FILTER, largest cluster, cortical depth, propagate, radius, max · Report a mismatch
- [5] § Functional Data Processing › Pre-processing ↔ code/analysis/func/01-0_mocoCoregistration.py, lines 68 to 126 · score 0.70 · transformation matrices, EPI space, motion correction, T1w images · Report a mismatch
- [6] § Functional Data Processing › Pre-processing ↔ code/misc/computeT1w.py, lines 13 to 49 · score 0.69 · EPI space, motion correction, T1w images, variation, inverse, concatenated · Report a mismatch
- [7] § Functional Data Processing › Definition of digit ROIs ↔ code/analysis/retired/08_selectROIs.py, lines 1 to 43 · score 0.65 · binarized activation map, cortical depth, propagation, thresholded, D3, D4 · Report a mismatch
- [8] § Temporal Analysis › The triphasic response changes as a function of distance from the activation peak ↔ code/analysis/func/99_quantifyPeakTrough.py, lines 178 to 232 · score 0.63 · post stimulus peak, quantified, 4–6 mm, 6–8 mm, trough, TTP · Report a mismatch
- [9] § Temporal Analysis › The triphasic response changes as a function of distance from the activation peak ↔ code/analysis/func/99_quantifyPeakTrough.py, lines 178 to 232 · score 0.58 · post stimulus peak, 8–10 mm, 6–8 mm, trough, TTPs, phases · Report a mismatch
- [10] § Functional Data Processing › Extraction of event-related averages ↔ code/analysis/func/01-3_saveNusianceRegressors.py, lines 13 to 85 · score 0.57 · motion outliers, motion traces, regressed, linearly · Report a mismatch
- [11] § Functional Data Processing › (Statistical) response estimation ↔ code/analysis/func/01-3_saveNusianceRegressors.py, lines 13 to 85 · score 0.57 · motion regressors, motion outliers, linear, derivative, VASO, sub · Report a mismatch
- [12] § Methods › Anatomical data processing ↔ code/analysis/func/01-0_mocoCoregistration.py, lines 132 to 207 · score 0.53 · antsPy, rigid, T1w images, transformations · Report a mismatch
- [13] § Functional Data Processing › Definition of digit ROIs ↔ code/analysis/func/01-0_mocoCoregistration.py, lines 262 to 340 · score 0.53 · transformation matrices, T1w image, spline, EPI · Report a mismatch
- [14] § Functional Data Processing › Definition of digit ROIs ↔ code/analysis/func/08_selectROIs_revised.py, lines 1 to 21 · score 0.52 · activation map, cortical depth, propagation, thresholded, voxels, ROI · Report a mismatch
- [15] § Functional Data Processing › Pre-processing ↔ code/analysis/func/03_boco.py, lines 59 to 146 · score 0.51 · dUpsample, duplicated, match, upsampled, volume, VASO · Report a mismatch
- [16] § Temporal Analysis › The triphasic response changes as a function of distance from the activation peak ↔ code/analysis/func/99_quantifyPeakTrough.py, lines 235 to 272 · score 0.50 · post stimulus peak, signal changes, 4–6 mm, 6–8 mm, trough, phase · Report a mismatch
Paper
Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Python · 391 lines · 14 KB · MIT · 4 matches
- """
- Doing motion correction and registering multiple runs across sessions.
- """
- import ants
- import os
- import glob
- import nibabel as nb
- import numpy as np
- import subprocess
- import sys
- sys.path.append(f'./code/misc')
- from computeT1w import *
- subs = ['sub-12', 'sub-15', 'sub-16', 'sub-17', 'sub-18']
- # subs = ['sub-07', 'sub-09', 'sub-10']
- subs = ['sub-14']
- ROOT = '/Users/sebastiandresbach/data/s1Anfunco/Nifti'
- # ========================================================================================
- # Do motion-correction within runs
- print('Doing motion-correction within runs')
- for sub in subs:
- print(f'Processing {sub}')
- funcDir = f'{ROOT}/derivatives/{sub}/func'
- if not os.path.exists(funcDir):
- os.makedirs(funcDir)
- print("Func directory is created")
- # Look for individual runs (containing both nulled and not-nulled images)
- runs = sorted(glob.glob(f'{ROOT}/{sub}/ses-0*/func/{sub}_ses-0*_task-*run-00*_cbv.nii.gz'))
- for i in range(1, 4):
- if f'ses-0{i}' in runs[0]:
- ses = f'ses-0{i}'
- # Make folder to dump motion traces
- motionDir = f'{funcDir}/motionParameters'
- if not os.path.exists(motionDir):
- os.makedirs(motionDir)
- print("Motion directory is created")
- for run in runs:
- base = os.path.basename(run).rsplit('.', 2)[0][:-4]
- print(f'Processing run {base}')
- # Make folder to dump motion traces for the run
- os.system(f'mkdir {funcDir}/motionParameters/{base}')
- for start, modality in enumerate(['notnulled', 'nulled']):
- print(modality)
- # Load timeseries containing both nulled and notnulled
- nii = nb.load(run)
- # get header and affine
- header = nii.header
- affine = nii.affine
- # Load data as array
- dataComplete = nii.get_fdata()
- # Separate nulled and not-nulled data
- # Start is defined by "enumerate" above. 0 for notnulled, 1 for nulled.
- data = dataComplete[:, :, :, start::2]
- # Make new nii and save
- img = nb.Nifti1Image(data, header=header, affine=affine)
- nb.save(img, f'{funcDir}/{base}_{modality}.nii')
- # Make reference image
- reference = np.mean(data[..., 4:6], axis=-1)
- # And save it
- img = nb.Nifti1Image(reference, header=header, affine=affine)
- nb.save(img, f'{funcDir}/{base}_{modality}_reference.nii')
- # Make motion mask
- print('Generating mask')
- command = '3dAutomask '
- command += f'-prefix {funcDir}/{base}_{modality}_moma.nii.gz '
- command += f'-peels 3 -dilate 2 '
- command += f'{funcDir}/{base}_{modality}_reference.nii'
- subprocess.run(command, shell=True)
- # Define mask and reference images in 'antspy-style'
- fixed = ants.image_read(f'{funcDir}/{base}_{modality}_reference.nii')
- # Get motion mask
- mask = ants.image_read(f'{funcDir}/{base}_{modality}_moma.nii.gz')
- # Load data in antsPy style
- ts = ants.image_read(f'{funcDir}/{base}_{modality}.nii')
- # Perform motion correction
- corrected = ants.motion_correction(ts, fixed=fixed, mask=mask)
- ants.image_write(corrected['motion_corrected'], f'{funcDir}/{base}_{modality}_moco.nii.gz')
- # Save transformation matrix for later
- for vol, matrix in enumerate(corrected['motion_parameters']):
- mat = matrix[0]
- os.system(f"cp {mat} {funcDir}/motionParameters/{base}/{base}_{modality}_vol{vol:03d}.mat")
- # =========================================================================
- # Computing motion outliers
- command = 't '
- command += f'-i {funcDir}/{base}_{modality}.nii '
- command += f'-o {funcDir}/motionParameters/{base}/{base}_{modality}_motionOutliers.txt '
- command += f'--nomoco'
- subprocess.run(command, shell=True)
- # =========================================================================
- # Compute T1w image in EPI space within run
- nulledFile = f'{funcDir}/{base}_nulled_moco.nii.gz'
- notNulledFile = f'{funcDir}/{base}_notnulled_moco.nii.gz'
- t1w = computeT1w(nulledFile, notNulledFile)
- header = nb.load(nulledFile).header
- affine = nb.load(nulledFile).affine
- img = nb.Nifti1Image(t1w, header=header, affine=affine)
- nb.save(img, f'{funcDir}/{base}_T1w.nii')
- # =============================================================================
- # Register run-wise T1w images to rest
- # =============================================================================
- # # Set subjects to work on
- # subs = ['sub-05']
- # # # Set sessions to work on
- # # sessions = ['ses-01', 'ses-02']
- # # sessions = ['ses-05']
- #
- print('Registering run-wise T1w images to rest')
- for sub in subs:
- print(f'Processing {sub}')
- # Look for individual STIMULATION runs (containing both nulled and not-nulled images)
- runs = sorted(glob.glob(f'{ROOT}/{sub}/ses-0*/func/{sub}_ses-0*_task-stim*run-00*_cbv.nii.gz'))
- for i in range(1, 4):
- if f'ses-0{i}' in runs[0]:
- ses = f'ses-0{i}'
- outFolder = f'{ROOT}/derivatives/{sub}/func'
- # look for individual runs
- runs = sorted(glob.glob(f'{outFolder}/{sub}_{ses}_task-stim*_run-0*_T1w.nii'))
- # Set name of reference image
- refImage = (sorted(glob.glob(f'{outFolder}/{sub}_{ses}_task-restBA3b_run-001_T1w.nii')))[0]
- # Get basename of reference image
- refBase = os.path.basename(refImage).rsplit('.', 2)[0]
- # Load reference image in antsPy style
- fixed = ants.image_read(refImage)
- # Define motion mask
- mask = ants.image_read(
- sorted(glob.glob(f'{outFolder}/{sub}_{ses}_task-restBA3b_run-001_nulled_moma.nii.gz'))[0]
- )
- for run in runs:
- base = os.path.basename(run).rsplit('.', 2)[0].split('_')
- tmp = base[0]
- for subString in base[1:-1]:
- tmp = tmp + f'_{subString}'
- base = tmp
- # Define moving image
- moving = ants.image_read(run)
- # Compute transformation matrix
- mytx = ants.registration(
- fixed=fixed,
- moving=moving,
- type_of_transform='Rigid',
- mask=mask
- )
- # Apply transformation
- mywarpedimage = ants.apply_transforms(
- fixed=fixed,
- moving=moving,
- transformlist=mytx['fwdtransforms'],
- interpolator='bSpline'
- )
- # Save image
- ants.image_write(
- mywarpedimage,
- f'{outFolder}'
- + f'/{base}_T1w_registered-{refBase}.nii')
- # Get transformation name
- transform1 = (
- f'{outFolder}'
- + f'/{base}_T1w_registered-{refBase}.mat'
- )
- # Save transform for future
- os.system(f"cp {mytx['fwdtransforms'][0]} {transform1}")
- # =============================================================================
- # Apply between run registration
- # =============================================================================
- print('Apply between run registration')
- # # Set subjects to work on
- # subs = ['sub-05']
- # # Set sessions to work on
- # sessions = ['ses-01', 'ses-02']
- # sessions = ['ses-04']
- for sub in subs:
- print(sub)
- # Look for individual STIMULATION runs (containing both nulled and not-nulled images)
- runs = sorted(glob.glob(f'{ROOT}/{sub}/ses-0*/func/{sub}_ses-0*_task-stim*run-00*_cbv.nii.gz'))
- for i in range(1, 4):
- if f'ses-0{i}' in runs[0]:
- ses = f'ses-0{i}'
- outFolder = f'{ROOT}/derivatives/{sub}/func'
- # Set name of reference image
- refImage = (sorted(glob.glob(f'{outFolder}/{sub}_{ses}_task-restBA3b_run-001_T1w.nii')))[0]
- # Get basename of reference image
- refBase = os.path.basename(refImage).rsplit('.', 2)[0].split('_')
- tmp1 = refBase[0]
- for subString in refBase[1:-1]:
- tmp1 = tmp1 + f'_{subString}'
- refBase = tmp1
- # Get header and affine of reference image to easily assign later
- refHeader = nb.load(refImage).header
- refAffine = nb.load(refImage).affine
- # Load reference image in antspy style
- fixed = ants.image_read(refImage)
- for modality in ['nulled', 'notnulled']:
- # Load motion mask of reference image in antspy style
- mask = ants.image_read(
- f'{outFolder}/{refBase}_{modality}_moma.nii.gz'
- )
- # Look for individual runs
- runs = sorted(glob.glob(f'{outFolder}/{sub}_{ses}_task-stim_run-0*_{modality}.nii'))
- # Loop over runs
- for run in runs:
- # Get the base name of the run
- runBase = os.path.basename(run).rsplit('.', 2)[0].split('_')
- tmp2 = runBase[0]
- for subString in runBase[1:-1]:
- tmp2 = tmp2 + f'_{subString}'
- runBase = tmp2
- # Load registration matrix between run and reference
- transformBetween = f'{outFolder}/{runBase}_T1w_registered-{refBase}_T1w.mat'
- # =============================================================
- # Separate run into individual volumes
- nii = nb.load(run)
- # get header and affine
- header = nii.header
- affine = nii.affine
- # Load data as array
- data = nii.get_fdata()
- # Loop over volumes
- for i in range(data.shape[-1]):
- # Overwrite volumes 0,1,2 with volumes 3,4,5
- if i <= 2:
- vol = data[..., i + 3]
- else:
- vol = data[..., i]
- # Save individual volumes
- img = nb.Nifti1Image(vol, header=header, affine=affine)
- nb.save(img, f'{outFolder}/{runBase}_{modality}_vol{i:03d}.nii')
- # Loop over the volumes we just created to do the correction
- for i in range(data.shape[-1]):
- # Load volume
- moving = ants.image_read(f'{outFolder}/{runBase}_{modality}_vol{i:03d}.nii')
- # Get within run transformation matrix of the volume
- transformWithin = f'{outFolder}/motionParameters' \
- f'/{runBase}/{runBase}_{modality}_vol{i:03d}.mat'
- # Apply transformation matrices
- mywarpedimage = ants.apply_transforms(
- fixed=fixed,
- moving=moving,
- transformlist=[transformWithin, transformBetween],
- interpolator='bSpline'
- )
- # Save warped image
- ants.image_write(mywarpedimage, f'{outFolder}/{runBase}_{modality}_vol{i:03d}_warped.nii')
- # =============================================================
- # Assemble images of run
- newData = np.zeros(data.shape)
- for i in range(data.shape[-1]):
- vol = nb.load(
- f'{outFolder}'
- + f'/{runBase}_{modality}_vol{i:03d}_warped.nii'
- ).get_fdata()
- newData[..., i] = vol
- img = nb.Nifti1Image(newData, header=refHeader, affine=refAffine)
- nb.save(img, f'{outFolder}/{runBase}_{modality}_moco-reg.nii')
- # Remove individual volumes
- os.system(f'rm {outFolder}/{runBase}_{modality}_vol*.nii')
- # =========================================================================
- # Compute T1w image in EPI space within run
- nulledFile = f'{outFolder}/{runBase}_nulled_moco-reg.nii'
- notNulledFile = f'{outFolder}/{runBase}_notnulled_moco-reg.nii'
- t1w = computeT1w(nulledFile, notNulledFile)
- header = nb.load(nulledFile).header
- affine = nb.load(nulledFile).affine
- img = nb.Nifti1Image(t1w, header=header, affine=affine)
- nb.save(img, f'{outFolder}/{runBase}_T1w_reg.nii')
- # =========================================================================
- # Compute T1w image in EPI space across runs
- print('Computing T1w image in EPI space across runs')
- for sub in subs:
- print(sub)
- runs = sorted(glob.glob(f'{ROOT}/{sub}/ses-0*/func/{sub}_ses-0*_task-stim*run-00*_cbv.nii.gz'))
- for i in range(1, 4):
- if f'ses-0{i}' in runs[0]:
- ses = f'ses-0{i}'
- outFolder = f'{ROOT}/derivatives/{sub}/func'
- for i, run in enumerate(runs):
- base = os.path.basename(run).rsplit('.', 2)[0][:-4]
- for modality in ['notnulled', 'nulled']:
- data = nb.load(f'{outFolder}/{base}_{modality}_moco-reg.nii').get_fdata()
- # For first run, initiate combined data
- if i == 0 and modality == 'notnulled':
- combined = data.copy()
- # And get header/ affine information to save data later
- header = nb.load(f'{outFolder}/{base}_{modality}_moco-reg.nii').header
- affine = nb.load(f'{outFolder}/{base}_{modality}_moco-reg.nii').affine
- # For other runs, just concatenate
- else:
- combined = np.concatenate((combined, data), axis=3)
- # De-trend before std. dev. calculation
- # combinedDemean = signal.detrend(combined, axis=3, type='constant')
- # combinedDetrend = signal.detrend(combinedDemean, axis=3, type='linear')
- stdDev = np.std(combined, axis=3)
- mean = np.mean(combined, axis=3)
- cvar = np.divide(stdDev, mean)
- cvarInv = 1 / cvar
- img = nb.Nifti1Image(cvarInv, header=header, affine=affine)
- nb.save(img, f'{outFolder}/{sub}_{ses}_T1w.nii')
- # t1w = ants.image_read(f'{outFolder}/{sub}_{ses}_T1w.nii')
- # t1w_n4 = ants.n4_bias_field_correction(t1w)
- # ants.image_write(t1w_n4, f'{outFolder}/{sub}_{ses}_T1w_N4corrected.nii')
01-0_mocoCoregistration.py at commit fcfa528, under MIT · at the source
Overview
- Faculty of Psychology and Neuroscience, Maastricht University, Maastricht, The Netherlands
- Department of Neurophysics, Max Planck Institute for Human Cognitive and Brain Sciences, Leipzig, Germany
- Brain Innovation, Maastricht, The Netherlands
- Krembil Brain Institute, University Health Network, Toronto, ON, Canada
- Felix Bloch Institute for Solid State Physics, Faculty of Physics and Earth System Sciences, Leipzig University, Leipzig, Germany
- Wellcome Centre for Human Neuroimaging, Institute of Neurology, University College London, London, United Kingdom
- National Institutes of Health, Bethesda, MD, United States
- Martinos Center for Biomedical Imaging, HMS, MGH, Charlestown, MA, United States
Abstract
Uncovering the cortical representation of the body has been at the core of human brain mapping for decades, with special attention given to the digits. In the last decade, advances in functional magnetic resonance imaging (fMRI) technologies have opened the possibility of non-invasively unraveling the 3rd dimension of digit representations in humans along cortical layers. In laminar fMRI, it is common to combine the use of highly sensitive blood oxygen level dependent (BOLD) measurements with cerebral blood volume sensitive measurements, such as slice-saturation slab-inversion vascular space occupancy (SS-SI VASO, henceforth referred to as VASO), which are more specific to the underlying neuronal populations. However, the spatial and temporal VASO response characteristics across cortical depth to passive stimulation of the digits are still unknown. Therefore, we characterized hemodynamic responses to vibrotactile stimulation of individual digit tips across cortical depth at 0.75 mm in-plane spatial resolution using BOLD and VASO fMRI at 7T. We could identify digit-specific regions of interest (ROIs) in putative Brodmann area 3b, following the known anatomical organization. In these ROIs, the BOLD response increased toward the cortical surface due to the draining vein effect, while the VASO response was more shifted toward middle cortical layers, likely reflecting bottom-up input from the thalamus, as expected. As an incidental finding, we also saw slightly negative BOLD and VASO responses for non-preferred digits in the ROIs. Therefore, we conducted an exploratory analysis in which we investigated the temporal signal dynamics for BOLD and VASO as a function of distance from activation peaks resulting from stimulation of contralateral digits. With this analysis, we found a triphasic response consisting of an initial peak and a subsequent negative deflection during stimulation, followed by a positive post-stimulus response in BOLD and to some extent in VASO. Similar response dynamics have been observed in the animal literature using invasive methods and in the ipsilateral somatosensory cortex in humans. Furthermore, lateral inhibition has been implicated in models of sensory aging. However, our study is the first to show these temporospatial signal fluctuations directly in human contralateral cortex upon stimulation of individual digits using sub-millimeter BOLD and VASO fMRI. In this context, our findings might offer new windows into the investigations of the potential neuronal excitation–inhibition mechanism in a center-surround architecture in the human somatosensory cortex using layer-specific CBV and BOLD measurements.
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 16 matches between paragraphs and lines of code.
sdres/s1Anfunco
fcfa5287675a56ff6b3f79d74c8de77a0588cc38, 12 December 2024Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
68 files
- code/
analysis/ , Python, 100 lines, 1 matchanat/ 01_registerHighResSlabs. py - code/
analysis/ , Python, 88 linesanat/ 02_cropHighResSlabs.py - code/
analysis/ , Python, 86 linesanat/ 04_segmentationPolish.py - code/
analysis/ , Python, 68 linesanat/ 05_upsampleHighResSlabs. py - code/
analysis/ , Python, 109 linesanat/ 07_LayNii.py - code/
analysis/ , Python, 19 linesanat/ 99_deface.py - code/
analysis/ , Python, 391 lines, 4 matchesfunc/ 01-0_mocoCoregistration. py - code/
analysis/ , Python, 125 linesfunc/ 01-1_motionParameters.py - code/
analysis/ , Python, 286 linesfunc/ 01-2_plotMotionParameter s.py - code/
analysis/ , Python, 85 lines, 2 matchesfunc/ 01-3_saveNusianceRegress ors.py - code/
analysis/ , Python, 87 linesfunc/ 02_voxelReduction.py - code/
analysis/ , Python, 146 lines, 1 matchfunc/ 03_boco.py - code/
analysis/ , Python, 102 linesfunc/ 04_firstLevelGLM.py - code/
analysis/ , Python, 65 lines, 1 matchfunc/ 05_registerFuncToAnat.py - code/
analysis/ , Python, 98 linesfunc/ 06_applyTransformToMaps. py - code/
analysis/ , Python, 53 linesfunc/ 07_upsampleStatmaps.py - code/
analysis/ , Python, 433 lines, 1 matchfunc/ 08_selectROIs_revised.py - code/
analysis/ , Python, 169 linesfunc/ 09-1_extractTSNR.py - code/
analysis/ , Python, 202 linesfunc/ 09_extractStats.py - code/
analysis/ , Python, 92 linesfunc/ 0x_extractNoiseGlobal.py - code/
analysis/ , Python, 125 linesfunc/ 99_binDistancesForPlotti ng.py - code/
analysis/ , Python, 458 linesfunc/ 99_centerSurround.py - code/
analysis/ , Python, 768 linesfunc/ 99_extractERA.py - code/
analysis/ , Python, 481 lines, 3 matchesfunc/ 99_quantifyPeakTrough.py - code/
analysis/ , Python, 93 linesfunc/ 99_registerStim.py - code/
analysis/ , Python, 370 linesfunc/ 99_timeCourseTest.py - code/
analysis/ , Python, 278 linesfunc/ centerAccountForRois.py - code/
analysis/ , Python, 20 linesfunc/ dilatePerimeter.py - code/
analysis/ , Python, 502 lines, 2 matchesretired/ 08_selectROIs.py - code/
analysis/ , Python, 122 linesretired/ 11_createRestMask.py - code/
analysis/ , Python, 90 linesretired/ 12_registerRest.py - code/
analysis/ , Python, 66 linesretired/ 13_extractCSF.py - code/
analysis/ , Python, 146 linesretired/ 14_nuisanceRegression.py - code/
analysis/ , Python, 151 linesretired/ 15_extractRestLayers.py - code/
analysis/ , Python, 667 linesretired/ 17_correlateHexbins.py - code/
analysis/ , Python, 394 linesretired/ 18_correlateRestLayers.p y - code/
analysis/ , Python, 412 linesretired/ 19_correctRestLayers.py - code/
analysis/ , Python, 245 linesretired/ 20_restLayerAnalysis.py - code/
analysis/ , Python, 345 linesretired/ 99_extractERA_noFilter.p y - code/
analysis/ , Python, 162 linesretired/ 99_makeSub-12Rois.py - code/
analysis/ , Python, 447 linesretired/ compareOrientationFaruk. py - code/
analysis/ , Python, 54 linesretired/ compareThresholds.py - code/
analysis/ , Python, 100 linesretired/ connected_clusters.py - code/
analysis/ , Python, 21 linesretired/ createVoxelIDs.py - code/
analysis/ , Python, 68 linesretired/ estimateConnectivity.py - code/
analysis/ , Python, 30 linesretired/ flattenLayers.py - code/
analysis/ , Python, 114 linesretired/ processRestFunc.py - code/
analysis/ , Python, 28 linesretired/ voxelsPerColumn.py - code/
misc/ , Python, 1 line__init__.py - code/
misc/ , Python, 19 linesclusterThresh.py - code/
misc/ , Python, 136 linescollectMaps.py - code/
misc/ , Python, 49 lines, 1 matchcomputeT1w.py - code/
misc/ , Python, 47 linesfind_tr.py - code/
misc/ , Python, 82 linesheudiconvheuristic.py - code/
misc/ , Python, 68 linesmeasureCorticalThickness .py - code/
misc/ , Python, 63 linesplotStimulation.py - code/
misc/ , Python, 28 linesprepReg.py - code/
misc/ , Python, 54 linesrenameRestVols.py - code/
misc/ , Python, 16 linesrenameSimulationFiles.py - code/
misc/ , Shell, 29 linesrunHeudiconv.sh - code/
stimulation/ , Python, 73 linesfillEventFiles.py - code/
stimulation/ , Python, 44 linesstimPatternDescription.p y - extracMotionParams.py, Python, 119 lines
- heudiconv_commands.sh, Shell, 22 lines
- heudiconv_heuristic.py, Python, 82 lines
- heudiconv_heuristic_sub-
06.py , Python, 82 lines - LICENSE, License, 21 lines
- README.md, Text, 1 line
figshare 26135296
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
The paper's code and data availability statement is in the Data section.
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:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 66 scripts, each with its path and the digest of its content;
- 16 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
- openneuro:ds005238, at OpenNeuro; found in “Data and Code Availability”
Data and Code Availability
Analysis code is available on GitHub: https://
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, 30 September 2026: the first record
Recorded: type, language, journal, volume, pages, dates, 9 authors, 6 keywords, 4 funders, 98 references.
Cite
This paper
Dresbach, S., Gulban, O. F., Steinbach, T., Eck, J., Kashyap, S., Kaas, A., Weiskopf, N., Goebel, R., & Huber, R. (2026). Laminar CBV and BOLD response characteristics over time and space in the human primary somatosensory cortex at 7T. Imaging neuroscience (Cambridge, Mass.), 4, IMAG.a.1157. https://
BibTeX
@article{dresbach2026lam
author = {Dresbach, Sebastian and Gulban, Omer Faruk and Steinbach, Till and Eck, Judith and Kashyap, Sriranga and Kaas, Amanda and Weiskopf, Nikolaus and Goebel, Rainer and Huber, Renzo},
title = {{Laminar CBV and BOLD response characteristics over time and space in the human primary somatosensory cortex at 7T}},
journal = {Imaging neuroscience (Cambridge, Mass.)},
year = {2026},
month = mar,
volume = {4},
pages = {IMAG.a.1157},
publisher = {MIT Press},
issn = {2837-6056},
doi = {10.1162/
url = {https://
pmid = {41918767},
pmcid = {PMC13034615}
}
RIS
TY - JOUR
AU - Dresbach, Sebastian
AU - Gulban, Omer Faruk
AU - Steinbach, Till
AU - Eck, Judith
AU - Kashyap, Sriranga
AU - Kaas, Amanda
AU - Weiskopf, Nikolaus
AU - Goebel, Rainer
AU - Huber, Renzo
TI - Laminar CBV and BOLD response characteristics over time and space in the human primary somatosensory cortex at 7T
T2 - Imaging neuroscience (Cambridge, Mass.)
J2 - Imaging Neurosci (Camb)
PY - 2026
DA - 2026/
VL - 4
SP - IMAG.a.1157
SN - 2837-6056
PB - MIT Press
DO - 10.1162/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1162/
"type": "article-journal",
"title": "Laminar CBV and BOLD response characteristics over time and space in the human primary somatosensory cortex at 7T",
"container-title": "Imaging neuroscience (Cambridge, Mass.)",
"author": [
{
"family": "Dresbach",
"given": "Sebastian"
},
{
"family": "Gulban",
"given": "Omer Faruk"
},
{
"family": "Steinbach",
"given": "Till"
},
{
"family": "Eck",
"given": "Judith"
},
{
"family": "Kashyap",
"given": "Sriranga"
},
{
"family": "Kaas",
"given": "Amanda"
},
{
"family": "Weiskopf",
"given": "Nikolaus"
},
{
"family": "Goebel",
"given": "Rainer"
},
{
"family": "Huber",
"given": "Renzo"
}
],
"container-title-short":
"volume": "4",
"page": "IMAG.a.1157",
"DOI": "10.1162/
"PMID": "41918767",
"PMCID": "PMC13034615",
"ISSN": "2837-6056",
"publisher": "MIT Press",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
27
]
]
}
}
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.1162/imag_a_00263 [code]
- Characterisation of laminar and vascular spatiotemporal dynamics of CBV and BOLD signals using VASO and ME-GRE at 7T in humans.Journal: Imaging neuroscience (Cambridge, Mass.)In common: HeuDiConv, dcm2niix, Nipype, 12 other tools, fMRI, systems, 20 references, 3 authors
- [2] doi:10.1093/cercor/bhad151 [code]
- Imaging the columnar functional organization of human area MT+ to axis-of-motion stimuli using VASO at 7 Tesla.Journal: Cerebral cortex (New York, N.Y. : 1991)In common: dcm2niix, AFNI, ANTs, 8 other tools, fMRI, 16 references, author Rainer Goebel
- [3] doi:10.1162/imag.a.1279 [code]
- Multimodal laminar characterization of visual areas along the cortical hierarchy.Journal: Imaging neuroscience (Cambridge, Mass.)In common: ANTs, FSL, scikit-image, 5 other tools, systems, 8 references, 3 authors
- [4] doi:10.1371/journal.pone.0280855 [code]
- Cerebral blood volume sensitive layer-fMRI in the human auditory cortex at 7T: Challenges and capabilities.Journal: PloS oneIn common: dcm2niix, imageio, AFNI, 7 other tools, fMRI, systems, 13 references
- [5] doi:10.1016/j.isci.2025.112967 [code]
- Contextual responses drive a unique laminar signature in human V1.Journal: iScienceIn common: Nipype, imageio, ANTs, 9 other tools, systems, 11 references
- [6] doi:10.3389/fnins.2025.1537026 [code]
- Mapping curvature domains in human V4 using CBV-sensitive layer-fMRI at 3T.Journal: Frontiers in neuroscienceIn common: FSL, fMRI, systems, 13 references, author Rainer Goebel
- [7] doi:10.1523/eneuro.0069-22.2022 [code]
- Fast Event-Related Mapping of Population Fingertip Tuning Properties in Human Sensorimotor Cortex at 7T.Journal: eNeuroIn common: FSL, NiBabel, pandas, 2 other tools, fMRI, systems, 12 references
- [8] doi:10.64898/2026.02.06.704362 [code]
- Functional gradients dissociate between cortical layersJournal: bioRxiv (preprint)In common: Nipype, AFNI, ANTs, 8 other tools, fMRI, systems, 8 references
- [9] doi:10.1007/s10548-023-01000-8 [code]
- Two-Dimensional Population Receptive Field Mapping of Human Primary Somatosensory Cortex.Journal: Brain topographyIn common: FSL, NiBabel, pandas, 2 other tools, fMRI, systems, 11 references
- [10] doi:10.1162/imag.a.1124 [code]
- Decoding of columnar-level organization across cortical depth using BOLD- and CBV-fMRI at 7 T.Journal: Imaging neuroscience (Cambridge, Mass.)In common: NiBabel, pandas, SciPy, 2 other tools, fMRI, systems, 14 references
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: 2 repositories of the authors' code, each at its verified commit and with its license, 66 scripts, and 16 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:dd437f2eb22f8b19…
Add the badge to the code's README
If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.
Markdown
<!-- oscr-badge:start -->
[](https://openscicode.org/badge/doi/10.1162/imag.a.1157)
<!-- oscr-badge:end -->reStructuredText
.. oscr-badge:start
.. image:: https://openscicode.org/badge/doi/10.1162/imag.a.1157.svg
:target: https://openscicode.org/badge/doi/10.1162/imag.a.1157
:alt: OSCR
.. oscr-badge:endHTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1162/imag.a.1157"><img src="https://openscicode.org/badge/doi/10.1162/imag.a.1157.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->On GitHub, open the README, choose Edit (the pencil), paste the snippet under the title, then "Commit changes".
If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge page.
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: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.
Report a mismatch between the code and the paper · Report a code error (signed in)
Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.
Report a reproduction failure (signed in)
Versions of its code: the releases of its code tied to a version of this paper (the preprint, the accepted manuscript, the version of record…), each with the tracing map versioned with it.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
