org.biojava.nbio.structure.io.GroupToSDF Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of biojava-structure Show documentation
Show all versions of biojava-structure Show documentation
The protein structure modules of BioJava.
/*
* 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.io;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import org.biojava.nbio.structure.Atom;
import org.biojava.nbio.structure.Bond;
import org.biojava.nbio.structure.Group;
public class GroupToSDF {
public String getText(Group thisGroup) {
// Fuction to convert a Group to a strign of the MDL molnlock
StringBuilder sb = new StringBuilder();
sb.append(getHeader(thisGroup));
sb.append(getCtab(thisGroup));
return sb.toString();
}
private String getCtab(Group thisGroup){
DecimalFormat df = new DecimalFormat("0.0000");
// The thre string builders for the three parts of the MDL block
StringBuilder header = new StringBuilder();
StringBuilder atomList = new StringBuilder();
StringBuilder bondOrders = new StringBuilder();
int numBonds = 0;
List atoms = thisGroup.getAtoms();
for(Atom a: thisGroup.getAtoms()){
/// ALL SHOULD BE TO FOUR DECIMAL PLACES WITH A CERTAIN NUMBER OF SPACES BEFOREa
String spaceX = getSpace(10, df.format(a.getX()));
String spaceY = getSpace(10, df.format(a.getY()));
String spaceZ = getSpace(10, df.format(a.getZ()));
String spaceEle = getSpace(4, a.getElement().toString());
atomList.append(spaceX+df.format(a.getX())+spaceY+df.format(a.getY())+spaceZ+df.format(a.getZ())+" "+a.getElement().toString()+spaceEle+"0 0 0 0 0 0 0 0 0 0 0 0\n");
for(Bond b: a.getBonds()){
Atom otherAtom = b.getOther(a);
if(atoms.indexOf(otherAtom)>=atoms.indexOf(a)){
continue;
}
if(atoms.indexOf(otherAtom)<0){
continue;
}
if(atoms.indexOf(a)<0){
continue;
}
numBonds++;
// Deal with the index infromation
String indexOther = Integer.toString(atoms.indexOf(otherAtom)+1);
String index = Integer.toString(atoms.indexOf(a)+1);
String order = Integer.toString(b.getBondOrder());
String spaceIndOne = getSpace(3, index);
String spaceIndTwo = getSpace(3, indexOther);
String spaceOrder = getSpace(3, order);
bondOrders.append(spaceIndOne).append(index).append(spaceIndTwo).append(indexOther).append(spaceOrder).append(order).append(" 0\n");
}
}
StringBuilder outString = new StringBuilder();
// Add the first line now
String spaceNumAtoms = getSpace(3, Integer.toString(thisGroup.getAtoms().size()));
String spaceNumBonds = getSpace(3, Integer.toString(numBonds));
header.append("\n");
header.append(spaceNumAtoms).append(thisGroup.getAtoms().size()).append(spaceNumBonds).append(numBonds).append(" 0 0 0 0 0 0 0 0999 V2000\n");
// Now add the header, atom, bond and charge information togeyher
outString.append(header.toString());
outString.append(atomList.toString());
outString.append(bondOrders.toString());
outString.append(getCharges(thisGroup));
// Add the final line and the $$$$ delimiter
outString.append("M END\n$$$$");
// Get the string and return it
return outString.toString();
}
private Object getCharges(Group thisGroup) {
// Get the array of charges
List chargeList = getAtomCharges(thisGroup);
// Build the string
StringBuilder outS = new StringBuilder();
int chargeCount=0;
// Loop through the charges -> maximum 8 charges per line
for(int i =0; i getAtomCharges(Group group) {
// The list to store the answer
List outArr = new ArrayList<>();
// Get the atom charge Information
for(Atom a: group.getAtoms()){
outArr.add(a.getCharge());
}
return outArr;
}
private String getSpace(int inputNum, String format) {
// Function to get the spaces between numbers
StringBuilder sb = new StringBuilder();
for(int i=0; i<(inputNum-format.length());i++){
sb.append(" ");
}
return sb.toString();
}
private String getHeader(Group thisGroup) {
// Make the header info for the start of the block
StringBuilder sb = new StringBuilder();
sb.append(thisGroup.getPDBName()).append("\n");
sb.append("Made by BioJava");
sb.append("\n");
return sb.toString();
}
}