getJSpecViewProperty(String arg0) {
- // TODO Auto-generated method stub
return null;
}
@Override
- public void resizeInnerPanel(String data) {
- // TODO Auto-generated method stub
-
- }
-
- public boolean isVerbose() {
- return verbose;
- }
-
- public void setVerbose(boolean verbose) {
- this.verbose = verbose;
+ public int[] resizeInnerPanel(String data) {
+ return null;
}
-
-
-
}
diff --git a/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/gui/WrapLayout.java b/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/gui/WrapLayout.java
new file mode 100644
index 0000000000..1516a643ef
--- /dev/null
+++ b/biojava-structure-gui/src/main/java/org/biojava/nbio/structure/gui/WrapLayout.java
@@ -0,0 +1,195 @@
+package org.biojava.nbio.structure.gui;
+
+import java.awt.*;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+
+/**
+ * FlowLayout subclass that fully supports wrapping of components.
+ *
+ * Originally written by Rob Camick
+ * https://tips4java.wordpress.com/2008/11/06/wrap-layout/
+ */
+public class WrapLayout extends FlowLayout
+{
+ private Dimension preferredLayoutSize;
+
+ /**
+ * Constructs a new WrapLayout with a left
+ * alignment and a default 5-unit horizontal and vertical gap.
+ */
+ public WrapLayout()
+ {
+ super();
+ }
+
+ /**
+ * Constructs a new FlowLayout with the specified
+ * alignment and a default 5-unit horizontal and vertical gap.
+ * The value of the alignment argument must be one of
+ * WrapLayout, WrapLayout,
+ * or WrapLayout.
+ * @param align the alignment value
+ */
+ public WrapLayout(int align)
+ {
+ super(align);
+ }
+
+ /**
+ * Creates a new flow layout manager with the indicated alignment
+ * and the indicated horizontal and vertical gaps.
+ *
+ * The value of the alignment argument must be one of
+ * WrapLayout, WrapLayout,
+ * or WrapLayout.
+ * @param align the alignment value
+ * @param hgap the horizontal gap between components
+ * @param vgap the vertical gap between components
+ */
+ public WrapLayout(int align, int hgap, int vgap)
+ {
+ super(align, hgap, vgap);
+ }
+
+ /**
+ * Returns the preferred dimensions for this layout given the
+ * visible components in the specified target container.
+ * @param target the component which needs to be laid out
+ * @return the preferred dimensions to lay out the
+ * subcomponents of the specified container
+ */
+ @Override
+ public Dimension preferredLayoutSize(Container target)
+ {
+ return layoutSize(target, true);
+ }
+
+ /**
+ * Returns the minimum dimensions needed to layout the visible
+ * components contained in the specified target container.
+ * @param target the component which needs to be laid out
+ * @return the minimum dimensions to lay out the
+ * subcomponents of the specified container
+ */
+ @Override
+ public Dimension minimumLayoutSize(Container target)
+ {
+ Dimension minimum = layoutSize(target, false);
+ minimum.width -= (getHgap() + 1);
+ return minimum;
+ }
+
+ /**
+ * Returns the minimum or preferred dimension needed to layout the target
+ * container.
+ *
+ * @param target target to get layout size for
+ * @param preferred should preferred size be calculated
+ * @return the dimension to layout the target container
+ */
+ private Dimension layoutSize(Container target, boolean preferred)
+ {
+ synchronized (target.getTreeLock())
+ {
+ // Each row must fit with the width allocated to the containter.
+ // When the container width = 0, the preferred width of the container
+ // has not yet been calculated so lets ask for the maximum.
+
+ int targetWidth = target.getSize().width;
+ Container container = target;
+
+ while (container.getSize().width == 0 && container.getParent() != null)
+ {
+ container = container.getParent();
+ }
+
+ targetWidth = container.getSize().width;
+
+ if (targetWidth == 0)
+ targetWidth = Integer.MAX_VALUE;
+
+ int hgap = getHgap();
+ int vgap = getVgap();
+ Insets insets = target.getInsets();
+ int horizontalInsetsAndGap = insets.left + insets.right + (hgap * 2);
+ int maxWidth = targetWidth - horizontalInsetsAndGap;
+
+ // Fit components into the allowed width
+
+ Dimension dim = new Dimension(0, 0);
+ int rowWidth = 0;
+ int rowHeight = 0;
+
+ int nmembers = target.getComponentCount();
+
+ for (int i = 0; i < nmembers; i++)
+ {
+ Component m = target.getComponent(i);
+
+ if (m.isVisible())
+ {
+ Dimension d = preferred ? m.getPreferredSize() : m.getMinimumSize();
+
+ // Can't add the component to current row. Start a new row.
+
+ if (rowWidth + d.width > maxWidth)
+ {
+ addRow(dim, rowWidth, rowHeight);
+ rowWidth = 0;
+ rowHeight = 0;
+ }
+
+ // Add a horizontal gap for all components after the first
+
+ if (rowWidth != 0)
+ {
+ rowWidth += hgap;
+ }
+
+ rowWidth += d.width;
+ rowHeight = Math.max(rowHeight, d.height);
+ }
+ }
+
+ addRow(dim, rowWidth, rowHeight);
+
+ dim.width += horizontalInsetsAndGap;
+ dim.height += insets.top + insets.bottom + vgap * 2;
+
+ // When using a scroll pane or the DecoratedLookAndFeel we need to
+ // make sure the preferred size is less than the size of the
+ // target containter so shrinking the container size works
+ // correctly. Removing the horizontal gap is an easy way to do this.
+
+ Container scrollPane = SwingUtilities.getAncestorOfClass(JScrollPane.class, target);
+
+ if (scrollPane != null && target.isValid())
+ {
+ dim.width -= (hgap + 1);
+ }
+
+ return dim;
+ }
+ }
+
+ /*
+ * A new row has been completed. Use the dimensions of this row
+ * to update the preferred size for the container.
+ *
+ * @param dim update the width and height when appropriate
+ * @param rowWidth the width of the row to add
+ * @param rowHeight the height of the row to add
+ */
+ private void addRow(Dimension dim, int rowWidth, int rowHeight)
+ {
+ dim.width = Math.max(dim.width, rowWidth);
+
+ if (dim.height > 0)
+ {
+ dim.height += getVgap();
+ }
+
+ dim.height += rowHeight;
+ }
+}
\ No newline at end of file
diff --git a/biojava-structure/pom.xml b/biojava-structure/pom.xml
index c59b4e1068..0be0265a08 100644
--- a/biojava-structure/pom.xml
+++ b/biojava-structure/pom.xml
@@ -4,7 +4,7 @@
biojava
org.biojava
- 4.2.4
+ 4.2.5
biojava-structure
biojava-structure
@@ -22,13 +22,13 @@
org.biojava
biojava-alignment
- 4.2.4
+ 4.2.5
compile
org.biojava
biojava-core
- 4.2.4
+ 4.2.5
compile
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/PDBCrystallographicInfo.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/PDBCrystallographicInfo.java
index b8d9ef18ee..2e10faef06 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/PDBCrystallographicInfo.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/PDBCrystallographicInfo.java
@@ -48,6 +48,23 @@ public class PDBCrystallographicInfo implements Serializable {
* are not stored.
*/
private Matrix4d[] ncsOperators;
+
+ /**
+ * Whether this structure has a non-standard space group not supported
+ * by Biojava. If this is true the sg member will be null.
+ * @since 4.2.5
+ */
+ private boolean nonStandardSg;
+
+ /**
+ * Whether this structure is non-standard coordinate frame convention, for which our scale matrix
+ * calculation and thus the crystal reconstruction will be incorrect.
+ * There's ~ 200 old structures in the PDB affected by the non-standard frame problem, hopefully they will
+ * be remediated in the future.
+ * For more info see: https://github.com/eppic-team/owl/issues/4
+ * @since 4.2.5
+ */
+ private boolean nonStandardCoordFrameConvention;
public PDBCrystallographicInfo() {
@@ -179,6 +196,45 @@ public Matrix4d[] getNcsOperators() {
public void setNcsOperators(Matrix4d[] ncsOperators) {
this.ncsOperators = ncsOperators;
}
+
+ /**
+ * Whether this structure has a non-standard space group not supported
+ * by Biojava. If this is true {@link #getSpaceGroup()} will be null.
+ * @since 4.2.5
+ */
+ public boolean isNonStandardSg() {
+ return nonStandardSg;
+ }
+
+ /**
+ * Set the non-standard space group field
+ * @param nonStandardSg
+ * @since 4.2.5
+ */
+ public void setNonStandardSg(boolean nonStandardSg) {
+ this.nonStandardSg = nonStandardSg;
+ }
+
+ /**
+ * Whether this structure is non-standard coordinate frame convention, for which our scale matrix
+ * calculation and thus the crystal reconstruction will be incorrect.
+ * There's ~ 200 old structures in the PDB affected by the non-standard frame problem, hopefully they will
+ * be remediated in the future.
+ * For more info see: https://github.com/eppic-team/owl/issues/4
+ * @since 4.2.5
+ */
+ public boolean isNonStandardCoordFrameConvention() {
+ return nonStandardCoordFrameConvention;
+ }
+
+ /**
+ * Set the non-standard coordinate frame convention field
+ * @param nonStandardCoordFrameConvention
+ * @since 4.2.5
+ */
+ public void setNonStandardCoordFrameConvention(boolean nonStandardCoordFrameConvention) {
+ this.nonStandardCoordFrameConvention = nonStandardCoordFrameConvention;
+ }
@Override
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/cath/CathInstallation.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/cath/CathInstallation.java
index 41ae6b014f..265248d361 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/cath/CathInstallation.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/cath/CathInstallation.java
@@ -53,8 +53,7 @@ public class CathInstallation implements CathDatabase{
public static final String domallFileName = "cath-domain-boundaries-v%s.txt";
public static final String CATH_DOWNLOAD_URL = "http://download.cathdb.info/cath/releases/";
- public static final String CATH_DOWNLOAD_LATEST_RELEASE_DIR = "latest-release";
- public static final String CATH_DOWNLOAD_PREV_RELEASE_DIR = "previous-releases";
+ public static final String CATH_DOWNLOAD_ALL_RELEASES_DIR = "all-releases";
public static final String CATH_DOWNLOAD_CLASSIFICATION_DATA_DIR = "cath-classification-data";
public static final String NEWLINE = System.getProperty("line.separator");;
@@ -134,10 +133,7 @@ private String buildFileName(String fileNameTemplate) {
private String buildUrl(String remoteFileName) {
String remoteFileNameWithVer = buildFileName(remoteFileName);
- String releasesDir = CATH_DOWNLOAD_LATEST_RELEASE_DIR;
- if (!cathVersion.equals(CathFactory.LATEST_VERSION)) {
- releasesDir = CATH_DOWNLOAD_PREV_RELEASE_DIR;
- }
+ String releasesDir = CATH_DOWNLOAD_ALL_RELEASES_DIR;
return cathDownloadUrl + releasesDir + "/v" + cathVersion + "/" + CATH_DOWNLOAD_CLASSIFICATION_DATA_DIR + "/" + remoteFileNameWithVer;
}
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/FileConvert.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/FileConvert.java
index 0d3127b9b4..4103e4ef1f 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/FileConvert.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/FileConvert.java
@@ -407,9 +407,10 @@ record = "ATOM ";
String serial = String.format("%5d",seri);
String fullName = formatAtomName(a);
-
-
- Character altLoc = a.getAltLoc() ;
+ Character altLoc = a.getAltLoc();
+ if ( altLoc == null)
+ altLoc = ' ';
+
String resseq = "" ;
if ( hasInsertionCode(pdbcode) )
resseq = String.format("%5s",pdbcode);
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/PDBFileParser.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/PDBFileParser.java
index 10cade8e16..ba52b5794c 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/PDBFileParser.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/PDBFileParser.java
@@ -1502,8 +1502,13 @@ private void pdb_CRYST1_Handler(String line) {
}
SpaceGroup sg = SymoplibParser.getSpaceGroup(spaceGroup);
- if (sg==null) logger.warn("Space group '"+spaceGroup+"' not recognised as a standard space group");
- crystallographicInfo.setSpaceGroup(sg);
+ if (sg==null) {
+ logger.warn("Space group '"+spaceGroup+"' not recognised as a standard space group");
+ crystallographicInfo.setNonStandardSg(true);
+ } else {
+ crystallographicInfo.setSpaceGroup(sg);
+ crystallographicInfo.setNonStandardSg(false);
+ }
}
/**
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ChemCompConsumer.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ChemCompConsumer.java
index 00cbd87ec6..c9fbef0b06 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ChemCompConsumer.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ChemCompConsumer.java
@@ -78,19 +78,19 @@ public void documentEnd() {
@Override
public void newAtomSite(AtomSite atom) {
- // TODO Auto-generated method stub
+
}
@Override
public void newDatabasePDBremark(DatabasePDBremark remark) {
- // TODO Auto-generated method stub
+
}
@Override
public void newDatabasePDBrev(DatabasePDBrev dbrev) {
- // TODO Auto-generated method stub
+
}
@@ -101,94 +101,99 @@ public void newDatabasePDBrevRecord(DatabasePdbrevRecord dbrev) {
@Override
public void newEntity(Entity entity) {
- // TODO Auto-generated method stub
+
}
@Override
public void newEntityPolySeq(EntityPolySeq epolseq) {
- // TODO Auto-generated method stub
+
}
@Override
public void newExptl(Exptl exptl) {
- // TODO Auto-generated method stub
+
}
@Override
public void newCell(Cell cell) {
- // TODO Auto-generated method stub
+
}
@Override
public void newSymmetry(Symmetry symmetry) {
- // TODO Auto-generated method stub
+
}
@Override
public void newStructNcsOper(StructNcsOper sNcsOper) {
- // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void newAtomSites(AtomSites atomSites) {
+
}
@Override
public void newPdbxEntityNonPoly(PdbxEntityNonPoly pen) {
- // TODO Auto-generated method stub
+
}
@Override
public void newPdbxNonPolyScheme(PdbxNonPolyScheme ppss) {
- // TODO Auto-generated method stub
+
}
@Override
public void newPdbxPolySeqScheme(PdbxPolySeqScheme ppss) {
- // TODO Auto-generated method stub
+
}
@Override
public void newRefine(Refine r) {
- // TODO Auto-generated method stub
+
}
@Override
public void newStructAsym(StructAsym sasym) {
- // TODO Auto-generated method stub
+
}
@Override
public void newStructKeywords(StructKeywords kw) {
- // TODO Auto-generated method stub
+
}
@Override
public void newStructRef(StructRef sref) {
- // TODO Auto-generated method stub
+
}
@Override
public void newStructRefSeq(StructRefSeq sref) {
- // TODO Auto-generated method stub
+
}
@Override
public void newStructRefSeqDif(StructRefSeqDif sref) {
- // TODO Auto-generated method stub
+
}
@Override
public void setStruct(Struct struct) {
- // TODO Auto-generated method stub
+
}
@@ -203,7 +208,7 @@ public void newGenericData(String category, List loopFields,
@Override
public void newAuditAuthor(AuditAuthor aa)
{
- // TODO Auto-generated method stub
+
}
@@ -217,7 +222,7 @@ public FileParsingParameters getFileParsingParameters()
@Override
public void setFileParsingParameters(FileParsingParameters params)
{
- // TODO Auto-generated method stub
+
}
@@ -230,19 +235,19 @@ public void newChemCompDescriptor(ChemCompDescriptor ccd) {
@Override
public void newPdbxStructOperList(PdbxStructOperList structOper) {
- // TODO Auto-generated method stub
+
}
@Override
public void newPdbxStrucAssembly(PdbxStructAssembly strucAssembly) {
- // TODO Auto-generated method stub
+
}
@Override
public void newPdbxStrucAssemblyGen(PdbxStructAssemblyGen strucAssembly) {
- // TODO Auto-generated method stub
+
}
@@ -253,7 +258,7 @@ public void newChemCompAtom(ChemCompAtom atom) {
@Override
public void newPdbxChemCompIndentifier(PdbxChemCompIdentifier id) {
- // TODO Auto-generated method stub
+
}
@@ -264,41 +269,41 @@ public void newChemCompBond(ChemCompBond bond) {
@Override
public void newPdbxChemCompDescriptor(PdbxChemCompDescriptor desc) {
- // TODO Auto-generated method stub
+
}
@Override
public void newEntitySrcGen(EntitySrcGen entitySrcGen) {
- // TODO Auto-generated method stub
+
}
@Override
public void newEntitySrcNat(EntitySrcNat entitySrcNat) {
- // TODO Auto-generated method stub
+
}
@Override
public void newEntitySrcSyn(EntitySrcSyn entitySrcSyn) {
- // TODO Auto-generated method stub
+
}
@Override
public void newStructConn(StructConn structConn) {
- // TODO Auto-generated method stub
+
}
@Override
public void newStructSiteGen(StructSiteGen gen) {
- // TODO
+
}
@Override
public void newStructSite(StructSite site) {
- // TODO
+
}
}
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MMcifConsumer.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MMcifConsumer.java
index 1204d3cf9b..e86a30826f 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MMcifConsumer.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MMcifConsumer.java
@@ -61,6 +61,7 @@ public interface MMcifConsumer {
public void newCell(Cell cell);
public void newSymmetry(Symmetry symmetry);
public void newStructNcsOper(StructNcsOper sNcsOper);
+ public void newAtomSites(AtomSites atomSites);
public void newStructRef(StructRef sref);
public void newStructRefSeq(StructRefSeq sref);
public void newStructRefSeqDif(StructRefSeqDif sref);
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MetalBondConsumer.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MetalBondConsumer.java
index 34f85b6614..a76e55a795 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MetalBondConsumer.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MetalBondConsumer.java
@@ -94,6 +94,11 @@ public void newSymmetry(Symmetry symmetry) {
@Override
public void newStructNcsOper(StructNcsOper sNcsOper) {
+ }
+
+ @Override
+ public void newAtomSites(AtomSites atomSites) {
+
}
@Override
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java
index 5ef567c93c..096bd77797 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java
@@ -45,6 +45,7 @@
import org.biojava.nbio.structure.GroupType;
import org.biojava.nbio.structure.HetatomImpl;
import org.biojava.nbio.structure.NucleotideImpl;
+import org.biojava.nbio.structure.PDBCrystallographicInfo;
import org.biojava.nbio.structure.PDBHeader;
import org.biojava.nbio.structure.ResidueNumber;
import org.biojava.nbio.structure.SeqMisMatch;
@@ -59,6 +60,7 @@
import org.biojava.nbio.structure.io.FileParsingParameters;
import org.biojava.nbio.structure.io.SeqRes2AtomAligner;
import org.biojava.nbio.structure.io.mmcif.model.AtomSite;
+import org.biojava.nbio.structure.io.mmcif.model.AtomSites;
import org.biojava.nbio.structure.io.mmcif.model.AuditAuthor;
import org.biojava.nbio.structure.io.mmcif.model.Cell;
import org.biojava.nbio.structure.io.mmcif.model.ChemComp;
@@ -136,6 +138,8 @@ public class SimpleMMcifConsumer implements MMcifConsumer {
private List structNcsOper;
private List sequenceDifs;
private List structSiteGens;
+
+ private Matrix4d parsedScaleMatrix;
/**
* A map of asym ids (internal chain ids) to strand ids (author chain ids)
@@ -871,6 +875,8 @@ public void documentEnd() {
}
setStructNcsOps();
+
+ setCrystallographicInfoMetadata();
Map> misMatchMap = new HashMap>();
@@ -1273,6 +1279,20 @@ private void setStructNcsOps() {
ncsOperators.toArray(new Matrix4d[ncsOperators.size()]));
}
}
+
+ private void setCrystallographicInfoMetadata() {
+ if (parsedScaleMatrix!=null) {
+
+ PDBCrystallographicInfo crystalInfo = structure.getCrystallographicInfo();
+
+ boolean nonStd = false;
+ if (crystalInfo.getCrystalCell()!=null && !crystalInfo.getCrystalCell().checkScaleMatrix(parsedScaleMatrix)) {
+ nonStd = true;
+ }
+
+ crystalInfo.setNonStandardCoordFrameConvention(nonStd);
+ }
+ }
/** This method will return the parsed protein structure, once the parsing has been finished
*
@@ -1507,15 +1527,38 @@ public void newCell(Cell cell) {
public void newSymmetry(Symmetry symmetry) {
String spaceGroup = symmetry.getSpace_group_name_H_M();
SpaceGroup sg = SymoplibParser.getSpaceGroup(spaceGroup);
- if (sg==null) logger.warn("Space group '"+spaceGroup+"' not recognised as a standard space group");
-
- structure.getPDBHeader().getCrystallographicInfo().setSpaceGroup(sg);
+ if (sg==null) {
+ logger.warn("Space group '"+spaceGroup+"' not recognised as a standard space group");
+ structure.getPDBHeader().getCrystallographicInfo().setNonStandardSg(true);
+ } else {
+ structure.getPDBHeader().getCrystallographicInfo().setSpaceGroup(sg);
+ structure.getPDBHeader().getCrystallographicInfo().setNonStandardSg(false);
+ }
}
@Override
public void newStructNcsOper(StructNcsOper sNcsOper) {
structNcsOper.add(sNcsOper);
}
+
+ public void newAtomSites(AtomSites atomSites) {
+
+ try {
+ Matrix4d m = new Matrix4d(
+ Double.parseDouble(atomSites.getFract_transf_matrix11()), Double.parseDouble(atomSites.getFract_transf_matrix12()), Double.parseDouble(atomSites.getFract_transf_matrix13()), Double.parseDouble(atomSites.getFract_transf_vector1()),
+ Double.parseDouble(atomSites.getFract_transf_matrix21()), Double.parseDouble(atomSites.getFract_transf_matrix22()), Double.parseDouble(atomSites.getFract_transf_matrix23()), Double.parseDouble(atomSites.getFract_transf_vector2()),
+ Double.parseDouble(atomSites.getFract_transf_matrix31()), Double.parseDouble(atomSites.getFract_transf_matrix32()), Double.parseDouble(atomSites.getFract_transf_matrix33()), Double.parseDouble(atomSites.getFract_transf_vector3()),
+ 0,0,0,1);
+
+ parsedScaleMatrix = m;
+
+ } catch (NumberFormatException e) {
+ logger.warn("Some values in _atom_sites.fract_transf_matrix or _atom_sites.fract_transf_vector could not be parsed as numbers. Can't check whether coordinate frame convention is correct! Error: {}", e.getMessage());
+ structure.getPDBHeader().getCrystallographicInfo().setNonStandardCoordFrameConvention(false);
+
+ // in this case parsedScaleMatrix stays null and can't be used in documentEnd()
+ }
+ }
@Override
public void newStructRef(StructRef sref) {
@@ -1850,8 +1893,6 @@ public List getStructOpers() {
return structOpers;
}
-
-
@Override
public void newPdbxStrucAssembly(PdbxStructAssembly strucAssembly) {
strucAssemblies.add(strucAssembly);
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifParser.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifParser.java
index 90b03c8da1..1b6851c6d8 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifParser.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifParser.java
@@ -40,6 +40,7 @@
import org.biojava.nbio.structure.io.MMCIFFileReader;
import org.biojava.nbio.structure.io.StructureIOFile;
import org.biojava.nbio.structure.io.mmcif.model.AtomSite;
+import org.biojava.nbio.structure.io.mmcif.model.AtomSites;
import org.biojava.nbio.structure.io.mmcif.model.AuditAuthor;
import org.biojava.nbio.structure.io.mmcif.model.CIFLabel;
import org.biojava.nbio.structure.io.mmcif.model.Cell;
@@ -675,6 +676,12 @@ private void endLineChecks(String category,List loopFields, List
StructNcsOper.class.getName(),
loopFields, lineData, loopWarnings);
triggerNewStructNcsOper(sNcsOper);
+ } else if ( category.equals("_atom_sites")) {
+
+ AtomSites atomSites = (AtomSites) buildObject(
+ AtomSites.class.getName(),
+ loopFields, lineData, loopWarnings);
+ triggerNewAtomSites(atomSites);
} else if ( category.equals("_struct_ref")){
StructRef sref = (StructRef) buildObject(
@@ -892,6 +899,12 @@ public void triggerNewStructNcsOper(StructNcsOper sNcsOper) {
}
}
+
+ public void triggerNewAtomSites(AtomSites atomSites) {
+ for(MMcifConsumer c : consumers){
+ c.newAtomSites(atomSites);
+ }
+ }
/**
* Populates a bean object from the {@link org.biojava.nbio.structure.io.mmcif.model} package,
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/model/AtomSites.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/model/AtomSites.java
new file mode 100644
index 0000000000..d0581402df
--- /dev/null
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/model/AtomSites.java
@@ -0,0 +1,401 @@
+package org.biojava.nbio.structure.io.mmcif.model;
+
+/**
+ * A class containing the _atom_sites data. Equivalent to the SCALE records in PDB files.
+ *
+ *
+ * @author Jose Duarte
+ *
+ */
+public class AtomSites extends AbstractBean {
+
+ String entry_id;
+
+ // to my knowledge this field is not used - JD 2016-11-22
+ String Cartn_transform_axes;
+
+ @CIFLabel(label="fract_transf_matrix[1][1]")
+ String fract_transf_matrix11;
+
+ @CIFLabel(label="fract_transf_matrix[1][2]")
+ String fract_transf_matrix12;
+
+ @CIFLabel(label="fract_transf_matrix[1][3]")
+ String fract_transf_matrix13;
+
+
+ @CIFLabel(label="fract_transf_matrix[2][1]")
+ String fract_transf_matrix21;
+
+ @CIFLabel(label="fract_transf_matrix[2][2]")
+ String fract_transf_matrix22;
+
+ @CIFLabel(label="fract_transf_matrix[2][3]")
+ String fract_transf_matrix23;
+
+
+ @CIFLabel(label="fract_transf_matrix[3][1]")
+ String fract_transf_matrix31;
+
+ @CIFLabel(label="fract_transf_matrix[3][2]")
+ String fract_transf_matrix32;
+
+ @CIFLabel(label="fract_transf_matrix[3][3]")
+ String fract_transf_matrix33;
+
+
+ @CIFLabel(label="fract_transf_vector[1]")
+ String fract_transf_vector1;
+
+ @CIFLabel(label="fract_transf_vector[2]")
+ String fract_transf_vector2;
+
+ @CIFLabel(label="fract_transf_vector[3]")
+ String fract_transf_vector3;
+
+ // these fields are unusual but appear in some entries like 5e5j - JD 2016-11-22
+ @CIFLabel(label="Cartn_transf_matrix[1][1]")
+ String Cartn_transf_matrix11;
+
+ @CIFLabel(label="Cartn_transf_matrix[1][2]")
+ String Cartn_transf_matrix12;
+
+ @CIFLabel(label="Cartn_transf_matrix[1][3]")
+ String Cartn_transf_matrix13;
+
+ @CIFLabel(label="Cartn_transf_matrix[2][1]")
+ String Cartn_transf_matrix21;
+
+ @CIFLabel(label="Cartn_transf_matrix[2][2]")
+ String Cartn_transf_matrix22;
+
+ @CIFLabel(label="Cartn_transf_matrix[2][3]")
+ String Cartn_transf_matrix23;
+
+ @CIFLabel(label="Cartn_transf_matrix[3][1]")
+ String Cartn_transf_matrix31;
+
+ @CIFLabel(label="Cartn_transf_matrix[3][2]")
+ String Cartn_transf_matrix32;
+
+ @CIFLabel(label="Cartn_transf_matrix[3][3]")
+ String Cartn_transf_matrix33;
+
+ @CIFLabel(label="Cartn_transf_vector[1]")
+ String Cartn_transf_vector1;
+
+ @CIFLabel(label="Cartn_transf_vector[2]")
+ String Cartn_transf_vector2;
+
+ @CIFLabel(label="Cartn_transf_vector[3]")
+ String Cartn_transf_vector3;
+
+
+ public String getEntry_id() {
+ return entry_id;
+ }
+ public void setEntry_id(String entry_id) {
+ this.entry_id = entry_id;
+ }
+ /**
+ * @return the cartn_transform_axes
+ */
+ public String getCartn_transform_axes() {
+ return Cartn_transform_axes;
+ }
+ /**
+ * @param cartn_transform_axes the cartn_transform_axes to set
+ */
+ public void setCartn_transform_axes(String cartn_transform_axes) {
+ Cartn_transform_axes = cartn_transform_axes;
+ }
+ /**
+ * @return the fract_transf_matrix11
+ */
+ public String getFract_transf_matrix11() {
+ return fract_transf_matrix11;
+ }
+ /**
+ * @param fract_transf_matrix11 the fract_transf_matrix11 to set
+ */
+ public void setFract_transf_matrix11(String fract_transf_matrix11) {
+ this.fract_transf_matrix11 = fract_transf_matrix11;
+ }
+ /**
+ * @return the fract_transf_matrix12
+ */
+ public String getFract_transf_matrix12() {
+ return fract_transf_matrix12;
+ }
+ /**
+ * @param fract_transf_matrix12 the fract_transf_matrix12 to set
+ */
+ public void setFract_transf_matrix12(String fract_transf_matrix12) {
+ this.fract_transf_matrix12 = fract_transf_matrix12;
+ }
+ /**
+ * @return the fract_transf_matrix13
+ */
+ public String getFract_transf_matrix13() {
+ return fract_transf_matrix13;
+ }
+ /**
+ * @param fract_transf_matrix13 the fract_transf_matrix13 to set
+ */
+ public void setFract_transf_matrix13(String fract_transf_matrix13) {
+ this.fract_transf_matrix13 = fract_transf_matrix13;
+ }
+ /**
+ * @return the fract_transf_matrix21
+ */
+ public String getFract_transf_matrix21() {
+ return fract_transf_matrix21;
+ }
+ /**
+ * @param fract_transf_matrix21 the fract_transf_matrix21 to set
+ */
+ public void setFract_transf_matrix21(String fract_transf_matrix21) {
+ this.fract_transf_matrix21 = fract_transf_matrix21;
+ }
+ /**
+ * @return the fract_transf_matrix22
+ */
+ public String getFract_transf_matrix22() {
+ return fract_transf_matrix22;
+ }
+ /**
+ * @param fract_transf_matrix22 the fract_transf_matrix22 to set
+ */
+ public void setFract_transf_matrix22(String fract_transf_matrix22) {
+ this.fract_transf_matrix22 = fract_transf_matrix22;
+ }
+ /**
+ * @return the fract_transf_matrix23
+ */
+ public String getFract_transf_matrix23() {
+ return fract_transf_matrix23;
+ }
+ /**
+ * @param fract_transf_matrix23 the fract_transf_matrix23 to set
+ */
+ public void setFract_transf_matrix23(String fract_transf_matrix23) {
+ this.fract_transf_matrix23 = fract_transf_matrix23;
+ }
+ /**
+ * @return the fract_transf_matrix31
+ */
+ public String getFract_transf_matrix31() {
+ return fract_transf_matrix31;
+ }
+ /**
+ * @param fract_transf_matrix31 the fract_transf_matrix31 to set
+ */
+ public void setFract_transf_matrix31(String fract_transf_matrix31) {
+ this.fract_transf_matrix31 = fract_transf_matrix31;
+ }
+ /**
+ * @return the fract_transf_matrix32
+ */
+ public String getFract_transf_matrix32() {
+ return fract_transf_matrix32;
+ }
+ /**
+ * @param fract_transf_matrix32 the fract_transf_matrix32 to set
+ */
+ public void setFract_transf_matrix32(String fract_transf_matrix32) {
+ this.fract_transf_matrix32 = fract_transf_matrix32;
+ }
+ /**
+ * @return the fract_transf_matrix33
+ */
+ public String getFract_transf_matrix33() {
+ return fract_transf_matrix33;
+ }
+ /**
+ * @param fract_transf_matrix33 the fract_transf_matrix33 to set
+ */
+ public void setFract_transf_matrix33(String fract_transf_matrix33) {
+ this.fract_transf_matrix33 = fract_transf_matrix33;
+ }
+ /**
+ * @return the fract_transf_vector1
+ */
+ public String getFract_transf_vector1() {
+ return fract_transf_vector1;
+ }
+ /**
+ * @param fract_transf_vector1 the fract_transf_vector1 to set
+ */
+ public void setFract_transf_vector1(String fract_transf_vector1) {
+ this.fract_transf_vector1 = fract_transf_vector1;
+ }
+ /**
+ * @return the fract_transf_vector2
+ */
+ public String getFract_transf_vector2() {
+ return fract_transf_vector2;
+ }
+ /**
+ * @param fract_transf_vector2 the fract_transf_vector2 to set
+ */
+ public void setFract_transf_vector2(String fract_transf_vector2) {
+ this.fract_transf_vector2 = fract_transf_vector2;
+ }
+ /**
+ * @return the fract_transf_vector3
+ */
+ public String getFract_transf_vector3() {
+ return fract_transf_vector3;
+ }
+ /**
+ * @param fract_transf_vector3 the fract_transf_vector3 to set
+ */
+ public void setFract_transf_vector3(String fract_transf_vector3) {
+ this.fract_transf_vector3 = fract_transf_vector3;
+ }
+ /**
+ * @return the cartn_transf_matrix11
+ */
+ public String getCartn_transf_matrix11() {
+ return Cartn_transf_matrix11;
+ }
+ /**
+ * @param cartn_transf_matrix11 the cartn_transf_matrix11 to set
+ */
+ public void setCartn_transf_matrix11(String cartn_transf_matrix11) {
+ Cartn_transf_matrix11 = cartn_transf_matrix11;
+ }
+ /**
+ * @return the cartn_transf_matrix12
+ */
+ public String getCartn_transf_matrix12() {
+ return Cartn_transf_matrix12;
+ }
+ /**
+ * @param cartn_transf_matrix12 the cartn_transf_matrix12 to set
+ */
+ public void setCartn_transf_matrix12(String cartn_transf_matrix12) {
+ Cartn_transf_matrix12 = cartn_transf_matrix12;
+ }
+ /**
+ * @return the cartn_transf_matrix13
+ */
+ public String getCartn_transf_matrix13() {
+ return Cartn_transf_matrix13;
+ }
+ /**
+ * @param cartn_transf_matrix13 the cartn_transf_matrix13 to set
+ */
+ public void setCartn_transf_matrix13(String cartn_transf_matrix13) {
+ Cartn_transf_matrix13 = cartn_transf_matrix13;
+ }
+ /**
+ * @return the cartn_transf_matrix21
+ */
+ public String getCartn_transf_matrix21() {
+ return Cartn_transf_matrix21;
+ }
+ /**
+ * @param cartn_transf_matrix21 the cartn_transf_matrix21 to set
+ */
+ public void setCartn_transf_matrix21(String cartn_transf_matrix21) {
+ Cartn_transf_matrix21 = cartn_transf_matrix21;
+ }
+ /**
+ * @return the cartn_transf_matrix22
+ */
+ public String getCartn_transf_matrix22() {
+ return Cartn_transf_matrix22;
+ }
+ /**
+ * @param cartn_transf_matrix22 the cartn_transf_matrix22 to set
+ */
+ public void setCartn_transf_matrix22(String cartn_transf_matrix22) {
+ Cartn_transf_matrix22 = cartn_transf_matrix22;
+ }
+ /**
+ * @return the cartn_transf_matrix23
+ */
+ public String getCartn_transf_matrix23() {
+ return Cartn_transf_matrix23;
+ }
+ /**
+ * @param cartn_transf_matrix23 the cartn_transf_matrix23 to set
+ */
+ public void setCartn_transf_matrix23(String cartn_transf_matrix23) {
+ Cartn_transf_matrix23 = cartn_transf_matrix23;
+ }
+ /**
+ * @return the cartn_transf_matrix31
+ */
+ public String getCartn_transf_matrix31() {
+ return Cartn_transf_matrix31;
+ }
+ /**
+ * @param cartn_transf_matrix31 the cartn_transf_matrix31 to set
+ */
+ public void setCartn_transf_matrix31(String cartn_transf_matrix31) {
+ Cartn_transf_matrix31 = cartn_transf_matrix31;
+ }
+ /**
+ * @return the cartn_transf_matrix32
+ */
+ public String getCartn_transf_matrix32() {
+ return Cartn_transf_matrix32;
+ }
+ /**
+ * @param cartn_transf_matrix32 the cartn_transf_matrix32 to set
+ */
+ public void setCartn_transf_matrix32(String cartn_transf_matrix32) {
+ Cartn_transf_matrix32 = cartn_transf_matrix32;
+ }
+ /**
+ * @return the cartn_transf_matrix33
+ */
+ public String getCartn_transf_matrix33() {
+ return Cartn_transf_matrix33;
+ }
+ /**
+ * @param cartn_transf_matrix33 the cartn_transf_matrix33 to set
+ */
+ public void setCartn_transf_matrix33(String cartn_transf_matrix33) {
+ Cartn_transf_matrix33 = cartn_transf_matrix33;
+ }
+ /**
+ * @return the cartn_transf_vector1
+ */
+ public String getCartn_transf_vector1() {
+ return Cartn_transf_vector1;
+ }
+ /**
+ * @param cartn_transf_vector1 the cartn_transf_vector1 to set
+ */
+ public void setCartn_transf_vector1(String cartn_transf_vector1) {
+ Cartn_transf_vector1 = cartn_transf_vector1;
+ }
+ /**
+ * @return the cartn_transf_vector2
+ */
+ public String getCartn_transf_vector2() {
+ return Cartn_transf_vector2;
+ }
+ /**
+ * @param cartn_transf_vector2 the cartn_transf_vector2 to set
+ */
+ public void setCartn_transf_vector2(String cartn_transf_vector2) {
+ Cartn_transf_vector2 = cartn_transf_vector2;
+ }
+ /**
+ * @return the cartn_transf_vector3
+ */
+ public String getCartn_transf_vector3() {
+ return Cartn_transf_vector3;
+ }
+ /**
+ * @param cartn_transf_vector3 the cartn_transf_vector3 to set
+ */
+ public void setCartn_transf_vector3(String cartn_transf_vector3) {
+ Cartn_transf_vector3 = cartn_transf_vector3;
+ }
+
+}
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/xtal/CrystalBuilder.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/xtal/CrystalBuilder.java
index 2d0ea1b3b4..f24ea9b4a8 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/xtal/CrystalBuilder.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/xtal/CrystalBuilder.java
@@ -102,20 +102,34 @@ public CrystalBuilder(Structure structure) {
if (structure.isCrystallographic()) {
this.isCrystallographic = true;
+
// we need to check space group not null for the cases where the entry is crystallographic but
// the space group is not a standard one recognized by biojava, e.g. 1mnk (SG: 'I 21')
- if (this.crystallographicInfo.getSpaceGroup()==null) {
- logger.warn("Could not find a space group, will only calculate asymmetric unit interfaces.");
+ if (this.crystallographicInfo.isNonStandardSg()) {
+ logger.warn("Space group is non-standard, will only calculate asymmetric unit interfaces.");
+ this.isCrystallographic = false;
+
+ } else if (this.crystallographicInfo.getSpaceGroup()==null) {
+ // just in case we still check for space group null (a user pdb file could potentially be crystallographic and have no space group)
+ logger.warn("Space group is null, will only calculate asymmetric unit interfaces.");
this.isCrystallographic = false;
} else {
this.numOperatorsSg = this.crystallographicInfo.getSpaceGroup().getMultiplicity();
}
+
// we need to check crystal cell not null for the rare cases where the entry is crystallographic but
// the crystal cell is not given, e.g. 2i68, 2xkm, 4bpq
if (this.crystallographicInfo.getCrystalCell()==null) {
logger.warn("Could not find a crystal cell definition, will only calculate asymmetric unit interfaces.");
this.isCrystallographic = false;
}
+
+ // check for cases like 4hhb that are in a non-standard coordinate frame convention, see https://github.com/eppic-team/owl/issues/4
+ if (this.crystallographicInfo.isNonStandardCoordFrameConvention()) {
+ logger.warn("Non-standard coordinate frame convention, will only calculate asymmetric unit interfaces.");
+ this.isCrystallographic = false;
+ this.numOperatorsSg = 1; // we force here to 1 or otherwise it gets filled from sg above
+ }
} else {
this.isCrystallographic = false;
diff --git a/biojava-structure/src/main/java/org/biojava/nbio/structure/xtal/CrystalCell.java b/biojava-structure/src/main/java/org/biojava/nbio/structure/xtal/CrystalCell.java
index 95c409d6d5..3850c0b87b 100644
--- a/biojava-structure/src/main/java/org/biojava/nbio/structure/xtal/CrystalCell.java
+++ b/biojava-structure/src/main/java/org/biojava/nbio/structure/xtal/CrystalCell.java
@@ -547,9 +547,10 @@ public boolean checkScaleMatrixConsistency(Matrix4d scaleMatrix) {
*/
public boolean checkScaleMatrix(Matrix4d scaleMatrix) {
+ Matrix3d mtranspose = getMTranspose();
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {
- if (!deltaComp(getMTranspose().getElement(i, j),scaleMatrix.getElement(i, j))) {
+ if (!deltaComp(mtranspose.getElement(i, j),scaleMatrix.getElement(i, j))) {
//System.out.println("Our value ("+i+","+j+"): "+getM().getElement(i,j));
//System.out.println("Their value ("+i+","+j+"): "+scaleMatrix.getElement(i,j));
return false;
diff --git a/biojava-survival/pom.xml b/biojava-survival/pom.xml
index 5c87ef8b70..d7c072c558 100644
--- a/biojava-survival/pom.xml
+++ b/biojava-survival/pom.xml
@@ -4,7 +4,7 @@
org.biojava
biojava
- 4.2.4
+ 4.2.5
biojava-survival
diff --git a/biojava-ws/pom.xml b/biojava-ws/pom.xml
index f6ef1afbfa..490d79c32d 100644
--- a/biojava-ws/pom.xml
+++ b/biojava-ws/pom.xml
@@ -3,7 +3,7 @@
biojava
org.biojava
- 4.2.4
+ 4.2.5
biojava-ws
biojava-ws
@@ -19,7 +19,7 @@
org.biojava
biojava-core
- 4.2.4
+ 4.2.5
compile
diff --git a/pom.xml b/pom.xml
index 3aa5456d2e..e1daf1fcea 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,7 @@
org.biojava
biojava
pom
- 4.2.4
+ 4.2.5
biojava
BioJava is an open-source project dedicated to providing a Java framework for processing biological
data. It provides analytical and statistical routines, parsers for common file formats and allows the
@@ -44,7 +44,7 @@
scm:git:git@github.com:biojava/biojava.git
https://github.com/biojava/biojava
- biojava-4.2.4
+ biojava-4.2.5