laddu 0.20.0

Amplitude analysis tools for Rust
Documentation
//! Demonstrates a complete in-memory dataset and model-analysis workflow.

use std::sync::Arc;

use laddu::{
    data::{data::OwnedEvent, schema::Schema},
    prelude::*,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let schema = Arc::new(Schema::new(std::iter::empty::<&str>(), ["mass"], true)?);
    let dataset = Dataset::from_events(
        schema,
        [
            OwnedEvent::weighted(vec![], vec![1.1], 1.0),
            OwnedEvent::weighted(vec![], vec![1.5], 1.0),
            OwnedEvent::weighted(vec![], vec![1.9], 1.0),
        ],
    )?;
    let execution = Execution::default();
    let mass = event_scalar("mass");
    let selected = dataset.select(
        &Predicate::ge(mass.clone(), 1.2).and(Predicate::lt(mass.clone(), 2.0)),
        &execution,
    )?;
    let bins = selected.bin_by(&mass, BinSpec::uniform(2, 1.2, 2.0)?, &execution)?;

    let s_wave = Expr::from(parameter!("S", initial: 1.0)).tagged("S");
    let d_wave = (Expr::from(parameter!("D", initial: 0.5)) * mass).tagged("D");
    let model = CompiledModel::from_expr(&(s_wave + d_wave).norm_sqr())?;
    let likelihood = Likelihood::new([NllTerm::new("waves", &model, &selected, &selected)?])?;
    let projection = likelihood.projection("waves", &selected, ["S"])?;
    let weights = projection.weights(&likelihood.default_params(), true)?;

    println!("{} bins, {} projected weights", bins.len(), weights.len());
    Ok(())
}