From acb5c8976ed32eb1853b13a9dc84c723ca3a8af2 Mon Sep 17 00:00:00 2001 From: Fizzizist Date: Mon, 24 Feb 2025 20:33:28 -0500 Subject: [PATCH] PRTM --- rust/src/main.rs | 1 + rust/src/solutions/mod.rs | 2 ++ rust/src/solutions/prtm.rs | 32 ++++++++++++++++++++++++++++++++ rust/src/utils.rs | 24 ++++++++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 rust/src/solutions/prtm.rs diff --git a/rust/src/main.rs b/rust/src/main.rs index 7557da2..ffafb47 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -6,6 +6,7 @@ use utils::run_solution; #[derive(clap::ValueEnum, Clone, Debug)] enum Problem { REVP, + PRTM, } #[derive(Parser, Debug)] diff --git a/rust/src/solutions/mod.rs b/rust/src/solutions/mod.rs index 40a9382..2c5307d 100644 --- a/rust/src/solutions/mod.rs +++ b/rust/src/solutions/mod.rs @@ -1,2 +1,4 @@ +mod prtm; mod revp; +pub use prtm::prtm; pub use revp::revp; diff --git a/rust/src/solutions/prtm.rs b/rust/src/solutions/prtm.rs new file mode 100644 index 0000000..1db76c0 --- /dev/null +++ b/rust/src/solutions/prtm.rs @@ -0,0 +1,32 @@ +use crate::utils::AMINO_ACID_MASS_TABLE; +use std::collections::HashMap; + +pub fn prtm(file_content: String) -> String { + let mut out_mass = 0.0; + let mass_map: HashMap = AMINO_ACID_MASS_TABLE.iter().cloned().collect(); + for aa in file_content.trim().chars() { + out_mass += mass_map + .get(&aa) + .expect("The given letter was not in the map"); + } + // rounds to 3 decimal places + return ((out_mass * 1000.0).round() / 1000.0).to_string(); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_prtm() { + let input_content = "SKADYEK".to_string(); + let expected = "821.392"; + assert_eq!(prtm(input_content), expected); + } + #[test] + fn test_prtm_float64() { + let input_content = "DVMPGSWEYQNMGDENESNPGQTQHYCIDWAGWRDTHPNCPQMPEFSISGPPYIAKRPSCKISPMDKLTATYWEAHAFNARVLKSNCMWQCPMLMNHMQNAQCCGFGRWECAWMTAINQGSFDYARFGFYTATINASFILCTDWIMVVWSRPSARVSKRWHYDPQSGAYSRENCYVHNYLPHDQNRCIYGNFQTFHGTFCVRGPSSVNTADWWTQRCYMPHQQMLVQPSRMWYTGARPHPRWTHRHNHIRFWWGCHKVCYKWIRGNDIHCHKFTYVVNGSGKATGCEALCNEWQTWGHRFQLESGYRQMCANRCSNRKEHYICDVCGRYFVNYVSFRLLLMKPDDMYETGDIFEGLSIYGTNHKGIVPLWPIMHRMAIKTKTAACEFQGTEKQPVTKVDSNRWCMNGWEQPITTMIQVGLSMGYVRWVCMAGPTSQPQAGGNFPEHPVMQCQKVRQECVLCPMSGRMEPWRTDFGDHNGMDIKVMNNFQPMCISTGTIMLNDPCMSIVDKSAEYCYTWFFVDFWKWYAVPNIIDREWGCCCNNSCEKDYRSRAKADTHHVCSVYFQTVNSRFRPARENYKHTGFRMLQRLPIHNTAAANDMVYLVHMMIRHFFPLLHKPCDETGPHNGKIKWFWLCGDINWARSSDSYIRWLNNYMWFMSERMVNWRFIEKDNQVFDAYRASAWFVGWVLWRQDGFACGHCQLECRHTFAMDEMSHGGIYWNRPVQLVEARGPHCMRLHHLQQGFILIWDFMNDLGQRKDFGCSTHGYGFNYNNFQHIDAWTMYTFTEASNFCTITAHDDADLLPHHCRPRGKCGVTNCKQNALIIATPLRYILHRVTVTCIGLQVQCRCTDGIMDENFALCMVIIHLLNYYHTNAFRRLKTHNENSSKPDNWCNNRGGHMCMKTTRVMETKWLEATLW".to_string(); + let expected = "107861.254"; + assert_eq!(prtm(input_content), expected); + } +} diff --git a/rust/src/utils.rs b/rust/src/utils.rs index 65f14f0..1882ee6 100644 --- a/rust/src/utils.rs +++ b/rust/src/utils.rs @@ -1,6 +1,29 @@ use crate::{solutions, Problem}; use std::{fs, io}; +pub const AMINO_ACID_MASS_TABLE: [(char, f64); 20] = [ + ('A', 71.03711), + ('C', 103.00919), + ('D', 115.02694), + ('E', 129.04259), + ('F', 147.06841), + ('G', 57.02146), + ('H', 137.05891), + ('I', 113.08406), + ('K', 128.09496), + ('L', 113.08406), + ('M', 131.04049), + ('N', 114.04293), + ('P', 97.05276), + ('Q', 128.05858), + ('R', 156.10111), + ('S', 87.03203), + ('T', 101.04768), + ('V', 99.06841), + ('W', 186.07931), + ('Y', 163.06333), +]; + pub struct FastaRecord { pub id: String, pub sequence: String, @@ -11,6 +34,7 @@ pub fn run_solution(problem: Problem, in_file: &String, out_file: &String) { let solution: io::Result = match fs::read_to_string(in_file) { Ok(content) => match problem { Problem::REVP => Ok(solutions::revp(content)), + Problem::PRTM => Ok(solutions::prtm(content)), }, Err(e) => Err(e), };