use crate::options::density::default_gate_colors;
use crate::options::{AxisOptions, BasePlotOptions, PlotOptions};
use derive_builder::Builder;
#[derive(Builder, Clone, Debug)]
#[builder(setter(into, strip_option), default)]
pub struct HistogramPlotOptions {
#[builder(default)]
pub base: BasePlotOptions,
#[builder(default)]
pub x_axis: AxisOptions,
#[builder(default = "true")]
pub histogram_filled: bool,
#[builder(default = "50")]
pub num_bins: usize,
#[builder(default)]
pub gate_colors: Vec<(u8, u8, u8)>,
#[builder(default = "0.0")]
pub baseline_separation: f32,
#[builder(default = "false")]
pub scale_to_peak: bool,
#[builder(default = "2.0")]
pub line_width: f64,
}
impl Default for HistogramPlotOptions {
fn default() -> Self {
Self {
base: BasePlotOptions::default(),
x_axis: AxisOptions::default(),
histogram_filled: true,
num_bins: 50,
gate_colors: Vec::new(),
baseline_separation: 0.0,
scale_to_peak: false,
line_width: 2.0,
}
}
}
impl PlotOptions for HistogramPlotOptions {
fn base(&self) -> &BasePlotOptions {
&self.base
}
}
impl HistogramPlotOptions {
pub fn new() -> HistogramPlotOptionsBuilder {
HistogramPlotOptionsBuilder::default()
}
pub fn gate_color(&self, gate_id: u32) -> (u8, u8, u8) {
let colors = if self.gate_colors.is_empty() {
default_gate_colors()
} else {
self.gate_colors.clone()
};
colors
.get(gate_id as usize)
.copied()
.unwrap_or((60, 60, 60))
}
}