X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fstructure%2FAtomSpec.java;h=f20cd31e4b44c6a4d1a98500724eaa43ad8ce139;hb=daf64249356f9a156423bd56ab0336d9da2e5325;hp=d3e8d42fe54f7f663d922c29160127f5b015740e;hpb=be32c14cd8e48fe0a207cd7030cb9cd46f894678;p=jalview.git diff --git a/src/jalview/structure/AtomSpec.java b/src/jalview/structure/AtomSpec.java index d3e8d42..f20cd31 100644 --- a/src/jalview/structure/AtomSpec.java +++ b/src/jalview/structure/AtomSpec.java @@ -1,16 +1,36 @@ +/* + * 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.structure; /** - * Java bean representing an atom in a PDB (or similar) structure model. + * Java bean representing an atom in a PDB (or similar) structure model or + * viewer * * @author gmcarstairs * */ public class AtomSpec { - // TODO clarify do we want pdbFile here, or pdbId? - // compare highlightAtom in 2.8.2 for JalviewJmolBinding and - // javascript.MouseOverStructureListener + int modelNo; + private String pdbFile; private String chain; @@ -20,6 +40,60 @@ public class AtomSpec private int atomIndex; /** + * Parses a Chimera atomspec e.g. #1:12.A to construct an AtomSpec model (with + * null pdb file name) + * + * @param spec + * @return + * @throw IllegalArgumentException if the spec cannot be parsed, or represents + * more than one residue + */ + public static AtomSpec fromChimeraAtomspec(String spec) + { + int colonPos = spec.indexOf(":"); + if (colonPos == -1) + { + throw new IllegalArgumentException(spec); + } + + int hashPos = spec.indexOf("#"); + if (hashPos == -1 && colonPos != 0) + { + // # is missing but something precedes : - reject + throw new IllegalArgumentException(spec); + } + + String modelSubmodel = spec.substring(hashPos + 1, colonPos); + int dotPos = modelSubmodel.indexOf("."); + int modelId = 0; + try + { + modelId = Integer.valueOf(dotPos == -1 ? modelSubmodel + : modelSubmodel.substring(0, dotPos)); + } catch (NumberFormatException e) + { + // ignore, default to model 0 + } + + String residueChain = spec.substring(colonPos + 1); + dotPos = residueChain.indexOf("."); + int resNum = 0; + try + { + resNum = Integer.parseInt(dotPos == -1 ? residueChain + : residueChain.substring(0, dotPos)); + } catch (NumberFormatException e) + { + // could be a range e.g. #1:4-7.B + throw new IllegalArgumentException(spec); + } + + String chainId = dotPos == -1 ? "" : residueChain.substring(dotPos + 1); + + return new AtomSpec(modelId, chainId, resNum, 0); + } + + /** * Constructor * * @param pdbFile @@ -35,6 +109,22 @@ public class AtomSpec this.atomIndex = atomNo; } + /** + * Constructor + * + * @param modelId + * @param chainId + * @param resNo + * @param atomNo + */ + public AtomSpec(int modelId, String chainId, int resNo, int atomNo) + { + this.modelNo = modelId; + this.chain = chainId; + this.pdbResNum = resNo; + this.atomIndex = atomNo; + } + public String getPdbFile() { return pdbFile; @@ -55,6 +145,16 @@ public class AtomSpec return atomIndex; } + public int getModelNumber() + { + return modelNo; + } + + public void setPdbFile(String file) + { + pdbFile = file; + } + @Override public String toString() {