@@ -134,6 +134,59 @@ private static IEnumerable<SearchMode> LoadSearchModesFromFile()
134
134
yield return new OpenSearchMode ( ) ;
135
135
yield return new IntervalSearchMode ( new List < DoubleRange > { new DoubleRange ( - 0.005 , 0.005 ) , new DoubleRange ( 21.981943 - 0.005 , 21.981943 + 0.005 ) } ) ;
136
136
yield return new IntervalSearchMode ( new List < DoubleRange > { new DoubleRange ( - 187 , double . PositiveInfinity ) } ) ;
137
+ foreach ( var sm in GetResidueInclusionExclusionSearchModes ( new DoubleRange ( - 187 , double . PositiveInfinity ) , 0.0075 ) )
138
+ yield return sm ;
139
+ }
140
+
141
+ /// <summary>
142
+ /// Ideally v is less than 0.00168565165, so no overlaps happen
143
+ /// </summary>
144
+ /// <param name="doubleRange"></param>
145
+ /// <param name="v"></param>
146
+ /// <returns></returns>
147
+ private static IEnumerable < SearchMode > GetResidueInclusionExclusionSearchModes ( DoubleRange doubleRange , double v )
148
+ {
149
+ List < double > massesToExclude = new List < double > ( ) ;
150
+ for ( char c = 'A' ; c <= 'Z' ; c ++ )
151
+ {
152
+ Residue residue ;
153
+ if ( Residue . TryGetResidue ( c , out residue ) )
154
+ {
155
+ massesToExclude . Add ( residue . MonoisotopicMass ) ;
156
+ massesToExclude . Add ( - residue . MonoisotopicMass ) ;
157
+ for ( char cc = 'A' ; cc <= 'Z' ; cc ++ )
158
+ {
159
+ Residue residueCC ;
160
+ if ( Residue . TryGetResidue ( cc , out residueCC ) )
161
+ {
162
+ massesToExclude . Add ( residue . MonoisotopicMass + residueCC . MonoisotopicMass ) ;
163
+ massesToExclude . Add ( residue . MonoisotopicMass - residueCC . MonoisotopicMass ) ;
164
+ massesToExclude . Add ( - residue . MonoisotopicMass + residueCC . MonoisotopicMass ) ;
165
+ massesToExclude . Add ( - residue . MonoisotopicMass - residueCC . MonoisotopicMass ) ;
166
+ }
167
+ }
168
+ }
169
+ }
170
+ List < double > filteredMasses = massesToExclude . GroupBy ( b => Math . Round ( b , 6 ) ) . Select ( b => b . FirstOrDefault ( ) ) . OrderBy ( b => b ) . ToList ( ) ;
171
+
172
+ yield return new DotSearchMode ( "Only AAs" , filteredMasses , new Tolerance ( ToleranceUnit . Absolute , v ) ) ;
173
+
174
+ List < DoubleRange > doubleRanges = new List < DoubleRange > ( ) ;
175
+
176
+ var prevGoodMin = double . NegativeInfinity ;
177
+
178
+ for ( int i = 0 ; i < filteredMasses . Count ; i ++ )
179
+ {
180
+ if ( Math . Round ( filteredMasses [ i ] , 6 ) == 0 )
181
+ continue ;
182
+ doubleRanges . Add ( new DoubleRange ( prevGoodMin , filteredMasses [ i ] - v ) ) ;
183
+ prevGoodMin = filteredMasses [ i ] + v ;
184
+ }
185
+ doubleRanges . Add ( new DoubleRange ( prevGoodMin , double . PositiveInfinity ) ) ;
186
+
187
+ doubleRanges = doubleRanges . Where ( b => b . Minimum <= doubleRange . Maximum && b . Maximum >= doubleRange . Minimum ) . Select ( b => new DoubleRange ( Math . Max ( doubleRange . Minimum , b . Minimum ) , Math . Min ( doubleRange . Maximum , b . Maximum ) ) ) . ToList ( ) ;
188
+
189
+ yield return new IntervalSearchMode ( "Exclude AAs" , doubleRanges ) ;
137
190
}
138
191
139
192
private static int GuessCharge ( List < IMzPeak > mzPeaks )
0 commit comments