+ void addGroup(AlignmentI al, StringTokenizer st)\r
+ {\r
+ SequenceGroup sg = new SequenceGroup();\r
+ sg.setName(st.nextToken());\r
+ String rng = "";\r
+ try\r
+ {\r
+ rng = st.nextToken();\r
+ if (rng.length() > 0 && !rng.startsWith("*"))\r
+ {\r
+ sg.setStartRes(Integer.parseInt(rng) - 1);\r
+ }\r
+ else\r
+ {\r
+ sg.setStartRes(0);\r
+ }\r
+ rng = st.nextToken();\r
+ if (rng.length() > 0 && !rng.startsWith("*"))\r
+ {\r
+ sg.setEndRes(Integer.parseInt(rng) - 1);\r
+ }\r
+ else\r
+ {\r
+ sg.setEndRes(al.getWidth() - 1);\r
+ }\r
+ } catch (Exception e)\r
+ {\r
+ System.err\r
+ .println("Couldn't parse Group Start or End Field as '*' or a valid column or sequence index: '"\r
+ + rng + "' - assuming alignment width for group.");\r
+ // assume group is full width\r
+ sg.setStartRes(0);\r
+ sg.setEndRes(al.getWidth() - 1);\r
+ }\r
+\r
+ String index = st.nextToken();\r
+ if (index.equals("-1"))\r
+ {\r
+ while (st.hasMoreElements())\r
+ {\r
+ sg.addSequence(al.findName(st.nextToken()), false);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ StringTokenizer st2 = new StringTokenizer(index, ",");\r
+\r
+ while (st2.hasMoreTokens())\r
+ {\r
+ String tmp = st2.nextToken();\r
+ if (tmp.equals("*"))\r
+ {\r
+ for (int i = 0; i < al.getHeight(); i++)\r
+ {\r
+ sg.addSequence(al.getSequenceAt(i), false);\r
+ }\r
+ }\r
+ else if (tmp.indexOf("-") >= 0)\r
+ {\r
+ StringTokenizer st3 = new StringTokenizer(tmp, "-");\r
+\r
+ int start = (Integer.parseInt(st3.nextToken()));\r
+ int end = (Integer.parseInt(st3.nextToken()));\r
+\r
+ if (end > start)\r
+ {\r
+ for (int i = start; i <= end; i++)\r
+ {\r
+ sg.addSequence(al.getSequenceAt(i - 1), false);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ sg\r
+ .addSequence(al.getSequenceAt(Integer.parseInt(tmp) - 1),\r
+ false);\r
+ }\r
+ }\r
+ }\r
+\r
+ if (refSeq != null)\r
+ {\r
+ sg.setStartRes(refSeq.findIndex(sg.getStartRes() + 1) - 1);\r
+ sg.setEndRes(refSeq.findIndex(sg.getEndRes() + 1) - 1);\r
+ sg.setSeqrep(refSeq);\r
+ }\r
+\r
+ if (sg.getSize() > 0)\r
+ {\r
+ al.addGroup(sg);\r
+ }\r
+ }\r
+\r
+ void addRowProperties(AlignmentI al, StringTokenizer st)\r
+ {\r
+ String label = st.nextToken(),keyValue,key,value;\r
+ boolean scaletofit=false,centerlab=false,showalllabs=false;\r
+ while (st.hasMoreTokens()) {\r
+ keyValue=st.nextToken();\r
+ key = keyValue.substring(0, keyValue.indexOf("="));\r
+ value = keyValue.substring(keyValue.indexOf("=") + 1);\r
+ if (key.equalsIgnoreCase("scaletofit")) {\r
+ scaletofit = Boolean.valueOf(value).booleanValue();\r
+ }\r
+ if (key.equalsIgnoreCase("showalllabs")) {\r
+ showalllabs = Boolean.valueOf(value).booleanValue();\r
+ }\r
+ if (key.equalsIgnoreCase("centrelabs")) {\r
+ centerlab = Boolean.valueOf(value).booleanValue();\r
+ }\r
+ AlignmentAnnotation[] alr = al.getAlignmentAnnotation(); \r
+ for (int i = 0; i < alr.length; i++)\r
+ {\r
+ if (alr[i].label.equalsIgnoreCase(label))\r
+ {\r
+ alr[i].centreColLabels = centerlab;\r
+ alr[i].scaleColLabel = scaletofit;\r
+ alr[i].showAllColLabels = showalllabs;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ void addProperties(AlignmentI al, StringTokenizer st)\r
+ {\r
+\r
+ // So far we have only added groups to the annotationHash,\r
+ // the idea is in the future properties can be added to\r
+ // alignments, other annotations etc\r
+ if (al.getGroups() == null)\r
+ {\r
+ return;\r
+ }\r
+ SequenceGroup sg = null;\r
+\r
+ String name = st.nextToken();\r
+\r
+ Vector groups = al.getGroups();\r
+ for (int i = 0; i < groups.size(); i++)\r
+ {\r
+ sg = (SequenceGroup) groups.elementAt(i);\r
+ if (sg.getName().equals(name))\r
+ {\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ sg = null;\r
+ }\r
+ }\r
+\r
+ if (sg != null)\r
+ {\r
+ String keyValue, key, value;\r
+ ColourSchemeI def = sg.cs;\r
+ sg.cs = null;\r
+ while (st.hasMoreTokens())\r
+ {\r
+ keyValue = st.nextToken();\r
+ key = keyValue.substring(0, keyValue.indexOf("="));\r
+ value = keyValue.substring(keyValue.indexOf("=") + 1);\r
+\r
+ if (key.equalsIgnoreCase("description"))\r
+ {\r
+ sg.setDescription(value);\r
+ }\r
+ else if (key.equalsIgnoreCase("colour"))\r
+ {\r
+ sg.cs = ColourSchemeProperty.getColour(al, value);\r
+ }\r
+ else if (key.equalsIgnoreCase("pidThreshold"))\r
+ {\r
+ sg.cs.setThreshold(Integer.parseInt(value), true);\r
+\r
+ }\r
+ else if (key.equalsIgnoreCase("consThreshold"))\r
+ {\r
+ sg.cs.setConservationInc(Integer.parseInt(value));\r
+ Conservation c = new Conservation("Group",\r
+ ResidueProperties.propHash, 3, sg.getSequences(null), sg\r
+ .getStartRes(), sg.getEndRes() + 1);\r
+\r
+ c.calculate();\r
+ c.verdict(false, 25);\r
+\r
+ sg.cs.setConservation(c);\r
+\r
+ }\r
+ else if (key.equalsIgnoreCase("outlineColour"))\r
+ {\r
+ sg.setOutlineColour(new UserColourScheme(value).findColour('A'));\r
+ }\r
+ else if (key.equalsIgnoreCase("displayBoxes"))\r
+ {\r
+ sg.setDisplayBoxes(Boolean.valueOf(value).booleanValue());\r
+ }\r
+ else if (key.equalsIgnoreCase("showUnconserved"))\r
+ {\r
+ sg.setShowunconserved(Boolean.valueOf(value).booleanValue());\r
+ }\r
+ else if (key.equalsIgnoreCase("displayText"))\r
+ {\r
+ sg.setDisplayText(Boolean.valueOf(value).booleanValue());\r
+ }\r
+ else if (key.equalsIgnoreCase("colourText"))\r
+ {\r
+ sg.setColourText(Boolean.valueOf(value).booleanValue());\r
+ }\r
+ else if (key.equalsIgnoreCase("textCol1"))\r
+ {\r
+ sg.textColour = new UserColourScheme(value).findColour('A');\r
+ }\r
+ else if (key.equalsIgnoreCase("textCol2"))\r
+ {\r
+ sg.textColour2 = new UserColourScheme(value).findColour('A');\r
+ }\r
+ else if (key.equalsIgnoreCase("textColThreshold"))\r
+ {\r
+ sg.thresholdTextColour = Integer.parseInt(value);\r
+ }\r
+ else if (key.equalsIgnoreCase("idColour"))\r
+ {\r
+ // consider warning if colour doesn't resolve to a real colour\r
+ sg.setIdColour((def = new UserColourScheme(value))\r
+ .findColour('A'));\r
+ }\r
+ else if (key.equalsIgnoreCase("hide"))\r
+ {\r
+ // see bug https://mantis.lifesci.dundee.ac.uk/view.php?id=25847\r
+ sg.setHidereps(true);\r
+ }\r
+ else if (key.equalsIgnoreCase("hidecols"))\r
+ {\r
+ // see bug https://mantis.lifesci.dundee.ac.uk/view.php?id=25847\r
+ sg.setHideCols(true);\r
+ }\r
+ sg.recalcConservation();\r
+ }\r
+ if (sg.cs == null)\r
+ {\r
+ sg.cs = def;\r
+ }\r
+ }\r
+ }\r
+\r
+ void setBelowAlignment(AlignmentI al, StringTokenizer st)\r
+ {\r
+ String token;\r
+ AlignmentAnnotation aa;\r
+ while (st.hasMoreTokens())\r
+ {\r
+ token = st.nextToken();\r
+ for (int i = 0; i < al.getAlignmentAnnotation().length; i++)\r
+ {\r
+ aa = al.getAlignmentAnnotation()[i];\r
+ if (aa.sequenceRef == refSeq && aa.label.equals(token))\r
+ {\r
+ aa.belowAlignment = true;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ void addAlignmentDetails(AlignmentI al, StringTokenizer st)\r
+ {\r
+ String keyValue, key, value;\r
+ while (st.hasMoreTokens())\r
+ {\r
+ keyValue = st.nextToken();\r
+ key = keyValue.substring(0, keyValue.indexOf("="));\r
+ value = keyValue.substring(keyValue.indexOf("=") + 1);\r
+ al.setProperty(key, value);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Write annotations as a CSV file of the form 'label, value, value, ...' for\r
+ * each row.\r
+ * \r
+ * @param annotations\r
+ * @return CSV file as a string.\r
+ */\r
+ public String printCSVAnnotations(AlignmentAnnotation[] annotations)\r
+ {\r
+ StringBuffer sp = new StringBuffer();\r
+ for (int i = 0; i < annotations.length; i++)\r
+ {\r
+ String atos = annotations[i].toString();\r
+ int p = 0;\r
+ do\r
+ {\r
+ int cp = atos.indexOf("\n", p);\r
+ sp.append(annotations[i].label);\r
+ sp.append(",");\r
+ if (cp > p)\r
+ {\r
+ sp.append(atos.substring(p, cp + 1));\r
+ }\r
+ else\r
+ {\r
+ sp.append(atos.substring(p));\r
+ sp.append("\n");\r
+ }\r
+ p = cp + 1;\r
+ } while (p > 0);\r
+ }\r
+ return sp.toString();\r