From a16efab90029be12793ac062994de9627b8f3046 Mon Sep 17 00:00:00 2001 From: pvtroshin Date: Thu, 28 Apr 2011 15:17:21 +0000 Subject: [PATCH] Add method to SequenceUtil to clean the protein sequence git-svn-id: link to svn.lifesci.dundee.ac.uk/svn/barton/ptroshin/JABA2@4047 e3abac25-378b-4346-85de-24260fe3988d --- build.xml | 18 +------------- datamodel/compbio/data/sequence/SequenceUtil.java | 11 +++++++++ .../compbio/data/sequence/SequenceUtilTester.java | 25 ++++++++++++++++++++ website/archive/datamodel-1.2.jar | Bin 63800 -> 63818 bytes website/archive/datamodel-src-1.2.jar | Bin 53496 -> 53535 bytes 5 files changed, 37 insertions(+), 17 deletions(-) diff --git a/build.xml b/build.xml index fc99421..3d4535e 100644 --- a/build.xml +++ b/build.xml @@ -128,23 +128,7 @@ - - - - - - - - - - - - - - - - - + diff --git a/datamodel/compbio/data/sequence/SequenceUtil.java b/datamodel/compbio/data/sequence/SequenceUtil.java index d0a6cd7..4d61d2a 100644 --- a/datamodel/compbio/data/sequence/SequenceUtil.java +++ b/datamodel/compbio/data/sequence/SequenceUtil.java @@ -170,6 +170,17 @@ public final class SequenceUtil { } /** + * Remove all non AA chars from the sequence + * + * @param sequence + * the sequence to clean + * @return cleaned sequence + */ + public static String cleanProteinSequence(String sequence) { + return SequenceUtil.NON_AA.matcher(sequence).replaceAll(""); + } + + /** * @param sequence * @return true is the sequence is a protein sequence, false overwise */ diff --git a/testsrc/compbio/data/sequence/SequenceUtilTester.java b/testsrc/compbio/data/sequence/SequenceUtilTester.java index b6e74ae..3e351bf 100644 --- a/testsrc/compbio/data/sequence/SequenceUtilTester.java +++ b/testsrc/compbio/data/sequence/SequenceUtilTester.java @@ -83,6 +83,31 @@ public class SequenceUtilTester { } @Test() + public void testCleanProteinSequence() { + String dirtySeq = "atgAGTggt\taGGTgc\ncgcAC\rTgc gACtcgcGAt cgA "; + assertFalse(SequenceUtil.isProteinSequence(dirtySeq)); + // This will still be NON protein sequence despite having only correct + // letters because the letters match perfectly the nucleotide sequence! + assertFalse(SequenceUtil.isProteinSequence(SequenceUtil + .cleanProteinSequence(dirtySeq))); + + String notaSeq = "atgc1tgatgcatgcatgatgmctga"; + assertFalse(SequenceUtil.isProteinSequence(notaSeq)); + assertTrue(SequenceUtil.isProteinSequence(SequenceUtil + .cleanProteinSequence(notaSeq))); + + String AAseq = "ARLGRVRWTQQRHAEAAVLLQQASDAAPEHPGIALWLGHALEDAGQAEAAAAAYTRAHQL"; + assertTrue(SequenceUtil.isProteinSequence(AAseq)); + assertTrue(SequenceUtil.isProteinSequence(SequenceUtil + .cleanProteinSequence(AAseq))); + AAseq += "XU"; + + assertFalse(SequenceUtil.isProteinSequence(AAseq)); + assertTrue(SequenceUtil.isProteinSequence(SequenceUtil + .cleanProteinSequence(AAseq))); + } + + @Test() public void testReadWriteFasta() { try { diff --git a/website/archive/datamodel-1.2.jar b/website/archive/datamodel-1.2.jar index 4c7cffc66478db8b96ca3ca65b99f7efc4ddc960..ecbf1613054e2a856c35881292021cdb3d0b97cb 100644 GIT binary patch delta 6678 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 delta 5290 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