use gsva::EnrichmentResult;
use crate::data::SpillModel;
pub fn transform_scores(
raw: &EnrichmentResult,
spill: &SpillModel,
scale: bool,
) -> EnrichmentResult {
let nsamp = raw.samples.len();
let mut out_types = Vec::new();
let mut scores = Vec::new();
for (i, ct) in raw.gene_sets.iter().enumerate() {
let Some(v2) = spill.v2(ct) else { continue };
let v3 = if scale {
spill.v3(ct).expect("fv has V2 but not V3")
} else {
1.0
};
let row = &raw.scores[i * nsamp..(i + 1) * nsamp];
let mn = row.iter().copied().fold(f64::INFINITY, f64::min);
let denom = v3 * 2.0;
out_types.push(ct.clone());
for &x in row {
let mut t = (x - mn) / 5000.0;
if t < 0.0 {
t = 0.0;
}
scores.push(t.powf(v2) / denom);
}
}
EnrichmentResult {
gene_sets: out_types,
samples: raw.samples.clone(),
scores,
}
}