bcore/datamodel/
tallies.rs1use 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}