@Override public IBitFingerprint getBitFingerprint(IAtomContainer container) throws CDKException { BitSet fp = new BitSet(pathToBit.size()); List<String> paths = new ArrayList<>(); calculate(paths, container); for (String path : paths) fp.set(pathToBit.get(path)); return new BitSetFingerprint(fp); }
/** * This performs the calculations used to generate the fingerprint * @param paths * @param mol */ private void calculate(List<String> paths, IAtomContainer mol) { AllPairsShortestPaths apsp = new AllPairsShortestPaths(mol); int numAtoms = mol.getAtomCount(); for (int i = 0; i < numAtoms; i++) { if (!include(mol.getAtom(i))) continue; for (int j = i + 1; j < numAtoms; j++) { if (!include(mol.getAtom(j))) continue; final int dist = apsp.from(i).distanceTo(j); if (dist > MAX_DISTANCE) continue; final IAtom beg = mol.getAtom(i); final IAtom end = mol.getAtom(j); paths.add(encodePath(dist, beg, end)); paths.add(encodePath(dist, end, beg)); if (isHalogen(mol.getAtom(i)) || isHalogen(mol.getAtom(j))) { paths.add(encodeHalPath(dist, beg, end)); paths.add(encodeHalPath(dist, end, beg)); } } } }
@Override public ICountFingerprint getCountFingerprint(IAtomContainer mol) throws CDKException { final Map<String,Integer> raw = getRawFingerprint(mol); final List<String> keys = new ArrayList<>(raw.keySet()); return new ICountFingerprint() {
@Test public void testGetRawFingerprint() throws Exception { IFingerprinter printer = new AtomPairs2DFingerprinter(); } }
@Test public void ignoredAtom() throws Exception { IFingerprinter printer = new AtomPairs2DFingerprinter(); IAtomContainer mol1 = parser.parseSmiles("[Te]1cccc1"); Map<String, Integer> map = printer.getRawFingerprint(mol1); Assert.assertTrue(map.containsKey("1_C_C")); Assert.assertTrue(map.containsKey("2_C_C")); }
@Test public void testHalogen() throws Exception { IFingerprinter printer = new AtomPairs2DFingerprinter(); IAtomContainer mol1 = parser.parseSmiles("Clc1ccccc1"); Map<String, Integer> map = printer.getRawFingerprint(mol1); Assert.assertTrue(map.containsKey("1_X_C")); Assert.assertTrue(map.containsKey("1_Cl_C")); Assert.assertTrue(map.containsKey("2_X_C")); Assert.assertTrue(map.containsKey("2_Cl_C")); Assert.assertTrue(map.containsKey("3_X_C")); Assert.assertTrue(map.containsKey("3_Cl_C")); Assert.assertTrue(map.containsKey("4_X_C")); Assert.assertTrue(map.containsKey("4_Cl_C")); }
@Override public Map<String, Integer> getRawFingerprint(IAtomContainer mol) throws CDKException { Map<String,Integer> raw = new HashMap<>(); List<String> paths = new ArrayList<>(); calculate(paths, mol); Collections.sort(paths); int count = 0; String prev = null; for (String path : paths) { if (prev == null || !path.equals(prev)) { if (count > 0) raw.put(prev, count); count = 1; prev = path; } else { ++count; } } if (count > 0) raw.put(prev, count); return raw; }
@Test public void testGetCountFingerprint() throws Exception { IFingerprinter printer = new AtomPairs2DFingerprinter(); IAtomContainer mol1 = parser.parseSmiles("cccccccccc"); ICountFingerprint icfp = printer.getCountFingerprint(mol1); Assert.assertEquals(9, icfp.numOfPopulatedbins()); }
@Test public void testFingerprint() throws Exception { /* * We are going to test hexane. Hexane is a good test b/c it has 10 carbons. * Since the max distance for this fingerprint is 10, the final C-C fingerprint slot * at distance 10 should return false, while all the other C-C fingerprint slots * should return true. */ IFingerprinter printer = new AtomPairs2DFingerprinter(); IAtomContainer mol1 = parser.parseSmiles("cccccccccc"); BitSetFingerprint bsfp = (BitSetFingerprint) printer.getBitFingerprint(mol1); Assert.assertEquals(9, bsfp.cardinality()); Assert.assertEquals(true, bsfp.get(0)); //Distance 1 Assert.assertEquals(true, bsfp.get(78)); //Distance 2 Assert.assertEquals(true, bsfp.get(156)); //Distance 3 Assert.assertEquals(true, bsfp.get(234)); //Distance 4 Assert.assertEquals(true, bsfp.get(312)); //Distance 5 Assert.assertEquals(true, bsfp.get(390)); //Distance 6 Assert.assertEquals(true, bsfp.get(468)); //Distance 7 Assert.assertEquals(true, bsfp.get(546)); //Distance 8 Assert.assertEquals(true, bsfp.get(624)); //Distance 9 Assert.assertEquals(false, bsfp.get(702)); //Distance 10 }