/* * 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.xtal; import static org.junit.Assert.*; import javax.vecmath.AxisAngle4d; import javax.vecmath.Matrix4d; import javax.vecmath.Point3d; import javax.vecmath.Point3i; import static java.lang.Math.sqrt; import org.junit.Before; import org.junit.Test; public class TestCrystalCell { @Before public void setUp() throws Exception { } @Test public void testGetCellIndices() { CrystalCell cell = new CrystalCell(100, 100, 100, 90, 90, 45); Point3i result,expected; Point3d query; query = new Point3d(0,0,0); expected = new Point3i(0,0,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(99.9,0,0); expected = new Point3i(0,0,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(100,0,0); expected = new Point3i(1,0,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(0,50,0); expected = new Point3i(-1,0,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(51,50,0); expected = new Point3i(0,0,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(72,71,0); expected = new Point3i(0,1,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(500,0,0); expected = new Point3i(5,0,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(-500,0,0); expected = new Point3i(-5,0,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(-550,0,0); expected = new Point3i(-6,0,0); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); query = new Point3d(2,1,500); expected = new Point3i(0,0,5); result = cell.getCellIndices(query); assertEquals("Wrong index for "+query,expected,result); } @Test public void testTransformToOrigin() { CrystalCell cell = new CrystalCell(100, 100, 100, 90, 90, 45); double h = 100/Math.sqrt(2); double tol = 1e-6; Point3d query,expected; // Note that the 0 boundaries are instable // If tests break, it's ok to move into the cell (e.g. <2,1,1> is unambiguous) query = new Point3d(0,0,0); expected = new Point3d(0,0,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(99.9,0,0); expected = new Point3d(99.9,0,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(100,0,0); expected = new Point3d(0,0,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(0,50,0); expected = new Point3d(100,50,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(51,50,0); expected = new Point3d(51,50,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(h+2,h+1,0); expected = new Point3d(2,1,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(500,0,0); expected = new Point3d(0,0,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(-500,0,0); expected = new Point3d(0,0,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(2,1,500); expected = new Point3d(2,1,0); cell.transfToOriginCell(query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); } @Test public void testTransformToOriginArray() { CrystalCell cell = new CrystalCell(100, 100, 100, 90, 90, 45); double h = 100/Math.sqrt(2); double tol = 1e-6; Point3d query,expected; // Note that the 0 boundaries are instable // If tests break, it's ok to move into the cell (e.g. <2,1,1> is unambiguous) query = new Point3d(0,0,0); expected = new Point3d(0,0,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(99.9,0,0); expected = new Point3d(99.9,0,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(100,0,0); expected = new Point3d(0,0,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(0,50,0); expected = new Point3d(100,50,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(51,50,0); expected = new Point3d(51,50,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(h+2,h+1,0); expected = new Point3d(2,1,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(500,0,0); expected = new Point3d(0,0,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(-500,0,0); expected = new Point3d(0,0,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); query = new Point3d(2,1,500); expected = new Point3d(2,1,0); cell.transfToOriginCell(new Point3d[] {query}, query); assertTrue("Error transforming to origin. Expected:"+expected+" but was:"+query, expected.epsilonEquals(query, tol)); } @Test public void testMatrixTransfToOriginCell() { CrystalCell cell = new CrystalCell(100, 100, 100, 90, 90, 45); Matrix4d[] operations = new Matrix4d[2]; Matrix4d xtalOp; int i = 0; // 90 deg rotation xtalOp = new Matrix4d(); xtalOp.set(new AxisAngle4d(0,0,1,Math.PI/2)); operations[i++] = cell.transfToOrthonormal(xtalOp); // translate (+2,+1,-1) followed by 90 deg rotation xtalOp.m03 += 2; xtalOp.m13 += 1; xtalOp.m23 += -1; operations[i++] = cell.transfToOrthonormal(xtalOp); xtalOp.set(new AxisAngle4d(0,0,1,-Math.PI/4)); xtalOp.m03 += 1; Point3d ref; ref = new Point3d(50-3*25*sqrt(2), -3*25*sqrt(2), 50); // center of cell (.5,-2,0) Matrix4d[] transformed = cell.transfToOriginCellOrthonormal(operations, ref); for(Matrix4d op: transformed) { Point3d x = new Point3d(ref); op.transform(x); Point3i index = cell.getCellIndices(x); assertEquals(new Point3i(0,0,0),index); } } }