// $Id$ // // @@ All Rights Reserved @@ // This file is part of the RDKit. // The contents are covered by the terms of the BSD license // which is included in the file license.txt, found at the root // of the RDKit source tree. // // Contribution from Roger Sayle #include #include #include #include #include #include #include #include #include #include namespace { struct Patterns { RDKit::ROMol *bit_8; RDKit::ROMol *bit_11; RDKit::ROMol *bit_13; RDKit::ROMol *bit_14; RDKit::ROMol *bit_15; RDKit::ROMol *bit_16; RDKit::ROMol *bit_17; RDKit::ROMol *bit_19; RDKit::ROMol *bit_20; RDKit::ROMol *bit_21; RDKit::ROMol *bit_22; RDKit::ROMol *bit_23; RDKit::ROMol *bit_24; RDKit::ROMol *bit_25; RDKit::ROMol *bit_26; RDKit::ROMol *bit_28; RDKit::ROMol *bit_30; RDKit::ROMol *bit_31; RDKit::ROMol *bit_32; RDKit::ROMol *bit_33; RDKit::ROMol *bit_34; RDKit::ROMol *bit_36; RDKit::ROMol *bit_37; RDKit::ROMol *bit_38; RDKit::ROMol *bit_39; RDKit::ROMol *bit_40; RDKit::ROMol *bit_41; RDKit::ROMol *bit_43; RDKit::ROMol *bit_44; RDKit::ROMol *bit_45; RDKit::ROMol *bit_47; RDKit::ROMol *bit_48; RDKit::ROMol *bit_49; RDKit::ROMol *bit_50; RDKit::ROMol *bit_51; RDKit::ROMol *bit_52; RDKit::ROMol *bit_53; RDKit::ROMol *bit_54; RDKit::ROMol *bit_55; RDKit::ROMol *bit_56; RDKit::ROMol *bit_57; RDKit::ROMol *bit_58; RDKit::ROMol *bit_59; RDKit::ROMol *bit_60; RDKit::ROMol *bit_61; RDKit::ROMol *bit_62; RDKit::ROMol *bit_63; RDKit::ROMol *bit_64; RDKit::ROMol *bit_65; RDKit::ROMol *bit_66; RDKit::ROMol *bit_67; RDKit::ROMol *bit_68; RDKit::ROMol *bit_69; RDKit::ROMol *bit_70; RDKit::ROMol *bit_71; RDKit::ROMol *bit_72; RDKit::ROMol *bit_73; RDKit::ROMol *bit_74; RDKit::ROMol *bit_75; RDKit::ROMol *bit_76; RDKit::ROMol *bit_77; RDKit::ROMol *bit_78; RDKit::ROMol *bit_79; RDKit::ROMol *bit_80; RDKit::ROMol *bit_81; RDKit::ROMol *bit_82; RDKit::ROMol *bit_83; RDKit::ROMol *bit_84; RDKit::ROMol *bit_85; RDKit::ROMol *bit_86; RDKit::ROMol *bit_87; RDKit::ROMol *bit_89; RDKit::ROMol *bit_90; RDKit::ROMol *bit_91; RDKit::ROMol *bit_92; RDKit::ROMol *bit_93; RDKit::ROMol *bit_94; RDKit::ROMol *bit_95; RDKit::ROMol *bit_96; RDKit::ROMol *bit_97; RDKit::ROMol *bit_98; RDKit::ROMol *bit_99; RDKit::ROMol *bit_100; RDKit::ROMol *bit_101; RDKit::ROMol *bit_102; RDKit::ROMol *bit_104; RDKit::ROMol *bit_105; RDKit::ROMol *bit_106; RDKit::ROMol *bit_107; RDKit::ROMol *bit_108; RDKit::ROMol *bit_109; RDKit::ROMol *bit_110; RDKit::ROMol *bit_111; RDKit::ROMol *bit_112; RDKit::ROMol *bit_113; RDKit::ROMol *bit_114; RDKit::ROMol *bit_115; RDKit::ROMol *bit_116; RDKit::ROMol *bit_117; RDKit::ROMol *bit_118; RDKit::ROMol *bit_119; RDKit::ROMol *bit_120; RDKit::ROMol *bit_121; RDKit::ROMol *bit_122; RDKit::ROMol *bit_123; RDKit::ROMol *bit_124; RDKit::ROMol *bit_126; RDKit::ROMol *bit_127; RDKit::ROMol *bit_128; RDKit::ROMol *bit_129; RDKit::ROMol *bit_131; RDKit::ROMol *bit_132; RDKit::ROMol *bit_133; RDKit::ROMol *bit_135; RDKit::ROMol *bit_136; RDKit::ROMol *bit_137; RDKit::ROMol *bit_138; RDKit::ROMol *bit_139; RDKit::ROMol *bit_140; RDKit::ROMol *bit_141; RDKit::ROMol *bit_142; RDKit::ROMol *bit_144; RDKit::ROMol *bit_145; RDKit::ROMol *bit_147; RDKit::ROMol *bit_148; RDKit::ROMol *bit_149; RDKit::ROMol *bit_150; RDKit::ROMol *bit_151; RDKit::ROMol *bit_152; RDKit::ROMol *bit_154; RDKit::ROMol *bit_155; RDKit::ROMol *bit_156; RDKit::ROMol *bit_157; RDKit::ROMol *bit_158; RDKit::ROMol *bit_162; RDKit::ROMol *bit_165; Patterns() : bit_8(RDKit::SmartsToMol("[!#6!#1]1~*~*~*~1")), bit_11(RDKit::SmartsToMol("*1~*~*~*~1")), bit_13(RDKit::SmartsToMol("[#8]~[#7](~[#6])~[#6]")), bit_14(RDKit::SmartsToMol("[#16]-[#16]")), bit_15(RDKit::SmartsToMol("[#8]~[#6](~[#8])~[#8]")), bit_16(RDKit::SmartsToMol("[!#6!#1]1~*~*~1")), bit_17(RDKit::SmartsToMol("[#6]#[#6]")), bit_19(RDKit::SmartsToMol("*1~*~*~*~*~*~*~1")), bit_20(RDKit::SmartsToMol("[#14]")), bit_21(RDKit::SmartsToMol("[#6]=[#6](~[!#6!#1])~[!#6!#1]")), bit_22(RDKit::SmartsToMol("*1~*~*~1")), bit_23(RDKit::SmartsToMol("[#7]~[#6](~[#8])~[#8]")), bit_24(RDKit::SmartsToMol("[#7]-[#8]")), bit_25(RDKit::SmartsToMol("[#7]~[#6](~[#7])~[#7]")), bit_26(RDKit::SmartsToMol("[#6]=@[#6](@*)@*")), bit_28(RDKit::SmartsToMol("[!#6!#1]~[CH2]~[!#6!#1]")), bit_30(RDKit::SmartsToMol("[#6]~[!#6!#1](~[#6])(~[#6])~*")), bit_31(RDKit::SmartsToMol("[!#6!#1]~[F,Cl,Br,I]")), bit_32(RDKit::SmartsToMol("[#6]~[#16]~[#7]")), bit_33(RDKit::SmartsToMol("[#7]~[#16]")), bit_34(RDKit::SmartsToMol("[CH2]=*")), bit_36(RDKit::SmartsToMol("[#16R]")), bit_37(RDKit::SmartsToMol("[#7]~[#6](~[#8])~[#7]")), bit_38(RDKit::SmartsToMol("[#7]~[#6](~[#6])~[#7]")), bit_39(RDKit::SmartsToMol("[#8]~[#16](~[#8])~[#8]")), bit_40(RDKit::SmartsToMol("[#16]-[#8]")), bit_41(RDKit::SmartsToMol("[#6]#[#7]")), bit_43(RDKit::SmartsToMol("[!#6!#1!H0]~*~[!#6!#1!H0]")), bit_44(RDKit::SmartsToMol( "[!#1;!#6;!#7;!#8;!#9;!#14;!#15;!#16;!#17;!#35;!#53]")), bit_45(RDKit::SmartsToMol("[#6]=[#6]~[#7]")), bit_47(RDKit::SmartsToMol("[#16]~*~[#7]")), bit_48(RDKit::SmartsToMol("[#8]~[!#6!#1](~[#8])~[#8]")), bit_49(RDKit::SmartsToMol("[!+0]")), bit_50(RDKit::SmartsToMol("[#6]=[#6](~[#6])~[#6]")), bit_51(RDKit::SmartsToMol("[#6]~[#16]~[#8]")), bit_52(RDKit::SmartsToMol("[#7]~[#7]")), bit_53(RDKit::SmartsToMol("[!#6!#1!H0]~*~*~*~[!#6!#1!H0]")), bit_54(RDKit::SmartsToMol("[!#6!#1!H0]~*~*~[!#6!#1!H0]")), bit_55(RDKit::SmartsToMol("[#8]~[#16]~[#8]")), bit_56(RDKit::SmartsToMol("[#8]~[#7](~[#8])~[#6]")), bit_57(RDKit::SmartsToMol("[#8R]")), bit_58(RDKit::SmartsToMol("[!#6!#1]~[#16]~[!#6!#1]")), bit_59(RDKit::SmartsToMol("[#16]!:*:*")), bit_60(RDKit::SmartsToMol("[#16]=[#8]")), bit_61(RDKit::SmartsToMol("*~[#16](~*)~*")), bit_62(RDKit::SmartsToMol("*@*!@*@*")), bit_63(RDKit::SmartsToMol("[#7]=[#8]")), bit_64(RDKit::SmartsToMol("*@*!@[#16]")), bit_65(RDKit::SmartsToMol("c:n")), bit_66(RDKit::SmartsToMol("[#6]~[#6](~[#6])(~[#6])~*")), bit_67(RDKit::SmartsToMol("[!#6!#1]~[#16]")), bit_68(RDKit::SmartsToMol("[!#6!#1!H0]~[!#6!#1!H0]")), bit_69(RDKit::SmartsToMol("[!#6!#1]~[!#6!#1!H0]")), bit_70(RDKit::SmartsToMol("[!#6!#1]~[#7]~[!#6!#1]")), bit_71(RDKit::SmartsToMol("[#7]~[#8]")), bit_72(RDKit::SmartsToMol("[#8]~*~*~[#8]")), bit_73(RDKit::SmartsToMol("[#16]=*")), bit_74(RDKit::SmartsToMol("[CH3]~*~[CH3]")), bit_75(RDKit::SmartsToMol("*!@[#7]@*")), bit_76(RDKit::SmartsToMol("[#6]=[#6](~*)~*")), bit_77(RDKit::SmartsToMol("[#7]~*~[#7]")), bit_78(RDKit::SmartsToMol("[#6]=[#7]")), bit_79(RDKit::SmartsToMol("[#7]~*~*~[#7]")), bit_80(RDKit::SmartsToMol("[#7]~*~*~*~[#7]")), bit_81(RDKit::SmartsToMol("[#16]~*(~*)~*")), bit_82(RDKit::SmartsToMol("*~[CH2]~[!#6!#1!H0]")), bit_83(RDKit::SmartsToMol("[!#6!#1]1~*~*~*~*~1")), bit_84(RDKit::SmartsToMol("[NH2]")), bit_85(RDKit::SmartsToMol("[#6]~[#7](~[#6])~[#6]")), bit_86(RDKit::SmartsToMol("[C;H2,H3][!#6!#1][C;H2,H3]")), bit_87(RDKit::SmartsToMol("[F,Cl,Br,I]!@*@*")), bit_89(RDKit::SmartsToMol("[#8]~*~*~*~[#8]")), bit_90(RDKit::SmartsToMol( "[$([!#6!#1!H0]~*~*~[CH2]~*),$([!#6!#1!H0R]1@[R]@[R]@[CH2R]1),$([!#" "6!#1!H0]~[R]1@[R]@[CH2R]1)]")), bit_91(RDKit::SmartsToMol( "[$([!#6!#1!H0]~*~*~*~[CH2]~*),$([!#6!#1!H0R]1@[R]@[R]@[R]@[CH2R]1)" ",$([!#6!#1!H0]~[R]1@[R]@[R]@[CH2R]1),$([!#6!#1!H0]~*~[R]1@[R]@[" "CH2R]1)]")), bit_92(RDKit::SmartsToMol("[#8]~[#6](~[#7])~[#6]")), bit_93(RDKit::SmartsToMol("[!#6!#1]~[CH3]")), bit_94(RDKit::SmartsToMol("[!#6!#1]~[#7]")), bit_95(RDKit::SmartsToMol("[#7]~*~*~[#8]")), bit_96(RDKit::SmartsToMol("*1~*~*~*~*~1")), bit_97(RDKit::SmartsToMol("[#7]~*~*~*~[#8]")), bit_98(RDKit::SmartsToMol("[!#6!#1]1~*~*~*~*~*~1")), bit_99(RDKit::SmartsToMol("[#6]=[#6]")), bit_100(RDKit::SmartsToMol("*~[CH2]~[#7]")), bit_101(RDKit::SmartsToMol( "[$([R]1@[R]@[R]@[R]@[R]@[R]@[R]@[R]@1),$([R]1@[R]@[R]@[R]@[R]@[R]@" "[R]@[R]@[R]@1),$([R]1@[R]@[R]@[R]@[R]@[R]@[R]@[R]@[R]@[R]@1),$([R]" "1@[R]@[R]@[R]@[R]@[R]@[R]@[R]@[R]@[R]@[R]@1),$([R]1@[R]@[R]@[R]@[" "R]@[R]@[R]@[R]@[R]@[R]@[R]@[R]@1),$([R]1@[R]@[R]@[R]@[R]@[R]@[R]@[" "R]@[R]@[R]@[R]@[R]@[R]@1),$([R]1@[R]@[R]@[R]@[R]@[R]@[R]@[R]@[R]@[" "R]@[R]@[R]@[R]@[R]@1)]")), bit_102(RDKit::SmartsToMol("[!#6!#1]~[#8]")), bit_104(RDKit::SmartsToMol("[!#6!#1!H0]~*~[CH2]~*")), bit_105(RDKit::SmartsToMol("*@*(@*)@*")), bit_106(RDKit::SmartsToMol("[!#6!#1]~*(~[!#6!#1])~[!#6!#1]")), bit_107(RDKit::SmartsToMol("[F,Cl,Br,I]~*(~*)~*")), bit_108(RDKit::SmartsToMol("[CH3]~*~*~*~[CH2]~*")), bit_109(RDKit::SmartsToMol("*~[CH2]~[#8]")), bit_110(RDKit::SmartsToMol("[#7]~[#6]~[#8]")), bit_111(RDKit::SmartsToMol("[#7]~*~[CH2]~*")), bit_112(RDKit::SmartsToMol("*~*(~*)(~*)~*")), bit_113(RDKit::SmartsToMol("[#8]!:*:*")), bit_114(RDKit::SmartsToMol("[CH3]~[CH2]~*")), bit_115(RDKit::SmartsToMol("[CH3]~*~[CH2]~*")), bit_116( RDKit::SmartsToMol("[$([CH3]~*~*~[CH2]~*),$([CH3]~*1~*~[CH2]1)]")), bit_117(RDKit::SmartsToMol("[#7]~*~[#8]")), bit_118(RDKit::SmartsToMol("[$(*~[CH2]~[CH2]~*),$(*1~[CH2]~[CH2]1)]")), bit_119(RDKit::SmartsToMol("[#7]=*")), bit_120(RDKit::SmartsToMol("[!#6R]")), bit_121(RDKit::SmartsToMol("[#7R]")), bit_122(RDKit::SmartsToMol("*~[#7](~*)~*")), bit_123(RDKit::SmartsToMol("[#8]~[#6]~[#8]")), bit_124(RDKit::SmartsToMol("[!#6!#1]~[!#6!#1]")), bit_126(RDKit::SmartsToMol("*!@[#8]!@*")), bit_127(RDKit::SmartsToMol("*@*!@[#8]")), bit_128(RDKit::SmartsToMol( "[$(*~[CH2]~*~*~*~[CH2]~*),$([R]1@[CH2R]@[R]@[R]@[R]@[CH2R]1),$(*~[" "CH2]~[R]1@[R]@[R]@[CH2R]1),$(*~[CH2]~*~[R]1@[R]@[CH2R]1)]")), bit_129(RDKit::SmartsToMol( "[$(*~[CH2]~*~*~[CH2]~*),$([R]1@[CH2]@[R]@[R]@[CH2R]1),$(*~[CH2]~[" "R]1@[R]@[CH2R]1)]")), bit_131(RDKit::SmartsToMol("[!#6!#1!H0]")), bit_132(RDKit::SmartsToMol("[#8]~*~[CH2]~*")), bit_133(RDKit::SmartsToMol("*@*!@[#7]")), bit_135(RDKit::SmartsToMol("[#7]!:*:*")), bit_136(RDKit::SmartsToMol("[#8]=*")), bit_137(RDKit::SmartsToMol("[!C!cR]")), bit_138(RDKit::SmartsToMol("[!#6!#1]~[CH2]~*")), bit_139(RDKit::SmartsToMol("[O!H0]")), bit_140(RDKit::SmartsToMol("[#8]")), bit_141(RDKit::SmartsToMol("[CH3]")), bit_142(RDKit::SmartsToMol("[#7]")), bit_144(RDKit::SmartsToMol("*!:*:*!:*")), bit_145(RDKit::SmartsToMol("*1~*~*~*~*~*~1")), bit_147( RDKit::SmartsToMol("[$(*~[CH2]~[CH2]~*),$([R]1@[CH2R]@[CH2R]1)]")), bit_148(RDKit::SmartsToMol("*~[!#6!#1](~*)~*")), bit_149(RDKit::SmartsToMol("[C;H3,H4]")), bit_150(RDKit::SmartsToMol("*!@*@*!@*")), bit_151(RDKit::SmartsToMol("[#7!H0]")), bit_152(RDKit::SmartsToMol("[#8]~[#6](~[#6])~[#6]")), bit_154(RDKit::SmartsToMol("[#6]=[#8]")), bit_155(RDKit::SmartsToMol("*!@[CH2]!@*")), bit_156(RDKit::SmartsToMol("[#7]~*(~*)~*")), bit_157(RDKit::SmartsToMol("[#6]-[#8]")), bit_158(RDKit::SmartsToMol("[#6]-[#7]")), bit_162(RDKit::SmartsToMol("a")), bit_165(RDKit::SmartsToMol("[R]")) {} }; boost::flyweight, boost::flyweights::no_tracking> gpats; void GenerateFP(const RDKit::ROMol &mol, ExplicitBitVect &fp) { if (gpats.get().size() == 0) { std::vector ps; ps.push_back(new Patterns()); gpats = ps; } const Patterns &pats = *(gpats.get().front()); PRECONDITION(fp.size() == 167, "bad fingerprint"); fp.clearBits(); if (!mol.getNumAtoms()) return; std::vector matches; RDKit::RWMol::ConstAtomIterator atom; RDKit::MatchVectType match; unsigned int count; for (atom = mol.beginAtoms(); atom != mol.endAtoms(); ++atom) switch ((*atom)->getAtomicNum()) { case 3: case 11: case 19: case 37: case 55: case 87: fp.setBit(35); break; case 4: case 12: case 20: case 38: case 56: case 88: fp.setBit(10); break; case 5: case 13: case 31: case 49: case 81: fp.setBit(18); break; case 9: fp.setBit(42); fp.setBit(134); break; case 15: fp.setBit(29); break; case 16: fp.setBit(88); break; case 17: fp.setBit(103); fp.setBit(134); break; case 21: case 22: case 39: case 40: case 72: fp.setBit(5); break; case 23: case 24: case 25: case 41: case 42: case 43: case 73: case 74: case 75: fp.setBit(7); break; case 26: case 27: case 28: case 44: case 45: case 46: case 76: case 77: case 78: fp.setBit(9); break; case 29: case 30: case 47: case 48: case 79: case 80: fp.setBit(12); break; case 32: case 33: case 34: case 50: case 51: case 52: case 82: case 83: case 84: fp.setBit(3); break; case 35: fp.setBit(46); fp.setBit(134); break; case 53: fp.setBit(27); fp.setBit(134); break; case 57: case 58: case 59: case 60: case 61: case 62: case 63: case 64: case 65: case 66: case 67: case 68: case 69: case 70: case 71: fp.setBit(6); break; case 89: case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97: case 98: case 99: case 100: case 101: case 102: case 103: fp.setBit(4); break; case 104: fp.setBit(2); break; } if (RDKit::SubstructMatch(mol, *pats.bit_8, match, true)) fp.setBit(8); if (RDKit::SubstructMatch(mol, *pats.bit_11, match, true)) fp.setBit(11); if (RDKit::SubstructMatch(mol, *pats.bit_13, match, true)) fp.setBit(13); if (RDKit::SubstructMatch(mol, *pats.bit_14, match, true)) fp.setBit(14); if (RDKit::SubstructMatch(mol, *pats.bit_15, match, true)) fp.setBit(15); if (RDKit::SubstructMatch(mol, *pats.bit_16, match, true)) fp.setBit(16); if (RDKit::SubstructMatch(mol, *pats.bit_17, match, true)) fp.setBit(17); if (RDKit::SubstructMatch(mol, *pats.bit_19, match, true)) fp.setBit(19); if (RDKit::SubstructMatch(mol, *pats.bit_20, match, true)) fp.setBit(20); if (RDKit::SubstructMatch(mol, *pats.bit_21, match, true)) fp.setBit(21); if (RDKit::SubstructMatch(mol, *pats.bit_22, match, true)) fp.setBit(22); if (RDKit::SubstructMatch(mol, *pats.bit_23, match, true)) fp.setBit(23); if (RDKit::SubstructMatch(mol, *pats.bit_24, match, true)) fp.setBit(24); if (RDKit::SubstructMatch(mol, *pats.bit_25, match, true)) fp.setBit(25); if (RDKit::SubstructMatch(mol, *pats.bit_26, match, true)) fp.setBit(26); if (RDKit::SubstructMatch(mol, *pats.bit_28, match, true)) fp.setBit(28); if (RDKit::SubstructMatch(mol, *pats.bit_30, match, true)) fp.setBit(30); if (RDKit::SubstructMatch(mol, *pats.bit_31, match, true)) fp.setBit(31); if (RDKit::SubstructMatch(mol, *pats.bit_32, match, true)) fp.setBit(32); if (RDKit::SubstructMatch(mol, *pats.bit_33, match, true)) fp.setBit(33); if (RDKit::SubstructMatch(mol, *pats.bit_34, match, true)) fp.setBit(34); if (RDKit::SubstructMatch(mol, *pats.bit_36, match, true)) fp.setBit(36); if (RDKit::SubstructMatch(mol, *pats.bit_37, match, true)) fp.setBit(37); if (RDKit::SubstructMatch(mol, *pats.bit_38, match, true)) fp.setBit(38); if (RDKit::SubstructMatch(mol, *pats.bit_39, match, true)) fp.setBit(39); if (RDKit::SubstructMatch(mol, *pats.bit_40, match, true)) fp.setBit(40); if (RDKit::SubstructMatch(mol, *pats.bit_41, match, true)) fp.setBit(41); if (RDKit::SubstructMatch(mol, *pats.bit_43, match, true)) fp.setBit(43); if (RDKit::SubstructMatch(mol, *pats.bit_44, match, true)) fp.setBit(44); if (RDKit::SubstructMatch(mol, *pats.bit_45, match, true)) fp.setBit(45); if (RDKit::SubstructMatch(mol, *pats.bit_47, match, true)) fp.setBit(47); if (RDKit::SubstructMatch(mol, *pats.bit_48, match, true)) fp.setBit(48); if (RDKit::SubstructMatch(mol, *pats.bit_49, match, true)) fp.setBit(49); if (RDKit::SubstructMatch(mol, *pats.bit_50, match, true)) fp.setBit(50); if (RDKit::SubstructMatch(mol, *pats.bit_51, match, true)) fp.setBit(51); if (RDKit::SubstructMatch(mol, *pats.bit_52, match, true)) fp.setBit(52); if (RDKit::SubstructMatch(mol, *pats.bit_53, match, true)) fp.setBit(53); if (RDKit::SubstructMatch(mol, *pats.bit_54, match, true)) fp.setBit(54); if (RDKit::SubstructMatch(mol, *pats.bit_55, match, true)) fp.setBit(55); if (RDKit::SubstructMatch(mol, *pats.bit_56, match, true)) fp.setBit(56); if (RDKit::SubstructMatch(mol, *pats.bit_57, match, true)) fp.setBit(57); if (RDKit::SubstructMatch(mol, *pats.bit_58, match, true)) fp.setBit(58); if (RDKit::SubstructMatch(mol, *pats.bit_59, match, true)) fp.setBit(59); if (RDKit::SubstructMatch(mol, *pats.bit_60, match, true)) fp.setBit(60); if (RDKit::SubstructMatch(mol, *pats.bit_61, match, true)) fp.setBit(61); if (RDKit::SubstructMatch(mol, *pats.bit_62, match, true)) fp.setBit(62); if (RDKit::SubstructMatch(mol, *pats.bit_63, match, true)) fp.setBit(63); if (RDKit::SubstructMatch(mol, *pats.bit_64, match, true)) fp.setBit(64); if (RDKit::SubstructMatch(mol, *pats.bit_65, match, true)) fp.setBit(65); if (RDKit::SubstructMatch(mol, *pats.bit_66, match, true)) fp.setBit(66); if (RDKit::SubstructMatch(mol, *pats.bit_67, match, true)) fp.setBit(67); if (RDKit::SubstructMatch(mol, *pats.bit_68, match, true)) fp.setBit(68); if (RDKit::SubstructMatch(mol, *pats.bit_69, match, true)) fp.setBit(69); if (RDKit::SubstructMatch(mol, *pats.bit_70, match, true)) fp.setBit(70); if (RDKit::SubstructMatch(mol, *pats.bit_71, match, true)) fp.setBit(71); if (RDKit::SubstructMatch(mol, *pats.bit_72, match, true)) fp.setBit(72); if (RDKit::SubstructMatch(mol, *pats.bit_73, match, true)) fp.setBit(73); if (RDKit::SubstructMatch(mol, *pats.bit_74, match, true)) fp.setBit(74); if (RDKit::SubstructMatch(mol, *pats.bit_75, match, true)) fp.setBit(75); if (RDKit::SubstructMatch(mol, *pats.bit_76, match, true)) fp.setBit(76); if (RDKit::SubstructMatch(mol, *pats.bit_77, match, true)) fp.setBit(77); if (RDKit::SubstructMatch(mol, *pats.bit_78, match, true)) fp.setBit(78); if (RDKit::SubstructMatch(mol, *pats.bit_79, match, true)) fp.setBit(79); if (RDKit::SubstructMatch(mol, *pats.bit_80, match, true)) fp.setBit(80); if (RDKit::SubstructMatch(mol, *pats.bit_81, match, true)) fp.setBit(81); if (RDKit::SubstructMatch(mol, *pats.bit_82, match, true)) fp.setBit(82); if (RDKit::SubstructMatch(mol, *pats.bit_83, match, true)) fp.setBit(83); if (RDKit::SubstructMatch(mol, *pats.bit_84, match, true)) fp.setBit(84); if (RDKit::SubstructMatch(mol, *pats.bit_85, match, true)) fp.setBit(85); if (RDKit::SubstructMatch(mol, *pats.bit_86, match, true)) fp.setBit(86); if (RDKit::SubstructMatch(mol, *pats.bit_87, match, true)) fp.setBit(87); if (RDKit::SubstructMatch(mol, *pats.bit_89, match, true)) fp.setBit(89); if (RDKit::SubstructMatch(mol, *pats.bit_90, match, true)) fp.setBit(90); if (RDKit::SubstructMatch(mol, *pats.bit_91, match, true)) fp.setBit(91); if (RDKit::SubstructMatch(mol, *pats.bit_92, match, true)) fp.setBit(92); if (RDKit::SubstructMatch(mol, *pats.bit_93, match, true)) fp.setBit(93); if (RDKit::SubstructMatch(mol, *pats.bit_94, match, true)) fp.setBit(94); if (RDKit::SubstructMatch(mol, *pats.bit_95, match, true)) fp.setBit(95); if (RDKit::SubstructMatch(mol, *pats.bit_96, match, true)) fp.setBit(96); if (RDKit::SubstructMatch(mol, *pats.bit_97, match, true)) fp.setBit(97); if (RDKit::SubstructMatch(mol, *pats.bit_98, match, true)) fp.setBit(98); if (RDKit::SubstructMatch(mol, *pats.bit_99, match, true)) fp.setBit(99); if (RDKit::SubstructMatch(mol, *pats.bit_100, match, true)) fp.setBit(100); if (RDKit::SubstructMatch(mol, *pats.bit_101, match, true)) fp.setBit(101); if (RDKit::SubstructMatch(mol, *pats.bit_102, match, true)) fp.setBit(102); if (RDKit::SubstructMatch(mol, *pats.bit_104, match, true)) fp.setBit(104); if (RDKit::SubstructMatch(mol, *pats.bit_105, match, true)) fp.setBit(105); if (RDKit::SubstructMatch(mol, *pats.bit_106, match, true)) fp.setBit(106); if (RDKit::SubstructMatch(mol, *pats.bit_107, match, true)) fp.setBit(107); if (RDKit::SubstructMatch(mol, *pats.bit_108, match, true)) fp.setBit(108); if (RDKit::SubstructMatch(mol, *pats.bit_109, match, true)) fp.setBit(109); if (RDKit::SubstructMatch(mol, *pats.bit_110, match, true)) fp.setBit(110); if (RDKit::SubstructMatch(mol, *pats.bit_111, match, true)) fp.setBit(111); if (RDKit::SubstructMatch(mol, *pats.bit_112, match, true)) fp.setBit(112); if (RDKit::SubstructMatch(mol, *pats.bit_113, match, true)) fp.setBit(113); if (RDKit::SubstructMatch(mol, *pats.bit_114, match, true)) fp.setBit(114); if (RDKit::SubstructMatch(mol, *pats.bit_115, match, true)) fp.setBit(115); if (RDKit::SubstructMatch(mol, *pats.bit_116, match, true)) fp.setBit(116); if (RDKit::SubstructMatch(mol, *pats.bit_117, match, true)) fp.setBit(117); if (RDKit::SubstructMatch(mol, *pats.bit_118, matches, true, true) > 1) fp.setBit(118); if (RDKit::SubstructMatch(mol, *pats.bit_119, match, true)) fp.setBit(119); if (RDKit::SubstructMatch(mol, *pats.bit_120, matches, true, true) > 1) fp.setBit(120); if (RDKit::SubstructMatch(mol, *pats.bit_121, match, true)) fp.setBit(121); if (RDKit::SubstructMatch(mol, *pats.bit_122, match, true)) fp.setBit(122); if (RDKit::SubstructMatch(mol, *pats.bit_123, match, true)) fp.setBit(123); count = RDKit::SubstructMatch(mol, *pats.bit_124, matches, true, true); if (count > 0) fp.setBit(124); if (count > 1) fp.setBit(130); if (RDKit::SubstructMatch(mol, *pats.bit_126, match, true)) fp.setBit(126); count = RDKit::SubstructMatch(mol, *pats.bit_127, matches, true, true); if (count > 1) fp.setBit(127); if (count > 0) fp.setBit(143); if (RDKit::SubstructMatch(mol, *pats.bit_128, match, true)) fp.setBit(128); if (RDKit::SubstructMatch(mol, *pats.bit_129, match, true)) fp.setBit(129); if (RDKit::SubstructMatch(mol, *pats.bit_131, matches, true, true) > 1) fp.setBit(131); if (RDKit::SubstructMatch(mol, *pats.bit_132, match, true)) fp.setBit(132); if (RDKit::SubstructMatch(mol, *pats.bit_133, match, true)) fp.setBit(133); if (RDKit::SubstructMatch(mol, *pats.bit_135, match, true)) fp.setBit(135); if (RDKit::SubstructMatch(mol, *pats.bit_136, matches, true, true) > 1) fp.setBit(136); if (RDKit::SubstructMatch(mol, *pats.bit_137, match, true)) fp.setBit(137); count = RDKit::SubstructMatch(mol, *pats.bit_138, matches, true, true); if (count > 1) fp.setBit(138); if (count > 0) fp.setBit(153); if (RDKit::SubstructMatch(mol, *pats.bit_139, match, true)) fp.setBit(139); count = RDKit::SubstructMatch(mol, *pats.bit_140, matches, true, true); if (count > 3) fp.setBit(140); if (count > 2) fp.setBit(146); if (count > 1) fp.setBit(159); if (count > 0) fp.setBit(164); if (RDKit::SubstructMatch(mol, *pats.bit_141, matches, true, true) > 2) fp.setBit(141); count = RDKit::SubstructMatch(mol, *pats.bit_142, matches, true, true); if (count > 1) fp.setBit(142); if (count > 0) fp.setBit(161); if (RDKit::SubstructMatch(mol, *pats.bit_144, match, true)) fp.setBit(144); count = RDKit::SubstructMatch(mol, *pats.bit_145, matches, true, true); if (count > 1) fp.setBit(145); if (count > 0) fp.setBit(163); if (RDKit::SubstructMatch(mol, *pats.bit_147, match, true)) fp.setBit(147); if (RDKit::SubstructMatch(mol, *pats.bit_148, match, true)) fp.setBit(148); count = RDKit::SubstructMatch(mol, *pats.bit_149, matches, true, true); if (count > 1) fp.setBit(149); if (count > 0) fp.setBit(160); if (RDKit::SubstructMatch(mol, *pats.bit_150, match, true)) fp.setBit(150); if (RDKit::SubstructMatch(mol, *pats.bit_151, match, true)) fp.setBit(151); if (RDKit::SubstructMatch(mol, *pats.bit_152, match, true)) fp.setBit(152); if (RDKit::SubstructMatch(mol, *pats.bit_154, match, true)) fp.setBit(154); if (RDKit::SubstructMatch(mol, *pats.bit_155, match, true)) fp.setBit(155); if (RDKit::SubstructMatch(mol, *pats.bit_156, match, true)) fp.setBit(156); if (RDKit::SubstructMatch(mol, *pats.bit_157, match, true)) fp.setBit(157); if (RDKit::SubstructMatch(mol, *pats.bit_158, match, true)) fp.setBit(158); if (RDKit::SubstructMatch(mol, *pats.bit_162, match, true)) fp.setBit(162); if (RDKit::SubstructMatch(mol, *pats.bit_165, match, true)) fp.setBit(165); /* BIT 125 */ RDKit::RingInfo *info = mol.getRingInfo(); unsigned int ringcount = info->numRings(); unsigned int nArom = 0; for (unsigned int i = 0; i < ringcount; i++) { bool isArom = true; const std::vector *ring = &info->bondRings()[i]; std::vector::const_iterator iter; for (iter = ring->begin(); iter != ring->end(); ++iter) if (!mol.getBondWithIdx(*iter)->getIsAromatic()) { isArom = false; break; } if (isArom) { if (nArom) { fp.setBit(125); break; } else nArom++; } } /* BIT 166 */ std::vector mapping; if (RDKit::MolOps::getMolFrags(mol, mapping) > 1) fp.setBit(166); } } // end of local anonymous namespace namespace RDKit { namespace MACCSFingerprints { ExplicitBitVect *getFingerprintAsBitVect(const ROMol &mol) { auto *fp = new ExplicitBitVect(167); GenerateFP(mol, *fp); return fp; } } }