2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
3 * Copyright (C) 2014 The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.ext.rbvi.chimera;
23 import jalview.api.FeatureRenderer;
24 import jalview.api.SequenceRenderer;
25 import jalview.api.structures.JalviewStructureDisplayI;
26 import jalview.datamodel.AlignmentI;
27 import jalview.datamodel.SequenceI;
28 import jalview.structure.StructureMapping;
29 import jalview.structure.StructureMappingcommandSet;
30 import jalview.structure.StructureSelectionManager;
31 import jalview.util.Format;
33 import java.awt.Color;
34 import java.util.ArrayList;
35 import java.util.Hashtable;
38 * Routines for generating Chimera commands for Jalview/Chimera binding
43 public class ChimeraCommands
47 * utility to construct the commands to colour chains by the given alignment
48 * for passing to Chimera
50 * @returns Object[] { Object[] { <model being coloured>,
53 public static StructureMappingcommandSet[] getColourBySequenceCommand(
54 StructureSelectionManager ssm, String[] files,
55 SequenceI[][] sequence, SequenceRenderer sr, FeatureRenderer fr,
59 ArrayList<StructureMappingcommandSet> cset = new ArrayList<StructureMappingcommandSet>();
60 Hashtable<String,StringBuffer> colranges=new Hashtable<String,StringBuffer>();
61 for (int pdbfnum = 0; pdbfnum < files.length; pdbfnum++)
63 float cols[] = new float[4];
64 StructureMapping[] mapping = ssm.getMapping(files[pdbfnum]);
65 StringBuffer command = new StringBuffer();
66 StructureMappingcommandSet smc;
67 ArrayList<String> str = new ArrayList<String>();
69 if (mapping == null || mapping.length < 1)
72 int startPos = -1, lastPos = -1, startModel = -1, lastModel = -1;
73 String startChain = "", lastChain = "";
75 for (int s = 0; s < sequence[pdbfnum].length; s++)
77 for (int sp, m = 0; m < mapping.length; m++)
79 if (mapping[m].getSequence() == sequence[pdbfnum][s]
80 && (sp = alignment.findIndex(sequence[pdbfnum][s])) > -1)
82 SequenceI asp = alignment.getSequenceAt(sp);
83 for (int r = 0; r < asp.getLength(); r++)
85 // no mapping to gaps in sequence
86 if (jalview.util.Comparison.isGap(asp.getCharAt(r)))
90 int pos = mapping[m].getPDBResNum(asp.findPosition(r));
92 if (pos < 1 || pos == lastPos)
95 Color col = sr.getResidueBoxColour(sequence[pdbfnum][s], r);
98 col = fr.findFeatureColour(col, sequence[pdbfnum][s], r);
99 if (lastCol != col || lastPos + 1 != pos
100 || pdbfnum != lastModel
101 || !mapping[m].getChain().equals(lastChain))
105 addColourRange(colranges, lastCol,startModel,startPos,lastPos,lastChain);
109 startModel = pdbfnum;
110 startChain = mapping[m].getChain();
115 lastChain = mapping[m].getChain();
117 // final colour range
120 addColourRange(colranges, lastCol,startModel,startPos,lastPos,lastChain);
126 // Finally, add the command set ready to be returned.
127 StringBuffer coms=new StringBuffer();
128 for (String cr:colranges.keySet())
130 coms.append("color #"+cr+" "+colranges.get(cr)+";");
132 cset.add(new StructureMappingcommandSet(ChimeraCommands.class,
133 files[pdbfnum], new String[] { coms.toString() }));
135 return cset.toArray(new StructureMappingcommandSet[cset.size()]);
138 private static void addColourRange(Hashtable<String, StringBuffer> colranges, Color lastCol, int startModel,
139 int startPos, int lastPos, String lastChain)
142 String colstring = ((lastCol.getRed()< 16) ? "0":"")+Integer.toHexString(lastCol.getRed())
143 + ((lastCol.getGreen()< 16) ? "0":"")+Integer.toHexString(lastCol.getGreen())
144 + ((lastCol.getBlue()< 16) ? "0":"")+Integer.toHexString(lastCol.getBlue());
145 StringBuffer currange = colranges.get(colstring);
148 colranges.put(colstring,currange = new StringBuffer());
150 if (currange.length()>0)
152 currange.append("|");
154 currange.append("#" + startModel + ":" + ((startPos==lastPos) ? startPos : startPos + "-"
155 + lastPos) + "." + lastChain);