From a4afd02409c7c45ee4042bf81b310a537d75c73d Mon Sep 17 00:00:00 2001 From: Daniel Barton Date: Fri, 30 Aug 2013 13:18:55 +0100 Subject: [PATCH] JAL-1358 Cleaned up RNAalifoldClient.java. RNA helices colouring bug and parameters bug unsolved --- lib/min-jabaws-client-3.0.0.jar | Bin 538986 -> 538120 bytes src/jalview/ws/jws2/RNAalifoldClient.java | 261 ++++++++++----------- test/jalview/ws/jabaws/RNAStructExportImport.java | 47 +--- 3 files changed, 132 insertions(+), 176 deletions(-) diff --git a/lib/min-jabaws-client-3.0.0.jar b/lib/min-jabaws-client-3.0.0.jar index 24d2165cf5fd9cb8c8702b8b81eb93d5df532406..531b8d1fe1c3e07787ba26415a7f5767523d5bd7 100644 GIT binary patch delta 27741 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 GYy2Nhg|>14 delta 29042 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 - arguments.add(sh.getRunnerConfig().getArgumentByOptionName("-p")); af = alignFrame; methodName = sh.serviceType; - // defult false. Which one here? - // submitGaps = true; nucleotidesAllowed = true; proteinAllowed = false; - arguments.add(sh.getRunnerConfig().getArgumentByOptionName("-p")); } @Override @@ -76,97 +71,76 @@ public class RNAalifoldClient extends JabawsAlignCalcWorker implements List structs = ((RNAStructScoreManager) scoremanager).getStructs(); List> data = ((RNAStructScoreManager) scoremanager).getData(); + System.out.println("Length of RNAStructScoreManager is: " + structs.size()); + // test to see if this data object contains base pair contacts Score fscore = data.get(0).first(); this.bpScores = (fscore.getMethod().equals( AlifoldResult.contactProbabilities.toString())); - // Add annotations for the mfe Structure - if (bpScores) - createAnnotationRowforScoreHolder(ourAnnot, getCalcId(), structs.get(1), - data.get(0), data.get(1)); - else - createAnnotationRowforScoreHolder(ourAnnot, getCalcId(), structs.get(1), - data.get(1)); - // add annotation for the consensus sequence alignment - createAnnotationRowforScoreHolder(ourAnnot, getCalcId(), structs.get(0), null); - - // Not loop for the rest of the Annotations - if (structs.size() > 2) { - for (int i = 2; i < structs.size(); i++) { - // I can't think of a nice way of presenting the ensembleValues data - // so I wont for now. - if (!data.get(i).first().getMethod().equals( - AlifoldResult.ensembleValues.toString())) { - createAnnotationRowforScoreHolder(ourAnnot, getCalcId(), structs.get(i), - data.get(i)); - } - } + createAnnotationRowforScoreHolder(ourAnnot, getCalcId(), structs.get(0), + null, null); + + // Add annotations for the mfe Structure + createAnnotationRowforScoreHolder(ourAnnot, getCalcId(), structs.get(1), + data.get(1), null); + + // decide whether to add base pair contact probability histogram + int count = 2; + if (bpScores) { + createAnnotationRowforScoreHolder(ourAnnot, getCalcId(), structs.get(2), + data.get(0), data.get(2)); + count++; + } + + + // Now loop for the rest of the Annotations (if there it isn't stochastic output + // only the centroid and MEA structures remain anyway) + for (int i = count; i < structs.size(); i++) { + // The ensemble values should be displayed in the description of the + // first (or all?) Stochastic Backtrack Structures. + if (!data.get(i).first().getMethod().equals( + AlifoldResult.ensembleValues.toString())) { + + createAnnotationRowforScoreHolder(ourAnnot, getCalcId(), structs.get(i), + data.get(i), null); + } } - if (ourAnnot.size() > 0) { - - // Modify the visible annotation on the alignment viewport with the - // new alignment annotation rows created. + updateOurAnnots(ourAnnot); - // ap.adjustAnnotationHeight(); + ap.adjustAnnotationHeight(); } } } - // just for the base pair contact annotation. It uses a second score object. - protected void createAnnotationRowforScoreHolder( - List ourAnnot, String calcId, - String struct, TreeSet data, TreeSet descriptionData) { - - String typename = data.first().getMethod().toString(); - - AlignmentAnnotation annotation = alignViewport.getAlignment() - .findOrCreateAnnotation(typename, calcId, false, null, null); - - constructAnnotationFromContactProbabilities(annotation, struct, data); - - String description = constructAlignmentAnnotationDescription(descriptionData.first()); - if (description.length() == 0) description = typename; - annotation.description = description; - - // dan test - annotation.belowAlignment = false; - - annotation.validateRangeAndDisplay(); - - ourAnnot.add(annotation); - } - protected void createAnnotationRowforScoreHolder( List ourAnnot, String calcId, - String struct, TreeSet data) + String struct, TreeSet data, TreeSet descriptionData) { /* If contactProbability information is returned from RNAalifold it is stored * in the first TreeSet object corresponding to the String Id which * holds the consensus alignment. The method enumeration is then updated to - * AlifoldResult.contactProbabilties. This line (hack) recreates the same + * AlifoldResult.contactProbabilties. This line recreates the same * data object as was overwritten with the contact probabilites data. */ if (data == null) data = compbio.data.sequence.RNAStructReader .newEmptyScore(AlifoldResult.consensusAlignment); - String typename = data.first().getMethod().toString(); + if (descriptionData == null) descriptionData = data; + + String[] typenameAndDescription = constructTypenameAndDescription( + descriptionData.first()); + String typename = typenameAndDescription[0]; + String description = typenameAndDescription[1]; + AlignmentAnnotation annotation = alignViewport.getAlignment() .findOrCreateAnnotation(typename, calcId, false, null, null); - // construct annotation from ScoreHolder (unpacked into struct and data) - if (bpScores && data.first().getMethod().equals( - AlifoldResult.contactProbabilities.toString())) - constructAnnotationFromContactProbabilities(annotation, struct, data); - - else - // if bpScores is false the TreeSet data should always contain - // a single Score object - constructAnnotationFromStructureString(annotation, struct, data.first()); + constructAnnotationFromScoreHolder(annotation, struct, data); /* update annotation description with the free Energy, frequency in ensemble * or other data where appropriate. @@ -174,51 +148,94 @@ public class RNAalifoldClient extends JabawsAlignCalcWorker implements * Doesnt deal with AlifoldResult.ensembleValues, the free energy of ensemble * and frequency of mfe structure in ensemble. How to deal with these? */ - String description = constructAlignmentAnnotationDescription(data.first()); - if (description.length() == 0) description = typename; annotation.description = description; - // dan test annotation.belowAlignment = false; +// annotation.showAllColLabels = true; annotation.validateRangeAndDisplay(); ourAnnot.add(annotation); } - - - private AlignmentAnnotation constructAnnotationFromStructureString( - AlignmentAnnotation annotation, String struct, Score score) + + + private AlignmentAnnotation constructAnnotationFromScoreHolder( + AlignmentAnnotation annotation, String struct, TreeSet data) { - Annotation[] anns = new Annotation[struct.length()]; - - for (int i = 0; i < struct.length(); i++) { - anns[i] = new Annotation(struct.substring(i, i+1), "", - struct.charAt(i), Float.NaN); + + if (data != null && data.size() > 1 && data.first().getMethod().equals( + AlifoldResult.contactProbabilities.toString())) + { + + // The base pair probabilities are stored in a set in scoreholder. we want a map + LinkedHashMap basePairs = new LinkedHashMap(); + for (Score score : data) { + // The Score objects contain a set of size one containing the range and + // an ArrayList of size one containing the probabilty + basePairs.put(score.getRanges().first(), new Float(score.getScores().get(0))); + } + for (int i = 0; i < struct.length(); i++) { + + // Return all the contacts associated with position i + LinkedHashMap contacts = isContact(basePairs, i+1); + + String description = ""; + float prob = 0f; + + if (contacts.size() == 0) { + description = "No Data"; + } + else { + for (Range contact : contacts.keySet()) { + float t = contacts.get(contact); + if (t > prob) prob = t; + description += Integer.toString(contact.from) + "->" + + Integer.toString(contact.to) + ": " + Float.toString(t) + "% | "; + } + } + + anns[i] = new Annotation(struct.substring(i, i+1), description, + isSS(struct.charAt(i)), prob); + } + } + else if (data == null || data.size() == 1) { + for (int i = 0; i < struct.length(); i++) { + + anns[i] = new Annotation(struct.substring(i, i+1), "", + isSS(struct.charAt(i)), Float.NaN); + } + + annotation.graph = 0; // No graph } - annotation.graph = 0; // No graph annotation.annotations = anns; - return annotation; - } - - private String constructAlignmentAnnotationDescription(Score score) { + + private String[] constructTypenameAndDescription(Score score) { String description = ""; + String typename = ""; String datatype = score.getMethod(); - if (datatype.equals(AlifoldResult.mfeStructure.toString()) || - datatype.equals(AlifoldResult.centroidStructure.toString())) { - description = MessageFormat.format("Energy: {0} = {1} + {2}", + if (datatype.equals(AlifoldResult.mfeStructure.toString())) { + + description = MessageFormat.format("Minimum Free Energy Structure. Energy: {0} = {1} + {2}", score.getScores().get(0), score.getScores().get(1), score.getScores().get(2)); + typename = "MFE Structure"; } else if (datatype.equals(AlifoldResult.contactProbabilityStructure.toString())) { - description = MessageFormat.format("Energy: {0} Frequency: {1}", + description = MessageFormat.format("Base Pair Contact Probabilities. " + + "Energy of Ensemble: {0} Frequency of Ensemble: {1}", score.getScores().get(0), score.getScores().get(1)); + typename = "Contact Probabilities"; + } + else if (datatype.equals(AlifoldResult.centroidStructure.toString())) { + description = MessageFormat.format("Centroid Structure. Energy: {0} = {1} + {2}", + score.getScores().get(0), score.getScores().get(1), score.getScores().get(2)); + typename = "Centroid Structure"; } else if (datatype.equals(AlifoldResult.stochBTStructure.toString())) { if (score.getScores().size() > 0) { @@ -230,68 +247,42 @@ public class RNAalifoldClient extends JabawsAlignCalcWorker implements else if (datatype.equals(AlifoldResult.MEAStucture.toString())) { description = MessageFormat.format("Maximum Expected Accuracy Values: '{' {0} MEA={1} '}", score.getScores().get(0), score.getScores().get(1)); + typename = "MEA Structure"; } - - return description; - } - - - private AlignmentAnnotation constructAnnotationFromContactProbabilities( - AlignmentAnnotation annotation, String struct, TreeSet data) - { - Annotation[] anns = new Annotation[struct.length()]; - - TreeMap basePairs = null; - // The base pair probabilities are stored in a set in scoreholder. we want a map - basePairs = new TreeMap(); - for (Score score : data) { - // The Score objects contain a set of size one containing the range and - // an ArrayList of size one containing the probabilty - basePairs.put(score.getRanges().first(), new Float(score.getScores().get(0))); + else if (datatype.equals(AlifoldResult.consensusAlignment.toString())) { + typename = "RNAalifold Consensus"; + description = "Consensus Alignment Produced by RNAalifold"; } - for (int i = 0; i < struct.length(); i++) { - - // Return all the contacts associated with position i - List contacts = isContact(basePairs, i+1); - - if (contacts.size() == 0) { - anns[i] = new Annotation(struct.substring(i, i+1), "", struct.charAt(i), 0f); - } - else if (contacts.size() == 1) { - // There is only one contact associated with this base - float prob = basePairs.get(contacts.get(0)); - anns[i] = new Annotation(struct.substring(i, i+1), "", struct.charAt(i), prob); - } - else if (contacts.size() > 1) { - // For now we will simply deal with alternate contact information by mentioning its - // existance in the description - float prob = basePairs.get(contacts.get(0)); - anns[i] = new Annotation(struct.substring(i, i+1), "This base has alternate contacts", - struct.charAt(i), prob); - } + else { + typename = datatype; + description = typename; } - annotation.annotations = anns; - - return annotation; + return new String[] {typename, description}; } - // Check whether, at position i there is a base contact and return all the // contacts at this position. Should be in order of descending probability. - private List isContact(TreeMap basePairs, int i) { - - List contacts = new ArrayList(); + private LinkedHashMap isContact(LinkedHashMap basePairs, int i) + { + LinkedHashMap contacts = new LinkedHashMap(); for (Range contact : basePairs.keySet()) { // finds the contacts associtated with position i ordered by the natural // ordering of the Scores TreeSet in ScoreManager which is, descending probability - if (contact.from == i || contact.to == i) contacts.add(contact); + if (contact.from == i || contact.to == i) + contacts.put(contact, basePairs.get(contact)); } return contacts; } + private char isSS (char chr) { + String regex = "\\(|\\)|\\{|\\}|\\[|\\]"; + char ss = (Pattern.matches(regex, Character.toString(chr))) ? 'S': ' '; + return ss; + } public String getCalcId() { diff --git a/test/jalview/ws/jabaws/RNAStructExportImport.java b/test/jalview/ws/jabaws/RNAStructExportImport.java index 74a24aa..4e407af 100644 --- a/test/jalview/ws/jabaws/RNAStructExportImport.java +++ b/test/jalview/ws/jabaws/RNAStructExportImport.java @@ -46,8 +46,6 @@ public class RNAStructExportImport for (Jws2Instance svc : disc.getServices()) { - System.out.println("Service type: " + svc.serviceType); - if (svc.getServiceTypeURI().toLowerCase().contains("rnaalifoldws")) { rnaalifoldws = svc; @@ -60,8 +58,6 @@ public class RNAStructExportImport jalview.io.FileLoader fl = new jalview.io.FileLoader(false); - // Following this method a long way we find some (probably important!) - // code that I have just commented out! af = fl.LoadFileWaitTillLoaded(testseqs, jalview.io.FormatAdapter.FILE); assertNotNull("Couldn't load test data ('" + testseqs + "')", af); @@ -78,16 +74,13 @@ public class RNAStructExportImport } } - /** - * test for patches to JAL-1294 - */ @Test public void testRNAStructExport() { + + alifoldClient = new RNAalifoldClient(rnaalifoldws, af, null, null); - - System.out.println("START FOLDING"); af.getViewport().getCalcManager().startWorker(alifoldClient); @@ -102,37 +95,9 @@ public class RNAStructExportImport ; } while (af.getViewport().getCalcManager().isWorking()); - System.out.println("END FOLDING"); - - // ALL FOR TESTING - AlignCalcManagerI test = af.getViewport().getCalcManager(); - RNAalifoldClient testWorker = ((RNAalifoldClient)test.getRegisteredWorkersOfClass(RNAalifoldClient.class).get(0)); - testWorker.updateResultAnnotation(true); - System.out.println("Annotation from RNAalifoldclient"); - for (Annotation ann : testWorker.ourAnnots.get(0).annotations) { - System.out.print(ann.toString()+"|"); - } - System.out.println(); - - // Why are the AlignViewport.alignment and the RNAalifoldClient alignment - // Annotations different AlignmentI orig_alig = af.getViewport().getAlignment(); - System.out.println("orig_alig has class: " + orig_alig.getClass()); - - // some time before here but after the RNAalifoldClient Update method - // the alignment annotation is replaced.... - - System.out.println("orig_alig annotation:\n"); - for (AlignmentAnnotation an : orig_alig.getAlignmentAnnotation()) { - for (Annotation ann : an.annotations) { - System.out.print(ann.toString()+"|"); - } - System.out.println(); - } - - testAnnotationFileIO("Testing RNAalifold Annotation IO", orig_alig); } @@ -141,11 +106,10 @@ public class RNAStructExportImport { try { - String aligfileout = new FormatAdapter().formatSequences("CLUSTAL", + // what format would be appropriate for RNAalifold annotations? + String aligfileout = new FormatAdapter().formatSequences("PFAM", al.getSequencesArray()); - // test -// System.out.println("aligfileout:\n" + aligfileout); String anfileout = new AnnotationFile().printAnnotations( al.getAlignmentAnnotation(), al.getGroups(), @@ -164,8 +128,9 @@ public class RNAStructExportImport System.out.println("Output annotation file:\n" + anfileout + "\n<