Brain ventricle morphology markers in predicting shunt surgery outcome in idiopathic normal-pressure hydrocephalus.
The 3 matches
- [1] § Methods › Proposed framework › Feature extraction › Local features ↔ feature_extraction.py, lines 73–188 · score 0.96 · farthest distance, open3d, search_radius_vector_3d, point clouds, point density, computation
- [2] § Methods › Proposed framework › Feature extraction › Global features ↔ feature_extraction.py, lines 346–412 · score 0.90 · convex hull volume, PyVista, volume ratio, area ratio, AsE, CHSA
- [3] § Methods › Proposed framework › Feature extraction › Curvature features ↔ feature_extraction.py, lines 346–412 · score 0.75 · PyVista, CMax, CMin, Gaussian, GC, MC
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
Python · 431 lines · 22 KB · CC0-1.0 · 3 matches
- #!/usr/bin/env python
- # coding: utf-8
- # In[ ]:
- # Imports
- import os
- import time
- from datetime import datetime
- import shutil
- import numpy as np
- import pandas as pd
- import nibabel as nib
- import trimesh
- import pyvista as pv
- import pymeshfix as mf
- from pymeshfix._meshfix import PyTMesh
- import vedo
- from vedo import *
- import open3d as o3d
- from open3d import *
- # In[ ]:
- # Correct Mesh
- def correct_mesh(iso, smooth=0, taubin=False):
- # Extract vertices and faces
- vertices = iso.vertices
- faces = iso.cells
- # Clean vertices and faces
- vertices, faces = mf.clean_from_arrays(vertices, faces)
- # Load PyTMesh
- mfix = PyTMesh(False) # False removes extra verbose output
- # Create array
- mfix.load_array(vertices, faces)
- # Fix mesh
- # Fills all the holes having at at most 'nbe' boundary edges. If
- # 'refine' is true, adds inner vertices to reproduce the sampling
- # density of the surroundings. Returns number of holes patched. If
- # 'nbe' is 0 (default), all the holes are patched.
- mfix.fill_small_boundaries(nbe=0, refine=True)
- # Return vertices and faces
- vert, faces = mfix.return_arrays()
- triangles = np.empty((faces.shape[0], 4), dtype=faces.dtype)
- triangles[:, -3:] = faces
- triangles[:, 0] = 3
- # Create mesh
- mesh = pv.PolyData(vert, triangles)
- # Apply Smoothing if Assigned
- if smooth > 0:
- if taubin:
- # Smooth mesh
- mesh = mesh.smooth_taubin(n_iter=smooth, non_manifold_smoothing=True)
- else:
- mesh = mesh.smooth(n_iter=smooth)
- return mesh
- # In[ ]:
- # 12 features derived from shape measurements
- def shape_measurments(pv_mesh, r=1.0): # set search radius [1,0.9,0.8,0.7,0.6,0.5,0.4,0.3,0.2,0.1,0.05]
- # Load the point cloud and normals
- point_cloud = np.asarray(pv_mesh.points)
- pcd = o3d.geometry.PointCloud()
- pcd.points = o3d.utility.Vector3dVector(point_cloud)
- # Remove Outliers ### EXPERIMENTAL ###########################
- # Downsample the Point Cloud with a Voxel of 0.01
- voxel_down_pcd = pcd.voxel_down_sample(voxel_size=0.01)
- # Statistical Oulier Removal
- pcd, ind = voxel_down_pcd.remove_statistical_outlier(nb_neighbors=100,
- std_ratio=2.0)
- ### END OF EXPERIMENTA #######################################
- pcd.compute_convex_hull()
- pcd.estimate_normals()
- pcd.orient_normals_consistent_tangent_plane(1)
- mesh_verts = np.asarray(pcd.points)
- mesh_norms = np.asarray(pcd.normals)
- # # Transform the point cloud to the a PointCloud() object used by open3d
- pcd.points = utility.Vector3dVector(mesh_verts)
- pcd.normals = utility.Vector3dVector(mesh_norms)
- # Calculate the KDTree
- pcd_tree = geometry.KDTreeFlann(pcd)
- allVerts = np.ones([len(mesh_verts),1])
- # how many scales will be used
- numScales = 1
- # Place holder for set of features
- feature_set = []
- i=0
- # go through all the points
- while i<len(mesh_verts):
- pointScaleFeatures = []
- for j in [r]:
- # Constant for Stability
- constant = 0.0
- # for each radius area scale find neighbours
- [k_small, idx_small, distances_small] = pcd_tree.search_radius_vector_3d(pcd.points[i], j) # radius search set radius
- currNdx = np.array(idx_small)
- # if there are less than 2 neightbours just add 0s
- if (len(currNdx) <=2):
- linearity= 0 + constant
- planarity=0 + constant
- sphericity=0 + constant
- omnivariance=0 + constant
- anisotropy=0 + constant
- eigenentropy=0 + constant
- sumOFEigs=0 + constant
- changeOfCurvature=0 + constant
- farthestDist = distances_small[len(distances_small)-1]/j
- pointDensity = k_small/j
- heightStd=0 + constant
- heightMax=0 + constant
- shapeDist_curr = np.zeros(50)
- # if there are enouigh neighbours then continue with computation
- else:
- # get heighbourhood points and normals
- nearestNeighbors_normals = mesh_norms[currNdx]
- nearestNeighbors_verts = mesh_verts[currNdx]
- # calculate the covariance matrix, and eigenvalues
- cov_mat = np.cov([nearestNeighbors_verts[:,0],nearestNeighbors_verts[:,1],nearestNeighbors_verts[:,2]])
- eig_val_cov, eig_vec_cov = np.linalg.eigh(cov_mat)
- idx = eig_val_cov.argsort()[::-1]
- eig_val_cov = eig_val_cov[idx]
- # calculate the first 12 features derived from shape measurements
- linearity = (eig_val_cov[0] - eig_val_cov[1])/eig_val_cov[0]
- planarity = (eig_val_cov[1] - eig_val_cov[2])/eig_val_cov[0]
- sphericity = eig_val_cov[2]/eig_val_cov[0]
- omnivariance =(eig_val_cov[0]*eig_val_cov[1]*eig_val_cov[2]) **(1./3.)
- anisotropy = (eig_val_cov[0] - eig_val_cov[2])/eig_val_cov[0]
- eigenentropy = -(( eig_val_cov[0] * np.log(eig_val_cov[0])) + ( eig_val_cov[1] * np.log(eig_val_cov[1])) + ( eig_val_cov[2] * np.log(eig_val_cov[2])))
- sumOFEigs = eig_val_cov[0]+ eig_val_cov[1]+eig_val_cov[2]
- changeOfCurvature = eig_val_cov[2]/(eig_val_cov[0]+ eig_val_cov[1]+eig_val_cov[2])
- farthestDist = distances_small[len(distances_small)-1]/j
- pointDensity = k_small/j
- heightMax = np.abs(np.dot(nearestNeighbors_normals.mean(axis=0),nearestNeighbors_verts.T)).max() - np.abs(np.dot(nearestNeighbors_normals.mean(axis=0),nearestNeighbors_verts.T)).min()
- heightStd = np.abs(np.dot(nearestNeighbors_normals.mean(axis=0),nearestNeighbors_verts.T)).std()
- # Added to the other features and a feature vector is created
- pointScaleFeatures.extend([linearity,planarity,sphericity,omnivariance,anisotropy,eigenentropy,sumOFEigs,changeOfCurvature,farthestDist,pointDensity,heightMax,heightStd])
- # The feature vector for each point is checked for NaN values and then concatenated
- where_are_NaNs = np.isnan(pointScaleFeatures)
- pointScaleFeatures = np.array(pointScaleFeatures)
- pointScaleFeatures[where_are_NaNs] = 0
- pointScaleFeatures = pointScaleFeatures.tolist()
- feature_set.append(pointScaleFeatures)
- i+=1
- # DataFrame of averaged features
- col_names = ['linearity','planarity','sphericity','omnivariance','anisotropy','eigenentropy','sumOFEigs','changeOfCurvature','farthestDist','pointDensity','heightStd', 'heightMax']
- feature_df = pd.DataFrame(feature_set, columns = col_names) # TO GET ENTIRE DATA FOR PLOTTTING
- # Get values
- final_df = feature_df.mean()
- return final_df
- # In[ ]:
- # Compute Mesh Features
- # Container for All Data
- all_data_list = []
- # Setup Parameters
- structure=[24,25] # flag surface of interest
- ndecim = 6000 # mesh granularity
- # Smooth Parameters
- lamb = 1.0
- itr = 5
- # Scans to Exclude
- corrupt_scan_id = [] # subject IDs to exclude
- # Directory to mine
- main_dir = '' # input path to directory of interest
- vent_size = [] # non processed mesh size
- # Starting Time
- program_starts = time.time()
- # ID's directory
- id_dirs = os.listdir(main_dir)
- # Sub-directory
- sub_dirs = [os.path.join(main_dir, sub_id) for sub_id in id_dirs if not 'DS_Store' in sub_id and not 'Mesh_Params' in sub_id]
- for sub_dir in sub_dirs:
- ses_dir = os.listdir(os.path.join(sub_dir))
- for ses in ses_dir[:2]:
- if not 'DS_Store' in ses:
- scan_dir = os.listdir(os.path.join(sub_dir, ses))
- synthseg_files = [file for file in scan_dir if 'sub' in file] # cneuro
- for synthseg_file in synthseg_files:
- # Define source path
- src_path = os.path.join(sub_dir, ses, synthseg_file)
- # Path details
- file_path = src_path
- # Find a base name
- basename = os.path.basename(file_path)
- # Get ID
- sub_id = basename.split('_')[0] # cNeuro
- if sub_id not in corrupt_scan_id:
- ### MESH PROCESSING ###########################################################################
- # Load File
- nifti_file = nib.load(file_path) # load file from the path
- segmentation_array = nifti_file.get_fdata() # convert nifti segmentation file into numpy array
- # Filter brain structure of interest and set a scene for mesh
- scene = np.where(
- (segmentation_array!=0) & # remove background
- np.isin(segmentation_array.astype(int), structure), # flag structure of interest
- 1, 0) # assign values
- # Create volume using Vedo surfnets and use dual approach to create isosurface
- # Extract volume
- vol = Volume(scene.astype(int),spacing =nifti_file.header.get_zooms()) # Extract volume and correct strectching along all axis
- # Create mesh from mask
- iso = vol.isosurface_discrete([1,]) # discreate
- ### CLEAN ###########################################################################
- # Create Clean Mesh
- mesh_obj = correct_mesh(iso) # smooth=s, taubin=taubin_state
- # Pyvista Mesh
- pv_mesh = pv.wrap(mesh_obj)
- # Extract Faces
- pv_faces = pv_mesh.faces
- # Extract Vertices
- pv_vertices = pv_mesh.points
- # Back to Vedo Mesh
- iso = vedo.Mesh([pv_vertices, pv_faces])
- ### SUBDIVIDE ###########################################################################
- if pv_vertices.shape[0] < ndecim:
- # Extract Vertices
- vedo_vertices = iso.vertices
- # Extract Faces
- vedo_faces = iso.cells
- # Subdivide Mesh
- tri_vertices, tri_faces = trimesh.remesh.subdivide_loop(vedo_vertices, np.array(vedo_faces).astype(int), iterations=1)
- # Tri Mesh
- tri_iso = trimesh.Trimesh(tri_vertices, tri_faces)
- # Convert to Vedo Mesh
- iso = vedo.trimesh2vedo(tri_iso)
- ### SMOOTH ###########################################################################
- # Correct Mesh
- pv_mesh = pv.wrap(correct_mesh(iso))
- # Convert to Tri Mesh
- pv_mesh_faces = pv_mesh.faces.reshape((pv_mesh.n_cells, 4))[:, 1:]
- # Convert to Tri Mesh
- tri_iso = trimesh.Trimesh(pv_mesh.points, pv_mesh_faces)
- # Convert to Vedo Mesh
- iso = vedo.trimesh2vedo(tri_iso)
- # ### DECIMATE ###########################################################################
- # Decimate Pro
- iso = iso.decimate_pro(
- n=ndecim,
- # preserve_topology=False,
- # preserve_boundaries=False,
- splitting=True
- )
- ### VEDO Smooth ###########################################################################
- # Correct Mesh
- pv_mesh = pv.wrap(correct_mesh(iso))
- # Convert to Tri Mesh
- pv_mesh_faces = pv_mesh.faces.reshape((pv_mesh.n_cells, 4))[:, 1:]
- # Convert to Tri Mesh
- tri_mesh = trimesh.Trimesh(pv_mesh.points, pv_mesh_faces)
- # Smooth Mesh
- trimesh.smoothing.filter_laplacian(tri_mesh, lamb=lamb, iterations=itr,)
- #### TEST
- # Convert to Vedo Mesh
- iso = vedo.trimesh2vedo(tri_mesh)
- # Correct Mesh
- pv_mesh = pv.wrap(correct_mesh(iso))
- # Convert to Tri Mesh
- pv_mesh_faces = pv_mesh.faces.reshape((pv_mesh.n_cells, 4))[:, 1:]
- # Convert to Tri Mesh
- tri_mesh = trimesh.Trimesh(pv_mesh.points, pv_mesh_faces)
- ### COMPUTE FEATURES ###########################################################################
- # Register Setup Parameters
- d = ndecim
- setup = f"s{lamb}_i{itr}_d{d}"
- # Compute Curvature Features
- # Tri mesh
- IMC = tri_mesh.integral_mean_curvature # Integral Mean Curvature
- # Compute Global Features
- # Tri mesh
- gf_tri_mesh = tri_mesh
- SA = gf_tri_mesh.area
- V = gf_tri_mesh.volume
- SAVR = SA/V
- # Capture Asphericity
- # Generate points
- pts = pv_mesh.points
- # Find the best fitting ellipsoid to the points
- elli = pca_ellipsoid(pts, pvalue=0.95) # https://vedo.embl.es/docs/vedo/pointcloud.html#pca_ellipsoid
- AS = elli.asphericity() # asphericity
- ASE = elli.asphericity_error() # error on asphericity
- # Capture Convexity and Geometry Features
- # Tri mesh
- cx_tri_mesh = tri_mesh
- # Compute Shape volume to Convex Hull volume ratio
- CxVR = V / cx_tri_mesh.convex_hull.volume # Volume devided by convex hull volume
- # Compute Shape area to Convex Hull area ratio
- CxSAR = SA / cx_tri_mesh.convex_hull.area
- # Compute Convex Hull volume
- CxV = cx_tri_mesh.convex_hull.volume
- # Compute Convex Hull area
- CxSA = cx_tri_mesh.convex_hull.area
- # Compute Convex Hull area to volume ratio
- CxSAVR = CxSA / CxV
- # Save Mesh
- ses_path = os.path.join(sub_dir, ses) # session dir path
- mesh_path = os.path.join(ses_path, f'{sub_id}_mesh.stl') # mesh destination path
- pv_mesh.save(mesh_path)
- # Features: ['linearity','planarity','sphericity','omnivariance','anisotropy','eigenentropy','sumOFEigs','changeOfCurvature','farthestDist','pointDensity','heightStd', 'heightMax']
- shape_m = shape_measurments(pv_mesh)
- L = shape_m['linearity']
- P = shape_m['planarity']
- SP = shape_m['sphericity']
- O = shape_m['omnivariance']
- AT = shape_m['anisotropy']
- ET = shape_m['eigenentropy']
- ES = shape_m['sumOFEigs']
- CC = shape_m['changeOfCurvature']
- FD = shape_m['farthestDist']
- PD = shape_m['pointDensity']
- Hmax = shape_m['heightMax']
- Hsd = shape_m['heightStd']
- # PyVista Curvature Mean
- GGC = np.mean(pv_mesh.curvature('gaussian'))
- GMC = np.mean(pv_mesh.curvature('mean'))
- Cmax = np.mean(pv_mesh.curvature('maximum'))
- Cmin = np.mean(pv_mesh.curvature('minimum'))
- # Create feature DataFrame
- # Measurment Names
- var_names = ['SA', 'V', 'SAVR', 'IMC', 'As', 'AsE',
- 'GC', 'MC', 'CMax', 'CMin',
- 'L', 'P', 'S', 'O', 'A', 'EE', 'SE', 'CC', 'PD', 'FD', 'HMax', 'HSD',
- 'CHV', 'CHSA', 'CHSAVR', 'CHSAR', 'CHVR',]
- # Measurments
- measurments = [SA,V,SAVR,IMC,AS,ASE,
- GGC,GMC,Cmax,Cmin,
- L,P,SP,O,AT,ET,ES,CC,FD,PD,Hmax,Hsd,
- CxV, CxSA,CxSAVR,CxSAR,CxVR,]
- col_names = ['MEASURMENT', 'VALUE']
- measurment_DF = pd.DataFrame(zip(var_names, measurments), columns=col_names)
- print(measurment_DF)
- # Extract Feature Values
- f_values = measurments
- # Add ID
- f_values.append(sub_id)
- # Add Setup
- f_values.append(setup)
- # Add Row to All Data List
- all_data_list.append(f_values)
- # Time per Loop
- now = time.time()
- print("It took {} seconds to process {} setup {}".format(now - program_starts,sub_id,setup))
- # Create Final DataFrame
- all_data_cols = ['SA', 'V', 'SAVR', 'IMC', 'As', 'AsE',
- 'GC', 'MC', 'CMax', 'CMin',
- 'L', 'P', 'S', 'O', 'A', 'EE', 'SE', 'CC', 'PD', 'FD', 'HMax', 'HSD',
- 'CHV', 'CHSA', 'CHSAVR', 'CHSAR', 'CHVR',
- 'ID', 'SETUP']
- all_data_df = pd.DataFrame(all_data_list, columns = all_data_cols)
- # Date Params
- year = datetime.now().year
- month = datetime.now().month
- day = datetime.now().day
- feature_data_dst = os.path.join(main_dir, f'feature_df_{day}-{month}-{year}.csv') # feature data dst
- # Save Data
- all_data_df.to_csv(feature_data_dst)
feature_extraction.py at commit 568b2ab, under CC0-1.0 · at the source
Overview
- School of Computing, University of Eastern Finland, Kuopio, 70211 Finland
- Faculty of Health Sciences, University of Eastern Finland, Kuopio, 70211 Finland
- Institute of Biomedicine, University of Eastern Finland, Kuopio, 70211 Finland
- Institute of Clinical Medicine–Radiology, University of Eastern Finland, Kuopio, 70211 Finland
- Combinostics Ltd., Tampere, 33100 Finland
- A.I. Virtanen Institute for Molecular Sciences, University of Eastern Finland, Kuopio, 70211 Finland
Abstract
Background: Idiopathic normal pressure hydrocephalus (iNPH) is characterized by a clinical triad of symptoms: abnormal gait, memory problems, and urinary incontinence. Neuroimaging plays a crucial role in diagnosing iNPH. However, current radiological markers, though indicative, are not definitive, suggesting the limited capacity of these indices to capture mechanisms associated with iNPH and the reversibility of the symptoms.
Aims: This study aims to (1) determine the geometric features of the lateral ventricles, (2) develop a quantitative method for three-dimensional analysis, and (3) test the ability to predict response to shunt surgery. By examining these features as potential diagnostic markers, this research seeks to enhance the understanding of morphometric characteristics in iNPH, thereby paving the way for improved patient selection for surgical intervention.
Methods: Our study contained 170 patients (95 shunt responders and 75 non-responders) from the Kuopio NPH registry. Our inclusion criteria required pre-surgery and one-year post-surgery symptom assessments alongside preoperative anatomical magnetic resonance imaging (MRI). Volumetric brain segmentations were performed using cNeuro software on T1-MRI images, followed by the generation of 3D lateral ventricle meshes for geometric feature extraction. The classification task employed the LogitNet machine learning model to analyze 27 geometric features. Model performance evaluation utilized repeated nested cross-validation (10 rounds) with five inner folds for parameter tuning and five outer folds for model evaluation. Additionally, we generated a ranking of feature importance based on the LogitNet L1 regularization coefficients.
Results: Our analysis revealed that LogitNet achieved an AUC of 0.661 (SD = 0.066) performance across 10 rounds of cross-validation in predicting the shunt surgery response. The most prominent feature contributing to the model’s prediction was asphericity.
Conclusion: Our analysis suggests that the proposed set of features, especially asphericity, effectively captures valuable information linked to the reversibility of iNPH.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 3 matches between paragraphs and lines of code.
AP-environment/3D-Mesh-Feature-Extraction
568b2ab9f1ce1921bb01ad24e6b1807631527d0a, 7 May 2025Availability: 1 check, the latest on 29 September 2026: the link answers
- 29 September 2026: the link answers
3 files
- feature_extraction.py, Python, 431 lines, 3 matches
- LICENSE, License, 121 lines
- README.md, Text, 2 lines
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:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 1 script, each with its path and the digest of its content;
- 3 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
No dataset and no data link were found in the paper.
Data availability
The feature extraction pipeline is available online at (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, 29 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 10 authors, 14 MeSH terms, 4 funders, 42 references.
Cite
This paper
Penkauskas, A., Kuukkanen, E., Lipponen, A., Hakumäki, J., Koikkalainen, J., Lotjonen, J., Erkkilä, L., Tohka, J., Miettinen, P., & Leinonen, V. (2026). Brain ventricle morphology markers in predicting shunt surgery outcome in idiopathic normal-pressure hydrocephalus. Fluids and barriers of the CNS, 23(1), 56. https://
BibTeX
@article{penkauskas2026b
author = {Penkauskas, Andrius and Kuukkanen, Eemeli and Lipponen, Anssi and Hakumäki, Juhana and Koikkalainen, Juha and Lotjonen, Jyrki and Erkkilä, Lauri and Tohka, Jussi and Miettinen, Pauli and Leinonen, Ville},
title = {{Brain ventricle morphology markers in predicting shunt surgery outcome in idiopathic normal-pressure hydrocephalus}},
journal = {Fluids and barriers of the CNS},
year = {2026},
month = apr,
volume = {23},
number = {1},
pages = {56},
publisher = {BMC},
issn = {2045-8118},
doi = {10.1186/
url = {https://
pmid = {41957814},
pmcid = {PMC13063911}
}
RIS
TY - JOUR
AU - Penkauskas, Andrius
AU - Kuukkanen, Eemeli
AU - Lipponen, Anssi
AU - Hakumäki, Juhana
AU - Koikkalainen, Juha
AU - Lotjonen, Jyrki
AU - Erkkilä, Lauri
AU - Tohka, Jussi
AU - Miettinen, Pauli
AU - Leinonen, Ville
TI - Brain ventricle morphology markers in predicting shunt surgery outcome in idiopathic normal-pressure hydrocephalus
T2 - Fluids and barriers of the CNS
J2 - Fluids Barriers CNS
PY - 2026
DA - 2026/
VL - 23
IS - 1
SP - 56
SN - 2045-8118
PB - BMC
DO - 10.1186/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1186/
"type": "article-journal",
"title": "Brain ventricle morphology markers in predicting shunt surgery outcome in idiopathic normal-pressure hydrocephalus",
"container-title": "Fluids and barriers of the CNS",
"author": [
{
"family": "Penkauskas",
"given": "Andrius"
},
{
"family": "Kuukkanen",
"given": "Eemeli"
},
{
"family": "Lipponen",
"given": "Anssi"
},
{
"family": "Hakumäki",
"given": "Juhana"
},
{
"family": "Koikkalainen",
"given": "Juha"
},
{
"family": "Lotjonen",
"given": "Jyrki"
},
{
"family": "Erkkilä",
"given": "Lauri"
},
{
"family": "Tohka",
"given": "Jussi"
},
{
"family": "Miettinen",
"given": "Pauli"
},
{
"family": "Leinonen",
"given": "Ville"
}
],
"container-title-short":
"volume": "23",
"issue": "1",
"page": "56",
"DOI": "10.1186/
"PMID": "41957814",
"PMCID": "PMC13063911",
"ISSN": "2045-8118",
"publisher": "BMC",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
9
]
]
}
}
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.1093/braincomms/fcag300
- Assessing CT-based volumetric analysis via deep learning for idiopathic normal pressure hydrocephalus.Journal: Brain communicationsIn common: structural MRI / diffusion, other condition, 6 references
- [2] doi:10.1371/journal.pmed.1004809 [code]
- Brain morphology in Anorexia Nervosa and its subtypes: A multi-cohort study of individual participant data.Journal: PLoS medicineIn common: NiBabel, pandas, NumPy, structural MRI / diffusion, other condition, 1 reference
- [3] doi:10.1002/epi4.70336 [code]
- Quantifying extra-lesional interhemispheric cortical asymmetry in focal cortical dysplasia type II.Journal: Epilepsia openIn common: NiBabel, pandas, NumPy, structural MRI / diffusion, clinical / translational, 1 reference
- [4] doi:10.1371/journal.pbio.3003856 [code]
- Aging and metabolism contribute separately to brain-body health.Journal: PLoS biologyIn common: NiBabel, pandas, NumPy, structural MRI / diffusion, clinical / translational, 1 reference
- [5] doi:10.1038/s41598-026-47942-4 [code]
- CT-based radiomic markers to predict late-onset seizures after traumatic brain injury.Journal: Scientific reportsIn common: NiBabel, pandas, NumPy, clinical / translational, other condition, 1 reference
- [6] doi:10.1093/brain/awag032 [code]
- A rostral prefrontal mediolateral gradient predicts creativity in frontotemporal dementia.Journal: Brain : a journal of neurologyIn common: NiBabel, pandas, NumPy, structural MRI / diffusion, 1 reference
- [7] doi:10.1093/schbul/sbag045 [code]
- Cortical Iron and Mesostriatal Dopamine Function in Schizophrenia: A Positron Emission Tomography and Magnetic Resonance Imaging Study.Journal: Schizophrenia bulletinIn common: NiBabel, pandas, NumPy, structural MRI / diffusion, 1 reference
- [8] doi:10.1038/s41598-026-56778-x [code]
- Chiari malformation type 1 is associated with a smaller fourth ventricle volume - a multi-cohort replication study.Journal: Scientific reportsIn common: NiBabel, pandas, NumPy, structural MRI / diffusion, 1 reference
- [9] doi:10.1162/imag.a.1252 [code]
- Does the brain's E:I balance really shape long-range temporal correlations? Lessons learned from 3T MRI.Journal: Imaging neuroscience (Cambridge, Mass.)In common: NiBabel, pandas, NumPy, structural MRI / diffusion, 1 reference
- [10] doi:10.1016/j.nicl.2026.104001 [code]
- Effect of vascular lesion preprocessing on Brain Intensity AbNormality Classification Algorithm (BIANCA) white matter hyperintensity segmentation.Journal: NeuroImage. ClinicalIn common: NiBabel, pandas, NumPy, structural MRI / diffusion, 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: 1 repository of the authors' code, each at its verified commit and with its license, 1 script, and 3 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:8148406c13188464…
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.
