Skip to main content

segul/writer/
contigs.rs

1//! Contig summary writer
2use std::{
3    io::{Result, Write},
4    path::{Path, PathBuf},
5};
6
7use crate::stats::contigs::ContigSummary;
8
9use super::FileWriter;
10
11const OUTPUT_SUFFIX: &str = "contig-summary";
12const DEFAULT_EXTENSION: &str = "csv";
13
14pub struct ContigSummaryWriter<'a> {
15    summary: &'a [ContigSummary],
16    output: &'a Path,
17    prefix: Option<&'a str>,
18}
19
20impl FileWriter for ContigSummaryWriter<'_> {}
21
22impl<'a> ContigSummaryWriter<'a> {
23    pub fn new(summary: &'a [ContigSummary], output: &'a Path, prefix: Option<&'a str>) -> Self {
24        Self {
25            summary,
26            output,
27            prefix,
28        }
29    }
30
31    pub fn write(&self) -> Result<()> {
32        let output_path = self.create_final_output_path();
33        let mut writer = self
34            .create_output_file(&output_path)
35            .expect("Failed writing to file");
36        self.write_records(&mut writer)?;
37        writer.flush()?;
38        Ok(())
39    }
40
41    fn create_final_output_path(&self) -> PathBuf {
42        match self.prefix {
43            Some(prefix) => {
44                let file_name = format!("{}_{}", prefix, OUTPUT_SUFFIX);
45                self.output
46                    .join(file_name)
47                    .with_extension(DEFAULT_EXTENSION)
48            }
49            None => self
50                .output
51                .join(OUTPUT_SUFFIX)
52                .with_extension(DEFAULT_EXTENSION),
53        }
54    }
55
56    fn write_records<W: Write>(&self, writer: &mut W) -> Result<()> {
57        writeln!(
58            writer,
59            "file_path,contig_name,\
60            contig_count,base_count,nucleotide,\
61            GC_content,AT_content,\
62            sum,min,max,mean,median,\
63            N50,N75,N90,\
64            contig_750,contig_1000,contig_1500,\
65            G_Count,C_Count,A_Count,T_Count"
66        )?;
67        for summary in self.summary {
68            writeln!(
69                writer,
70                "{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}",
71                summary.file_path,
72                summary.contig_name,
73                summary.contig_count,
74                summary.base_count,
75                summary.nucleotide,
76                summary.gc_content,
77                summary.at_content,
78                summary.stats.sum,
79                summary.stats.min,
80                summary.stats.max,
81                summary.stats.mean,
82                summary.stats.median,
83                summary.nstats.n50,
84                summary.nstats.n75,
85                summary.nstats.n90,
86                summary.contig750,
87                summary.contig1000,
88                summary.contig1500,
89                summary.g_count,
90                summary.c_count,
91                summary.a_count,
92                summary.t_count,
93            )?;
94        }
95
96        Ok(())
97    }
98}