package org.openscience.cdk.layout;
import org.openscience.cdk.exception.CDKException;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.io.iterator.IteratingSDFReader;
import org.openscience.cdk.isomorphism.matchers.IQueryAtomContainer;
import org.openscience.cdk.silent.SilentChemObjectBuilder;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* Given an SDfile - extract the layout of core ring templates to a separate SDfile.
*
* @author John May
* @see <a href="https://github.com/cdk/cdk/wiki/Making-a-template-library">Making a template library</a>
*/
public class ExtractTemplates {
public static void main(String[] args) throws IOException, CDKException {
if (args.length < 1 || !args[0].endsWith(".sdf")) {
System.err.println("Expected input SDF as argument.");
return;
}
if (args[0].startsWith("~"))
args[0] = System.getProperty("user.home") + args[0].substring(1);
String sdfInPath = args[0];
String sdfOutPath = sdfInPath.substring(0, sdfInPath.length() - 4) + "-templates.sdf";
System.out.println("Extracting ring templates to '" + sdfOutPath + "'");
System.out.println(" - input SDfile: '" + sdfInPath + "'");
RingTemplateExtractor extractor = new RingTemplateExtractor();
IteratingSDFReader sdfReader = new IteratingSDFReader(new FileReader(sdfInPath),
SilentChemObjectBuilder.getInstance());
SDfile:
while (sdfReader.hasNext()) {
IAtomContainer container = sdfReader.next();
if (container instanceof IQueryAtomContainer)
continue;
for (IAtom atom : container.atoms()) {
if (atom.getImplicitHydrogenCount() == null)
continue SDfile;
if (atom.getPoint2d() == null)
continue SDfile;
}
extractor.add(container);
}
extractor.writeSDfile(new File(sdfOutPath));
}
}