public IntArrayFingerprint(IBitFingerprint fingerprint) { // if it is an IntArrayFingerprint we can do faster (System.arraycopy) if (fingerprint instanceof IntArrayFingerprint) { IntArrayFingerprint iaFP = (IntArrayFingerprint) fingerprint; trueBits = new int[iaFP.trueBits.length]; System.arraycopy(iaFP.trueBits, 0, trueBits, 0, trueBits.length); } else { trueBits = new int[fingerprint.cardinality()]; int index = 0; for (int i = 0; i < fingerprint.size(); i++) { if (fingerprint.get(i)) { trueBits[index++] = i; } } } }
/** * Evaluates Tanimoto coefficient for two <code>IBitFingerprint</code>. * <p> * @param fingerprint1 fingerprint for the first molecule * @param fingerprint2 fingerprint for the second molecule * @return The Tanimoto coefficient * @throws IllegalArgumentException if bitsets are not of the same length */ public static double calculate(IBitFingerprint fingerprint1, IBitFingerprint fingerprint2) { if (fingerprint1.size() != fingerprint2.size()) { throw new IllegalArgumentException("Fingerprints must have the same size"); } int cardinality1 = fingerprint1.cardinality(); int cardinality2 = fingerprint2.cardinality(); // If the fingerprint is an IntArrayFingeprint that could mean a big // fingerprint so let's take the safe way out and create a // new IntArrayfingerprint IBitFingerprint one_and_two = fingerprint1 instanceof IntArrayFingerprint ? new IntArrayFingerprint( fingerprint1) : new BitSetFingerprint(fingerprint1); one_and_two.and(fingerprint2); double cardinalityCommon = one_and_two.cardinality(); return cardinalityCommon / (cardinality1 + cardinality2 - cardinalityCommon); }
@Test public void makeBitFingerprint() { Map<String,Integer> features = new HashMap<String,Integer>(); features.put("CCO", 1); features.put("CC", 1); features.put("C", 1); IBitFingerprint fp = FingerprinterTool.makeBitFingerprint(features, 1024, 1); assertThat(fp.cardinality(), is(3)); assertTrue(fp.get("CCO".hashCode() % 1024)); assertTrue(fp.get("CC".hashCode() % 1024)); assertTrue(fp.get("C".hashCode() % 1024)); }
@Test public void protonsDontCauseNPE() throws Exception { IAtomContainer proton = new AtomContainer(1, 0, 0, 0); proton.addAtom(atom("H", +1, 0)); CircularFingerprinter circ = new CircularFingerprinter(CircularFingerprinter.CLASS_FCFP2); assertThat(circ.getBitFingerprint(proton).cardinality(), is(0)); }
@Test public void testRegression() throws Exception { IAtomContainer mol1 = TestMoleculeFactory.makeIndole(); IAtomContainer mol2 = TestMoleculeFactory.makePyrrole(); Fingerprinter fingerprinter = new Fingerprinter(1024, 8); IBitFingerprint bs1 = fingerprinter.getBitFingerprint(mol1); Assert.assertEquals( "Seems the fingerprint code has changed. This will cause a number of other tests to fail too!", 33, bs1.cardinality()); IBitFingerprint bs2 = fingerprinter.getBitFingerprint(mol2); Assert.assertEquals( "Seems the fingerprint code has changed. This will cause a number of other tests to fail too!", 13, bs2.cardinality()); }
@Test public void testRegression() throws Exception { IAtomContainer mol1 = TestMoleculeFactory.makeIndole(); IAtomContainer mol2 = TestMoleculeFactory.makePyrrole(); AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol1); AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol2); ShortestPathFingerprinter fingerprinter = new ShortestPathFingerprinter(); IBitFingerprint bs1 = fingerprinter.getBitFingerprint(mol1); Assert.assertEquals( "Seems the fingerprint code has changed. This will cause a number of other tests to fail too!", 22, bs1.cardinality()); IBitFingerprint bs2 = fingerprinter.getBitFingerprint(mol2); Assert.assertEquals( "Seems the fingerprint code has changed. This will cause a number of other tests to fail too!", 11, bs2.cardinality()); }