bool Cube::setLimits(const Molecule &mol, double spacing_, double padding) { Index numAtoms = mol.atomCount(); Vector3 min_, max_; if (numAtoms) { Vector3 curPos = min_ = max_ = mol.atomPositions3d()[0]; for (Index i = 1; i < numAtoms; ++i) { curPos = mol.atomPositions3d()[i]; if (curPos.x() < min_.x()) min_.x() = curPos.x(); if (curPos.x() > max_.x()) max_.x() = curPos.x(); if (curPos.y() < min_.y()) min_.y() = curPos.y(); if (curPos.y() > max_.y()) max_.y() = curPos.y(); if (curPos.z() < min_.z()) min_.z() = curPos.z(); if (curPos.z() > max_.z()) max_.z() = curPos.z(); } } else { min_ = max_ = Vector3::Zero(); } // Now to take care of the padding term min_ += Vector3(-padding,-padding,-padding); max_ += Vector3( padding, padding, padding); return setLimits(min_, max_, spacing_); }
TEST_F(MoleculeSerializationTest, roundTrip) { MoleculeSerializer serializer(&this->ethane); size_t size = serializer.size(); uint8 *data = new uint8[size]; bool success = serializer.serialize(data, size); EXPECT_TRUE(success); Molecule after; MoleculeDeserializer deserializer(&after); success = deserializer.deserialize(data, size); EXPECT_TRUE(success); delete[] data; EXPECT_EQ(this->ethane.atomicNumbers(), after.atomicNumbers()); std::vector<Avogadro::Vector2> expected2d = this->ethane.atomPositions2d(); std::vector<Avogadro::Vector2> actual2d = after.atomPositions2d(); EXPECT_EQ(expected2d.size(), actual2d.size()); for (size_t i = 0; i < expected2d.size(); i++) EXPECT_TRUE(this->equal(expected2d[i], actual2d[i])); std::vector<Avogadro::Vector3> expected3d = this->ethane.atomPositions3d(); std::vector<Avogadro::Vector3> actual3d = after.atomPositions3d(); EXPECT_EQ(expected3d.size(), actual3d.size()); for (size_t i = 0; i < expected3d.size(); i++) EXPECT_TRUE(this->equal(expected3d[i], actual3d[i])); const std::vector<std::pair<size_t, size_t> > expectedBondPairs = this->ethane.bondPairs(); const std::vector<std::pair<size_t, size_t> > actualBondPairs = after.bondPairs(); EXPECT_EQ(expectedBondPairs.size(), actualBondPairs.size()); for (size_t i = 0; i < expectedBondPairs.size(); i++) { EXPECT_EQ(expectedBondPairs[i].first, actualBondPairs[i].first); EXPECT_EQ(expectedBondPairs[i].second, actualBondPairs[i].second); } const std::vector<unsigned char> expectedBondOrder = this->ethane.bondOrders(); const std::vector<unsigned char> actualBondOrder = after.bondOrders(); for (size_t i = 0; i < expectedBondOrder.size(); i++) EXPECT_EQ(expectedBondOrder[i], actualBondOrder[i]); }
TEST(UnitCellTest, fractionalCoordinates) { Molecule mol = createCrystal(static_cast<Real>(3.0), static_cast<Real>(4.0), static_cast<Real>(5.0), static_cast<Real>(90.0), static_cast<Real>(120.0), static_cast<Real>(77.0)); mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(0), static_cast<Real>(0), static_cast<Real>(0))); mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(0.7), static_cast<Real>(2.23733), static_cast<Real>(2.14574))); mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(2.07490), static_cast<Real>(2.09303), static_cast<Real>(1.07287))); mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(3), static_cast<Real>(0), static_cast<Real>(0))); mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(0.89980), static_cast<Real>(3.89748), static_cast<Real>(0))); mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(-2.5), static_cast<Real>(0.57717), static_cast<Real>(4.29149))); Array<Vector3> ccoords_ref = mol.atomPositions3d(); Array<Vector3> fcoords; EXPECT_TRUE(CrystalTools::fractionalCoordinates(mol, fcoords)); EXPECT_EQ(mol.atomCount(), fcoords.size()); EXPECT_TRUE(std::fabs(fcoords[0][0] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[0][1] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[0][2] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[1][0] - static_cast<Real>(0.5)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[1][1] - static_cast<Real>(0.5)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[1][2] - static_cast<Real>(0.5)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[2][0] - static_cast<Real>(0.75)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[2][1] - static_cast<Real>(0.5)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[2][2] - static_cast<Real>(0.25)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[3][0] - static_cast<Real>(1)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[3][1] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[3][2] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[4][0] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[4][1] - static_cast<Real>(1)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[4][2] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[5][0] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[5][1] - static_cast<Real>(0)) < 1e-4); EXPECT_TRUE(std::fabs(fcoords[5][2] - static_cast<Real>(1)) < 1e-4); mol.atomPositions3d().clear(); EXPECT_TRUE(CrystalTools::setFractionalCoordinates(mol, fcoords)); Array<Vector3> ccoords = mol.atomPositions3d(); for (int i = 0; i < 6; ++i) { for (int j = 0; j < 3; ++j) { EXPECT_FLOAT_EQ(static_cast<float>(ccoords_ref[i][j]), static_cast<float>(ccoords[i][j])) << " (i=" << i << "j=" << j << ")"; } } }