@@ -12,7 +12,7 @@ use crate::{
12
12
polymer_database:: { BondDescription , ModificationDescription , PolymerDatabase } ,
13
13
target:: { Index , Target } ,
14
14
} ,
15
- AnyMod , AnyModification , Bond , BondTarget , FunctionalGroup , GroupState , Id , NamedMod ,
15
+ AnyMod , AnyModification , Bond , BondTarget , Count , FunctionalGroup , GroupState , Id , NamedMod ,
16
16
PolychemError , Residue , Result ,
17
17
} ;
18
18
@@ -79,14 +79,12 @@ impl<'a, 'p> Polymerizer<'a, 'p> {
79
79
Ok ( residues)
80
80
}
81
81
82
- // FIXME: Might want to call this `modify` and either delete or rename the other, less-useful `modify`
83
82
pub fn modify (
84
83
& mut self ,
85
84
modification : impl Into < AnyModification < ' a , ' p > > ,
86
85
target : & mut Residue < ' a , ' p > ,
87
86
) -> Result < ( ) > {
88
87
let modification = modification. into ( ) ;
89
- // FIXME: Don't forget to be clever about the multiplier!
90
88
match modification. kind {
91
89
AnyMod :: Named ( m) => {
92
90
self . modify_with_optional_groups ( m. abbr ( ) , target, modification. multiplier )
@@ -103,6 +101,15 @@ impl<'a, 'p> Polymerizer<'a, 'p> {
103
101
self . modify_with_optional_groups ( abbr, target, 1 )
104
102
}
105
103
104
+ pub fn modify_only_groups (
105
+ & mut self ,
106
+ abbr : impl AsRef < str > ,
107
+ target : & mut Residue < ' a , ' p > ,
108
+ number : Count ,
109
+ ) -> Result < ( ) > {
110
+ self . modify_with_optional_groups ( abbr, target, number)
111
+ }
112
+
106
113
// PERF: Could create an `_unchecked` version for when you've already called `self.free_*_groups()` — skip straight
107
114
// to `self.update_group()`!
108
115
pub fn modify_group (
@@ -476,7 +483,8 @@ mod tests {
476
483
use rust_decimal_macros:: dec;
477
484
478
485
use crate :: {
479
- testing_tools:: assert_miette_snapshot, Massive , Modification , OffsetKind , OffsetMod ,
486
+ testing_tools:: assert_miette_snapshot, Charged , Massive , Modification , OffsetKind ,
487
+ OffsetMod ,
480
488
} ;
481
489
482
490
use super :: * ;
@@ -873,6 +881,67 @@ mod tests {
873
881
assert_miette_snapshot ! ( nonexistent_modification) ;
874
882
}
875
883
884
+ #[ test]
885
+ fn modify_only_groups ( ) {
886
+ let mut polymerizer = Polymerizer :: new ( & ATOMIC_DB , & POLYMER_DB ) ;
887
+ let mut murnac = polymerizer. residue ( "m" ) . unwrap ( ) ;
888
+ assert_eq ! ( murnac. monoisotopic_mass( ) , dec!( 293.11106657336 ) ) ;
889
+
890
+ polymerizer
891
+ . modify_only_groups ( "Met" , & mut murnac, 3 )
892
+ . unwrap ( ) ;
893
+ assert_eq ! ( murnac. monoisotopic_mass( ) , dec!( 335.15801676674 ) ) ;
894
+ let reducing_end = FunctionalGroup :: new ( "Hydroxyl" , "Reducing End" ) ;
895
+ let nonreducing_end = FunctionalGroup :: new ( "Hydroxyl" , "Nonreducing End" ) ;
896
+ let six_position = FunctionalGroup :: new ( "Hydroxyl" , "6-Position" ) ;
897
+ for hydroxyl_group in [ reducing_end, nonreducing_end, six_position] {
898
+ assert ! ( matches!(
899
+ murnac. group_state( & hydroxyl_group) . unwrap( ) ,
900
+ GroupState :: Modified ( _)
901
+ ) ) ;
902
+ }
903
+
904
+ let mut murnac = polymerizer. residue ( "m" ) . unwrap ( ) ;
905
+ assert_eq ! ( murnac. monoisotopic_mass( ) , dec!( 293.11106657336 ) ) ;
906
+ polymerizer
907
+ . modify_only_groups ( "Ca" , & mut murnac, 4 )
908
+ . unwrap ( ) ;
909
+ assert_eq ! ( murnac. charge( ) , 4 ) ;
910
+ assert_eq ! ( murnac. monoisotopic_mass( ) , dec!( 448.927935519603480 ) ) ;
911
+
912
+ let mut alanine = polymerizer. residue ( "A" ) . unwrap ( ) ;
913
+ assert_eq ! ( alanine. monoisotopic_mass( ) , dec!( 89.04767846918 ) ) ;
914
+ polymerizer
915
+ . modify_only_groups ( "Ca" , & mut alanine, 2 )
916
+ . unwrap ( ) ;
917
+ assert_eq ! ( alanine. charge( ) , 2 ) ;
918
+ assert_eq ! ( alanine. monoisotopic_mass( ) , dec!( 166.956112942301740 ) ) ;
919
+
920
+ let mut murnac = polymerizer. residue ( "m" ) . unwrap ( ) ;
921
+ polymerizer
922
+ . modify_only_groups ( "Met" , & mut murnac, 3 )
923
+ . unwrap ( ) ;
924
+ let all_groups_occupied = polymerizer. modify_only_groups ( "Ca" , & mut murnac, 4 ) ;
925
+ assert_miette_snapshot ! ( all_groups_occupied) ;
926
+ let still_all_groups_occupied = polymerizer. modify_only_groups ( "Ca" , & mut murnac, 2 ) ;
927
+ assert_miette_snapshot ! ( still_all_groups_occupied) ;
928
+
929
+ assert_eq ! ( murnac. monoisotopic_mass( ) , dec!( 335.15801676674 ) ) ;
930
+ polymerizer
931
+ . modify_only_groups ( "Ca" , & mut murnac, 1 )
932
+ . unwrap ( ) ;
933
+ assert_eq ! ( murnac. monoisotopic_mass( ) , dec!( 374.112234003300870 ) ) ;
934
+
935
+ // Start a new polymer by resetting the polymerizer
936
+ let mut polymerizer = polymerizer. reset ( ) ;
937
+ let residue_not_in_polymer = polymerizer. modify_only_groups ( "Ca" , & mut alanine, 2 ) ;
938
+ assert_miette_snapshot ! ( residue_not_in_polymer) ;
939
+
940
+ let mut murnac = polymerizer. residue ( "m" ) . unwrap ( ) ;
941
+ let no_matching_groups = polymerizer. modify_only_groups ( "Anh" , & mut murnac, 2 ) ;
942
+ assert_miette_snapshot ! ( no_matching_groups) ;
943
+ }
944
+
876
945
#[ test]
877
946
fn bond ( ) {
878
947
let mut polymerizer = Polymerizer :: new ( & ATOMIC_DB , & POLYMER_DB ) ;
0 commit comments