bcore/datamodel/
tallies.rs

1use csv::Writer;
2use ndarray::ArrayView2;
3use serde::{Deserialize, Serialize};
4use serde_json;
5use super::vec_to_array_view2;
6#[derive(Debug, Serialize, Deserialize)]
7pub struct Tallies(pub Vec<f64>);
8
9impl Tallies {
10    pub fn validate(&self) -> bool {
11        self.0.len() % 6 == 0
12    }
13
14    pub fn to_json(&self) -> serde_json::Result<String> {
15        serde_json::to_string_pretty(&self.0)
16    }
17
18    pub fn to_csv(&self) -> Result<String, String> {
19        if !self.validate() {
20            return Err(
21                "Validation failed: The number of elements is not divisible by 6.".to_string(),
22            );
23        }
24
25        let headers = vec![
26            "NewParticle",
27            "Death",
28            "Move",
29            "Exit",
30            "Overflow",
31            "ChangeWeight",
32        ];
33        let mut wtr = Writer::from_writer(vec![]);
34
35        wtr.write_record(&headers).map_err(|e| e.to_string())?;
36
37        for row in self.0.chunks(6) {
38            wtr.serialize(row).map_err(|e| e.to_string())?;
39        }
40        let data = String::from_utf8(wtr.into_inner().map_err(|e| e.to_string())?)
41            .map_err(|e| e.to_string())?;
42        Ok(data)
43    }
44
45    pub fn to_array(&self)->ArrayView2<f64>
46    {
47        vec_to_array_view2(&self.0, self.0.len()/6, 6)
48    }
49}