use derive_new::new;
use log::error;
use crate::{
config::WeightConfig,
math::{aggregate_pvalues, arithmetic_mean},
results::GeneResult,
};
#[derive(new, Debug)]
pub struct Amalgam {
membership_size: usize,
draw_index: usize,
pvalues: Vec<f64>,
logfc: Vec<f64>,
weight_config: WeightConfig,
}
impl TryFrom<Amalgam> for GeneResult {
type Error = crate::Error;
fn try_from(amalgam: Amalgam) -> Result<Self, Self::Error> {
if amalgam.membership_size == 0 {
error!("Found a membership size of zero for amalgam: {:?}", amalgam);
return Err(crate::Error::MembershipSizeOfZero);
} else if amalgam.pvalues.len() == 0 {
error!("Found the pvalues len of zero for amalgam: {:?}", amalgam);
return Err(crate::Error::MembershipSizeOfZero);
}
let mut pvalues = amalgam.pvalues;
let wgm = aggregate_pvalues(&mut pvalues, amalgam.weight_config);
let logfc = arithmetic_mean(&amalgam.logfc);
let gene = format!("amalgam_{}_{}", amalgam.membership_size, amalgam.draw_index);
Ok(GeneResult::builder()
.gene(gene)
.wgm(wgm)
.logfc(logfc)
.amalgam(true)
.build())
}
}