use crate::methods::dge_bulk::{EdgeRDgeRes, EdgeRQlParams, run_edger_ql};
use crate::prelude::*;
use crate::single_cell::mc_generation::cell_aggregation_utils::{
PseudoBulk, pseudo_bulk_genes_dense,
};
use edge_rs::glm::test::Tested;
#[allow(clippy::too_many_arguments)]
pub fn pseudobulk_dge<S: SingleCellReading>(
reader: &S,
gene_indices: &[usize],
sample_cells: &[Vec<usize>],
design: &[f64],
n_coef: usize,
tested: &Tested,
params: &EdgeRQlParams,
verbose: usize,
) -> Result<EdgeRDgeRes, BixverseErrors> {
let n_samples = sample_cells.len();
if design.len() != n_samples * n_coef {
return Err(BixverseErrors::DgeShapeMismatch {
name: "design",
expected: n_samples * n_coef,
got: design.len(),
});
}
let aggregate =
pseudo_bulk_genes_dense(reader, gene_indices, sample_cells, PseudoBulk::Raw, verbose)?;
let counts = mat_to_flat_row_major(aggregate.as_ref());
run_edger_ql(
&counts,
gene_indices.len(),
n_samples,
design,
n_coef,
tested,
params,
)
}