//------------------------------------------------------------------------------ bool OBOpenDXCubeFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv) { OBMol* pmol = dynamic_cast<OBMol*>(pOb); if(pmol==NULL) return false; ostream &ofs = *pConv->GetOutStream(); OBMol &mol = *pmol; char buffer[BUFF_SIZE]; string str; stringstream errorMsg; OBGridData *gd = (OBGridData*)mol.GetData(OBGenericDataType::GridData); if (gd == NULL) { errorMsg << "The molecule has no grid."; obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning); return false; } // APBS-style OpenDX Multigrid // First some comments ofs << "# Data from Open Babel " << BABEL_VERSION << "\n"; str = mol.GetTitle(); if (str.empty()) ofs << "# Molecule Title: *****" << "\n"; else ofs << "# Molecule Title: " << str << "\n"; int nx, ny, nz; double origin[3], xAxis[3], yAxis[3], zAxis[3]; gd->GetAxes(xAxis, yAxis, zAxis); gd->GetNumberOfPoints(nx, ny, nz); gd->GetOriginVector(origin); // data line 1: # of points in x, y, z (nx, ny, nz) snprintf(buffer, BUFF_SIZE, "object 1 class gridpositions counts %5d %5d %5d", nx, ny, nz); ofs << buffer << "\n"; // data line 2: origin (x, y, z) snprintf(buffer, BUFF_SIZE,"origin %12.6f %12.6f %12.6f", origin[0], origin[1], origin[2]); ofs << buffer << "\n"; // data line 3: x-displacement snprintf(buffer, BUFF_SIZE,"delta %12.6f %12.6f %12.6f", xAxis[0], xAxis[1], xAxis[2]); ofs << buffer << "\n"; // data line 4: y-displacement snprintf(buffer, BUFF_SIZE,"delta %12.6f %12.6f %12.6f", yAxis[0], yAxis[1], yAxis[2]); ofs << buffer << "\n"; // data line 5: z-displacement snprintf(buffer, BUFF_SIZE,"delta %12.6f %12.6f %12.6f", zAxis[0], zAxis[1], zAxis[2]); ofs << buffer << "\n"; // data line 6: # of points in x, y, z (nx, ny, nz) snprintf(buffer, BUFF_SIZE, "object 2 class gridconnections counts %5d %5d %5d", nx, ny, nz); ofs << buffer << "\n"; // data line 7: total # of points snprintf(buffer, BUFF_SIZE, "object 3 class array type double rank 0 items %5d data follows", nx*ny*nz); ofs << buffer << "\n"; // The cube(s) double value; unsigned int count = 1; for (int i = 0; i < nx; ++i) { for (int j = 0; j < ny; ++j) { for (int k = 0; k < nz; ++k) { value = gd->GetValue(i, j, k); snprintf(buffer, BUFF_SIZE," %12.5E", value); if (count % 3 == 0) ofs << buffer << "\n"; else ofs << buffer; count++; } // z-axis } // y-axis } // x-axis if (count % 3 != 0) ofs << "\n"; ofs << "attribute \"dep\" string \"positions\"\n"; ofs << "object \"regular positions regular connections\" class field\n"; ofs << "component \"positions\" value 1\n"; ofs << "component \"connections\" value 2\n"; ofs << "component \"data\" value 3\n"; return true; }
//------------------------------------------------------------------------------ bool OBGaussianCubeFormat::WriteMolecule(OBBase* pOb, OBConversion* pConv) { OBMol* pmol = dynamic_cast<OBMol*>(pOb); if(pmol==NULL) return false; ostream &ofs = *pConv->GetOutStream(); OBMol &mol = *pmol; char buffer[BUFF_SIZE]; string str; stringstream errorMsg; // first two lines are comments str = mol.GetTitle(); if (str.empty()) ofs << "*****" << endl; else ofs << str << endl; ofs << endl; // line 2 OBGridData *gd = (OBGridData*)mol.GetData(OBGenericDataType::GridData); if (gd == NULL) { errorMsg << "The molecule has no grid."; obErrorLog.ThrowError(__FUNCTION__, errorMsg.str(), obWarning); return false; } int nx, ny, nz; double origin[3], xAxis[3], yAxis[3], zAxis[3]; gd->GetAxes(xAxis, yAxis, zAxis); gd->GetNumberOfPoints(nx, ny, nz); gd->GetOriginVector(origin); // line 3: number of atoms, origin x y z snprintf(buffer, BUFF_SIZE,"%5d%12.6f%12.6f%12.6f", - static_cast<signed int> (mol.NumAtoms()), origin[0]*ANGSTROM_TO_BOHR, origin[1]*ANGSTROM_TO_BOHR, origin[2]*ANGSTROM_TO_BOHR); ofs << buffer << endl; // line 4: number of points x direction, axis x direction x y z snprintf(buffer, BUFF_SIZE,"%5d%12.6f%12.6f%12.6f", nx, xAxis[0]*ANGSTROM_TO_BOHR, xAxis[1]*ANGSTROM_TO_BOHR, xAxis[2]*ANGSTROM_TO_BOHR); ofs << buffer << endl; // line 5: number of points y direction, axis y direction x y z snprintf(buffer, BUFF_SIZE,"%5d%12.6f%12.6f%12.6f", ny, yAxis[0]*ANGSTROM_TO_BOHR, yAxis[1]*ANGSTROM_TO_BOHR, yAxis[2]*ANGSTROM_TO_BOHR); ofs << buffer << endl; // line 6: number of points z direction, axis z direction x y z snprintf(buffer, BUFF_SIZE,"%5d%12.6f%12.6f%12.6f", nz, zAxis[0]*ANGSTROM_TO_BOHR, zAxis[1]*ANGSTROM_TO_BOHR, zAxis[2]*ANGSTROM_TO_BOHR); ofs << buffer << endl; // Atom lines: atomic number, ?, X, Y, Z FOR_ATOMS_OF_MOL (atom, mol) { double *coordPtr = atom->GetCoordinate(); snprintf(buffer, BUFF_SIZE,"%5d%12.6f%12.6f%12.6f%12.6f", atom->GetAtomicNum(), static_cast<double>(atom->GetAtomicNum()), coordPtr[0]*ANGSTROM_TO_BOHR, coordPtr[1]*ANGSTROM_TO_BOHR, coordPtr[2]*ANGSTROM_TO_BOHR); ofs << buffer << endl; }