/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojava.nbio.structure; import org.biojava.nbio.structure.xtal.CrystalCell; import org.biojava.nbio.structure.xtal.SpaceGroup; import javax.vecmath.Matrix4d; import java.io.Serializable; /** * A class to hold crystallographic information about a PDB structure. * * @author Peter Rose * @author duarte_j */ public class PDBCrystallographicInfo implements Serializable { private static final long serialVersionUID = -7949886749566087669L; private CrystalCell cell; private SpaceGroup sg; /** * Some PDB files contain NCS operators necessary to create the full AU. * Usually this happens for viral proteins. * See http://www.wwpdb.org/documentation/format33/sect8.html#MTRIXn . * Note that the "given" operators * (iGiven field =1 in PDB format, "given" string in _struct_ncs_oper.code in mmCIF format) * 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() { } /** * @return the unit cell parameter a */ public float getA() { return (float)cell.getA(); } /** * @return the unit cell parameter b */ public float getB() { return (float)cell.getB(); } /** * @return the unit cell parameter c */ public float getC() { return (float)cell.getC(); } /** * @return the unit cell parameter alpha (degrees) */ public float getAlpha() { return (float)cell.getAlpha(); } /** * @return the unit cell parameter beta (degrees) */ public float getBeta() { return (float)cell.getBeta(); } /** * @return the unit cell parameter gamma (degrees) */ public float getGamma() { return (float)cell.getGamma(); } /** * Return the crystal cell * @return */ public CrystalCell getCrystalCell() { return cell; } /** * Set the crystal cell * @param cell */ public void setCrystalCell(CrystalCell cell) { this.cell = cell; } /** * Get the SpaceGroup * @return the spaceGroup */ public SpaceGroup getSpaceGroup() { return sg; } /** * Set the SpaceGroup * @param spaceGroup */ public void setSpaceGroup(SpaceGroup spaceGroup) { this.sg = spaceGroup; } /** * Return the z, i.e. the multiplicity of the space group times the number of chains in asymmetric unit * @return 0 * @deprecated As of 4.0, use {@link SpaceGroup#getMultiplicity()} and {@link Structure#size()} */ @Deprecated public int getZ() { return 0; } /** * Gets all symmetry transformation operators corresponding to this structure's space group * (including the identity, at index 0) expressed in the orthonormal basis. Using PDB axes * convention (NCODE=1). * @return an array of size {@link SpaceGroup#getNumOperators()} */ public Matrix4d[] getTransformationsOrthonormal() { Matrix4d[] transfs = new Matrix4d[this.getSpaceGroup().getNumOperators()]; transfs[0] = new Matrix4d(this.getSpaceGroup().getTransformation(0)); // no need to transform the identity for (int i=1;i<this.getSpaceGroup().getNumOperators();i++) { transfs[i] = this.cell.transfToOrthonormal(this.getSpaceGroup().getTransformation(i)); } return transfs; } /** * Get the NCS operators. * Some PDB files contain NCS operators necessary to create the full AU. * Usually this happens for viral proteins. * See http://www.wwpdb.org/documentation/format33/sect8.html#MTRIXn . * Note that the "given" operators * (iGiven field =1 in PDB format, "given" string in _struct_ncs_oper.code in mmCIF format) * are not stored. * @return the operators or null if no operators present */ public Matrix4d[] getNcsOperators() { return ncsOperators; } /** * Set the NCS operators. * Some PDB files contain NCS operators necessary to create the full AU. * Usually this happens for viral proteins. * See http://www.wwpdb.org/documentation/format33/sect8.html#MTRIXn . * Note that the "given" operators * (iGiven field =1 in PDB format, "given" string in _struct_ncs_oper.code in mmCIF format) * are not stored. * @param ncsOperators */ 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 public String toString() { return "["+ (sg==null?"no SG":sg.getShortSymbol())+" - "+ (cell==null?"no Cell": String.format("%.2f %.2f %.2f, %.2f %.2f %.2f", cell.getA(),cell.getB(),cell.getC(),cell.getAlpha(),cell.getBeta(),cell.getGamma()) )+ (ncsOperators==null? "" : String.format(" - %d NCS operators",ncsOperators.length) )+ "]"; } }