diff --git a/modules/bindings/pymod/clustalw.py b/modules/bindings/pymod/clustalw.py index 6f0434da5b79c00cc02f45d01ceeeab4ceab8b52..2c2fd6ebac5cf580dd1a259cb087a0ada9a127c4 100644 --- a/modules/bindings/pymod/clustalw.py +++ b/modules/bindings/pymod/clustalw.py @@ -3,7 +3,8 @@ from ost import settings, io, seq, LogError import os import subprocess -def ClustalW(seq1, seq2=None, clustalw=None, keep_files=False, nopgap=False): +def ClustalW(seq1, seq2=None, clustalw=None, keep_files=False, nopgap=False, + clustalw_option_string=False): clustalw_path=settings.Locate(('clustalw', 'clustalw2'), explicit_file_name=clustalw) @@ -34,6 +35,9 @@ def ClustalW(seq1, seq2=None, clustalw=None, keep_files=False, nopgap=False): out) if nopgap: command+=" -nopgap" + if clustalw_option_string!=False: + command=command+" "+clustalw_option_string #see useful flags: http://toolkit.tuebingen.mpg.de/clustalw/help_params + ps=subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) ps.stdout.readlines() aln=io.LoadAlignment(out) diff --git a/modules/bindings/tests/test_clustalw.py b/modules/bindings/tests/test_clustalw.py index 010b636eb7bc249a86e84516dad81ca27c00b646..0536df8f77f868c27b93edbf92fd37a5f9a3d31d 100644 --- a/modules/bindings/tests/test_clustalw.py +++ b/modules/bindings/tests/test_clustalw.py @@ -15,9 +15,15 @@ class TestClustalWBindings(unittest.TestCase): self.pw_alignment = io.LoadAlignment("testfiles/pairwise_aln.fasta") self.nopgap_pw_alignment = io.LoadAlignment("testfiles/nopgap_pairwise_aln.fasta") self.mult_alignment = io.LoadAlignment("testfiles/multiple_aln.fasta") + self.strseq1 = self.targetseq.GetGaplessString() self.strseq2 = self.templseq.GetGaplessString() - + + self.seq1 = io.LoadSequence("testfiles/seq1.fasta") + self.seq2 = io.LoadSequence("testfiles/seq2.fasta") + self.seq1_seq2_alignment = io.LoadAlignment("testfiles/seq1_seq2_aln.fasta") + self.seq1_seq2_alignment_options_changed = io.LoadAlignment("testfiles/seq1_seq2_aln_options_changed.fasta") + def testPairwiseClustalW(self): aln=clustalw.ClustalW(self.targetseq, self.templseq) assert self.pw_alignment.ToString(80) == aln.ToString(80), \ @@ -46,6 +52,15 @@ class TestClustalWBindings(unittest.TestCase): "Pairwise alignment using two strings differs from precomputed one \n%s \n%s" \ %(self.pw_alignment.ToString(80),aln.ToString(80)) + def testPairwiseClustalWChangedOptions(self): + # five residues removed two positions before the end of seq2 + aln=clustalw.ClustalW(self.seq1,self.seq2) + assert self.seq1_seq2_alignment.ToString(80) == aln.ToString(80), \ + "Pairwise alignment with default gap penalties differs from precomputed one" + aln=clustalw.ClustalW(self.seq1,self.seq2,clustalw_option_string="-GAPOPEN=2 -GAPEXT=0") + assert self.seq1_seq2_alignment_options_changed.ToString(80) == aln.ToString(80), \ + "Pairwise alignment with modified gap penalties differs from precomputed one" + if __name__ == "__main__": # test if clustalw package is available on system, otherwise ignore tests try: diff --git a/modules/bindings/tests/testfiles/seq1.fasta b/modules/bindings/tests/testfiles/seq1.fasta new file mode 100644 index 0000000000000000000000000000000000000000..7aa326305015b25f0416e416fe14afe19984e29a --- /dev/null +++ b/modules/bindings/tests/testfiles/seq1.fasta @@ -0,0 +1,2 @@ +>target +MAETLIKVDLNQSPYDNPQVHNRWHPDIPMAVWVEPGAEFKLETYDWTGGAIKNDDSAEDVRDVDLSTVHFLSGPVGVKGAEPGDLLVVDLLDIGARDDSLWGFNGFFSKQNGGGFLDEHFPLAQKSIWDFHGMFTKSRHIPGVNFAGLIHPGLIGCLPDPKMLASWNERETGLIATDPDRIPGLANPPNATTAHMGQMQGEARDKAAAEGARTVPPREHGGNCDIKDLSRGSRVFFPVYVDGAGLSVGDLHFSQGDGEITFCGAIEMAGWVHMKVSLIKGGMAKYGIKNPIFKPSPMTPNYKDYLIFEGISVDEKGKQHYLDVTVAYRQACLNAIEYLKKFGYSGAQAYSLLGTAPVQGHISGVVDVPNACATLWLPTEIFDFDINPTAEGPQKIITGGVDLPIAQDK \ No newline at end of file diff --git a/modules/bindings/tests/testfiles/seq1_seq2_aln.fasta b/modules/bindings/tests/testfiles/seq1_seq2_aln.fasta new file mode 100644 index 0000000000000000000000000000000000000000..e735762a95916b563ad735f89eaa3c22376fd505 --- /dev/null +++ b/modules/bindings/tests/testfiles/seq1_seq2_aln.fasta @@ -0,0 +1,4 @@ +>target +MAETLIKVDLNQSPYDNPQVHNRWHPDIPMAVWVEPGAEFKLETYDWTGGAIKNDDSAEDVRDVDLSTVHFLSGPVGVKGAEPGDLLVVDLLDIGARDDSLWGFNGFFSKQNGGGFLDEHFPLAQKSIWDFHGMFTKSRHIPGVNFAGLIHPGLIGCLPDPKMLASWNERETGLIATDPDRIPGLANPPNATTAHMGQMQGEARDKAAAEGARTVPPREHGGNCDIKDLSRGSRVFFPVYVDGAGLSVGDLHFSQGDGEITFCGAIEMAGWVHMKVSLIKGGMAKYGIKNPIFKPSPMTPNYKDYLIFEGISVDEKGKQHYLDVTVAYRQACLNAIEYLKKFGYSGAQAYSLLGTAPVQGHISGVVDVPNACATLWLPTEIFDFDINPTAEGPQKIITGGVDLPIAQDK +>model +---------------------------------VEPGAEFKLETYDWTGGAIKNDDSAEDVRDVDLSTVHFLSGPVGVKGAEPGDLLVVDLLDIGARDDSLWGFNGFFSKQNGGGFLDEHFPLAQKSIWDFHGMFTKSRHIPGVNFAGLIHPGLIGCLPDPKMLASWNERETGLIATDPDRIPGLANPPNATTAHMGQMQGEARDKAAAEGARTVPPREHGGNCDIKDLSRGSRVFFPVYVDGAGLSVGDLHFSQGDGEITFCGAIEMAGWVIK--------------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/modules/bindings/tests/testfiles/seq1_seq2_aln_options_changed.fasta b/modules/bindings/tests/testfiles/seq1_seq2_aln_options_changed.fasta new file mode 100644 index 0000000000000000000000000000000000000000..3efdc6cd889b07a900a1f63e6d5e8f1d13552af9 --- /dev/null +++ b/modules/bindings/tests/testfiles/seq1_seq2_aln_options_changed.fasta @@ -0,0 +1,4 @@ +>target +MAETLIKVDLNQSPYDNPQVHNRWHPDIPMAVWVEPGAEFKLETYDWTGGAIKNDDSAEDVRDVDLSTVHFLSGPVGVKGAEPGDLLVVDLLDIGARDDSLWGFNGFFSKQNGGGFLDEHFPLAQKSIWDFHGMFTKSRHIPGVNFAGLIHPGLIGCLPDPKMLASWNERETGLIATDPDRIPGLANPPNATTAHMGQMQGEARDKAAAEGARTVPPREHGGNCDIKDLSRGSRVFFPVYVDGAGLSVGDLHFSQGDGEITFCGAIEMAGWVHMKVSLIKGGMAKYGIKNPIFKPSPMTPNYKDYLIFEGISVDEKGKQHYLDVTVAYRQACLNAIEYLKKFGYSGAQAYSLLGTAPVQGHISGVVDVPNACATLWLPTEIFDFDINPTAEGPQKIITGGVDLPIAQDK +>model +---------------------------------VEPGAEFKLETYDWTGGAIKNDDSAEDVRDVDLSTVHFLSGPVGVKGAEPGDLLVVDLLDIGARDDSLWGFNGFFSKQNGGGFLDEHFPLAQKSIWDFHGMFTKSRHIPGVNFAGLIHPGLIGCLPDPKMLASWNERETGLIATDPDRIPGLANPPNATTAHMGQMQGEARDKAAAEGARTVPPREHGGNCDIKDLSRGSRVFFPVYVDGAGLSVGDLHFSQGDGEITFCGAIEMAGWV------IK--------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/modules/bindings/tests/testfiles/seq2.fasta b/modules/bindings/tests/testfiles/seq2.fasta new file mode 100644 index 0000000000000000000000000000000000000000..72a58bd2acab10c6be354a59e75b28eea045a906 --- /dev/null +++ b/modules/bindings/tests/testfiles/seq2.fasta @@ -0,0 +1,2 @@ +>model +VEPGAEFKLETYDWTGGAIKNDDSAEDVRDVDLSTVHFLSGPVGVKGAEPGDLLVVDLLDIGARDDSLWGFNGFFSKQNGGGFLDEHFPLAQKSIWDFHGMFTKSRHIPGVNFAGLIHPGLIGCLPDPKMLASWNERETGLIATDPDRIPGLANPPNATTAHMGQMQGEARDKAAAEGARTVPPREHGGNCDIKDLSRGSRVFFPVYVDGAGLSVGDLHFSQGDGEITFCGAIEMAGWVIK \ No newline at end of file diff --git a/modules/seq/alg/pymod/renumber.py b/modules/seq/alg/pymod/renumber.py index f6d7d128f115dc499d2ded3ad2f265114227a9ad..39f34ba7b0dc68b4c84421e6b14ac606a9ddc107 100644 --- a/modules/seq/alg/pymod/renumber.py +++ b/modules/seq/alg/pymod/renumber.py @@ -1,11 +1,11 @@ from ost import io, seq, mol, conop -import ost +from ost import * -def Renumber(seq_handle): +def Renumber(seq_handle, sequence_number_with_attached_view=1): """ Function to renumber an entity according to an alignment between the model sequence - and the full-length target sequence. The aligned model sequence with an attached - view needs to be provided. Upon succcess, the renumbered entity is returned. + and the full-length target sequence. The aligned model sequence or the alignment itself + with an attached view needs to be provided. Upon succcess, the renumbered entity is returned. .. code-block:: python @@ -16,35 +16,70 @@ def Renumber(seq_handle): pdb_seq=seq.SequenceFromChain("model", ent.chains[0]) aln=ClustalW(s,pdb_seq) aln.AttachView(1,ent.chains[0].Select("")) - e=Renumber(aln.GetSequence(1)) + e=Renumber(aln.GetSequence(sequence_number_with_attached_view)) io.SavePDB(e, "renum.pdb") """ - if seq_handle.HasAttachedView()==False: - raise RuntimeError, "Sequence Handle has no attached view" - changed_residue_count=0 - renumberingFlag = False - ent_n=mol.CreateEntity() - ed=ent_n.EditXCS() - c=ed.InsertChain(" ") - for pos in range(len(seq_handle)): - if seq_handle[pos]!='-': - r=seq_handle.GetResidue(pos) - if r.IsValid(): - #print seq_handle[pos],r.number.num,pos+1 - if r.number.num!=pos+1: - changed_residue_count+=1 - renumberingFlag = True - r_n=ed.AppendResidue(c,r.name, mol.ResNum(pos+1)) - for atom in r.atoms: - ed.InsertAtom(r_n,atom.name,atom.pos,atom.prop) - else: - err='Error: renumbering failed at position %s' %pos - raise RuntimeError, err - if renumberingFlag == True: - err = 'Warning: %s residues have been renumbered!' %changed_residue_count - ost.LogMessage(err) - conop.ConnectAll(ent_n) - return ent_n + if isinstance(seq_handle, seq.SequenceHandle): + if seq_handle.HasAttachedView()==False: + raise RuntimeError, "Sequence Handle has no attached view" + changed_residue_count=0 + renumberingFlag = False + ent_n=mol.CreateEntity() + ed=ent_n.EditXCS() + c=ed.InsertChain(" ") + for pos in range(len(seq_handle)): + if seq_handle[pos]!='-': + r=seq_handle.GetResidue(pos) + if r.IsValid(): + #print seq_handle[pos],r.number.num,pos+1 + if r.number.num!=pos+1: + changed_residue_count+=1 + renumberingFlag = True + r_n=ed.AppendResidue(c,r.name, mol.ResNum(pos+1)) + for atom in r.atoms: + ed.InsertAtom(r_n,atom.name,atom.pos,atom.prop) + else: + err='Error: renumbering failed at position %s' %pos + raise RuntimeError, err + if renumberingFlag == True: + err = 'Warning: %s residues have been renumbered!' %changed_residue_count + LogInfo(err) + conop.ConnectAll(ent_n) + return ent_n + elif isinstance(seq_handle, seq.AlignmentHandle): + if seq_handle.GetSequence(sequence_number_with_attached_view).HasAttachedView()==False: + raise RuntimeError, "Sequence Handle has no attached view" + dir(seq_handle) + counter=0 + changed_residue_count=0 + renumberingFlag = False + ent_n=mol.CreateEntity() + ed=ent_n.EditXCS() + c=ed.InsertChain(seq_handle.GetSequence(sequence_number_with_attached_view).GetAttachedView().chains[0].name) + for col in seq_handle: + if col[0]!='-' and col[1]!='-': + if col[0]==col[1]: + rnum=seq_handle.GetSequence(sequence_number_with_attached_view).GetResidueIndex(counter) + r=seq_handle.GetSequence(sequence_number_with_attached_view).GetResidue(counter) + if r.IsValid(): + if r.number.num!=counter+1: + changed_residue_count+=1 + renumberingFlag = True + r_n=ed.AppendResidue(c,r.name, mol.ResNum(counter+1)) + for atom in r.atoms: + ed.InsertAtom(r_n,atom.name,atom.pos,atom.element, atom.b_factor, + atom.occupancy, atom.is_hetatom) + + else: + raise RuntimeError("invalide residue at postion %s (renumbering failed)" %(counter)) + else: + raise RuntimeError("residue mismatch at position %d (%s vs %s) (renumbering failed)"%(counter, col[0],col[1])) + counter+=1 + if renumberingFlag == True: + err = 'Warning: %s residues have been renumbered!' %changed_residue_count + LogInfo(err) + conop.ConnectAll(ent_n) + return ent_n diff --git a/modules/seq/alg/tests/CMakeLists.txt b/modules/seq/alg/tests/CMakeLists.txt index 37969a869b14c0f740f2b8e221509120f1cd1a6e..aafdabc4b723b7ee0ac6b978eb28cf34f95b5c23 100644 --- a/modules/seq/alg/tests/CMakeLists.txt +++ b/modules/seq/alg/tests/CMakeLists.txt @@ -2,6 +2,7 @@ set(OST_SEQ_ALG_UNIT_TESTS test_merge_pairwise_alignments.cc test_sequence_identity.cc tests.cc + test_renumber.py ) ost_unittest(seq_alg "${OST_SEQ_ALG_UNIT_TESTS}") diff --git a/modules/seq/alg/tests/test_renumber.py b/modules/seq/alg/tests/test_renumber.py new file mode 100644 index 0000000000000000000000000000000000000000..498c42c863f5fc564af954adb3ea4cd8c5319459 --- /dev/null +++ b/modules/seq/alg/tests/test_renumber.py @@ -0,0 +1,118 @@ +import unittest +from ost import * +from ost import settings +from ost import seq +from ost.bindings.clustalw import * +from ost.seq.alg import renumber + +class TestRenumber(unittest.TestCase): + + def setUp(self): + self.target_seq = io.LoadSequence("testfiles/peptide.fasta") + self.peptide_original = io.LoadEntity("testfiles/peptide_original.pdb") + self.peptide_plus_5 = io.LoadEntity("testfiles/peptide_plus_5.pdb") + self.peptide_random = io.LoadEntity("testfiles/peptide_random.pdb") + self.peptide_del_1_2 = io.LoadEntity("testfiles/peptide_del_1_2.pdb") + self.peptide_del_4 = io.LoadEntity("testfiles/peptide_del_4.pdb") + self.peptide_mutation_3 = io.LoadEntity("testfiles/peptide_mutation_3.pdb") + + + def testPeptidePlusFive(self): + """ + All residue numbers shifted by 5. + Check whether internal atom order changes while renumbering + (a new entity is generated in the edit_mode) + TODO: add more basic tests: are all properties preserved? + """ + model_seq=seq.SequenceFromChain(" ", self.peptide_plus_5.chains[0]) + model_seq.name="model" + aln=ClustalW(self.target_seq,model_seq) + aln.AttachView(1,self.peptide_plus_5.Select("")) + ent_n=renumber.Renumber(aln) + + for r_counter in range(len(self.peptide_original.residues)): + assert self.peptide_original.residues[r_counter].qualified_name == ent_n.residues[r_counter].qualified_name, \ + "Renumbering failed on residue level: restoring from ResNum+5" + for atom_nr in range(len(self.peptide_original.residues[r_counter].atoms)): + assert self.peptide_original.residues[r_counter].atoms[atom_nr].name==ent_n.residues[r_counter].atoms[atom_nr].name, \ + "Renumbering failed on atom level: restoring from ResNum+5" + + + def testPeptideRandom(self): + """ + Change residue names in random order + """ + model_seq=seq.SequenceFromChain(" ", self.peptide_random.chains[0]) + model_seq.name="model" + aln=ClustalW(self.target_seq,model_seq) + aln.AttachView(1,self.peptide_random.Select("")) + ent_n=renumber.Renumber(aln) + + for r_counter in range(len(self.peptide_original.residues)): + assert self.peptide_original.residues[r_counter].qualified_name == ent_n.residues[r_counter].qualified_name, \ + "Renumbering failed on residue level: restoring from random residue numbers" + for atom_nr in range(len(self.peptide_original.residues[r_counter].atoms)): + assert self.peptide_original.residues[r_counter].atoms[atom_nr].name==ent_n.residues[r_counter].atoms[atom_nr].name, \ + "Renumbering failed on atom level: restoring from random residue numbers" + + + def testPeptideDel_1_2(self): + """ + First two residues were removed + """ + model_seq=seq.SequenceFromChain(" ", self.peptide_del_1_2.chains[0]) + model_seq.name="model" + aln=ClustalW(self.target_seq,model_seq) + aln.AttachView(1,self.peptide_del_1_2.Select("")) + ent_n=renumber.Renumber(aln) + + for r_counter in range(len(self.peptide_original.residues)): + if r_counter==0 or r_counter==1: + continue + assert self.peptide_original.residues[r_counter].qualified_name == ent_n.residues[r_counter-2].qualified_name, \ + "Renumbering failed on residue level: restoring from random residue numbers" + for atom_nr in range(len(self.peptide_original.residues[r_counter].atoms)): + assert self.peptide_original.residues[r_counter].atoms[atom_nr].name==ent_n.residues[r_counter-2].atoms[atom_nr].name, \ + "Renumbering failed on atom level: restoring from random residue numbers" + + + def testPeptideDel_4(self): + """ + Residues in the middle (position 4) was removed + """ + model_seq=seq.SequenceFromChain(" ", self.peptide_del_4.chains[0]) + model_seq.name="model" + aln=ClustalW(self.target_seq,model_seq) + aln.AttachView(1,self.peptide_del_4.Select("")) + ent_n=renumber.Renumber(aln) + + flag=0 + for r_counter in range(len(self.peptide_original.residues)): + if r_counter==3: + flag=1 + continue + assert self.peptide_original.residues[r_counter].qualified_name == ent_n.residues[r_counter-flag].qualified_name, \ + "Renumbering failed on residue level: restoring from random residue numbers" + for atom_nr in range(len(self.peptide_original.residues[r_counter].atoms)): + assert self.peptide_original.residues[r_counter].atoms[atom_nr].name==ent_n.residues[r_counter-flag].atoms[atom_nr].name, \ + "Renumbering failed on atom level: restoring from random residue numbers" + + + def testPeptideMutation_3(self): + """ + Mutation to GLY at postion 3 + """ + model_seq=seq.SequenceFromChain(" ", self.peptide_mutation_3.chains[0]) + model_seq.name="model" + aln=ClustalW(self.target_seq,model_seq) + aln.AttachView(1,self.peptide_mutation_3.Select("")) + self.assertRaises(RuntimeError, renumber.Renumber, aln) + + + +if __name__ == "__main__": + # test renumbering + try: + unittest.main() + except Exception, e: + print e \ No newline at end of file diff --git a/modules/seq/alg/tests/testfiles/peptide.fasta b/modules/seq/alg/tests/testfiles/peptide.fasta new file mode 100644 index 0000000000000000000000000000000000000000..8366b04ca04fb059f3d15348e964b9bdf8f4490e --- /dev/null +++ b/modules/seq/alg/tests/testfiles/peptide.fasta @@ -0,0 +1,2 @@ +>peptide +MPTNA \ No newline at end of file diff --git a/modules/seq/alg/tests/testfiles/peptide_del_1_2.pdb b/modules/seq/alg/tests/testfiles/peptide_del_1_2.pdb new file mode 100644 index 0000000000000000000000000000000000000000..06fc7e30a5bd50f197a3db75a8cda18ba1b5361f --- /dev/null +++ b/modules/seq/alg/tests/testfiles/peptide_del_1_2.pdb @@ -0,0 +1,20 @@ +ATOM 16 N THR 1 -26.565 -9.309 10.007 1.00 0.00 N +ATOM 17 CA THR 1 -26.102 -8.194 9.247 1.00 0.00 C +ATOM 18 C THR 1 -25.296 -7.372 10.186 1.00 0.00 C +ATOM 19 O THR 1 -24.295 -6.768 9.810 1.00 0.00 O +ATOM 20 CB THR 1 -27.274 -7.369 8.683 1.00 0.00 C +ATOM 21 OG1 THR 1 -28.080 -6.880 9.762 1.00 0.00 O +ATOM 22 CG2 THR 1 -28.139 -8.227 7.772 1.00 0.00 C +ATOM 23 N ASN 2 -25.736 -7.349 11.452 1.00 0.00 N +ATOM 24 CA ASN 2 -25.104 -6.609 12.495 1.00 0.00 C +ATOM 25 C ASN 2 -23.742 -7.171 12.684 1.00 0.00 C +ATOM 26 O ASN 2 -22.806 -6.454 13.030 1.00 0.00 O +ATOM 27 CB ASN 2 -25.901 -6.728 13.795 1.00 0.00 C +ATOM 28 CG ASN 2 -27.189 -5.929 13.764 1.00 0.00 C +ATOM 29 OD1 ASN 2 -27.340 -5.007 12.963 1.00 0.00 O +ATOM 30 ND2 ASN 2 -28.124 -6.282 14.639 1.00 0.00 N +ATOM 31 N ALA 3 -16.677 -4.828 10.806 1.00 0.00 N +ATOM 32 CA ALA 3 -15.984 -3.708 10.241 1.00 0.00 C +ATOM 33 C ALA 3 -15.498 -2.863 11.363 1.00 0.00 C +ATOM 34 O ALA 3 -14.369 -2.378 11.344 1.00 0.00 O +ATOM 35 CB ALA 3 -16.917 -2.901 9.352 1.00 0.00 C \ No newline at end of file diff --git a/modules/seq/alg/tests/testfiles/peptide_del_4.pdb b/modules/seq/alg/tests/testfiles/peptide_del_4.pdb new file mode 100644 index 0000000000000000000000000000000000000000..183ce9c57a125cc1bd0a16c7125b1fb13154de5d --- /dev/null +++ b/modules/seq/alg/tests/testfiles/peptide_del_4.pdb @@ -0,0 +1,27 @@ +ATOM 1 N MET 1 -29.037 -8.783 14.347 1.00 0.00 N +ATOM 2 CA MET 1 -28.985 -9.502 13.056 1.00 0.00 C +ATOM 3 C MET 1 -27.597 -9.852 12.665 1.00 0.00 C +ATOM 4 O MET 1 -26.614 -9.275 13.129 1.00 0.00 O +ATOM 5 CB MET 1 -29.575 -8.640 11.938 1.00 0.00 C +ATOM 6 CG MET 1 -31.084 -8.470 12.016 1.00 0.00 C +ATOM 7 SD MET 1 -31.752 -7.534 10.628 1.00 0.00 S +ATOM 8 CE MET 1 -33.497 -7.530 11.030 1.00 0.00 C +ATOM 9 N PRO 2 -27.533 -10.838 11.828 1.00 0.00 N +ATOM 10 CA PRO 2 -26.273 -11.293 11.337 1.00 0.00 C +ATOM 11 C PRO 2 -25.709 -10.233 10.478 1.00 0.00 C +ATOM 12 O PRO 2 -24.518 -10.265 10.186 1.00 0.00 O +ATOM 13 CB PRO 2 -26.616 -12.565 10.559 1.00 0.00 C +ATOM 14 CG PRO 2 -28.043 -12.386 10.161 1.00 0.00 C +ATOM 15 CD PRO 2 -28.699 -11.637 11.286 1.00 0.00 C +ATOM 16 N THR 3 -26.565 -9.309 10.007 1.00 0.00 N +ATOM 17 CA THR 3 -26.102 -8.194 9.247 1.00 0.00 C +ATOM 18 C THR 3 -25.296 -7.372 10.186 1.00 0.00 C +ATOM 19 O THR 3 -24.295 -6.768 9.810 1.00 0.00 O +ATOM 20 CB THR 3 -27.274 -7.369 8.683 1.00 0.00 C +ATOM 21 OG1 THR 3 -28.080 -6.880 9.762 1.00 0.00 O +ATOM 22 CG2 THR 3 -28.139 -8.227 7.772 1.00 0.00 C +ATOM 31 N ALA 4 -16.677 -4.828 10.806 1.00 0.00 N +ATOM 32 CA ALA 4 -15.984 -3.708 10.241 1.00 0.00 C +ATOM 33 C ALA 4 -15.498 -2.863 11.363 1.00 0.00 C +ATOM 34 O ALA 4 -14.369 -2.378 11.344 1.00 0.00 O +ATOM 35 CB ALA 4 -16.917 -2.901 9.352 1.00 0.00 C \ No newline at end of file diff --git a/modules/seq/alg/tests/testfiles/peptide_mutation_3.pdb b/modules/seq/alg/tests/testfiles/peptide_mutation_3.pdb new file mode 100644 index 0000000000000000000000000000000000000000..be9fa82c7d15a43b2a9d906466c33c74d0293fca --- /dev/null +++ b/modules/seq/alg/tests/testfiles/peptide_mutation_3.pdb @@ -0,0 +1,32 @@ +ATOM 1 N MET 1 -29.037 -8.783 14.347 1.00 0.00 N +ATOM 2 CA MET 1 -28.985 -9.502 13.056 1.00 0.00 C +ATOM 3 C MET 1 -27.597 -9.852 12.665 1.00 0.00 C +ATOM 4 O MET 1 -26.614 -9.275 13.129 1.00 0.00 O +ATOM 5 CB MET 1 -29.575 -8.640 11.938 1.00 0.00 C +ATOM 6 CG MET 1 -31.084 -8.470 12.016 1.00 0.00 C +ATOM 7 SD MET 1 -31.752 -7.534 10.628 1.00 0.00 S +ATOM 8 CE MET 1 -33.497 -7.530 11.030 1.00 0.00 C +ATOM 9 N PRO 2 -27.533 -10.838 11.828 1.00 0.00 N +ATOM 10 CA PRO 2 -26.273 -11.293 11.337 1.00 0.00 C +ATOM 11 C PRO 2 -25.709 -10.233 10.478 1.00 0.00 C +ATOM 12 O PRO 2 -24.518 -10.265 10.186 1.00 0.00 O +ATOM 13 CB PRO 2 -26.616 -12.565 10.559 1.00 0.00 C +ATOM 14 CG PRO 2 -28.043 -12.386 10.161 1.00 0.00 C +ATOM 15 CD PRO 2 -28.699 -11.637 11.286 1.00 0.00 C +ATOM 16 N GLY 3 -26.565 -9.309 10.007 1.00 0.00 N +ATOM 17 CA GLY 3 -26.102 -8.194 9.247 1.00 0.00 C +ATOM 18 C GLY 3 -25.296 -7.372 10.186 1.00 0.00 C +ATOM 19 O GLY 3 -24.295 -6.768 9.810 1.00 0.00 O +ATOM 23 N ASN 4 -25.736 -7.349 11.452 1.00 0.00 N +ATOM 24 CA ASN 4 -25.104 -6.609 12.495 1.00 0.00 C +ATOM 25 C ASN 4 -23.742 -7.171 12.684 1.00 0.00 C +ATOM 26 O ASN 4 -22.806 -6.454 13.030 1.00 0.00 O +ATOM 27 CB ASN 4 -25.901 -6.728 13.795 1.00 0.00 C +ATOM 28 CG ASN 4 -27.189 -5.929 13.764 1.00 0.00 C +ATOM 29 OD1 ASN 4 -27.340 -5.007 12.963 1.00 0.00 O +ATOM 30 ND2 ASN 4 -28.124 -6.282 14.639 1.00 0.00 N +ATOM 31 N ALA 5 -16.677 -4.828 10.806 1.00 0.00 N +ATOM 32 CA ALA 5 -15.984 -3.708 10.241 1.00 0.00 C +ATOM 33 C ALA 5 -15.498 -2.863 11.363 1.00 0.00 C +ATOM 34 O ALA 5 -14.369 -2.378 11.344 1.00 0.00 O +ATOM 35 CB ALA 5 -16.917 -2.901 9.352 1.00 0.00 C \ No newline at end of file diff --git a/modules/seq/alg/tests/testfiles/peptide_original.pdb b/modules/seq/alg/tests/testfiles/peptide_original.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8068ae46b1353f2c52556919ef5cf89c2d5e5a1f --- /dev/null +++ b/modules/seq/alg/tests/testfiles/peptide_original.pdb @@ -0,0 +1,35 @@ +ATOM 1 N MET 1 -29.037 -8.783 14.347 1.00 0.00 N +ATOM 2 CA MET 1 -28.985 -9.502 13.056 1.00 0.00 C +ATOM 3 C MET 1 -27.597 -9.852 12.665 1.00 0.00 C +ATOM 4 O MET 1 -26.614 -9.275 13.129 1.00 0.00 O +ATOM 5 CB MET 1 -29.575 -8.640 11.938 1.00 0.00 C +ATOM 6 CG MET 1 -31.084 -8.470 12.016 1.00 0.00 C +ATOM 7 SD MET 1 -31.752 -7.534 10.628 1.00 0.00 S +ATOM 8 CE MET 1 -33.497 -7.530 11.030 1.00 0.00 C +ATOM 9 N PRO 2 -27.533 -10.838 11.828 1.00 0.00 N +ATOM 10 CA PRO 2 -26.273 -11.293 11.337 1.00 0.00 C +ATOM 11 C PRO 2 -25.709 -10.233 10.478 1.00 0.00 C +ATOM 12 O PRO 2 -24.518 -10.265 10.186 1.00 0.00 O +ATOM 13 CB PRO 2 -26.616 -12.565 10.559 1.00 0.00 C +ATOM 14 CG PRO 2 -28.043 -12.386 10.161 1.00 0.00 C +ATOM 15 CD PRO 2 -28.699 -11.637 11.286 1.00 0.00 C +ATOM 16 N THR 3 -26.565 -9.309 10.007 1.00 0.00 N +ATOM 17 CA THR 3 -26.102 -8.194 9.247 1.00 0.00 C +ATOM 18 C THR 3 -25.296 -7.372 10.186 1.00 0.00 C +ATOM 19 O THR 3 -24.295 -6.768 9.810 1.00 0.00 O +ATOM 20 CB THR 3 -27.274 -7.369 8.683 1.00 0.00 C +ATOM 21 OG1 THR 3 -28.080 -6.880 9.762 1.00 0.00 O +ATOM 22 CG2 THR 3 -28.139 -8.227 7.772 1.00 0.00 C +ATOM 23 N ASN 4 -25.736 -7.349 11.452 1.00 0.00 N +ATOM 24 CA ASN 4 -25.104 -6.609 12.495 1.00 0.00 C +ATOM 25 C ASN 4 -23.742 -7.171 12.684 1.00 0.00 C +ATOM 26 O ASN 4 -22.806 -6.454 13.030 1.00 0.00 O +ATOM 27 CB ASN 4 -25.901 -6.728 13.795 1.00 0.00 C +ATOM 28 CG ASN 4 -27.189 -5.929 13.764 1.00 0.00 C +ATOM 29 OD1 ASN 4 -27.340 -5.007 12.963 1.00 0.00 O +ATOM 30 ND2 ASN 4 -28.124 -6.282 14.639 1.00 0.00 N +ATOM 31 N ALA 5 -16.677 -4.828 10.806 1.00 0.00 N +ATOM 32 CA ALA 5 -15.984 -3.708 10.241 1.00 0.00 C +ATOM 33 C ALA 5 -15.498 -2.863 11.363 1.00 0.00 C +ATOM 34 O ALA 5 -14.369 -2.378 11.344 1.00 0.00 O +ATOM 35 CB ALA 5 -16.917 -2.901 9.352 1.00 0.00 C \ No newline at end of file diff --git a/modules/seq/alg/tests/testfiles/peptide_plus_5.pdb b/modules/seq/alg/tests/testfiles/peptide_plus_5.pdb new file mode 100644 index 0000000000000000000000000000000000000000..c64a572640047c0f784ecf3ccd733b4756f39f92 --- /dev/null +++ b/modules/seq/alg/tests/testfiles/peptide_plus_5.pdb @@ -0,0 +1,35 @@ +ATOM 1 N MET 6 -29.037 -8.783 14.347 1.00 0.00 N +ATOM 2 CA MET 6 -28.985 -9.502 13.056 1.00 0.00 C +ATOM 3 C MET 6 -27.597 -9.852 12.665 1.00 0.00 C +ATOM 4 O MET 6 -26.614 -9.275 13.129 1.00 0.00 O +ATOM 5 CB MET 6 -29.575 -8.640 11.938 1.00 0.00 C +ATOM 6 CG MET 6 -31.084 -8.470 12.016 1.00 0.00 C +ATOM 7 SD MET 6 -31.752 -7.534 10.628 1.00 0.00 S +ATOM 8 CE MET 6 -33.497 -7.530 11.030 1.00 0.00 C +ATOM 9 N PRO 7 -27.533 -10.838 11.828 1.00 0.00 N +ATOM 10 CA PRO 7 -26.273 -11.293 11.337 1.00 0.00 C +ATOM 11 C PRO 7 -25.709 -10.233 10.478 1.00 0.00 C +ATOM 12 O PRO 7 -24.518 -10.265 10.186 1.00 0.00 O +ATOM 13 CB PRO 7 -26.616 -12.565 10.559 1.00 0.00 C +ATOM 14 CG PRO 7 -28.043 -12.386 10.161 1.00 0.00 C +ATOM 15 CD PRO 7 -28.699 -11.637 11.286 1.00 0.00 C +ATOM 16 N THR 8 -26.565 -9.309 10.007 1.00 0.00 N +ATOM 17 CA THR 8 -26.102 -8.194 9.247 1.00 0.00 C +ATOM 18 C THR 8 -25.296 -7.372 10.186 1.00 0.00 C +ATOM 19 O THR 8 -24.295 -6.768 9.810 1.00 0.00 O +ATOM 20 CB THR 8 -27.274 -7.369 8.683 1.00 0.00 C +ATOM 21 OG1 THR 8 -28.080 -6.880 9.762 1.00 0.00 O +ATOM 22 CG2 THR 8 -28.139 -8.227 7.772 1.00 0.00 C +ATOM 23 N ASN 9 -25.736 -7.349 11.452 1.00 0.00 N +ATOM 24 CA ASN 9 -25.104 -6.609 12.495 1.00 0.00 C +ATOM 25 C ASN 9 -23.742 -7.171 12.684 1.00 0.00 C +ATOM 26 O ASN 9 -22.806 -6.454 13.030 1.00 0.00 O +ATOM 27 CB ASN 9 -25.901 -6.728 13.795 1.00 0.00 C +ATOM 28 CG ASN 9 -27.189 -5.929 13.764 1.00 0.00 C +ATOM 29 OD1 ASN 9 -27.340 -5.007 12.963 1.00 0.00 O +ATOM 30 ND2 ASN 9 -28.124 -6.282 14.639 1.00 0.00 N +ATOM 31 N ALA 10 -16.677 -4.828 10.806 1.00 0.00 N +ATOM 32 CA ALA 10 -15.984 -3.708 10.241 1.00 0.00 C +ATOM 33 C ALA 10 -15.498 -2.863 11.363 1.00 0.00 C +ATOM 34 O ALA 10 -14.369 -2.378 11.344 1.00 0.00 O +ATOM 35 CB ALA 10 -16.917 -2.901 9.352 1.00 0.00 C \ No newline at end of file diff --git a/modules/seq/alg/tests/testfiles/peptide_random.pdb b/modules/seq/alg/tests/testfiles/peptide_random.pdb new file mode 100644 index 0000000000000000000000000000000000000000..74597e72bf51d7f8f0f6fcacb198dd14d16f7e3f --- /dev/null +++ b/modules/seq/alg/tests/testfiles/peptide_random.pdb @@ -0,0 +1,35 @@ +ATOM 1 N MET 6 -29.037 -8.783 14.347 1.00 0.00 N +ATOM 2 CA MET 6 -28.985 -9.502 13.056 1.00 0.00 C +ATOM 3 C MET 6 -27.597 -9.852 12.665 1.00 0.00 C +ATOM 4 O MET 6 -26.614 -9.275 13.129 1.00 0.00 O +ATOM 5 CB MET 6 -29.575 -8.640 11.938 1.00 0.00 C +ATOM 6 CG MET 6 -31.084 -8.470 12.016 1.00 0.00 C +ATOM 7 SD MET 6 -31.752 -7.534 10.628 1.00 0.00 S +ATOM 8 CE MET 6 -33.497 -7.530 11.030 1.00 0.00 C +ATOM 9 N PRO 1 -27.533 -10.838 11.828 1.00 0.00 N +ATOM 10 CA PRO 1 -26.273 -11.293 11.337 1.00 0.00 C +ATOM 11 C PRO 1 -25.709 -10.233 10.478 1.00 0.00 C +ATOM 12 O PRO 1 -24.518 -10.265 10.186 1.00 0.00 O +ATOM 13 CB PRO 1 -26.616 -12.565 10.559 1.00 0.00 C +ATOM 14 CG PRO 1 -28.043 -12.386 10.161 1.00 0.00 C +ATOM 15 CD PRO 1 -28.699 -11.637 11.286 1.00 0.00 C +ATOM 16 N THR 7 -26.565 -9.309 10.007 1.00 0.00 N +ATOM 17 CA THR 7 -26.102 -8.194 9.247 1.00 0.00 C +ATOM 18 C THR 7 -25.296 -7.372 10.186 1.00 0.00 C +ATOM 19 O THR 7 -24.295 -6.768 9.810 1.00 0.00 O +ATOM 20 CB THR 7 -27.274 -7.369 8.683 1.00 0.00 C +ATOM 21 OG1 THR 7 -28.080 -6.880 9.762 1.00 0.00 O +ATOM 22 CG2 THR 7 -28.139 -8.227 7.772 1.00 0.00 C +ATOM 23 N ASN 4 -25.736 -7.349 11.452 1.00 0.00 N +ATOM 24 CA ASN 4 -25.104 -6.609 12.495 1.00 0.00 C +ATOM 25 C ASN 4 -23.742 -7.171 12.684 1.00 0.00 C +ATOM 26 O ASN 4 -22.806 -6.454 13.030 1.00 0.00 O +ATOM 27 CB ASN 4 -25.901 -6.728 13.795 1.00 0.00 C +ATOM 28 CG ASN 4 -27.189 -5.929 13.764 1.00 0.00 C +ATOM 29 OD1 ASN 4 -27.340 -5.007 12.963 1.00 0.00 O +ATOM 30 ND2 ASN 4 -28.124 -6.282 14.639 1.00 0.00 N +ATOM 31 N ALA 2 -16.677 -4.828 10.806 1.00 0.00 N +ATOM 32 CA ALA 2 -15.984 -3.708 10.241 1.00 0.00 C +ATOM 33 C ALA 2 -15.498 -2.863 11.363 1.00 0.00 C +ATOM 34 O ALA 2 -14.369 -2.378 11.344 1.00 0.00 O +ATOM 35 CB ALA 2 -16.917 -2.901 9.352 1.00 0.00 C \ No newline at end of file