/// <summary> /// Peptide Encoding Problem: Find substrings of a genome encoding a given amino acid sequence. /// </summary> /// <param name="DNA">A DNA string</param> /// <param name="Peptide">An amino acid string</param> /// <returns>All substrings of Text encoding Peptide (if any such substrings exist).</returns> public static string PeptideEncoding(string DNA, string Peptide) { List <string>[] encodes = new List <string> [Peptide.Length]; Protein p = new Protein(); for (int i = 0; i < Peptide.Length; i++) { encodes[i] = p.GetPeptideEncodes(Peptide[i].ToString()); } string cur_adv, cur_rev; List <int> adv_match, rev_match; Dictionary <int, string> matches = new Dictionary <int, string>(); RNAConstructorState cur_pos = new RNAConstructorState(0, "", true, true); Stack <RNAConstructorState> stack = new Stack <RNAConstructorState>(); stack.Push(cur_pos); FileStream fs1 = File.OpenWrite(@".\PA2_2_debug.txt"); TextWriter wr = new StreamWriter(fs1); foreach (List <string> e in encodes) { foreach (string s in e) { wr.Write(s + " "); } wr.WriteLine(); } do { if (cur_pos.Position < encodes[stack.Count - 1].Count) // position in the range -> check substring { cur_adv = stack.Peek().AdvRNA + Protein.UntranscribeRNA(encodes[stack.Count - 1][cur_pos.Position]); //adv_match = cur_pos.IsAdvMatch ? BioInf_PA1.FindPatternPositions(cur_adv, DNA) : null; adv_match = BioInf_PA1.FindPatternPositions(cur_adv, DNA); //todo Fix the check (is previous IsAdvMatch spoiled?) cur_rev = BioInf_PA1.ReverseComplement(cur_adv); //rev_match = cur_pos.IsRevMatch ? BioInf_PA1.FindPatternPositions(cur_rev, DNA) : null; rev_match = BioInf_PA1.FindPatternPositions(cur_rev, DNA); wr.WriteLine("Adv[{1}.{0}]: {2} - {3}", stack.Count, cur_pos.Position, cur_adv, adv_match != null ? adv_match.Count : 0); wr.WriteLine("Rev[{1}.{0}]: {2} - {3}", stack.Count, cur_pos.Position, cur_rev, rev_match != null ? rev_match.Count : 0); if (adv_match != null || rev_match != null) { // There are some matches if (stack.Count < encodes.Length) { // Not last level -> Go to next level (INTO) cur_pos.AdvRNA = cur_adv; cur_pos.IsAdvMatch = adv_match != null; cur_pos.IsRevMatch = rev_match != null; stack.Push(cur_pos); cur_pos.Position = 0; } else // Last level -> Add the match and go to next substring (ADD + NEXT) { if (adv_match != null) { foreach (int pos in adv_match) { matches.Add(pos, cur_adv); // Full string was matched } } if (rev_match != null) { foreach (int pos in rev_match) { matches.Add(pos, cur_rev); } } cur_pos.Position++; } } else // Go to next substring on the current level (NEXT) { cur_pos.Position++; } } else // x out of the range for current level { if (stack.Count > 1) { // Not the first level -> Go to previous level (OUT) cur_pos = stack.Pop(); cur_pos.Position++; } else // Last substring of last level -> EXIT { break; } } } while (true); string str = ""; foreach (KeyValuePair <int, string> kv in matches) { //str = str + kv.Value + " " + kv.Key + "\n"; str = str + kv.Value + " "; } return(str.TrimEnd(' ')); }