public BitSetFingerprint(IBitFingerprint fingerprint) { if (fingerprint instanceof BitSetFingerprint) { bitset = (BitSet) ((BitSetFingerprint) fingerprint).bitset.clone(); } else { BitSet bitSet = new BitSet(); for (int i = 0; i < fingerprint.size(); i++) { bitSet.set(i, fingerprint.get(i)); } this.bitset = bitSet; } }
@Override public void or(IBitFingerprint fingerprint) { if (bitset.size() != fingerprint.size()) { throw new IllegalArgumentException("Fingerprints must have same size"); } if (fingerprint instanceof BitSetFingerprint) { bitset.or(((BitSetFingerprint) fingerprint).bitset); } else { for (int i = 0; i < bitset.size(); i++) { bitset.set(i, bitset.get(i) || fingerprint.get(i)); } } }
@Override public void and(IBitFingerprint fingerprint) { if (bitset.size() != fingerprint.size()) { throw new IllegalArgumentException("Fingerprints must have same size"); } if (fingerprint instanceof BitSetFingerprint) { bitset.and(((BitSetFingerprint) fingerprint).bitset); } else { for (int i = 0; i < bitset.size(); i++) { bitset.set(i, bitset.get(i) && fingerprint.get(i)); } } }
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 testgetBitFingerprint_IAtomContainer() throws java.lang.Exception { Fingerprinter fingerprinter = new Fingerprinter(); IAtomContainer mol = TestMoleculeFactory.makeIndole(); IBitFingerprint bs = fingerprinter.getBitFingerprint(mol); Assert.assertNotNull(bs); Assert.assertEquals(fingerprinter.getSize(), bs.size()); }
@Test public void testgetBitFingerprint_IAtomContainer() throws java.lang.Exception { ShortestPathFingerprinter fingerprinter = new ShortestPathFingerprinter(); IAtomContainer mol = TestMoleculeFactory.makeIndole(); AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol); IBitFingerprint bs = fingerprinter.getBitFingerprint(mol); Assert.assertNotNull(bs); Assert.assertEquals(fingerprinter.getSize(), bs.size()); }
@Test public void testBitFingerprint() throws Exception { SignatureFingerprinter fingerprinter = new SignatureFingerprinter(0); SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance()); IAtomContainer mol = sp.parseSmiles("O(NC)CC"); IBitFingerprint bitFP = fingerprinter.getBitFingerprint(mol); Assert.assertNotNull(bitFP); Assert.assertNotSame(0, bitFP.size()); }