last version stay many bugs ..
[jalview.git] / src / jalview / ext / varna / VarnaCommands.java
1 /**\r
2  * \r
3  */\r
4 package jalview.ext.varna;\r
5 \r
6 import jalview.api.FeatureRenderer;\r
7 import jalview.api.SequenceRenderer;\r
8 import jalview.datamodel.AlignmentI;\r
9 import jalview.datamodel.SequenceI;\r
10 import jalview.structure.StructureMapping;\r
11 import jalview.structure.StructureSelectionManager;\r
12 import jalview.util.Comparison;\r
13 \r
14 import java.awt.Color;\r
15 import java.util.ArrayList;\r
16 \r
17 /**\r
18  * Routines for generating Jmol commands for Jalview/Jmol binding\r
19  * another cruisecontrol test.\r
20  * \r
21  * @author JimP\r
22  *\r
23  */\r
24 public class VarnaCommands\r
25 {\r
26 \r
27   /**\r
28    * Jmol utility which constructs the commands to colour chains by the given alignment\r
29    * \r
30    */\r
31   public static String[] getColourBySequenceCommand(StructureSelectionManager ssm, String[] files, SequenceI[][] sequence, SequenceRenderer sr, FeatureRenderer fr, AlignmentI alignment)\r
32   {\r
33         \r
34     ArrayList<String> str = new ArrayList<String>();\r
35     StringBuffer command = new StringBuffer();\r
36   \r
37     for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)\r
38     {\r
39       StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]);\r
40   \r
41       if (mapping == null || mapping.length < 1)\r
42         continue;\r
43   \r
44       int lastPos = -1;\r
45       for (int s = 0; s < sequence[pdbfnum].length; s++)\r
46       {\r
47         for (int sp, m = 0; m < mapping.length; m++)\r
48         {\r
49           if (mapping[m].getSequence() == sequence[pdbfnum][s]\r
50                   && (sp = alignment.findIndex(sequence[pdbfnum][s])) > -1)\r
51           {\r
52             SequenceI asp = alignment.getSequenceAt(sp);\r
53             for (int r = 0; r < asp.getLength(); r++)\r
54             {\r
55               // no mapping to gaps in sequence\r
56               if (jalview.util.Comparison.isGap(asp.getCharAt(r)))\r
57               {\r
58                 continue;\r
59               }\r
60               int pos = mapping[m].getPDBResNum(asp.findPosition(r));\r
61   \r
62               if (pos < 1 || pos == lastPos)\r
63                 continue;\r
64   \r
65               lastPos = pos;\r
66   \r
67               Color col = sr.getResidueBoxColour(sequence[pdbfnum][s], r);\r
68   \r
69               if (fr != null)\r
70                 col = fr.findFeatureColour(col, sequence[pdbfnum][s], r);\r
71               String newSelcom = (mapping[m].getChain() != " " ? ":"\r
72                       + mapping[m].getChain() : "")\r
73                       + "/"\r
74                       + (pdbfnum + 1)\r
75                       + ".1"\r
76                       + ";color["\r
77                       + col.getRed()\r
78                       + ","\r
79                       + col.getGreen()\r
80                       + ","\r
81                       + col.getBlue() + "]";\r
82               if (command.length()>newSelcom.length() && command.substring(command.length()-newSelcom.length()).equals(newSelcom))\r
83               {\r
84                 command = VarnaCommands.condenseCommand(command, pos);\r
85                 continue;\r
86               }\r
87               // TODO: deal with case when buffer is too large for Jmol to parse\r
88               // - execute command and flush\r
89   \r
90               command.append(";");\r
91               if (command.length()>51200)\r
92               {\r
93                 // add another chunk\r
94                 str.add(command.toString());\r
95                 command.setLength(0);\r
96               }\r
97               command.append("select " + pos);\r
98               command.append(newSelcom);\r
99             }\r
100             break;\r
101           }\r
102         }\r
103       }\r
104     }\r
105     {\r
106       // add final chunk\r
107       str.add(command.toString());\r
108       command.setLength(0);\r
109     }\r
110     return str.toArray(new String[str.size()]);\r
111   }\r
112 \r
113   public static StringBuffer condenseCommand(StringBuffer command, int pos)\r
114   {\r
115   \r
116     // work back to last 'select'\r
117     int p=command.length(),q=p;\r
118     do {\r
119       p-=6;\r
120       if (p<1) { p=0; };\r
121     } while ((q=command.indexOf("select",p))==-1 && p>0);\r
122     \r
123     StringBuffer sb = new StringBuffer(command.substring(0,q+7));\r
124   \r
125     command =  command.delete(0,q+7);\r
126   \r
127     String start;\r
128   \r
129     if (command.indexOf("-") > -1)\r
130     {\r
131       start = command.substring(0, command.indexOf("-"));\r
132     }\r
133     else\r
134     {\r
135       start = command.substring(0, command.indexOf(":"));\r
136     }\r
137   \r
138     sb.append(start + "-" + pos + command.substring(command.indexOf(":")));\r
139   \r
140     return sb;\r
141   }\r
142 \r
143 }\r