Clover icon

jalviewX

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

File ModellerDescription.java

 

Coverage histogram

../../img/srcFileCovDistChart2.png
51% of files have more coverage

Code metrics

76
127
16
2
428
313
69
0.54
7.94
8
4.31

Classes

Class Line # Actions
ModellerDescription 25 123 67 182
0.1455399114.6%
ModellerDescription.resCode 74 4 2 6
0.00%
 

Contributing tests

This file is covered by 1 test. .

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.datamodel.SequenceI;
24   
 
25    public class ModellerDescription
26    {
27    /**
28    * Translates between a String containing a set of colon-separated values on a
29    * single line, and sequence start/end and other properties. See PIRFile IO
30    * for its use.
31    */
32    final String[] seqTypes = { "sequence", "structure", "structureX",
33    "structureN" };
34   
35    final String[] Fields = { "objectType", "objectId", "startField",
36    "startCode", "endField", "endCode", "description1", "description2",
37    "resolutionField", "tailField" };
38   
39    final int TYPE = 0;
40   
41    final int LOCALID = 1;
42   
43    final int START = 2;
44   
45    final int START_CHAIN = 3;
46   
47    final int END = 4;
48   
49    final int END_CHAIN = 5;
50   
51    final int DESCRIPTION1 = 6;
52   
53    final int DESCRIPTION2 = 7;
54   
55    final int RESOLUTION = 8;
56   
57    final int TAIL = 9;
58   
59    /**
60    * 0 is free text or empty 1 is something that parses to an integer, or \@
61    */
62    final int Types[] = { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 };
63   
64    final char Padding[] = { ' ', ' ', ' ', '.', ' ', '.', '.', '.', '.',
65    '.' };
66   
67    java.util.Hashtable fields = new java.util.Hashtable();
68   
 
69  0 toggle ModellerDescription()
70    {
71  0 fields.put(Fields[TAIL], "");
72    }
73   
 
74    class resCode
75    {
76    Integer val;
77   
78    String field;
79   
 
80  0 toggle resCode(String f, Integer v)
81    {
82  0 val = v;
83  0 field = f;
84    }
85   
 
86  0 toggle resCode(int v)
87    {
88  0 val = new Integer(v);
89  0 field = val.toString();
90    }
91    };
92   
 
93  0 toggle private resCode validResidueCode(String field)
94    {
95  0 Integer val = null;
96  0 com.stevesoft.pat.Regex r = new com.stevesoft.pat.Regex(
97    "\\s*((([-0-9]+).?)|FIRST|LAST|@)");
98   
99  0 if (!r.search(field))
100    {
101  0 return null; // invalid
102    }
103  0 String value = r.stringMatched(3);
104  0 if (value == null)
105    {
106  0 value = r.stringMatched(1);
107    }
108    // jalview.bin.Cache.log.debug("from '" + field + "' matched '" + value +
109    // "'");
110  0 try
111    {
112  0 val = Integer.valueOf(value);
113  0 return new resCode(field, val); // successful numeric extraction
114    } catch (Exception e)
115    {
116    }
117  0 return new resCode(field, null);
118    }
119   
 
120  15 toggle private java.util.Hashtable parseDescription(String desc)
121    {
122  15 java.util.Hashtable fields = new java.util.Hashtable();
123  15 java.util.StringTokenizer st = new java.util.StringTokenizer(desc, ":",
124    true);
125   
126  15 String field;
127  15 int type = -1;
128  15 if (st.countTokens() > 0)
129    {
130    // parse colon-fields
131  15 int i = 0;
132  15 field = st.nextToken(":");
133  15 do
134    {
135  60 if (seqTypes[i].equalsIgnoreCase(field))
136    {
137  0 break;
138    }
139  60 } while (++i < seqTypes.length);
140   
141  15 if (i < seqTypes.length)
142    {
143  0 st.nextToken(); // skip ':'
144    // valid seqType for modeller
145  0 type = i;
146  0 i = 1; // continue parsing fields
147  0 while (i < TAIL && st.hasMoreTokens())
148    {
149  0 if ((field = st.nextToken(":")) != null)
150    {
151  0 if (!field.equals(":"))
152    {
153    // validate residue field value
154  0 if (Types[i] == 1)
155    {
156  0 resCode val = validResidueCode(field);
157  0 if (val != null)
158    {
159  0 fields.put(new String(Fields[i] + "num"), val);
160    }
161    else
162    {
163    // jalview.bin.Cache.log.debug(
164    // "Ignoring non-Modeller description: invalid integer-like
165    // field '" + field + "'");
166  0 type = -1; /* invalid field! - throw the FieldSet away */
167    }
168  0 ;
169    }
170  0 fields.put(Fields[i++], field);
171  0 if (st.hasMoreTokens())
172    {
173  0 st.nextToken(); // skip token sep.
174    }
175    }
176    else
177    {
178  0 i++;
179    }
180    }
181    }
182  0 if (i == TAIL)
183    {
184    // slurp remaining fields
185  0 while (st.hasMoreTokens())
186    {
187  0 String tl = st.nextToken(":");
188  0 field += tl.equals(":") ? tl : (":" + tl);
189    }
190  0 fields.put(Fields[TAIL], field);
191    }
192    }
193    }
194  15 if (type == -1)
195    {
196    // object is not a proper ModellerPIR object
197  15 fields = new java.util.Hashtable();
198  15 fields.put(Fields[TAIL], new String(desc));
199    }
200    else
201    {
202  0 fields.put(Fields[TYPE], seqTypes[type]);
203    }
204  15 return fields;
205    }
206   
 
207  15 toggle ModellerDescription(String desc)
208    {
209  15 if (desc == null)
210    {
211  0 desc = "";
212    }
213  15 fields = parseDescription(desc);
214    }
215   
 
216  0 toggle void setStartCode(int v)
217    {
218  0 resCode r;
219  0 fields.put(Fields[START] + "num", r = new resCode(v));
220  0 fields.put(Fields[START], r.field);
221    }
222   
 
223  0 toggle void setEndCode(int v)
224    {
225  0 resCode r;
226  0 fields.put(Fields[END] + "num", r = new resCode(v));
227  0 fields.put(Fields[END], r.field);
228    }
229   
230    /**
231    * make a possibly updated modeller field line for the sequence object
232    *
233    * @param seq
234    * SequenceI
235    */
 
236  0 toggle ModellerDescription(SequenceI seq)
237    {
238   
239  0 if (seq.getDescription() != null)
240    {
241  0 fields = parseDescription(seq.getDescription());
242    }
243   
244  0 if (isModellerFieldset())
245    {
246    // Set start and end before we update the type (in the case of a
247    // synthesized field set)
248  0 if (getStartCode() == null || (getStartNum() != seq.getStart()
249    && getStartCode().val != null))
250    {
251    // unset or user updated sequence start position
252  0 setStartCode(seq.getStart());
253    }
254   
255  0 if (getEndCode() == null || (getEndNum() != seq.getEnd()
256    && getStartCode() != null && getStartCode().val != null))
257    {
258  0 setEndCode(seq.getEnd());
259    }
260    }
261    else
262    {
263    // synthesize fields
264  0 setStartCode(seq.getStart());
265  0 setEndCode(seq.getEnd());
266  0 fields.put(Fields[LOCALID], seq.getName()); // this may be overwritten
267    // below...
268    // type - decide based on evidence of PDB database references - this also
269    // sets the local reference field
270  0 int t = 0; // sequence
271  0 if (seq.getDatasetSequence() != null
272    && seq.getDatasetSequence().getDBRefs() != null)
273    {
274  0 jalview.datamodel.DBRefEntry[] dbr = seq.getDatasetSequence()
275    .getDBRefs();
276  0 int i, j;
277  0 for (i = 0, j = dbr.length; i < j; i++)
278    {
279  0 if (dbr[i] != null)
280    {
281    // JBPNote PDB dbRefEntry needs properties to propagate onto
282    // ModellerField
283    // JBPNote Need to get info from the user about whether the sequence
284    // is the one being modelled, or if it is a template.
285  0 if (dbr[i].getSource()
286    .equals(jalview.datamodel.DBRefSource.PDB))
287    {
288  0 fields.put(Fields[LOCALID], dbr[i].getAccessionId());
289  0 t = 2;
290  0 break;
291    }
292    }
293    }
294    }
295  0 fields.put(Fields[TYPE], seqTypes[t]);
296    }
297   
298    }
299   
300    /**
301    * Indicate if fields parsed to a modeller-like colon-separated value line
302    *
303    * @return boolean
304    */
 
305  15 toggle boolean isModellerFieldset()
306    {
307  15 return (fields.containsKey(Fields[TYPE]));
308    }
309   
 
310  0 toggle String getDescriptionLine()
311    {
312  0 String desc = "";
313  0 int lastfield = Fields.length - 1;
314   
315  0 if (isModellerFieldset())
316    {
317  0 String value;
318    // try to write a minimal modeller field set, so..
319   
320    // find the last valid field in the entry
321   
322  0 for (; lastfield > 6; lastfield--)
323    {
324  0 if (fields.containsKey(Fields[lastfield]))
325    {
326  0 break;
327    }
328    }
329   
330  0 for (int i = 0; i < lastfield; i++)
331    {
332  0 value = (String) fields.get(Fields[i]);
333  0 if (value != null && value.length() > 0)
334    {
335  0 desc += ((String) fields.get(Fields[i])) + ":";
336    }
337    else
338    {
339  0 desc += Padding[i] + ":";
340    }
341    }
342    }
343    // just return the last field if no others were defined.
344  0 if (fields.containsKey(Fields[lastfield]))
345    {
346  0 desc += (String) fields.get(Fields[lastfield]);
347    }
348    else
349    {
350  0 desc += ".";
351    }
352  0 return desc;
353    }
354   
 
355  0 toggle int getStartNum()
356    {
357  0 int start = 0;
358  0 resCode val = getStartCode();
359  0 if (val != null && val.val != null)
360    {
361  0 return val.val.intValue();
362    }
363  0 return start;
364    }
365   
 
366  0 toggle resCode getStartCode()
367    {
368  0 if (isModellerFieldset() && fields.containsKey(Fields[START] + "num"))
369    {
370  0 return (resCode) fields.get(Fields[START] + "num");
371    }
372  0 return null;
373    }
374   
 
375  0 toggle resCode getEndCode()
376    {
377  0 if (isModellerFieldset() && fields.containsKey(Fields[END] + "num"))
378    {
379  0 return (resCode) fields.get(Fields[END] + "num");
380    }
381  0 return null;
382    }
383   
 
384  0 toggle int getEndNum()
385    {
386  0 int end = 0;
387  0 resCode val = getEndCode();
388  0 if (val != null && val.val != null)
389    {
390  0 return val.val.intValue();
391    }
392  0 return end;
393    }
394   
395    /**
396    * returns true if sequence object was modifed with a valid modellerField set
397    *
398    * @param newSeq
399    * SequenceI
400    * @return boolean
401    */
 
402  15 toggle boolean updateSequenceI(SequenceI newSeq)
403    {
404  15 if (isModellerFieldset())
405    {
406  0 resCode rc = getStartCode();
407  0 if (rc != null && rc.val != null)
408    {
409  0 newSeq.setStart(getStartNum());
410    }
411    else
412    {
413  0 newSeq.setStart(1);
414    }
415  0 rc = getEndCode();
416  0 if (rc != null && rc.val != null)
417    {
418  0 newSeq.setEnd(getEndNum());
419    }
420    else
421    {
422  0 newSeq.setEnd(newSeq.getStart() + newSeq.getLength());
423    }
424  0 return true;
425    }
426  15 return false;
427    }
428    }