protected IEnumerable<Dictionary<int, Modification>> GetVariableModificationPatterns(Dictionary<int, List<Modification>> possibleVariableModifications)
{
if(possibleVariableModifications.Count == 0 && (KnownModifications == null || KnownModifications.Count == 0))
{
yield return null;
}
else
{
Dictionary<int, List<Modification>> possible_variable_modifications = new Dictionary<int, List<Modification>>(possibleVariableModifications);
if(KnownModifications != null)
{
foreach(KeyValuePair<int, List<Modification>> kvp in KnownModifications)
{
foreach(Modification modification in kvp.Value)
{
if(modification.AminoAcid != BaseSequence[kvp.Key - 2])
{
throw new Exception("Known modification amino acid mismatch in " + ((this is Peptide) ? ((Peptide)this).Parent.Description : ((Protein)this).Description));
}
}
List<Modification> modifications;
if(!possible_variable_modifications.TryGetValue(kvp.Key, out modifications))
{
modifications = kvp.Value;
possible_variable_modifications.Add(kvp.Key, modifications);
}
else
{
modifications.AddRange(kvp.Value);
}
}
}
int[] base_variable_modification_pattern = new int[Length + 4];
for(int variable_modifications = 0; variable_modifications <= possible_variable_modifications.Count; variable_modifications++)
{
foreach(int[] variable_modification_pattern in GetVariableModificationPatterns(new List<KeyValuePair<int, List<Modification>>>(possible_variable_modifications), possible_variable_modifications.Count - variable_modifications, base_variable_modification_pattern, 0))
{
yield return GetVariableModificationPattern(variable_modification_pattern, possible_variable_modifications);
}
}
}
}