public static IEnumerable<Peptide> GetUniquePeptides(Peptide peptide)
{
HashSet<QuantitationChannelSet> sets = new HashSet<QuantitationChannelSet>();
Dictionary<IQuantitationChannel, HashSet<int>> locations = new Dictionary<IQuantitationChannel, HashSet<int>>();
IMass[] mods = peptide.Modifications;
int modLength = mods.Length;
for (int i = 0; i < modLength; i++)
{
if (mods[i] != null)
{
IMass mod = mods[i];
List<QuantitationChannelSet> channelsets = new List<QuantitationChannelSet>();
QuantitationChannelSet quantSetMod;
ModificationCollection modCol;
if ((modCol = mod as ModificationCollection) != null)
{
foreach (IMass mod2 in modCol)
{
if ((quantSetMod = mod2 as QuantitationChannelSet) != null)
{
channelsets.Add(quantSetMod);
}
}
}
else if ((quantSetMod = mod as QuantitationChannelSet) != null)
{
channelsets.Add(quantSetMod);
}
foreach (QuantitationChannelSet channelset in channelsets)
{
sets.Add(channelset);
foreach (IQuantitationChannel channel in channelset.GetChannels())
{
HashSet<int> residues;
if (locations.TryGetValue(channel, out residues))
{
residues.Add(i);
}
else
{
residues = new HashSet<int> {i};
locations.Add(channel, residues);
}
}
}
}
}
if (sets.Count == 0)
{
yield return new Peptide(peptide, true);
}
else if (sets.Count == 1)
{
foreach (QuantitationChannelSet set in sets)
{
foreach (IQuantitationChannel channel in set.GetChannels())
{
Peptide toReturn = new Peptide(peptide, true);
foreach (int residue in locations[channel])
{
toReturn.SetModification(channel, residue);
}
yield return toReturn;
}
}
}
else
{
List<HashSet<IQuantitationChannel>> quantChannels = new List<HashSet<IQuantitationChannel>>();
GetUniquePeptides_helper(sets.ToList(), 0, new HashSet<IQuantitationChannel>(), quantChannels);
foreach (HashSet<IQuantitationChannel> channelset in quantChannels)
{
Peptide toReturn = new Peptide(peptide, true);
Dictionary<int, IMass> modsToAdd = new Dictionary<int, IMass>();
foreach (IQuantitationChannel channel in channelset)
{
foreach (int residue in locations[channel])
{
IMass modToAdd;
if (modsToAdd.TryGetValue(residue, out modToAdd))
{
ModificationCollection col = new ModificationCollection(channel, modToAdd);
modsToAdd[residue] = col;
}
else
{
modsToAdd.Add(residue, channel);
}
}
}
foreach (KeyValuePair<int, IMass> kvp in modsToAdd)
{
toReturn.SetModification(kvp.Value, kvp.Key);
}
yield return toReturn;
}
}
}