use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Atlas {
DesikanKilliany68,
Destrieux148,
Schaefer100,
Schaefer200,
Schaefer400,
Custom(usize),
}
impl Atlas {
pub fn num_regions(&self) -> usize {
match self {
Atlas::DesikanKilliany68 => 68,
Atlas::Destrieux148 => 148,
Atlas::Schaefer100 => 100,
Atlas::Schaefer200 => 200,
Atlas::Schaefer400 => 400,
Atlas::Custom(n) => *n,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Hemisphere {
Left,
Right,
Midline,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Lobe {
Frontal,
Parietal,
Temporal,
Occipital,
Limbic,
Subcortical,
Cerebellar,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BrainRegion {
pub id: usize,
pub name: String,
pub hemisphere: Hemisphere,
pub lobe: Lobe,
pub centroid: [f64; 3],
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Parcellation {
pub atlas: Atlas,
pub regions: Vec<BrainRegion>,
}
impl Parcellation {
pub fn num_regions(&self) -> usize {
self.regions.len()
}
pub fn get_region(&self, id: usize) -> Option<&BrainRegion> {
self.regions.iter().find(|r| r.id == id)
}
pub fn regions_in_hemisphere(&self, hemisphere: Hemisphere) -> Vec<&BrainRegion> {
self.regions
.iter()
.filter(|r| r.hemisphere == hemisphere)
.collect()
}
pub fn regions_in_lobe(&self, lobe: Lobe) -> Vec<&BrainRegion> {
self.regions.iter().filter(|r| r.lobe == lobe).collect()
}
}