#include #include #include #include #include #include #include using namespace std; using namespace OpenBabel; class Filter { vector sms; public: Filter() { OBSmartsPattern sm; sm.Init("[F,Cl,Br,I]S(=O)(=O)*"); // ハロゲン化スルホニル sms.push_back(sm); sm.Init("[F,Cl,Br,I]C(=O)*"); // ハロゲン化アシル sms.push_back(sm); sm.Init("[F,Cl,Br,I][CX4H2]*"); // ハロゲン化アルキル sms.push_back(sm); sm.Init("*C(=O)!@-O!@-C(=O)*"); // 酸無水物 sms.push_back(sm); sm.Init("[F,Cl,Br,I]c1[nH0]ccc[nH0]1"); // ハロゲン化ピリミジン sms.push_back(sm); sm.Init("[CX3H1](=O)[#6]"); // アルデヒド sms.push_back(sm); sm.Init("*C(C*)=[NX2]*"); // イミン sms.push_back(sm); sm.Init("[F,Cl,Br,I]C([F,Cl,Br,I])([F,Cl,Br,I])C(=O)C*"); // パーハロケトン sms.push_back(sm); sm.Init("[#6]O!@-C(=O)[#6]"); // 脂肪族エステル sms.push_back(sm); sm.Init("*C!@-C(=O)[CX4H3]"); // 脂肪族ケトン sms.push_back(sm); sm.Init("O1CC1"); // エポキシド sms.push_back(sm); sm.Init("N1CC1"); // アジリジン sms.push_back(sm); sm.Init("[#6]S!@-C(=O)[#6]"); // チオエステル sms.push_back(sm); sm.Init("[#6]O!@-S(=O)(=O)[#6]"); // スルホン酸エステル sms.push_back(sm); sm.Init("[#6]O!@-P(=O)(-[OH])[#6]"); // ホスホン酸エステル sms.push_back(sm); sm.Init("[F,Cl,Br,I][CX4H2]C(=O)*"); // α-ハロカルボニル化合物 sms.push_back(sm); sm.Init("O=C(*)!@-C(=O)*"); // 1,2-ジカルボニル化合物 sms.push_back(sm); sm.Init("*C[CH]!@=[CH]!@-C(*)=O"); // マイケル受容体 sms.push_back(sm); sm.Init("*C[CH]([F,Cl,Br,I])!@-[CH2]!@-C(*)=O"); // β-ヘテロ置換カルボニル化合物 sms.push_back(sm); sm.Init("*O!@-O*"); // O-O結合 sms.push_back(sm); sm.Init("*N!@-O*"); // N-O結合 sms.push_back(sm); sm.Init("*N!@-N*"); // N-結合 sms.push_back(sm); sm.Init("*S!@-N*"); // S-N結合 sms.push_back(sm); sm.Init("*S!@-S*"); // S-S結合 sms.push_back(sm); sm.Init("*S!@-O*"); // S-O結合 sms.push_back(sm); } bool Check(OBMol& mol) { for (auto ii = sms.begin(); ii != sms.end(); ii++) { if (ii->Match(mol)) return false; } return true; } }; int main(int argc, char* argv[]) { ifstream ifs(argv[1]); if (ifs.fail()) { cerr << "Failed to open the file: " << argv[1] << endl; return -1; } ofstream ofs(argv[2]); OBConversion conv; conv.SetInAndOutFormats("SDF", "SDF"); Filter f; OBMol mol; while (conv.Read(&mol, &ifs)) { if (f.Check(mol)) { conv.Write(&mol, &ofs); } } ifs.close(); }