O=C(Nc1ccc(N2CCN(C(=O)c3ccco3)CC2)c(Cl)c1)c1cc2ccccc2o1
CC1COCC(C)N1C1=C(Cl)C(=O)c2ccccc2C1=O
Cc1ccc(/C=C/C(=O)NCc2ccc(S(N)(=O)=O)cc2)o1
Cc1ccc(NC(=O)c2cc(C)n(-c3ccccc3)c2C)cc1
Cc1ccc(-c2c(C(=O)N/N=C/c3ccsc3)nnn2-c2nonc2N)cc1
CC1=CC(=NOC(=O)/C=C/c2ccccc2)C=C(C)C1=O
CC1=C(n2nnc([N+](=O)[O-])n2)C(c2cccnc2)C(C#N)=C(N)O1
CCN1CCN(c2nc(C)nc3c2sc(=S)n3C)CC1
O=C(CNC(=O)c1cccs1)OCC(=O)c1ccc([N+](=O)[O-])cc1
CCc1c(C#N)c(S)nc(C)c1C(=O)Nc1ccccc1
C/C(Cn1nnc([N+](=O)[O-])n1)=N\NC(=O)c1ccc(Cl)c(Cl)c1
COc1ccc(-c2cn3cc(C)ccc3n2)cc1Br
Cc1ccc(S(=O)(=O)/N=C2/C=C(C3C(=O)CC(C)(C)CC3=O)C(=O)c3ccccc32)cc1
COc1ccc(N=C2C(=S)N(c3ccc(OC)cc3)C(=NS(=O)(=O)c3ccccc3)N2c2ccccc2)cc1
CCN(CC)c1ccc(NC(=O)c2ccccc2Br)cc1S(=O)(=O)Nc1ccccc1OC
S=C(NN=Cc1ccccn1)N(Cc1ccccn1)Cc1ccccn1
CCc1ccc(S(=O)(=O)Nc2cc(SCC(=O)O)c(O)c3ccccc23)cc1
CCC(C)N(CCNC(=O)c1ccc2c(c1)NC(=O)c1ccccc1S2)C1CCCCC1
COC1=CC(=O)C=C(OC)C1(O)CC(C)=O
Cc1cccc(-n2c(=S)[nH]c3sc4c(c3c2=O)CCc2ccccc2-4)c1
Nc1c(O)cccc1C(=O)O
CNCc1ccccc1Sc1cc(O)ccc1O.O=C(O)/C=C\C(=O)O
CCOc1ccc(NC(=O)Cn2sc3nc(C)cc(C)c3c2=O)cc1
COC(=O)[C@H](CCSC)NC(=O)c1cc2c3ccccc3nc-2c[nH]1
O=C1Nc2cc(C(=O)NCCCN3CCCC3)ccc2S/C1=C/c1cccc(Cl)c1
O=C1Nc2cc(C(=O)NCCCN3CCCC3)ccc2S/C1=C\c1ccccc1
COc1ccc(CNC(=O)Cc2cn(C)c3ccccc23)c(OC)c1
[O-][N+](=Cc1ccccc1)c1ccc(Cl)cc1
C/C(Cn1nnc([N+](=O)[O-])n1)=N\NC(=O)c1ccc(O)cc1
CN1CCc2cccc3c2[C@@H]1Cc1ccc(O)c(O)c1-3.Cl
Cc1ccc([S+]([O-])c2ccc([N+](=O)[O-])c3nonc23)cc1
CCOC(=O)c1c(OCC)[nH]c2c1cc(O)c1ccccc12
O=c1c2ccccc2sn1-c1ccccc1F
CCn1c([N+](=O)[O-])nc2c1c(=O)[nH]c(=O)n2C
CC1(C)CN(c2ccccc2)N(C(=O)c2ccc(C#N)cc2)C1=O
Cc1nc2ccc(Nc3nc4cc(S(=O)(=O)N5CCOCC5)ccc4o3)cc2s1
CN1C(=O)C(N=Nc2ccc([N+](=O)[O-])cc2)SC1=S
N#CC1=C(N)Oc2c(O)cc3ccccc3c2C1c1ccsc1
CN(C)c1ncc(C2=C(Cl)C(=O)C(N3CCCC3)=C(Cl)C2=O)s1
COc1ccc2c(c1)c(=Cc1ccc(N(C)C)cc1)c1cc(-c3ccccc3)[n+](C)n12.O=S(=O)([O-])C(F)(F)F
Oc1nc2ccccc2n2c(-c3ccccc3)nnc12
Cc1ccc(-c2nc(N3CCOCC3)s[n+]2-c2ccccc2)cc1.[O-][Cl+3]([O-])([O-])[O-]
COc1cccc(C(=O)Nc2nnc(C(C)C)s2)c1
COc1ccc(CN(C)S(=O)(=O)c2nnc(NC(=O)c3ccc(C)cc3)s2)cc1OC
O=C(CSc1nc2cc(Cl)ccc2s1)c1ccco1
O=c1[nH]sc2cc(F)ccc12
CCN(CC)c1ccc(NC(=O)c2cccc(C)c2)cc1S(=O)(=O)Nc1ccccc1OC
CC(Cc1ccc(O)c(O)c1)C(C)Cc1ccc(O)c(O)c1
c1nc2nc[nH]c(SSc3[nH]cnc4ncnc3-4)c-2n1
CCN(CC)CC.COc1ccc(-n2c(=S)[nH]c3c(sc(=S)n3-c3ccccc3)c2=O)c(OC)c1
O=C1C=CC(=O)N1c1ccc(N2CCCCC2)cc1
Cc1ccc(CNc2ccc(O)cc2)cc1
O=c1c2ccccc2sn1-c1cc(S(=O)(=O)N2CCOCC2)ccc1N1CCCC1
O=C(CCC(=O)OCC(=O)c1ccc([N+](=O)[O-])cc1)Nc1ccccc1Cl
OpenBabel/Rubabel[]
require 'rubabel'
File.open("benzodiazepine.smi.sdf", 'w') do |out|
Rubabel.foreach("benzodiazepine.smi.gz") do |mol|
mol.make_3d!
out.print mol.write_string(:sdf)
end
end
Indigo/C++[]
#include "base_cpp/scanner.h"
#include "base_cpp/output.h"
#include "molecule/molecule.h"
#include "molecule/smiles_loader.h"
#include "molecule/molfile_saver.h"
#include "molecule/molecule_dearom.h"
#include "layout/molecule_layout.h"
int main (int argc, char *argv[])
{
if (argc < 3)
{
fprintf(stderr, "Usage: smi_sdf_convert infile.smi outfile.sdf\n");
return -1;
}
try
{
FileScanner scanner(argv[1]);
FileOutput output(argv[2]);
Array<char> smiles;
Molecule mol;
int cnt = 0;
while (!scanner.isEOF())
{
scanner.readString(smiles, false);
if (smiles.size() < 1)
continue;
printf("saving molecule #%d... ", ++cnt);
BufferScanner smiles_s(smiles);
SmilesLoader smiles_l(smiles_s);
smiles_l.loadMolecule(mol, false);
mol.calcImplicitHydrogens(true);
{
DearomatizationsStorage dst;
Dearomatizer dearom(mol);
dearom.setDearomatizationParams(Dearomatizer::PARAMS_SAVE_ONE_DEAROMATIZATION);
dearom.enumerateDearomatizations(dst);
MoleculeDearomatizer mdearom(mol, dst);
for (int i = 0; i < dst.getGroupsCount(); i++)
mdearom.dearomatizeGroup(i, 0);
}
{
MoleculeLayout ml(mol);
ml.make();
mol.getStereocenters().markBonds();
}
MolfileSaver saver(output);
// saver.v2000 = true;
saver.saveMolecule(mol);
output.printf("$$$$\n");
printf("\n");
}
}
catch (Exception &e)
{
fprintf(stderr, "error: %s\n", e.message());
return -1;
}
return 0;
}
Instructions:
- Unpack 'graph', 'molecule', and 'layout' projects into some folder
- Create 'utils' folder nearby
- Paste the above code into utils/smi_sdf_convert.cpp file
- Compile the file using the following commands:
$ cd graph; make CONF=Release32; cd ..
$ cd molecule; make CONF=Release32; cd ..
$ cd layout; make CONF=Release32; cd ..
$ cd utils
$ gcc smi_sdf_convert.cpp -o smi_sdf_convert -O3 -m32 -I.. -I../common ../liblayout/dist/Release32/GNU-Linux-x86/liblayout.a ../molecule/dist/Release32/GNU-Linux-x86/libmolecule.a ../graph/dist/Release32/GNU-Linux-x86/libgraph.a -lpthread -lstdc++ - Run the program like that:
$ ./smi_sdf_convert infile.smi outfile.sdf
RDKit/Python[]
from rdkit import Chem
from rdkit.Chem import AllChem
suppl = Chem.SmilesMolSupplier('benzodiazepine.smi')
w = Chem.SDWriter('bz.out.sdf')
for mol in suppl:
# skip molecules the rdkit doesn't read:
if not mol: continue
# add coordinates so we get a correct mol block:
AllChem.Compute2DCoords(mol)
w.write(mol)
w.flush()
Cactvs/Tcl[]
molfile write "benzodiazepine.sdf" [molfile open "benzodiazepine.smi"]
Yup, it's a one-liner. 2D coordinates and wedges are automatically generated, and aromaticity resolution is also implicit. The format of the output file is, in the absence of a specific format setting, decoded from the suffix of that file.
Cactvs/Python[]
A one-liner as well:
Molfile.Write('benzodiazepine.sdf',Molfile('benzodiazepine.smi'))