1 package jalview.ws.phyre2;
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.SequenceI;
5 import jalview.fts.core.DecimalFormatTableCellRenderer;
6 import jalview.io.AppletFormatAdapter;
7 import jalview.io.DataSourceType;
8 import jalview.io.FileFormat;
9 import jalview.io.FormatAdapter;
10 import jalview.io.StructureFile;
11 import jalview.schemes.ResidueProperties;
12 import jalview.structure.StructureMapping;
13 import jalview.structure.StructureMappingClient;
14 import jalview.structures.models.MappingOutputModel;
15 import jalview.util.Comparison;
16 import jalview.util.Format;
18 import java.io.BufferedReader;
20 import java.io.FileReader;
21 import java.io.IOException;
22 import java.io.PrintStream;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.List;
27 import javax.swing.JTable;
28 import javax.swing.table.DefaultTableModel;
30 public class Phyre2Client extends StructureMappingClient
32 private final static String NEWLINE = System.lineSeparator();
34 public static final int UNASSIGNED = -1;
36 private final static String PATH_SEPARATOR = File.separator;
38 private String fastaMappingFile;
40 public Phyre2Client(StructureFile structureFile)
42 this.structureFile = structureFile;
45 public StructureMapping getStructureMapping(SequenceI seq,
46 String pdbFile, String fMappingFile, String chain)
48 this.fastaMappingFile = fMappingFile;
49 return getStructureMapping(seq, pdbFile, chain);
53 public StructureMapping getStructureMapping(SequenceI seq,
54 String pdbFile, String chain)
56 final StringBuilder mappingDetails = new StringBuilder(128);
57 PrintStream ps = new PrintStream(System.out)
60 public void print(String x)
62 mappingDetails.append(x);
68 mappingDetails.append(NEWLINE);
71 HashMap<Integer, int[]> mapping = getPhyre2FastaMapping(seq, ps);
73 String mappingOutput = mappingDetails.toString();
74 StructureMapping phyre2ModelMapping = new StructureMapping(seq,
75 pdbFile, structureFile.getId(), chain, mapping, mappingOutput);
76 return phyre2ModelMapping;
79 public HashMap<Integer, int[]> getPhyre2FastaMapping(SequenceI inputSeq,
80 java.io.PrintStream os)
82 HashMap<Integer, int[]> mapping = new HashMap<Integer, int[]>();
83 AlignmentI seq2Phyre2ModelFastaMapping = null;
86 String fastaFile = getFastaMappingFile();
87 DataSourceType protocol = AppletFormatAdapter
88 .checkProtocol(fastaFile);
89 seq2Phyre2ModelFastaMapping = new FormatAdapter().readFile(fastaFile,
90 protocol, FileFormat.Fasta);
91 } catch (IOException e1)
95 SequenceI[] seqs = seq2Phyre2ModelFastaMapping.getSequencesArray();
96 SequenceI tSequenceRes = seqs[0];
97 SequenceI tStructureRes = seqs[1];
99 // Essential to resolve fastaAlignment to input sequence and model sequence
101 tSequenceRes.setStart(inputSeq.getStart());
102 tSequenceRes.setEnd(inputSeq.getEnd());
104 tStructureRes.setStart(structureFile.getSeqsAsArray()[0].getStart());
105 tStructureRes.setEnd(structureFile.getSeqsAsArray()[0].getEnd());
108 int sequenceResLenght = tSequenceRes.getLength();
109 int structureResLenght = tStructureRes.getLength();
110 if (sequenceResLenght == structureResLenght)
112 int prevStructResNum = -1;
113 int alignmentLenght = sequenceResLenght + tSequenceRes.getStart();
114 for (int x = 0; x < alignmentLenght; x++)
116 int alignSeqResidueIndex = tSequenceRes.findIndex(x);
117 int structResNum = tStructureRes
118 .findPosition(alignSeqResidueIndex);
119 int sequenceResNum = tSequenceRes
120 .findPosition(alignSeqResidueIndex - 1);
121 boolean sameResNum = (structResNum == prevStructResNum);
122 // System.out.println(sequenceResNum + " : "
123 // + (sameResNum ? -1 : prevStructResNum));
124 mapping.put(sequenceResNum, new int[] {
125 sameResNum ? -1 : prevStructResNum, -1 });
126 prevStructResNum = structResNum;
129 } catch (Exception e)
136 populateAtomPositions(" ", mapping);
137 } catch (IllegalArgumentException e)
140 } catch (StructureMappingException e)
147 MappingOutputModel mop = new MappingOutputModel();
148 mop.setSeqStart(tSequenceRes.getStart());
149 mop.setSeqEnd(tSequenceRes.getEnd());
150 mop.setSeqName(tSequenceRes.getName());
151 mop.setSeqResidue(tSequenceRes.getSequenceAsString());
153 mop.setStrStart(tStructureRes.getStart());
154 mop.setStrEnd(tStructureRes.getEnd());
155 mop.setStrName(tStructureRes.getName());
156 mop.setStrResidue(tStructureRes.getSequenceAsString());
161 os.print(getMappingOutput(mop).toString());
162 } catch (Exception e)
171 private String getFastaMappingFile()
173 return fastaMappingFile;
177 public StringBuffer getMappingOutput(MappingOutputModel mp)
178 throws StructureMappingException
180 String seqRes = mp.getSeqResidue();
181 String seqName = mp.getSeqName();
182 int sStart = mp.getSeqStart();
183 int sEnd = mp.getSeqEnd();
185 String strRes = mp.getStrResidue();
186 String strName = mp.getStrName();
187 int pdbStart = mp.getStrStart();
188 int pdbEnd = mp.getStrEnd();
190 String type = mp.getType();
192 int maxid = (seqName.length() >= strName.length()) ? seqName.length()
194 int len = 72 - maxid - 1;
196 int nochunks = ((seqRes.length()) / len)
197 + ((seqRes.length()) % len > 0 ? 1 : 0);
199 StringBuffer output = new StringBuffer();
200 output.append(NEWLINE);
201 output.append("Sequence \u27f7 Structure mapping details").append(
203 output.append("Method: Phyre2 Alignment");
204 output.append(NEWLINE).append(NEWLINE);
206 output.append(new Format("%" + maxid + "s").form(seqName));
207 output.append(" : ");
208 output.append(String.valueOf(sStart));
209 output.append(" - ");
210 output.append(String.valueOf(sEnd));
211 output.append(" Maps to ");
212 output.append(NEWLINE);
213 output.append(new Format("%" + maxid + "s").form(strName));
214 output.append(" : ");
215 output.append(String.valueOf(pdbStart));
216 output.append(" - ");
217 output.append(String.valueOf(pdbEnd));
218 output.append(NEWLINE).append(NEWLINE);
220 int matchedSeqCount = 0;
221 for (int j = 0; j < nochunks; j++)
223 // Print the first aligned sequence
224 output.append(new Format("%" + (maxid) + "s").form(seqName)).append(
227 for (int i = 0; i < len; i++)
229 if ((i + (j * len)) < seqRes.length())
231 output.append(seqRes.charAt(i + (j * len)));
235 output.append(NEWLINE);
236 output.append(new Format("%" + (maxid) + "s").form(" ")).append(" ");
238 // Print out the matching chars
239 for (int i = 0; i < len; i++)
243 if ((i + (j * len)) < seqRes.length())
245 boolean sameChar = Comparison.isSameResidue(
246 seqRes.charAt(i + (j * len)),
247 strRes.charAt(i + (j * len)), false);
249 && !jalview.util.Comparison.isGap(seqRes.charAt(i
255 else if (type.equals("pep"))
257 if (ResidueProperties.getPAM250(seqRes.charAt(i + (j * len)),
258 strRes.charAt(i + (j * len))) > 0)
272 } catch (IndexOutOfBoundsException e)
277 // Now print the second aligned sequence
278 output = output.append(NEWLINE);
279 output = output.append(new Format("%" + (maxid) + "s").form(strName))
281 for (int i = 0; i < len; i++)
283 if ((i + (j * len)) < strRes.length())
285 output.append(strRes.charAt(i + (j * len)));
288 output.append(NEWLINE).append(NEWLINE);
290 float pid = (float) matchedSeqCount / seqRes.length() * 100;
291 output.append("Length of alignment = " + seqRes.length()).append(
293 output.append(new Format("Percentage ID = %2.2f").form(pid));
298 public static List<Phyre2SummaryPojo> parsePhyreCrudeList(String crudeList)
300 List<Phyre2SummaryPojo> phyre2Results = new ArrayList<Phyre2SummaryPojo>();
301 try (BufferedReader br = new BufferedReader(new FileReader(crudeList)))
304 while ((line = br.readLine()) != null)
306 String[] lineData = line.split(" ");
307 Phyre2SummaryPojo psp = new Phyre2SummaryPojo();
308 psp.setSerialNo(Integer.valueOf(lineData[0]));
309 psp.setTemplateId(lineData[1]);
310 psp.setConfidence(100 * Double.valueOf(lineData[2]));
311 psp.setPid(Integer.valueOf(lineData[3]));
312 psp.setAlignedRange(lineData[4] + " - " + lineData[5]);
313 // psp.setCoverage(coverage);
314 // psp.setTemplateSummary(templateSummary);
315 phyre2Results.add(psp);
317 } catch (Exception e)
321 return phyre2Results;
324 public static DefaultTableModel getTableModel(
325 List<Phyre2SummaryPojo> phyreResults)
327 if (phyreResults == null)
331 DefaultTableModel tableModel = new DefaultTableModel()
334 public boolean isCellEditable(int row, int column)
340 public Class<?> getColumnClass(int columnIndex)
345 return Integer.class;
355 return Integer.class;
365 tableModel.addColumn("#");
366 tableModel.addColumn("Template");
367 tableModel.addColumn("Aligned Range");
368 tableModel.addColumn("Coverage");
369 tableModel.addColumn("Confidence");
370 tableModel.addColumn("%.i.d");
371 tableModel.addColumn("Template Information");
373 for (Phyre2SummaryPojo res : phyreResults)
375 tableModel.addRow(new Object[] { res.getSerialNo(),
376 res.getTemplateId(), res.getAlignedRange(), res.getCoverage(),
377 res.getConfidence(), res.getPid(), res.getTemplateSummary() });
382 public static void configurePhyreResultTable(JTable phyreResultTable)
385 DecimalFormatTableCellRenderer idCellRender = new DecimalFormatTableCellRenderer(
387 DecimalFormatTableCellRenderer pidCellRender = new DecimalFormatTableCellRenderer(
389 DecimalFormatTableCellRenderer confidenceCellRender = new DecimalFormatTableCellRenderer(
392 phyreResultTable.getColumn("#").setMinWidth(20);
393 phyreResultTable.getColumn("#").setPreferredWidth(30);
394 phyreResultTable.getColumn("#").setMaxWidth(40);
395 phyreResultTable.getColumn("#").setCellRenderer(idCellRender);
397 phyreResultTable.getColumn("Template").setMinWidth(60);
398 phyreResultTable.getColumn("Template").setPreferredWidth(90);
399 phyreResultTable.getColumn("Template").setMaxWidth(150);
401 phyreResultTable.getColumn("Aligned Range").setMinWidth(80);
402 phyreResultTable.getColumn("Aligned Range").setPreferredWidth(80);
403 phyreResultTable.getColumn("Aligned Range").setMaxWidth(120);
405 phyreResultTable.getColumn("Coverage").setMinWidth(60);
406 phyreResultTable.getColumn("Coverage").setPreferredWidth(60);
407 phyreResultTable.getColumn("Coverage").setMaxWidth(90);
409 phyreResultTable.getColumn("Confidence").setMinWidth(60);
410 phyreResultTable.getColumn("Confidence").setPreferredWidth(60);
411 phyreResultTable.getColumn("Confidence").setMaxWidth(90);
412 phyreResultTable.getColumn("Confidence").setCellRenderer(
413 confidenceCellRender);
415 phyreResultTable.getColumn("%.i.d").setMinWidth(45);
416 phyreResultTable.getColumn("%.i.d").setPreferredWidth(450);
417 phyreResultTable.getColumn("%.i.d").setMaxWidth(65);
418 phyreResultTable.getColumn("%.i.d").setCellRenderer(pidCellRender);
420 phyreResultTable.getColumn("Template Information").setMinWidth(400);
421 phyreResultTable.getColumn("Template Information").setPreferredWidth(
423 phyreResultTable.getColumn("Template Information").setMaxWidth(1500);