Analysis¶
The analysis module evaluates simulation results by computing statistics within regions of interest (ROIs). It supports spherical and cortical atlas ROIs in both mesh and voxel space.
graph LR
FIELD([Field Data]) --> ANALYZER[Analyzer]
ROI([ROI Specification]) --> ANALYZER
ANALYZER --> STATS([ROI Statistics])
ANALYZER --> VIZ([Visualizations])
ANALYZER --> CSV([CSV Export])
style FIELD fill:#1a3a5c,stroke:#48a,color:#fff
style ROI fill:#1a3a5c,stroke:#48a,color:#fff
style ANALYZER fill:#2d5a27,stroke:#4a8,color:#fff
style STATS fill:#1a5c4a,stroke:#4a8,color:#fff
style VIZ fill:#1a5c4a,stroke:#4a8,color:#fff
style CSV fill:#1a5c4a,stroke:#4a8,color:#fff
Single-Subject Analysis¶
Spherical ROI¶
from tit.analyzer import Analyzer
analyzer = Analyzer(
subject_id="001",
simulation="motor_cortex",
space="mesh",
tissue_type="GM", # "GM", "WM", or "both" (voxel only; mesh always uses GM)
)
result = analyzer.analyze_sphere(
center=(-42, -20, 55),
radius=10,
coordinate_space="MNI",
visualize=True,
)
# Access metrics
print(f"ROI Mean: {result.roi_mean:.4f} V/m")
print(f"ROI Max: {result.roi_max:.4f} V/m")
print(f"ROI Min: {result.roi_min:.4f} V/m")
print(f"Focality: {result.roi_focality:.2f}")
print(f"GM Mean: {result.gm_mean:.4f} V/m")
print(f"GM Max: {result.gm_max:.4f} V/m")
print(f"N elements: {result.n_elements}")
Cortical Atlas ROI¶
The region parameter accepts a single region name or a list of region names
whose masks are combined into one ROI.
result = analyzer.analyze_cortex(atlas="DK40", region="lh.precentral")
# Multiple regions combined into a single ROI
result = analyzer.analyze_cortex(atlas="DK40", region=["lh.precentral", "lh.postcentral"])
Analysis Spaces¶
| Space | Method | Description |
|---|---|---|
"mesh" |
Surface-based | Analysis on the cortical mesh, weighted by node areas |
"voxel" |
Volume-based | Analysis on NIfTI data, weighted by voxel volumes |
When to Use Each Space
Use mesh space for cortical targets where surface geometry matters (e.g., normal/tangential field components). Use voxel space for deep brain targets or when you need MNI-aligned volumetric analysis.
ROI Types¶
Define a sphere by center coordinates and radius. Works in both MNI and subject coordinate spaces.
Use a predefined cortical atlas parcellation (e.g., Desikan-Killiany DK40, HCP_MMP1). A single region or a list of regions can be provided.
Result Metrics¶
Each analysis returns an AnalysisResult dataclass with these fields:
| Field | Description |
|---|---|
field_name |
SimNIBS field name (e.g., "TI_max") |
region_name |
Human-readable ROI identifier |
space |
"mesh" or "voxel" |
analysis_type |
"spherical", "cortical", "mask" or "subcortical" |
roi_mean |
Weighted mean field intensity within the ROI |
roi_max |
Maximum field intensity within the ROI |
roi_min |
Minimum field intensity within the ROI |
roi_focality |
Ratio of ROI mean intensity to whole-tissue mean |
gm_mean |
Mean field intensity across all gray matter (or tissue) |
gm_max |
Maximum field intensity across all gray matter (or tissue) |
normal_mean |
Mean of the normal-component field in the ROI (mesh only, optional) |
normal_max |
Max of the normal-component field in the ROI (mesh only, optional) |
normal_focality |
Focality of the normal-component field (mesh only, optional) |
percentile_95 |
95th percentile of field intensity (area/volume-weighted) |
percentile_99 |
99th percentile of field intensity |
percentile_99_9 |
99.9th percentile of field intensity |
focality_50_area |
Area (cm^2, mesh) or volume (cm^3, voxel) above 50% of 99.9th percentile |
focality_75_area |
Area (cm^2, mesh) or volume (cm^3, voxel) above 75% of 99.9th percentile |
focality_90_area |
Area (cm^2, mesh) or volume (cm^3, voxel) above 90% of 99.9th percentile |
focality_95_area |
Area (cm^2, mesh) or volume (cm^3, voxel) above 95% of 99.9th percentile |
n_elements |
Number of mesh nodes or voxels in the ROI |
total_area_or_volume |
Total area (mm^2, mesh) or volume (mm^3, voxel) of the ROI |
hf_peak_roi_mean, hf_peak_gm_mean |
Weighted mean hf_peak (V/m) over the same ROI and GM elements (modulation fields only, optional) |
hf_peak_focality |
hf_peak_roi_mean / hf_peak_gm_mean: focality of the stimulation (carrier) intensity |
hf_rms_roi_mean, hf_rms_gm_mean, hf_rms_focality |
The same on the RMS carrier field hf_rms (V/m) |
ti_selectivity |
roi_focality / hf_peak_focality; above 1 the modulation is more focal than its carriers |
hf_peak_focality_50_area ... hf_peak_focality_95_area |
focality_*_area computed on hf_peak |
carrier_note |
Why a carrier metric is None (a carrier field has no usable values on the analysed elements, or the analysed field is a carrier field) |
on_demand_note |
What the analysis computed or wrote because the simulation had not saved it (None when everything was saved) |
Group Analysis¶
Compare results across multiple subjects:
from tit.analyzer import run_group_analysis
group_result = run_group_analysis(
subject_ids=["001", "002", "003"],
simulation="motor_cortex",
space="mesh",
tissue_type="GM",
analysis_type="spherical",
center=(-42, -20, 55),
radius=10,
coordinate_space="MNI",
visualize=True,
)
# group_result.subject_results: dict of per-subject AnalysisResult
# group_result.summary_csv_path: path to group_summary.csv
# group_result.comparison_plot_path: path to comparison bar chart PDF
The run_group_analysis function also supports cortical atlas ROIs:
group_result = run_group_analysis(
subject_ids=["001", "002", "003"],
simulation="motor_cortex",
space="mesh",
analysis_type="cortical",
atlas="DK40",
region="lh.precentral",
visualize=True,
)
Statistical Testing¶
For formal group comparisons (e.g., responders vs non-responders), use the tit.stats module:
from tit.stats import GroupComparisonConfig, run_group_comparison
# Load subjects from CSV (columns: subject_id, simulation_name, response)
subjects = GroupComparisonConfig.load_subjects("/data/my_project/subjects.csv")
config = GroupComparisonConfig(
analysis_name="responder_comparison",
subjects=subjects,
test_type=GroupComparisonConfig.TestType.UNPAIRED,
n_permutations=5000,
alpha=0.05,
cluster_threshold=0.05,
)
result = run_group_comparison(config)
print(f"Significant clusters: {result.n_significant_clusters}")
print(f"Significant voxels: {result.n_significant_voxels}")
The tit.stats module also supports voxel-wise correlation analysis via
CorrelationConfig and run_correlation.
API Reference¶
tit.analyzer.analyzer.AnalysisResult
dataclass
¶
AnalysisResult(field_name: str, region_name: str, space: str, analysis_type: str, roi_mean: float, roi_max: float, roi_min: float, roi_focality: float, gm_mean: float, gm_max: float, normal_mean: float | None = None, normal_max: float | None = None, normal_focality: float | None = None, percentile_95: float | None = None, percentile_99: float | None = None, percentile_99_9: float | None = None, focality_50_area: float | None = None, focality_75_area: float | None = None, focality_90_area: float | None = None, focality_95_area: float | None = None, n_elements: int = 0, total_area_or_volume: float = 0.0, hf_peak_roi_mean: float | None = None, hf_peak_gm_mean: float | None = None, hf_peak_focality: float | None = None, hf_rms_roi_mean: float | None = None, hf_rms_gm_mean: float | None = None, hf_rms_focality: float | None = None, ti_selectivity: float | None = None, hf_peak_focality_50_area: float | None = None, hf_peak_focality_75_area: float | None = None, hf_peak_focality_90_area: float | None = None, hf_peak_focality_95_area: float | None = None, carrier_note: str | None = None, on_demand_note: str | None = None)
Immutable container for ROI analysis statistics.
Returned by :meth:Analyzer.analyze_sphere and
:meth:Analyzer.analyze_cortex.
Attributes¶
field_name : str
Name of the field that was analyzed (e.g. "TI_max").
region_name : str
Human-readable ROI label.
space : str
"mesh" or "voxel".
analysis_type : str
"spherical", "cortical" or "mask".
roi_mean : float
Area/volume-weighted mean field value inside the ROI.
roi_max : float
Maximum field value inside the ROI.
roi_min : float
Minimum field value inside the ROI.
roi_focality : float
Ratio of ROI mean to the whole selected tissue's mean (> 1 means the
ROI is stronger than that tissue's average).
gm_mean : float
Mean field value across all positive elements of the whole selected
tissue: the GM surface in mesh space; the GM, WM or GM+WM voxels of
the tissue selection in voxel space (results.csv says which in its
tissue row). The gm_ name is kept for every tissue.
gm_max : float
Maximum field value across the same elements.
normal_mean : float or None
Weighted mean of the normal-component field in the ROI (mesh only;
None when unavailable).
normal_max : float or None
Maximum normal-component field in the ROI.
normal_focality : float or None
Normal-component focality ratio.
percentile_95 : float or None
95th percentile of the whole selected tissue's field distribution.
percentile_99 : float or None
99th percentile of the same distribution.
percentile_99_9 : float or None
99.9th percentile of the same distribution.
focality_50_area : float or None
Area/volume where the field exceeds 50 % of the 99.9th percentile
value -- cm^2 in mesh space, cm^3 in voxel space (the _area
name is kept for both spaces).
focality_75_area : float or None
Same for 75 % threshold.
focality_90_area : float or None
Same for 90 % threshold.
focality_95_area : float or None
Same for 95 % threshold.
n_elements : int
Number of ROI mesh nodes or voxels with a positive field value -- the
elements every roi_* statistic and total_area_or_volume describe,
defined identically in both spaces.
total_area_or_volume : float
Total surface area (mm^2) or volume (mm^3) of positive-valued ROI
elements.
hf_peak_roi_mean, hf_peak_gm_mean : float or None
Area/volume-weighted mean hf_peak (peak carrier field, V/m) over
the same ROI and GM elements as roi_mean / gm_mean.
hf_peak_focality : float or None
hf_peak_roi_mean / hf_peak_gm_mean: focality of the stimulation (carrier)
intensity, the carrier counterpart of roi_focality.
hf_rms_roi_mean, hf_rms_gm_mean : float or None
Weighted mean of the saved hf_rms field (RMS carrier field over time,
sqrt(hf_power), V/m) over the same elements.
hf_rms_focality : float or None
hf_rms_roi_mean / hf_rms_gm_mean.
ti_selectivity : float or None
roi_focality / hf_peak_focality: above 1 the modulation is more focal
than the stimulation, at or below 1 a plain kHz field targets as well.
hf_peak_focality_50_area ... hf_peak_focality_95_area : float or None
focality_*_area computed on hf_peak (same units, same
99.9th-percentile convention, same GM elements).
carrier_note : str or None
Why a carrier metric is None: the analysed field is itself a
carrier field, or a carrier field has no usable values on the
analysed elements. None when every carrier metric is present.
on_demand_note : str or None
What this analysis produced because the simulation had not saved it
(a field computed from the channel meshes, a NIfTI written from the
field mesh), in the words it logged; None when everything was
saved. What it produced stays in the simulation's outputs.
See Also¶
Analyzer : Single-subject field analyzer. GroupResult : Container for multi-subject group analysis.
tit.analyzer.analyzer.Analyzer ¶
Analyzer(subject_id: str, simulation: str, space: str = 'mesh', tissue_type: str = 'GM', output_dir: str | None = None, field: str | None = None)
Unified analyzer for mesh and voxel field data.
Lazily loads the field file on first analysis call. All coordinate transforms and ROI masking are handled internally.
Parameters¶
subject_id : str
Subject identifier (without sub- prefix).
simulation : str
Simulation (montage) folder name.
space : str, optional
"mesh" or "voxel". Default "mesh".
tissue_type : str, optional
"GM", "WM", or "both". Only affects voxel analyses;
mesh analyses always use the GM cortical surface. Default "GM".
output_dir : str or None, optional
Override output directory. If None, derived from PathManager.
field : str or None, optional
Field to analyze, from constants.FIELD_REGISTRY (e.g.
"hf_peak", "TI_normal"). Default None resolves the
TI_max/mTI_max envelope. See :func:select_field_file. A volume
field the simulation did not save -- the analysed field, or the
hf_peak / hf_rms a modulation field's carrier metrics read --
is produced first, from the simulation's channel meshes, and saved
into its outputs (:mod:tit.volume_fields); so is the NIfTI a voxel
analysis reads. on_demand_note on the result says what was.
Attributes¶
subject_id : str
Subject identifier.
simulation : str
Simulation folder name.
space : str
Analysis space ("mesh" or "voxel").
tissue_type : str
Normalised tissue selection ("GM", "WM", or "BOTH").
field_path : pathlib.Path
Resolved path to the field file.
field_name : str
Short name of the field (e.g. "TI_max").
m2m_path : str
Path to the subject's m2m_* directory.
output_dir : str or None
Output directory override, or None.
Raises¶
FileNotFoundError
If no field file exists for subject_id/simulation in space
(run the simulation first), or a field it needs was not saved and
cannot be produced (:class:tit.volume_fields.FieldUnavailableError,
naming what is missing).
ValueError
If space is not "mesh"/"voxel" or field is not a known
field name.
Examples¶
from tit.analyzer import Analyzer analyzer = Analyzer("ernie", "L_Insula", space="voxel") # doctest: +SKIP result = analyzer.analyze_sphere( ... center=(-35.0, 5.0, 5.0), radius=10.0, coordinate_space="MNI", ... ) # doctest: +SKIP result.roi_mean, result.roi_focality # doctest: +SKIP (0.21, 1.8) cortex = Analyzer("ernie", "L_Insula", space="mesh").analyze_cortex( ... atlas="DK40", region="lh.insula", visualize=True) # doctest: +SKIP cortex.analysis_type, cortex.focality_50_area # doctest: +SKIP ('cortical', 42.1)
See Also¶
AnalysisResult : Container for single-subject analysis outputs. run_group_analysis : Multi-subject group analysis.
Source code in tit/analyzer/analyzer.py
volume_fields_read
staticmethod
¶
The volume fields an analysis of field in space reads (job preflight asks too).
The analysed field itself (not TI_normal, a surface field) and, for a modulation
field, the hf_peak / hf_rms its carrier metrics read. A request
:func:select_field_file will refuse (unknown field or space, TI_normal in voxel
space) reads none.
Source code in tit/analyzer/analyzer.py
analyze_sphere ¶
analyze_sphere(center: tuple[float, float, float], radius: float, coordinate_space: str = 'subject', visualize: bool = False) -> AnalysisResult
Analyze a spherical ROI.
Parameters¶
center : tuple of float
(x, y, z) coordinates of the sphere centre.
radius : float
Radius in mm.
coordinate_space : str, optional
"subject" (default) or "MNI". When "MNI",
coordinates are transformed to subject space via SimNIBS
mni2subject_coords.
visualize : bool, optional
Also write the ROI overlay, its scene and histogram.png
(results.csv and analysis.json are written either way).
Returns¶
AnalysisResult ROI and whole-GM statistics for the spherical region.
Raises¶
FileNotFoundError If the required field or surface mesh file does not exist. ValueError If center is not three finite numbers or radius is not a positive finite number, or if the sphere holds no positive field value (an empty ROI has no statistics).
See Also¶
analyze_cortex : Atlas-based cortical ROI analysis.
Source code in tit/analyzer/analyzer.py
analyze_spheres ¶
analyze_spheres(spheres, coordinate_space: str = 'subject', visualize: bool = False) -> AnalysisResult
Analyze several spherical ROIs unioned into a single ROI.
The spheres are combined with a logical OR before any statistic is
computed, so the result describes one ROI covering all of them --
overlapping spheres are not double-counted. Passing a single sphere
is equivalent to :meth:analyze_sphere.
Parameters¶
spheres : sequence of tuple of float
One (x, y, z, r) per sphere.
coordinate_space : str, optional
"subject" (default) or "MNI", applied to every sphere.
visualize : bool, optional
Also write the ROI overlay, its scene and histogram.png
(results.csv and analysis.json are written either way).
Returns¶
AnalysisResult ROI and whole-GM statistics for the combined region.
Raises¶
ValueError If spheres is empty, a sphere lacks a finite centre or a positive finite radius, or their union holds no positive field value.
See Also¶
analyze_sphere : Single spherical ROI analysis.
Source code in tit/analyzer/analyzer.py
analyze_cortex ¶
Analyze a cortical atlas region.
Parameters¶
atlas : str
Atlas name recognised by SimNIBS (e.g. "DK40",
"HCP_MMP1"), or an absolute path to an atlas NIfTI
(voxel mode only).
region : str or list of str
Region name within the atlas (e.g. "lh.cuneus"), or a
list of region names whose masks are unioned into a single
combined ROI. Bare names like "cuneus" expand to both
hemispheres in mesh mode.
visualize : bool, optional
Also write the ROI overlay, its scene and histogram.png
(results.csv and analysis.json are written either way).
Returns¶
AnalysisResult ROI and whole-GM statistics for the cortical region.
Raises¶
KeyError If a region name cannot be resolved in the atlas. FileNotFoundError If the atlas or field file does not exist.
See Also¶
analyze_sphere : Spherical ROI analysis.
Source code in tit/analyzer/analyzer.py
analyze_mask ¶
analyze_mask(mask_path: str, coordinate_space: str = 'subject', visualize: bool = False) -> AnalysisResult
Analyze positive NIfTI voxels sampled onto subject geometry.
MNI masks use the optimizer's nonlinear m2m registration. Nearest-neighbour sampling preserves binary membership; mesh results remain GM surface-area statistics and voxel results retain the selected tissue and volume units.
Parameters¶
mask_path : str
Path to a 3-D NIfTI mask (.nii/.nii.gz); voxels > 0
form the ROI.
coordinate_space : str, optional
"subject" (default) or "mni" (case-insensitive).
visualize : bool, optional
Also write the ROI overlay, its scene and histogram.png
(results.csv and analysis.json are written either way).
Returns¶
AnalysisResult
ROI and whole-GM statistics for the mask region, with
analysis_type="mask".
Raises¶
ValueError
If coordinate_space is not "subject"/"mni", the file is
not a readable finite 3-D NIfTI, or (mesh mode) the mask does not
overlap the grey-matter surface.
See Also¶
analyze_sphere : Spherical ROI analysis. analyze_cortex : Atlas-based cortical ROI analysis.
Source code in tit/analyzer/analyzer.py
analyze_subcortical ¶
analyze_subcortical(atlas: str, region: str | list[str], coordinate_space: str = 'subject', visualize: bool = False) -> AnalysisResult
Analyze regions of a volumetric (label) atlas, in subject or MNI space.
The selected labels (islands removed, as for every volumetric ROI) become one
binary mask in the atlas's own space, which is then measured exactly as
:meth:analyze_mask measures a mask: an MNI atlas goes through the subject's
nonlinear m2m registration, a mesh analysis samples the mask onto the GM
surface, a voxel analysis onto the field grid within the selected tissue.
Parameters¶
atlas : str
Subject space: an atlas name the catalog lists for the subject
("labeling.nii.gz", a FreeSurfer volume such as
"aparc.DKTatlas+aseg.mgz", "masks/<file>") or a file path.
MNI space: a shipped MNI atlas id (its file name) or a file path.
region : str or list of str
Region name(s) or integer label(s); several are unioned into one ROI.
coordinate_space : str, optional
"subject" (default) or "mni" -- the space atlas is in.
visualize : bool, optional
Also write the ROI overlay, its scene and histogram.png
(results.csv and analysis.json are written either way).
Returns¶
AnalysisResult
ROI statistics with analysis_type="subcortical".
Raises¶
FileNotFoundError If the atlas cannot be found. ValueError If a region is not in the atlas, or the ROI does not overlap the GM surface (mesh; a deep structure has none) or the selected tissue (voxel).
Source code in tit/analyzer/analyzer.py
729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 | |
voxel_atlas_candidates
classmethod
¶
Every path :meth:_resolve_voxel_atlas tries for atlas name, in search order.
Shared with :mod:tit.jobs.preflight, so the submit-time check and the runner
cannot disagree about where a subject's volume atlas lives.
Source code in tit/analyzer/analyzer.py
surface_regions_without_volume
classmethod
¶
The names in regions a voxel analysis of surface atlas atlas cannot measure.
Shared with :mod:tit.jobs.preflight, so such a region is refused at submit, not
after the job started. Only DK40 (read from the DKT volume) has any.
Source code in tit/analyzer/analyzer.py
match_region_label
staticmethod
¶
The label id whose name region names, or None.
labels is (id, name) pairs in ascending id order. The exact name (any case)
wins, then a surface-style hemisphere name's volume spelling, then the first name
containing region. Shared with :mod:tit.jobs.preflight, which matches against
the atlas's whole lookup table -- names the volume may not carry -- so it only
asks whether region names anything; the runner
(:meth:_find_voxel_region_id) refuses a name several present labels contain.
Source code in tit/analyzer/analyzer.py
tit.analyzer.group.GroupResult
dataclass
¶
GroupResult(subject_results: dict[str, AnalysisResult], summary_csv_path: Path, comparison_plot_path: Path | None)
Outcome of a multi-subject group analysis.
Attributes¶
subject_results : dict of str to AnalysisResult
Mapping of subject ID to its
:class:~tit.analyzer.analyzer.AnalysisResult.
summary_csv_path : pathlib.Path
Path to the summary CSV (one row per subject plus an AVERAGE row).
comparison_plot_path : pathlib.Path or None
Path to the 2x2 comparison bar-chart PDF, or None if plotting
failed.
See Also¶
run_group_analysis : Factory function that produces this result. AnalysisResult : Per-subject analysis container.
tit.analyzer.group.run_group_analysis ¶
run_group_analysis(subject_ids: list[str], simulation: str, space: str = 'mesh', tissue_type: str = 'GM', analysis_type: str = 'spherical', center: tuple[float, float, float] | None = None, radius: float | None = None, coordinate_space: str = 'subject', spheres: Sequence[tuple[float, float, float, float]] | None = None, atlas: str | None = None, region: str | list[str] | None = None, visualize: bool = False, output_dir: str | Path | None = None, field: str | None = None, mask_path: str | None = None) -> GroupResult
Run the same ROI analysis across multiple subjects and summarise.
Dispatches to analyze_sphere or analyze_cortex on each subject,
builds a summary CSV (with an AVERAGE row), and generates a 2x2
comparison bar-chart PDF.
Parameters¶
subject_ids : list of str
Subject identifiers (without sub- prefix).
simulation : str
Simulation (montage) folder name, shared by all subjects.
space : str, optional
"mesh" or "voxel". Default "mesh".
tissue_type : str, optional
"GM", "WM", or "both" (voxel only). Default "GM".
analysis_type : str, optional
"spherical", "cortical", "subcortical" or "mask".
Default "spherical".
center : tuple of float or None, optional
(x, y, z) sphere centre; required when analysis_type is
"spherical".
radius : float or None, optional
Sphere radius in mm; required when analysis_type is
"spherical".
coordinate_space : str, optional
"subject" or "MNI" (spherical, subcortical and mask): the
space of the sphere centre, the volume atlas or the mask. Default
"subject"; a group spherical or mask analysis requires "MNI"
(one target for every subject).
spheres : sequence of tuple of float or None, optional
One (x, y, z, r) per sphere, unioned into a single ROI
(spherical only). Takes precedence over center/radius.
atlas : str or None, optional
Atlas name (cortical and subcortical).
region : str, list of str, or None, optional
Region name or list of region names (cortical and subcortical).
visualize : bool, optional
Generate per-subject visualization artifacts. Default False.
output_dir : str, pathlib.Path, or None, optional
Override output directory. If None, each run writes to its own
derivatives/ti-toolbox/group_analysis/<simulation>_<space>_<target>[_<field>][_<tissue>]_<timestamp>/
(the field and tissue suffixes as :func:group_run_name adds them; a second
run of the same name started in the same second gets _2, _3, ...). The
per-subject analyses always go to each subject's own default folder.
field : str or None, optional
Field to analyze (constants.FIELD_REGISTRY name, e.g.
"TI_max", "TI_normal", "hf_peak"). Default None
resolves the TI_max/mTI_max envelope per subject.
mask_path : str or None, optional
MNI-space NIfTI mask (analysis_type="mask" only).
Returns¶
GroupResult
Per-subject results, the summary CSV path
(group_summary.csv), and the comparison plot path.
Raises¶
KeyError
If analysis_type is not "spherical", "cortical",
"subcortical" or "mask"; or if a subject's atlas lacks a
region, and then the message starts with sub-<id>:.
ValueError
If coordinate_space is not "subject"/"MNI"; if
analysis_type="mask" or "spherical" with a non-MNI
coordinate_space, or an unreadable mask_path; if a sphere is
missing or lacks a finite centre or a positive, finite radius
(checked once, before any subject); or if a
subject's analysis is refused (for example its ROI is empty), and
then the message starts with sub-<id>:.
FileNotFoundError
If a subject has no field file for simulation in space.
Examples¶
from tit.analyzer import run_group_analysis res = run_group_analysis( ... subject_ids=["ernie", "101"], simulation="L_Insula", space="voxel", ... analysis_type="spherical", center=(-35.0, 5.0, 5.0), radius=10.0, ... coordinate_space="MNI", ... ) # doctest: +SKIP res.summary_csv_path.name, sorted(res.subject_results) # doctest: +SKIP ('group_summary.csv', ['101', 'ernie']) run_group_analysis(["ernie", "101"], "L_Insula", space="mesh", ... analysis_type="cortical", atlas="DK40", ... region="lh.insula") # doctest: +SKIP
See Also¶
Analyzer : Single-subject analyzer used internally per subject. GroupResult : Container for the returned outcomes.
Source code in tit/analyzer/group.py
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 | |