Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.io

File StructureFile.java

 
testFileParser: Problem opening 1GAQ.txt : FILE CANNOT BE OPENED FOR READING
 

Coverage histogram

../../img/srcFileCovDistChart8.png
19% of files have more coverage

Code metrics

38
125
32
1
497
362
62
0.5
3.91
32
1.94

Classes

Class Line # Actions
StructureFile 43 125 62 50
0.7435897674.4%
 

Contributing tests

This file is covered by 21 tests. .

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
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.
11    *
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.
16    *
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.
20    */
21    package jalview.io;
22   
23    import jalview.analysis.AlignSeq;
24    import jalview.api.FeatureSettingsModelI;
25    import jalview.datamodel.Alignment;
26    import jalview.datamodel.AlignmentAnnotation;
27    import jalview.datamodel.AlignmentI;
28    import jalview.datamodel.DBRefEntry;
29    import jalview.datamodel.DBRefSource;
30    import jalview.datamodel.PDBEntry;
31    import jalview.datamodel.PDBEntry.Type;
32    import jalview.datamodel.SequenceI;
33    import jalview.structure.StructureImportSettings;
34   
35    import java.awt.Color;
36    import java.io.IOException;
37    import java.lang.reflect.Constructor;
38    import java.util.List;
39    import java.util.Vector;
40   
41    import mc_view.PDBChain;
42   
 
