#[derive(Clone, Debug)]
pub struct MetacellsParams {
pub select: SelectParams,
pub similarity: SimilarityParams,
pub knn: MC2KnnParams,
pub partition: PartitionParams,
pub deviants: DeviantsParams,
pub dissolve: DissolveParams,
pub target_metacell_size: usize,
pub min_metacell_size: usize,
pub target_metacell_umis: u64,
pub must_complete_cover: bool,
pub random_seed: u64,
}
impl Default for MetacellsParams {
fn default() -> Self {
Self {
select: SelectParams::default(),
similarity: SimilarityParams::default(),
knn: MC2KnnParams::default(),
partition: PartitionParams::default(),
deviants: DeviantsParams::default(),
dissolve: DissolveParams::default(),
target_metacell_size: 48,
min_metacell_size: 12,
target_metacell_umis: 160_000,
must_complete_cover: false,
random_seed: 0,
}
}
}
#[derive(Clone, Debug)]
pub struct SelectParams {
pub downsample_min_samples: u32,
pub downsample_min_cell_quantile: f32,
pub downsample_max_cell_quantile: f32,
pub min_gene_total: Option<u32>,
pub min_gene_top3: Option<u32>,
pub min_gene_relative_variance: Option<f32>,
pub min_genes: usize,
pub relative_variance_window_size: usize,
pub lateral_gene_mask: Option<Vec<bool>>,
}
impl Default for SelectParams {
fn default() -> Self {
Self {
downsample_min_samples: 750,
downsample_min_cell_quantile: 0.05,
downsample_max_cell_quantile: 0.5,
min_gene_total: Some(50),
min_gene_top3: Some(4),
min_gene_relative_variance: Some(0.1),
min_genes: 100,
relative_variance_window_size: 100, lateral_gene_mask: None,
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum SimilarityMethod {
#[default]
LogPearson,
Pearson,
Spearman,
}
#[derive(Clone, Debug)]
pub struct SimilarityParams {
pub method: SimilarityMethod,
pub value_regularisation: f32,
}
impl Default for SimilarityParams {
fn default() -> Self {
Self {
method: SimilarityMethod::LogPearson,
value_regularisation: (1.0 / 7.0),
}
}
}
#[derive(Clone, Debug)]
pub struct MC2KnnParams {
pub balanced_ranks_factor: f32,
pub incoming_degree_factor: f32,
pub outgoing_degree_factor: f32,
pub min_outgoing_degree: usize,
pub k_size_factor: f32,
pub k_umis_quantile: f32,
pub min_knn_k: Option<usize>,
pub knn_k_override: Option<usize>,
}
impl Default for MC2KnnParams {
fn default() -> Self {
Self {
balanced_ranks_factor: (10_f32).sqrt(),
incoming_degree_factor: 3.0,
outgoing_degree_factor: 1.0,
min_outgoing_degree: 2,
k_size_factor: 2.0,
k_umis_quantile: 0.1,
min_knn_k: Some(30),
knn_k_override: None,
}
}
}
#[derive(Clone, Debug)]
pub struct PartitionParams {
pub cooldown_pass: f64,
pub cooldown_node: f64,
pub cooldown_phase: f64,
pub min_split_size_factor: f64,
pub max_merge_size_factor: f64,
pub max_split_min_cut_strength: f64,
pub min_cut_seed_cells: usize,
pub min_seed_size_quantile: f32,
pub max_seed_size_quantile: f32,
}
impl Default for PartitionParams {
fn default() -> Self {
Self {
cooldown_pass: 0.02,
cooldown_node: 0.25,
cooldown_phase: 0.75,
min_split_size_factor: 2.0,
max_merge_size_factor: 0.5,
max_split_min_cut_strength: 0.1,
min_cut_seed_cells: 7,
min_seed_size_quantile: 0.85,
max_seed_size_quantile: 0.95,
}
}
}
#[derive(Clone, Debug)]
pub struct DeviantsParams {
pub min_gene_fold_factor: f32,
pub max_gene_fraction: f32,
pub max_cell_fraction: f32,
pub gap_skip_cells: usize,
pub max_gap_cells_count: usize,
pub max_gap_cells_fraction: f32,
pub min_compare_umis: f32,
pub cells_regularisation_quantile: f32,
}
impl Default for DeviantsParams {
fn default() -> Self {
Self {
min_gene_fold_factor: 3.0, max_gene_fraction: 0.03,
max_cell_fraction: 0.25,
gap_skip_cells: 1,
max_gap_cells_count: 3,
max_gap_cells_fraction: 0.1,
min_compare_umis: 8.0,
cells_regularisation_quantile: 0.25,
}
}
}
#[derive(Clone, Debug)]
pub struct DissolveParams {
pub min_robust_size_factor: f32,
pub min_convincing_gene_fold_factor: Option<f32>,
}
impl Default for DissolveParams {
fn default() -> Self {
Self {
min_robust_size_factor: 0.5,
min_convincing_gene_fold_factor: Some(3.0),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn metacells_defaults() {
let p = MetacellsParams::default();
assert_eq!(p.target_metacell_size, 48);
assert_eq!(p.min_metacell_size, 12);
assert_eq!(p.target_metacell_umis, 160_000);
assert_eq!(p.knn.balanced_ranks_factor, (10_f32).sqrt());
}
}