X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FModellerDescription.java;h=d66fe6c5be246bb21fb8a18b0274e345c3b35433;hb=a1984b1c8c273ed33c7ce9283039f4027dcae2de;hp=457a6ae8fe5787558d7a95e18881ea877b289e8f;hpb=69f23b44e8ce05b33fca23ffb3774c285a23dd9b;p=jalview.git diff --git a/src/jalview/io/ModellerDescription.java b/src/jalview/io/ModellerDescription.java index 457a6ae..d66fe6c 100755 --- a/src/jalview/io/ModellerDescription.java +++ b/src/jalview/io/ModellerDescription.java @@ -1,50 +1,77 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.io; +import jalview.bin.Cache; +import jalview.datamodel.DBRefEntry; import jalview.datamodel.SequenceI; -import java.util.Vector; + +import java.util.List; + import com.stevesoft.pat.Regex; + public class ModellerDescription { - /** - * Translates between a String containing a set of colon-separated values - * on a single line, and sequence start/end and other properties. - * See PIRFile IO for its use. - */ - final String[] seqTypes = - { - "sequence", "structure", "structureX", "structureN"}; - final String[] Fields = - { - "objectType", "objectId", - "startField", "startCode", - "endField", "endCode", - "description1", "description2", - "resolutionField", "tailField"}; + /** + * Translates between a String containing a set of colon-separated values on a + * single line, and sequence start/end and other properties. See PIRFile IO + * for its use. + */ + final String[] seqTypes = { "sequence", "structure", "structureX", + "structureN" }; + + final String[] Fields = { "objectType", "objectId", "startField", + "startCode", "endField", "endCode", "description1", "description2", + "resolutionField", "tailField" }; + final int TYPE = 0; + final int LOCALID = 1; + final int START = 2; + final int START_CHAIN = 3; + final int END = 4; + final int END_CHAIN = 5; + final int DESCRIPTION1 = 6; + final int DESCRIPTION2 = 7; + final int RESOLUTION = 8; + final int TAIL = 9; /** - * 0 is free text or empty - * 1 is something that parses to an integer, or \@ + * 0 is free text or empty 1 is something that parses to an integer, or \@ */ - final int Types[] = - { - 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 - }; - final char Padding[] = - { - ' ', ' ', ' ', '.', ' ', '.', '.', '.', '.', '.' - }; + final int Types[] = { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 }; + + final char Padding[] = { ' ', ' ', ' ', '.', ' ', '.', '.', '.', '.', + '.' }; java.util.Hashtable fields = new java.util.Hashtable(); + ModellerDescription() { fields.put(Fields[TAIL], ""); @@ -53,7 +80,9 @@ public class ModellerDescription class resCode { Integer val; + String field; + resCode(String f, Integer v) { val = v; @@ -62,7 +91,7 @@ public class ModellerDescription resCode(int v) { - val = new Integer(v); + val = Integer.valueOf(v); field = val.toString(); } }; @@ -70,7 +99,8 @@ public class ModellerDescription private resCode validResidueCode(String field) { Integer val = null; - com.stevesoft.pat.Regex r = new Regex("\\s*((([-0-9]+).?)|FIRST|LAST|@)"); + Regex r = new Regex( + "\\s*((([-0-9]+).?)|FIRST|LAST|@)"); if (!r.search(field)) { @@ -81,14 +111,13 @@ public class ModellerDescription { value = r.stringMatched(1); } - jalview.bin.Cache.log.debug("from '" + field + "' matched '" + value + - "'"); + // Cache.debug("from '" + field + "' matched '" + value + + // "'"); try { val = Integer.valueOf(value); return new resCode(field, val); // successful numeric extraction - } - catch (Exception e) + } catch (Exception e) { } return new resCode(field, null); @@ -97,7 +126,9 @@ public class ModellerDescription private java.util.Hashtable parseDescription(String desc) { java.util.Hashtable fields = new java.util.Hashtable(); - java.util.StringTokenizer st = new java.util.StringTokenizer(desc, ":"); + java.util.StringTokenizer st = new java.util.StringTokenizer(desc, ":", + true); + String field; int type = -1; if (st.countTokens() > 0) @@ -107,39 +138,51 @@ public class ModellerDescription field = st.nextToken(":"); do { - if (seqTypes[i].compareToIgnoreCase(field) == 0) + if (seqTypes[i].equalsIgnoreCase(field)) { break; } - } - while (++i < seqTypes.length); + } while (++i < seqTypes.length); if (i < seqTypes.length) { + st.nextToken(); // skip ':' // valid seqType for modeller type = i; i = 1; // continue parsing fields while (i < TAIL && st.hasMoreTokens()) { - if ( (field = st.nextToken(":")) != null) + if ((field = st.nextToken(":")) != null) { - // validate residue field value - if (Types[i] == 1) + if (!field.equals(":")) { - resCode val = validResidueCode(field); - if (val != null) + // validate residue field value + if (Types[i] == 1) { - fields.put(new String(Fields[i] + "num"), val); + resCode val = validResidueCode(field); + if (val != null) + { + fields.put(new String(Fields[i] + "num"), val); + } + else + { + // Cache.debug( + // "Ignoring non-Modeller description: invalid integer-like + // field '" + field + "'"); + type = -1; /* invalid field! - throw the FieldSet away */ + } + ; } - else + fields.put(Fields[i++], field); + if (st.hasMoreTokens()) { - jalview.bin.Cache.log.debug( - "Ignoring non-Modeller description: invalid integer-like field '" + field + "'"); - type = -1; /* invalid field! - throw the FieldSet away */ + st.nextToken(); // skip token sep. } - ; } - fields.put(Fields[i++], field); + else + { + i++; + } } } if (i == TAIL) @@ -147,7 +190,8 @@ public class ModellerDescription // slurp remaining fields while (st.hasMoreTokens()) { - field += ":" + st.nextToken(":"); + String tl = st.nextToken(":"); + field += tl.equals(":") ? tl : (":" + tl); } fields.put(Fields[TAIL], field); } @@ -191,7 +235,9 @@ public class ModellerDescription /** * make a possibly updated modeller field line for the sequence object - * @param seq SequenceI + * + * @param seq + * SequenceI */ ModellerDescription(SequenceI seq) { @@ -203,13 +249,17 @@ public class ModellerDescription if (isModellerFieldset()) { - // Set start and end before we update the type (in the case of a synthesized field set) - if (getStartNum() != seq.getStart() && getStartCode().val != null) + // Set start and end before we update the type (in the case of a + // synthesized field set) + if (getStartCode() == null || (getStartNum() != seq.getStart() + && getStartCode().val != null)) { + // unset or user updated sequence start position setStartCode(seq.getStart()); } - if (getEndNum() != seq.getEnd() && getStartCode().val != null) + if (getEndCode() == null || (getEndNum() != seq.getEnd() + && getStartCode() != null && getStartCode().val != null)) { setEndCode(seq.getEnd()); } @@ -219,25 +269,28 @@ public class ModellerDescription // synthesize fields setStartCode(seq.getStart()); setEndCode(seq.getEnd()); - fields.put(Fields[LOCALID], seq.getName()); // this may be overwritten below... - // type - decide based on evidence of PDB database references - this also sets the local reference field + fields.put(Fields[LOCALID], seq.getName()); // this may be overwritten + // below... + // type - decide based on evidence of PDB database references - this also + // sets the local reference field int t = 0; // sequence - if (seq.getDatasetSequence() != null && - seq.getDatasetSequence().getDBRef() != null) + if (seq.getDatasetSequence() != null + && seq.getDatasetSequence().getDBRefs() != null) { - Vector dbr = seq.getDatasetSequence().getDBRef(); - int i, j; - for (i = 0, j = dbr.size(); i < j; i++) + List dbr = seq.getDatasetSequence().getDBRefs(); + for (int i = 0, ni = dbr.size(); i < ni; i++) { - jalview.datamodel.DBRefEntry dref = (jalview.datamodel.DBRefEntry) - dbr.get(i); - if (dref != null) + DBRefEntry dbri = dbr.get(i); + if (dbri != null) { - // JBPNote PDB dbRefEntry needs properties to propagate onto ModellerField - // JBPNote Need to get info from the user about whether the sequence is the one being modelled, or if it is a template. - if (dref.getSource().equals("PDB")) + // JBPNote PDB dbRefEntry needs properties to propagate onto + // ModellerField + // JBPNote Need to get info from the user about whether the sequence + // is the one being modelled, or if it is a template. + if (dbri.getSource() + .equals(jalview.datamodel.DBRefSource.PDB)) { - fields.put(Fields[LOCALID], dref.getAccessionId()); + fields.put(Fields[LOCALID], dbri.getAccessionId()); t = 2; break; } @@ -251,6 +304,7 @@ public class ModellerDescription /** * Indicate if fields parsed to a modeller-like colon-separated value line + * * @return boolean */ boolean isModellerFieldset() @@ -283,7 +337,7 @@ public class ModellerDescription value = (String) fields.get(Fields[i]); if (value != null && value.length() > 0) { - desc += ( (String) fields.get(Fields[i])) + ":"; + desc += ((String) fields.get(Fields[i])) + ":"; } else { @@ -307,7 +361,7 @@ public class ModellerDescription { int start = 0; resCode val = getStartCode(); - if (val.val != null) + if (val != null && val.val != null) { return val.val.intValue(); } @@ -336,7 +390,7 @@ public class ModellerDescription { int end = 0; resCode val = getEndCode(); - if (val.val != null) + if (val != null && val.val != null) { return val.val.intValue(); } @@ -345,14 +399,17 @@ public class ModellerDescription /** * returns true if sequence object was modifed with a valid modellerField set - * @param newSeq SequenceI + * + * @param newSeq + * SequenceI * @return boolean */ boolean updateSequenceI(SequenceI newSeq) { if (isModellerFieldset()) { - if (getStartCode().val != null) + resCode rc = getStartCode(); + if (rc != null && rc.val != null) { newSeq.setStart(getStartNum()); } @@ -360,7 +417,8 @@ public class ModellerDescription { newSeq.setStart(1); } - if (getEndCode().val != null) + rc = getEndCode(); + if (rc != null && rc.val != null) { newSeq.setEnd(getEndNum()); } @@ -373,4 +431,3 @@ public class ModellerDescription return false; } } -