/********************************************************************** Copyright (C) 2003-2005 by Geoffrey R. Hutchison This file is part of the Open Babel project. For more information, see This program 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 version 2 of the License. This program 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. ***********************************************************************/ // used to set import/export for Cygwin DLLs #ifdef WIN32 #define USING_OBDLL #endif #include #include #include namespace OpenBabel { bool SafeOpen(std::ifstream &fs, const char *filename); bool SafeOpen(std::ofstream &fs, const char *filename); } using namespace std; using namespace OpenBabel; #ifdef TESTDATADIR string testdatadir = TESTDATADIR; string unitcell_file = testdatadir + "unitcell.txt"; string results_file = testdatadir + "unitcell_results.txt"; #else string unitcell_file = "files/unitcell.txt"; string results_file = "files/unitcell_results.txt"; #endif int main(int argc,char *argv[]) { if (argc != 1) { cout << "Usage: unitcell" << endl; cout << " Tests Open Babel unit cell conversions." << endl; return 0; } cout << "# Testing unit cell transformations ..." << endl; cout << "1..12" << endl; double a, b, c, alpha, beta, gamma; vector3 v1, v2, v3, v4, v5, v6, v7, v8, v9; double x = 0.0, y = 0.0, z = 0.0; char buffer[BUFF_SIZE]; std::ifstream ifs, results; OBUnitCell cell, cell2; vector v3Return; vector vs; unsigned int currTest = 1; if (!SafeOpen(ifs, unitcell_file.c_str())) { cout << "Bail out! Couldn't open test file 'unitcell.txt'" << endl; return(-1); } if (!SafeOpen(results, results_file.c_str())) { cout << "Bail out! Couldn't open test file 'unitcell_results.txt'" << endl; return(-1); } ifs.getline(buffer,BUFF_SIZE); sscanf(buffer,"%lf %lf %lf",&x, &y, &z); v1.Set(x, y, z); ifs.getline(buffer,BUFF_SIZE); sscanf(buffer,"%lf %lf %lf",&x, &y, &z); v2.Set(x, y, z); ifs.getline(buffer,BUFF_SIZE); sscanf(buffer,"%lf %lf %lf",&x, &y, &z); v3.Set(x, y, z); cell.SetData(v1, v2, v3); a = cell.GetA(); b = cell.GetB(); c = cell.GetC(); alpha = cell.GetAlpha(); beta = cell.GetBeta(); gamma = cell.GetGamma(); results.getline(buffer,BUFF_SIZE); tokenize(vs,buffer); if (vs.size() != 6) { cout << "Bail out! Cannot parse results file 'unitcell_results.txt'" << endl; return(-1); } if ( IsNear(a, atof(vs[0].c_str()), 1.0e-3) ) cout << "ok " << currTest++ << " # a distance" << endl; else cout << "not ok " << currTest++ << " # a distance" << endl; if ( IsNear(b, atof(vs[1].c_str()), 1.0e-3) ) cout << "ok " << currTest++ << " # b distance" << endl; else cout << "not ok " << currTest++ << " # b distance" << endl; if ( IsNear(c, atof(vs[2].c_str()), 1.0e-3) ) cout << "ok " << currTest++ << " # c distance" << endl; else cout << "not ok " << currTest++ << " # c distance" << endl; if ( IsNear(alpha, atof(vs[3].c_str()), 1.0e-3) ) cout << "ok " << currTest++ << " # alpha angle" << endl; else cout << "not ok " << currTest++ << " # alpha angle" << alpha << endl; if ( IsNear(beta, atof(vs[4].c_str()), 1.0e-3) ) cout << "ok " << currTest++ << " # beta angle" << endl; else cout << "not ok " << currTest++ << " # beta angle " << beta << endl; if ( IsNear(gamma, atof(vs[5].c_str()), 1.0e-3) ) cout << "ok " << currTest++ << " # gamma angle" << endl; else cout << "not ok " << currTest++ << " # gamma angle: " << gamma << endl; // check to see if vector and a,b,c methods are equivalent cell2.SetData(a, b, c, alpha, beta, gamma); if ( IsNear(a, cell2.GetA(), 1.0e-3) ) cout << "ok " << currTest++ << " # a distance" << endl; else cout << "not ok " << currTest++ << " # a distance" << endl; if ( IsNear(b, cell2.GetB(), 1.0e-3) ) cout << "ok " << currTest++ << " # b distance" << endl; else cout << "not ok " << currTest++ << " # b distance" << endl; if ( IsNear(c, cell2.GetC(), 1.0e-3) ) cout << "ok " << currTest++ << " # c distance" << endl; else cout << "not ok " << currTest++ << " # c distance" << endl; if ( IsNear(alpha, cell2.GetAlpha(), 1.0e-3) ) cout << "ok " << currTest++ << " # a angle" << endl; else cout << "not ok " << currTest++ << " # a angle" << endl; if ( IsNear(beta, cell2.GetBeta(), 1.0e-3) ) cout << "ok " << currTest++ << " # beta angle" << endl; else cout << "not ok " << currTest++ << " # beta angle" << endl; if ( IsNear(gamma, cell2.GetGamma(), 1.0e-3) ) cout << "ok " << currTest++ << " # gamma angle" << endl; else cout << "not ok " << currTest++ << " # gamma angle" << endl; v3Return = cell2.GetCellVectors(); v4 = v3Return[0]; // cout << v4 << endl; v5 = v3Return[1]; // cout << v5 << endl; v6 = v3Return[2]; // cout << v6 << endl; v9 = vector3(1.0f, 1.0f, 1.0f); matrix3x3 m = cell2.GetOrthoMatrix(); v9 *= m; // cout << v9 << endl; cout << "# cell volume " << cell.GetCellVolume() << endl; cout << "# lattice type " << cell.GetLatticeType() << endl; cout << "# cell volume " << cell2.GetCellVolume() << endl; cout << "# lattice type " << cell2.GetLatticeType() << endl; return(0); // success }