43    public abstract class StructureFile extends AlignFile
44    {
45    private String id;
46   
47    private PDBEntry.Type dbRefType;
48   
49    /**
50    * set to true to add derived sequence annotations (temp factor read from
51    * file, or computed secondary structure) to the alignment
52    */
53    protected boolean visibleChainAnnotation = false;
54   
55    /**
56    * Set true to predict secondary structure (using JMol for protein, Annotate3D
57    * for RNA)
58    */
59    protected boolean predictSecondaryStructure = false;
60   
61    /**
62    * Set true (with predictSecondaryStructure=true) to predict secondary
63    * structure using an external service (currently Annotate3D for RNA only)
64    */
65    protected boolean externalSecondaryStructure = false;
66   
67    private Vector<PDBChain> chains;
68   
69    private boolean pdbIdAvailable;
70   
 
71  14 toggle public StructureFile(Object inFile, DataSourceType sourceType)
72    throws IOException
73    {
74  14 super(inFile, sourceType);
75    }
76   
 
77  2 toggle public StructureFile(FileParse fp) throws IOException
78    {
79  2 super(fp);
80    }
81   
 
82  83 toggle public void addSettings(boolean addAlignmentAnnotations,
83    boolean predictSecondaryStructure, boolean externalSecStr)
84    {
85  83 this.visibleChainAnnotation = addAlignmentAnnotations;
86  83 this.predictSecondaryStructure = predictSecondaryStructure;
87  83 this.externalSecondaryStructure = externalSecStr;
88    }
89   
 
90  92 toggle public void xferSettings()
91    {
92  92 this.visibleChainAnnotation = StructureImportSettings
93    .isVisibleChainAnnotation();
94  92 this.predictSecondaryStructure = StructureImportSettings
95    .isProcessSecondaryStructure();
96  92 this.externalSecondaryStructure = StructureImportSettings
97    .isExternalSecondaryStructure();
98   
99    }
100   
 
101  83 toggle public StructureFile(boolean parseImmediately, Object dataObject,
102    DataSourceType sourceType) throws IOException
103    {
104  83 Test failure here super(parseImmediately, dataObject, sourceType);
105    }
106   
 
107  0 toggle public StructureFile(boolean a, FileParse fp) throws IOException
108    {
109  0 super(a, fp);
110    }
111   
 
112  1 toggle public StructureFile()
113    {
114    }
115   
 
116  157 toggle protected SequenceI postProcessChain(PDBChain chain)
117    {
118  157 SequenceI pdbSequence = chain.sequence;
119  157 pdbSequence.setName(getId() + "|" + pdbSequence.getName());
120  157 PDBEntry entry = new PDBEntry();
121  157 entry.setId(getId());
122  157 entry.setType(getStructureFileType());
123  157 if (chain.id != null)
124    {
125  157 entry.setChainCode(chain.id);
126    }
127  157 if (inFile != null)
128    {
129  137 entry.setFile(inFile.getAbsolutePath());
130    }
131    else
132    {
133  20 entry.setFile(getDataName());
134    }
135   
136  157 DBRefEntry sourceDBRef = new DBRefEntry();
137  157 sourceDBRef.setAccessionId(getId());
138  157 sourceDBRef.setSource(DBRefSource.PDB);
139    // TODO: specify version for 'PDB' database ref if it is read from a file.
140    // TODO: decide if jalview.io should be creating primary refs!
141  157 sourceDBRef.setVersion("");
142  157 pdbSequence.addPDBId(entry);
143  157 pdbSequence.addDBRef(sourceDBRef);
144  157 SequenceI chainseq = pdbSequence;
145  157 seqs.addElement(chainseq);
146  157 AlignmentAnnotation[] chainannot = chainseq.getAnnotation();
147   
148  157 if (chainannot != null && visibleChainAnnotation)
149    {
150  234 for (int ai = 0; ai < chainannot.length; ai++)
151    {
152  117 chainannot[ai].visible = visibleChainAnnotation;
153  117 annotations.addElement(chainannot[ai]);
154    }
155    }
156  157 return chainseq;
157    }
158   
159    /**
160    * filetype of structure file - default is PDB
161    */
162    String structureFileType = PDBEntry.Type.PDB.toString();
163   
 
164  92 toggle protected void setStructureFileType(String structureFileType)
165    {
166  92 this.structureFileType = structureFileType;
167    }
168   
169    /**
170    * filetype of last file processed
171    *
172    * @return
173    */
 
174  157 toggle public String getStructureFileType()
175    {
176  157 return structureFileType;
177    }
178   
 
179  0 toggle @SuppressWarnings({ "unchecked", "rawtypes" })
180    protected void processPdbFileWithAnnotate3d(List<SequenceI> rna)
181    throws Exception
182    {
183    // System.out.println("this is a PDB format and RNA sequence");
184    // note: we use reflection here so that the applet can compile and run
185    // without the HTTPClient bits and pieces needed for accessing Annotate3D
186    // web service
187  0 try
188    {
189  0 Class cl = Class.forName("jalview.ws.jws1.Annotate3D");
190  0 if (cl != null)
191    {
192    // TODO: use the PDB ID of the structure if one is available, to save
193    // bandwidth and avoid uploading the whole structure to the service
194  0 Object annotate3d = cl.getConstructor(new Class[] {})
195    .newInstance(new Object[] {});
196  0 AlignmentI al = ((AlignmentI) cl
197    .getMethod("getRNAMLFor", new Class[]
198    { FileParse.class })
199    .invoke(annotate3d, new Object[]
200    { new FileParse(getDataName(), dataSourceType) }));
201  0 for (SequenceI sq : al.getSequences())
202    {
203  0 if (sq.getDatasetSequence() != null)
204    {
205  0 if (sq.getDatasetSequence().getAllPDBEntries() != null)
206    {
207  0 sq.getDatasetSequence().getAllPDBEntries().clear();
208    }
209    }
210    else
211    {
212  0 if (sq.getAllPDBEntries() != null)
213    {
214  0 sq.getAllPDBEntries().clear();
215    }
216    }
217    }
218  0 replaceAndUpdateChains(rna, al, AlignSeq.DNA, false);
219    }
220    } catch (ClassNotFoundException x)
221    {
222    // ignore classnotfounds - occurs in applet
223    }
224    }
225   
 
226  2 toggle @SuppressWarnings("unchecked")
227    protected void replaceAndUpdateChains(List<SequenceI> prot, AlignmentI al,
228    String pep, boolean b)
229    {
230  2 List<List<? extends Object>> replaced = AlignSeq
231    .replaceMatchingSeqsWith(seqs, annotations, prot, al, pep,
232    false);
233  2 for (PDBChain ch : getChains())
234    {
235  8 int p = 0;
236  8 for (SequenceI sq : (List<SequenceI>) replaced.get(0))
237    {
238  20 p++;
239  20 if (sq == ch.sequence || sq.getDatasetSequence() == ch.sequence)
240    {
241  8 p = -p;
242  8 break;
243    }
244    }
245  8 if (p < 0)
246    {
247  8 p = -p - 1;
248    // set shadow entry for chains
249  8 ch.shadow = (SequenceI) replaced.get(1).get(p);
250  8 ch.shadowMap = ((AlignSeq) replaced.get(2).get(p))
251    .getMappingFromS1(false);
252    }
253    }
254    }
255   
256    /**
257    * Predict secondary structure for RNA and/or protein sequences and add as
258    * annotations
259    *
260    * @param rnaSequences
261    * @param proteinSequences
262    */
 
263  2 toggle protected void addSecondaryStructure(List<SequenceI> rnaSequences,
264    List<SequenceI> proteinSequences)
265    {
266    /*
267    * Currently using Annotate3D for RNA, but only if the 'use external
268    * prediction' flag is set
269    */
270  2 if (externalSecondaryStructure && rnaSequences.size() > 0)
271    {
272  0 try
273    {
274  0 processPdbFileWithAnnotate3d(rnaSequences);
275    } catch (Exception x)
276    {
277  0 System.err.println("Exceptions when dealing with RNA in pdb file");
278  0 x.printStackTrace();
279   
280    }
281    }
282   
283    /*
284    * Currently using JMol PDB parser for peptide
285    */
286  2 if (proteinSequences.size() > 0)
287    {
288  2 try
289    {
290  2 processWithJmolParser(proteinSequences);
291    } catch (Exception x)
292    {
293  0 System.err.println(
294    "Exceptions from Jmol when processing data in pdb file");
295  0 x.printStackTrace();
296    }
297    }
298    }
299   
 
300  2 toggle @SuppressWarnings({ "unchecked", "rawtypes" })
301    private void processWithJmolParser(List<SequenceI> prot) throws Exception
302    {
303  2 try
304    {
305   
306  2 Class cl = Class.forName("jalview.ext.jmol.JmolParser");
307  2 if (cl != null)
308    {
309  2 final Constructor constructor = cl
310    .getConstructor(new Class[]
311    { FileParse.class });
312  2 final Object[] args = new Object[] {
313    new FileParse(getDataName(), dataSourceType) };
314   
315  2 StructureImportSettings.setShowSeqFeatures(false);
316  2 StructureImportSettings.setVisibleChainAnnotation(false);
317  2 StructureImportSettings
318    .setProcessSecondaryStructure(predictSecondaryStructure);
319  2 StructureImportSettings
320    .setExternalSecondaryStructure(externalSecondaryStructure);
321  2 Object jmf = constructor.newInstance(args);
322  2 AlignmentI al = new Alignment((SequenceI[]) cl
323    .getMethod("getSeqsAsArray", new Class[] {}).invoke(jmf));
324  2 cl.getMethod("addAnnotations", new Class[] { AlignmentI.class })
325    .invoke(jmf, al);
326  2 for (SequenceI sq : al.getSequences())
327    {
328  8 if (sq.getDatasetSequence() != null)
329    {
330  0 sq.getDatasetSequence().getAllPDBEntries().clear();
331    }
332    else
333    {
334  8 sq.getAllPDBEntries().clear();
335    }
336    }
337  2 replaceAndUpdateChains(prot, al, AlignSeq.PEP, false);
338    }
339    } catch (ClassNotFoundException q)
340    {
341    }
342  2 StructureImportSettings.setShowSeqFeatures(true);
343    }
344   
 
345  22363 toggle public PDBChain findChain(String id) throws Exception
346    {
347  22363 for (PDBChain chain : getChains())
348    {
349  39600 if (chain.id.equals(id))
350    {
351  22206 return chain;
352    }
353    }
354  157 throw new Exception("PDB chain not Found!");
355    }
356   
 
357  99 toggle public void makeResidueList()
358    {
359  99 for (PDBChain chain : getChains())
360    {
361  157 chain.makeResidueList(visibleChainAnnotation);
362    }
363    }
364   
 
365  99 toggle public void makeCaBondList()
366    {
367  99 for (PDBChain chain : getChains())
368    {
369  157 chain.makeCaBondList();
370    }
371    }
372   
 
373  0 toggle public void setChargeColours()
374    {
375  0 for (PDBChain chain : getChains())
376    {
377  0 chain.setChargeColours();
378    }
379    }
380   
 
381  0 toggle public void setColours(jalview.schemes.ColourSchemeI cs)
382    {
383  0 for (PDBChain chain : getChains())
384    {
385  0 chain.setChainColours(cs);
386    }
387    }
388   
 
389  0 toggle public void setChainColours()
390    {
391  0 int i = 0;
392  0 for (PDBChain chain : getChains())
393    {
394  0 chain.setChainColours(Color.getHSBColor(1.0f / i++, .4f, 1.0f));
395    }
396    }
397   
 
398  161 toggle public static boolean isRNA(SequenceI seq)
399    {
400  161 int length = seq.getLength();
401  328 for (int i = 0; i < length; i++)
402    {
403  327 char c = seq.getCharAt(i);
404  327 if ((c != 'A') && (c != 'C') && (c != 'G') && (c != 'U'))
405    {
406  160 return false;
407    }
408    }
409  1 return true;
410    }
411   
412    /**
413    * make a friendly ID string.
414    *
415    * @param dataName
416    * @return truncated dataName to after last '/' and pruned .extension if
417    * present
418    */
 
419  8 toggle protected String safeName(String dataName)
420    {
421  8 int p = 0;
422  ? while ((p = dataName.indexOf("/")) > -1 && p < dataName.length())
423    {
424  9 dataName = dataName.substring(p + 1);
425    }
426  8 if (dataName.indexOf(".") > -1)
427    {
428  6 dataName = dataName.substring(0, dataName.lastIndexOf("."));
429    }
430  8 return dataName;
431    }
432   
 
433  1055 toggle public String getId()
434    {
435  1055 return id;
436    }
437   
 
438  106 toggle public void setId(String id)
439    {
440  106 this.id = id;
441    }
442   
 
443  23028 toggle public Vector<PDBChain> getChains()
444    {
445  23028 return chains;
446    }
447   
 
448  99 toggle public void setChains(Vector<PDBChain> chains)
449    {
450  99 this.chains = chains;
451    }
452   
 
453  0 toggle public Type getDbRefType()
454    {
455  0 return dbRefType;
456    }
457   
 
458  7 toggle public void setDbRefType(String dbRefType)
459    {
460  7 this.dbRefType = Type.getType(dbRefType);
461    }
462   
 
463  11 toggle public void setDbRefType(Type dbRefType)
464    {
465  11 this.dbRefType = dbRefType;
466    }
467   
468    /**
469    * Returns a descriptor for suitable feature display settings with
470    * <ul>
471    * <li>ResNums or insertions features visible</li>
472    * <li>insertions features coloured red</li>
473    * <li>ResNum features coloured by label</li>
474    * <li>Insertions displayed above (on top of) ResNums</li>
475    * </ul>
476    */
 
477  10 toggle @Override
478    public FeatureSettingsModelI getFeatureColourScheme()
479    {
480  10 return new PDBFeatureSettings();
481    }
482   
483    /**
484    * Answers true if the structure file has a PDBId
485    *
486    * @return
487    */
 
488  9 toggle public boolean isPPDBIdAvailable()
489    {
490  9 return pdbIdAvailable;
491    }
492   
 
493  92 toggle public void setPDBIdAvailable(boolean pdbIdAvailable)
494    {
495  92 this.pdbIdAvailable = pdbIdAvailable;
496    }
497    }