Skip to content
John Mayfield edited this page Sep 13, 2017 · 8 revisions

Heavy atom counts from an SD file

IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
boolean skipErrors = true;
try (InputStream in = new FileInputStream(new File("myinput.sdf"));
     Reader rdr = new InputStreamReader(in, StandardCharsets.UTF_8);
     IteratingSDFReader sdfr = new IteratingSDFReader(rdr,
                                                      builder,
                                                      skipErrors)) {
    while (sdfr.hasNext()) {
        IAtomContainer mol = sdfr.next();
        int numHeavy = 0;
        for (IAtom atom : mol.atoms()) {
            if (atom.getAtomicNumber() > 1)
                numHeavy++;
        }
    }
} catch (FileNotFoundException e) {
    System.err.println("No such file: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Low level IO error: " + e.getMessage());
}

Ring counts in a SMILES file

try (InputStream in = new FileInputStream(new File("input.smi"));
     Reader rdr = new InputStreamReader(in, StandardCharsets.UTF_8);
     BufferedReader brdr = new BufferedReader(rdr)) {

    IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
    SmilesParser       smipar  = new SmilesParser(builder);

    String line;
    while ((line = brdr.readLine()) != null) {
        try {
            IAtomContainer mol = smipar.parseSmiles(line);
            int numRings = Cycles.markRingAtomsAndBonds(mol);
        } catch (InvalidSmilesException ex) {
            System.err.println("BAD SMILES: " + line);
        }
    }

} catch (FileNotFoundException e) {
    System.err.println("No such file: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Low level IO error: " + e.getMessage());
}

Convert a SMILES string to canonical SMILES

try (InputStream in = new FileInputStream(new File("input.smi"));
     Reader rdr = new InputStreamReader(in, StandardCharsets.UTF_8);
     BufferedReader brdr = new BufferedReader(rdr)) {

    IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
    SmilesParser       smipar  = new SmilesParser(builder);
    SmilesGenerator    smigen  = new SmilesGenerator(SmiFlavor.Canonical | SmiFlavor.Stereo);
    // N.b. many flavor options to choose

    String line;
    while ((line = brdr.readLine()) != null) {
        try {
            IAtomContainer mol = smipar.parseSmiles(line);
            System.out.println(smigen.create(mol));
        } catch (InvalidSmilesException ex) {
            System.err.println("BAD SMILES: " + line);
        }
    }

} catch (FileNotFoundException e) {
    System.err.println("No such file: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Low level IO error: " + e.getMessage());
}

Report how many SD file records are within a certain molecular weight range

IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
boolean skipErrors = true;
try (InputStream in = new FileInputStream(new File("myinput.sdf"));
     Reader rdr = new InputStreamReader(in, StandardCharsets.UTF_8);
     IteratingSDFReader sdfr = new IteratingSDFReader(rdr,
                                                      builder,
                                                      skipErrors)) {
    double min = 300;
    double max = 400;
    int count = 0;
    while (sdfr.hasNext()) {
        IAtomContainer mol = sdfr.next();
        double weight = AtomContainerManipulator.getMolecularWeight(mol);
        if (weight >= min && weight <= max)
            count++;
    }
} catch (FileNotFoundException e) {
    System.err.println("No such file: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Low level IO error: " + e.getMessage());
}

Depict a molecule

caffeine

IChemObjectBuilder bldr   = SilentChemObjectBuilder.getInstance();
SmilesParser       smipar = new SmilesParser(bldr);

IAtomContainer mol = smipar.parseSmiles("CN1C=NC2=C1C(=O)N(C(=O)N2C)C caffeine");
mol.setProperty(CDKConstants.TITLE, "caffeine"); // title already set from input!

DepictionGenerator dptgen = new DepictionGenerator();
dptgen.withSize(200, 250)              // px (raster) or mm (vector)
      .withMolTitle()
      .withTitleColor(Color.DARK_GRAY) // annotations are red by default
      .depict(mol)
      .writeTo("~/caffeine.png");      // svg preferred but will be 20cmx25cm!

Highlight a substructure

3016

String fname = "benzodiazepine.sdf";
String sma   = "c1ccc2c(c1)C(=NCCN2)c3ccccc3";

IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance();
IAtomContainer     mol  = null;

try (FileInputStream in   = new FileInputStream(fname);
     MDLV2000Reader  mdlr = new MDLV2000Reader(in)) {
    while ((mol = mdlr.read(bldr.newInstance(IAtomContainer.class))) != null)
        if (mol.getProperty(CDKConstants.TITLE).equals("3016"))
            break;            
}

AtomContainerManipulator.suppressHydrogens(mol);
Pattern ptrn = SmartsPattern.create(sma, bldr);

DepictionGenerator dptgen = new DepictionGenerator();
dptgen.withSize(200, 250)
      .withHighlight(ptrn.matchAll(mol)
                         .uniqueAtoms()
                         .toChemObjects(),
                     Color.RED)
      .depict(mol)
      .writeTo("~/3016.png");