/* $Revision$ $Author$ $Date$
*
* Copyright (C) 2009 Rajarshi Guha <rajarshi.guha@gmail.com>
*
* Contact: cdk-devel@lists.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* All we ask is that proper credit is given for our work, which includes
* - but is not limited to - adding the above copyright notice to the beginning
* of your source code files, and to any copyright notice that you may distribute
* with programs based on this work.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.openscience.cdk.fingerprint;
import org.openscience.cdk.CDKConstants;
import org.openscience.cdk.annotations.TestClass;
import org.openscience.cdk.annotations.TestMethod;
import org.openscience.cdk.exception.CDKException;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.IRingSet;
import org.openscience.cdk.ringsearch.SSSRFinder;
import org.openscience.cdk.smiles.smarts.SMARTSQueryTool;
import org.openscience.cdk.tools.periodictable.PeriodicTable;
import java.util.BitSet;
/**
* Generates a Pubchem fingerprint for a molecule.
* <p/>
* These fingerprints are described
* <a href="ftp://ftp.ncbi.nlm.nih.gov/pubchem/specifications/pubchem_fingerprints.txt">
* here</a> and are of the structural key type, of length 881. See
* {@link org.openscience.cdk.fingerprint.Fingerprinter} for a
* more detailed description of fingerprints in general. This implementation is
* based on the public domain code made available by the NCGC
* <a href="http://www.ncgc.nih.gov/pub/openhts/code/NCGC_PubChemFP.java.txt">
* here</a>
* <p/>
* <p/>
* A fingerprint is generated for an AtomContainer with this code: <pre>
* Molecule molecule = new Molecule();
* PubchemFingerprinter fprinter = new PubchemFingerprinter();
* BitSet fingerprint = fprinter.getFingerprint(molecule);
* fingerprint.size(); // returns 881
* fingerprint.length(); // returns the highest set bit
* </pre>
* Note that the fingerprinter assumes that you have detected aromaticity and
* atom types before evaluating the fingerprint. Also the fingerprinter
* expects that explicit H's are present
* <p/>
* Note that this fingerprint is not particularly fast, as it will perform
* ring detection using {@link org.openscience.cdk.ringsearch.AllRingsFinder}
* as well as multiple SMARTS queries.
* <p/>
* Some SMARTS patterns have been modified from the original code, since they
* were based on explicit H matching. As a result, we replace the explicit H's
* with a query of the #N&!H0 where N is the atomic number. Thus bit 344 was
* originally <code>[#6](~[#6])([H])</code> but is written here as
* <code>[#6&!H0]~[#6]</code>. In some cases, where the H count can be reduced
* to single possibility we directly use that H count. An example is bit 35,
* which was <code>[#6](~[#6])(~[#6])(~[#6])([H])</code> and is rewritten as
* <code>[#6H1](~[#6])(~[#6])(~[#6]</code>.
* <p/>
*
* @cdk.author Rajarshi Guha
* @cdk.keyword fingerprint
* @cdk.keyword similarity
* @cdk.module fingerprint
* @cdk.svnrev $Revision$
*/
@TestClass("org.openscience.cdk.fingerprint.PubchemFingerprinterTest")
public class PubchemFingerprinter implements IFingerprinter {
// number of bits in this fingerprint
public static int FP_SIZE = 881;
private byte[] m_bits;
private static SMARTSQueryTool sqt;
public PubchemFingerprinter() {
try {
sqt = new SMARTSQueryTool("C");
} catch (CDKException e) {
// bad practice but, the above initialization
// will never fail so we don't bother throwing
// the exception
}
m_bits = new byte[(FP_SIZE + 7) >> 3];
}
/**
* Calculate 881 bit Pubchem fingperprint for a molecule.
* <p/>
* See
* <a href="ftp://ftp.ncbi.nlm.nih.gov/pubchem/specifications/pubchem_fingerprints.txt">here</a>
* for a description of each bit position.
*
* @param atomContainer the molecule to consider
* @return the fingerprint
* @throws CDKException if there is an error during substructure
* searching or atom typing
* @see #getFingerprintAsBytes()
*/
@TestMethod("testFingerprint")
public BitSet getFingerprint(IAtomContainer atomContainer)
throws CDKException {
generateFp(atomContainer);
BitSet fp = new BitSet(FP_SIZE);
for (int i = 0; i < FP_SIZE; i++) {
if (isBitOn(i)) fp.set(i);
}
return fp;
}
/**
* Get the size of the fingerprint.
*
* @return The bit length of the fingerprint
*/
@TestMethod("testGetSize")
public int getSize() {
return FP_SIZE;
}
static class CountElements {
int[] counts = new int[120];
public CountElements(IAtomContainer m) {
for (int i = 0; i < m.getAtomCount(); i++)
++counts[PeriodicTable.getAtomicNumber(m.getAtom(i).getSymbol())];
}
public int getCount(int atno) {
return counts[atno];
}
public int getCount(String symb) {
return counts[PeriodicTable.getAtomicNumber(symb)];
}
}
static class CountRings {
int[][] sssr = {};
IRingSet ringSet;
public CountRings(IAtomContainer m) {
SSSRFinder finder = new SSSRFinder(m);
ringSet = finder.findSSSR();
}
public int countAnyRing(int size) {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (ring.getAtomCount() == size)
c++;
}
return c;
}
private boolean isCarbonOnlyRing(IAtomContainer ring) {
for (IAtom ringAtom : ring.atoms()) {
if (!ringAtom.getSymbol().equals("C")) return false;
}
return true;
}
private boolean isRingSaturated(IAtomContainer ring) {
for (IBond ringBond : ring.bonds()) {
if (ringBond.getOrder() != IBond.Order.SINGLE) return false;
}
return true;
}
private boolean isRingUnsaturated(IAtomContainer ring) {
return !isRingSaturated(ring);
}
private int countNitrogenInRing(IAtomContainer ring) {
int c = 0;
for (IAtom ringAtom : ring.atoms()) {
if (ringAtom.getSymbol().equals("N")) c++;
}
return c;
}
private int countHeteroInRing(IAtomContainer ring) {
int c = 0;
for (IAtom ringAtom : ring.atoms()) {
if (!ringAtom.getSymbol().equals("C")
&& !ringAtom.getSymbol().equals("H"))
c++;
}
return c;
}
private boolean isAromaticRing(IAtomContainer ring) {
for (IBond bond : ring.bonds())
if (!bond.getFlag(CDKConstants.ISAROMATIC)) return false;
return true;
}
public int countAromaticRing() {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (isAromaticRing(ring)) c++;
}
return c;
}
public int countHeteroAromaticRing() {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (!isCarbonOnlyRing(ring) && isAromaticRing(ring)) c++;
}
return c;
}
public int countSaturatedOrAromaticCarbonOnlyRing(int size) {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (ring.getAtomCount() == size
&& isCarbonOnlyRing(ring)
&& (isRingSaturated(ring) || isAromaticRing(ring)))
c++;
}
return c;
}
public int countSaturatedOrAromaticNitrogenContainingRing(int size) {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (ring.getAtomCount() == size
&& (isRingSaturated(ring) || isAromaticRing(ring))
&& countNitrogenInRing(ring) > 0)
++c;
}
return c;
}
public int countSaturatedOrAromaticHeteroContainingRing(int size) {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (ring.getAtomCount() == size
&& (isRingSaturated(ring) || isAromaticRing(ring))
&& countHeteroInRing(ring) > 0)
++c;
}
return c;
}
public int countUnsaturatedCarbonOnlyRing(int size) {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (ring.getAtomCount() == size
&& isRingUnsaturated(ring)
&& !isAromaticRing(ring)
&& isCarbonOnlyRing(ring))
++c;
}
return c;
}
public int countUnsaturatedNitrogenContainingRing(int size) {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (ring.getAtomCount() == size
&& isRingUnsaturated(ring)
&& !isAromaticRing(ring)
&& countNitrogenInRing(ring) > 0)
++c;
}
return c;
}
public int countUnsaturatedHeteroContainingRing(int size) {
int c = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (ring.getAtomCount() == size
&& isRingUnsaturated(ring)
&& !isAromaticRing(ring)
&& countHeteroInRing(ring) > 0)
++c;
}
return c;
}
}
static class CountSubstructures {
private IAtomContainer mol;
public CountSubstructures(IAtomContainer m) {
mol = m;
}
public int countSubstructure(String smarts) throws CDKException {
sqt.setSmarts(smarts);
boolean status = sqt.matches(mol);
if (status) {
return sqt.getUniqueMatchingAtoms().size();
} else return 0;
}
}
static private void _generateFp(byte[] fp, IAtomContainer mol)
throws CDKException {
countElements(fp, mol);
countRings(fp, mol);
countSubstructures(fp, mol);
}
private void generateFp(IAtomContainer mol) throws CDKException {
for (int i = 0; i < m_bits.length; ++i) {
m_bits[i] = 0;
}
_generateFp(m_bits, mol);
}
private boolean isBitOn(int bit) {
return (m_bits[bit >> 3] & MASK[bit % 8]) != 0;
}
/**
* Returns the fingerprint generated for a molecule as a byte[].
* <p/>
* Note that this should be immediately called after calling
* {@link #getFingerprint(org.openscience.cdk.interfaces.IAtomContainer)}
*
* @return The fingerprint as a byte array
* @see #getFingerprint(org.openscience.cdk.interfaces.IAtomContainer)
*/
public byte[] getFingerprintAsBytes() {
return m_bits;
}
/**
* Returns a fingerprint from a Base64 encoded Pubchem fingerprint.
*
* @param enc The Base64 encoded fingerprint
* @return A BitSet corresponding to the input fingerprint
*/
public static BitSet decode(String enc) {
byte[] fp = base64Decode(enc);
if (fp.length < 4) {
throw new IllegalArgumentException(
"Input is not a proper PubChem base64 encoded fingerprint");
}
int len = (fp[0] << 24) | (fp[1] << 16)
| (fp[2] << 8) | (fp[3] & 0xff);
if (len != FP_SIZE) {
throw new IllegalArgumentException(
"Input is not a proper PubChem base64 encoded fingerprint");
}
PubchemFingerprinter pc = new PubchemFingerprinter();
for (int i = 0; i < pc.m_bits.length; ++i) {
pc.m_bits[i] = fp[i + 4];
}
BitSet ret = new BitSet(FP_SIZE);
for (int i = 0; i < FP_SIZE; i++) {
if (pc.isBitOn(i)) ret.set(i);
}
return ret;
}
// the first four bytes contains the length of the fingerprint
private String encode() {
byte[] pack = new byte[4 + m_bits.length];
pack[0] = (byte) ((FP_SIZE & 0xffffffff) >> 24);
pack[1] = (byte) ((FP_SIZE & 0x00ffffff) >> 16);
pack[2] = (byte) ((FP_SIZE & 0x0000ffff) >> 8);
pack[3] = (byte) (FP_SIZE & 0x000000ff);
for (int i = 0; i < m_bits.length; ++i) {
pack[i + 4] = m_bits[i];
}
return base64Encode(pack);
}
private static String BASE64_LUT =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz0123456789+/=";
// based on NCBI C implementation
private static String base64Encode(byte[] data) {
char c64[] = new char[data.length * 4 / 3 + 5];
for (int i = 0, k = 0; i < data.length; i += 3, k += 4) {
c64[k + 0] = (char) (data[i] >> 2);
c64[k + 1] = (char) ((data[i] & 0x03) << 4);
c64[k + 2] = c64[k + 3] = 64;
if ((i + i) < data.length) {
c64[k + 1] |= data[i + 1] >> 4;
c64[k + 2] = (char) ((data[i + 1] & 0x0f) << 2);
}
if ((i + 2) < data.length) {
c64[k + 2] |= data[i + 2] >> 6;
c64[k + 3] = (char) (data[i + 2] & 0x3f);
}
for (int j = 0; j < 4; ++j) {
c64[k + j] = BASE64_LUT.charAt(c64[k + j]);
}
}
return new String(c64);
}
// based on NCBI C implementation
private static byte[] base64Decode(String data) {
int len = data.length();
byte[] b64 = new byte[len * 3 / 4];
byte[] buf = new byte[4];
boolean done = false;
for (int i = 0, j, k = 0; i < len && !done;) {
buf[0] = buf[1] = buf[2] = buf[3] = 0;
for (j = 0; j < 4 && i < len; ++j) {
char c = data.charAt(i);
if (c >= 'A' && c <= 'Z') {
c -= 'A';
} else if (c >= 'a' && c <= 'z') {
c = (char) (c - 'a' + 26);
} else if (c >= '0' && c <= '9') {
c = (char) (c - '0' + 52);
} else if (c == '+') {
c = 62;
} else if (c == '/') {
c = 63;
} else if (c == '=' || c == '-') {
done = true;
break;
} else {
++i;
--j;
continue;
}
buf[j] = (byte) c;
++i;
}
if (k < b64.length && j >= 1) {
b64[k++] = (byte) ((buf[0] << 2) | ((buf[1] & 0x30) >> 4));
}
if (k < b64.length && j >= 3) {
b64[k++] = (byte) (((buf[1] & 0x0f) << 4)
| ((buf[2] & 0x3c) >> 2));
}
if (k < b64.length && j >= 4) {
b64[k++] = (byte) (((buf[2] & 0x03) << 6) | (buf[3] & 0x3f));
}
}
return b64;
}
static final int BITCOUNT[] = {
0, 1, 1, 2, 1, 2, 2, 3,
1, 2, 2, 3, 2, 3, 3, 4,
1, 2, 2, 3, 2, 3, 3, 4,
2, 3, 3, 4, 3, 4, 4, 5,
1, 2, 2, 3, 2, 3, 3, 4,
2, 3, 3, 4, 3, 4, 4, 5,
2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6,
1, 2, 2, 3, 2, 3, 3, 4,
2, 3, 3, 4, 3, 4, 4, 5,
2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6,
2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6,
4, 5, 5, 6, 5, 6, 6, 7,
1, 2, 2, 3, 2, 3, 3, 4,
2, 3, 3, 4, 3, 4, 4, 5,
2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6,
2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6,
4, 5, 5, 6, 5, 6, 6, 7,
2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6,
4, 5, 5, 6, 5, 6, 6, 7,
3, 4, 4, 5, 4, 5, 5, 6,
4, 5, 5, 6, 5, 6, 6, 7,
4, 5, 5, 6, 5, 6, 6, 7,
5, 6, 6, 7, 6, 7, 7, 8
};
static final int MASK[] = {
0x80,
0x40,
0x20,
0x10,
0x08,
0x04,
0x02,
0x01
};
/*
Section 1: Hierarchic Element Counts - These bs test for the
presence or count of individual chemical atoms represented
by their atomic symbol.
*/
private static void countElements(byte[] fp, IAtomContainer mol) {
int b;
CountElements ce = new CountElements(mol);
b = 0;
if (ce.getCount("H") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 1;
if (ce.getCount("H") >= 8) fp[b >> 3] |= MASK[b % 8];
b = 2;
if (ce.getCount("H") >= 16) fp[b >> 3] |= MASK[b % 8];
b = 3;
if (ce.getCount("H") >= 32) fp[b >> 3] |= MASK[b % 8];
b = 4;
if (ce.getCount("Li") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 5;
if (ce.getCount("Li") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 6;
if (ce.getCount("B") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 7;
if (ce.getCount("B") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 8;
if (ce.getCount("B") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 9;
if (ce.getCount("C") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 10;
if (ce.getCount("C") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 11;
if (ce.getCount("C") >= 8) fp[b >> 3] |= MASK[b % 8];
b = 12;
if (ce.getCount("C") >= 16) fp[b >> 3] |= MASK[b % 8];
b = 13;
if (ce.getCount("C") >= 32) fp[b >> 3] |= MASK[b % 8];
b = 14;
if (ce.getCount("N") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 15;
if (ce.getCount("N") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 16;
if (ce.getCount("N") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 17;
if (ce.getCount("N") >= 8) fp[b >> 3] |= MASK[b % 8];
b = 18;
if (ce.getCount("O") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 19;
if (ce.getCount("O") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 20;
if (ce.getCount("O") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 21;
if (ce.getCount("O") >= 8) fp[b >> 3] |= MASK[b % 8];
b = 22;
if (ce.getCount("O") >= 16) fp[b >> 3] |= MASK[b % 8];
b = 23;
if (ce.getCount("F") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 24;
if (ce.getCount("F") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 25;
if (ce.getCount("F") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 26;
if (ce.getCount("Na") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 27;
if (ce.getCount("Na") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 28;
if (ce.getCount("Si") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 29;
if (ce.getCount("Si") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 30;
if (ce.getCount("P") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 31;
if (ce.getCount("P") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 32;
if (ce.getCount("P") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 33;
if (ce.getCount("S") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 34;
if (ce.getCount("S") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 35;
if (ce.getCount("S") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 36;
if (ce.getCount("S") >= 8) fp[b >> 3] |= MASK[b % 8];
b = 37;
if (ce.getCount("Cl") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 38;
if (ce.getCount("Cl") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 39;
if (ce.getCount("Cl") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 40;
if (ce.getCount("Cl") >= 8) fp[b >> 3] |= MASK[b % 8];
b = 41;
if (ce.getCount("K") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 42;
if (ce.getCount("K") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 43;
if (ce.getCount("Br") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 44;
if (ce.getCount("Br") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 45;
if (ce.getCount("Br") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 46;
if (ce.getCount("I") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 47;
if (ce.getCount("I") >= 2) fp[b >> 3] |= MASK[b % 8];
b = 48;
if (ce.getCount("I") >= 4) fp[b >> 3] |= MASK[b % 8];
b = 49;
if (ce.getCount("Be") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 50;
if (ce.getCount("Mg") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 51;
if (ce.getCount("Al") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 52;
if (ce.getCount("Ca") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 53;
if (ce.getCount("Sc") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 54;
if (ce.getCount("Ti") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 55;
if (ce.getCount("V") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 56;
if (ce.getCount("Cr") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 57;
if (ce.getCount("Mn") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 58;
if (ce.getCount("Fe") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 59;
if (ce.getCount("Co") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 60;
if (ce.getCount("Ni") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 61;
if (ce.getCount("Cu") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 62;
if (ce.getCount("Zn") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 63;
if (ce.getCount("Ga") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 64;
if (ce.getCount("Ge") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 65;
if (ce.getCount("As") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 66;
if (ce.getCount("Se") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 67;
if (ce.getCount("Kr") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 68;
if (ce.getCount("Rb") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 69;
if (ce.getCount("Sr") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 70;
if (ce.getCount("Y") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 71;
if (ce.getCount("Zr") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 72;
if (ce.getCount("Nb") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 73;
if (ce.getCount("Mo") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 74;
if (ce.getCount("Ru") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 75;
if (ce.getCount("Rh") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 76;
if (ce.getCount("Pd") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 77;
if (ce.getCount("Ag") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 78;
if (ce.getCount("Cd") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 79;
if (ce.getCount("In") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 80;
if (ce.getCount("Sn") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 81;
if (ce.getCount("Sb") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 82;
if (ce.getCount("Te") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 83;
if (ce.getCount("Xe") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 84;
if (ce.getCount("Cs") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 85;
if (ce.getCount("Ba") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 86;
if (ce.getCount("Lu") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 87;
if (ce.getCount("Hf") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 88;
if (ce.getCount("Ta") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 89;
if (ce.getCount("W") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 90;
if (ce.getCount("Re") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 91;
if (ce.getCount("Os") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 92;
if (ce.getCount("Ir") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 93;
if (ce.getCount("Pt") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 94;
if (ce.getCount("Au") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 95;
if (ce.getCount("Hg") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 96;
if (ce.getCount("Tl") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 97;
if (ce.getCount("Pb") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 98;
if (ce.getCount("Bi") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 99;
if (ce.getCount("La") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 100;
if (ce.getCount("Ce") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 101;
if (ce.getCount("Pr") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 102;
if (ce.getCount("Nd") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 103;
if (ce.getCount("Pm") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 104;
if (ce.getCount("Sm") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 105;
if (ce.getCount("Eu") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 106;
if (ce.getCount("Gd") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 107;
if (ce.getCount("Tb") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 108;
if (ce.getCount("Dy") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 109;
if (ce.getCount("Ho") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 110;
if (ce.getCount("Er") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 111;
if (ce.getCount("Tm") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 112;
if (ce.getCount("Yb") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 113;
if (ce.getCount("Tc") >= 1) fp[b >> 3] |= MASK[b % 8];
b = 114;
if (ce.getCount("U") >= 1) fp[b >> 3] |= MASK[b % 8];
}
/*
Section 2: Rings in a canonic ESSR ring set-These bs test for the
presence or count of the described chemical ring system.
An ESSR ring is any ring which does not share three
consecutive atoms with any other ring in the chemical
structure. For example, naphthalene has three ESSR rings
(two phenyl fragments and the 10-membered envelope), while
biphenyl will yield a count of only two ESSR rings.
*/
private static void countRings(byte[] fp, IAtomContainer mol) {
CountRings cr = new CountRings(mol);
int b;
b = 115;
if (cr.countAnyRing(3) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 116;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(3) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 117;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(3) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 118;
if (cr.countSaturatedOrAromaticHeteroContainingRing(3) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 119;
if (cr.countUnsaturatedCarbonOnlyRing(3) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 120;
if (cr.countUnsaturatedNitrogenContainingRing(3) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 121;
if (cr.countUnsaturatedHeteroContainingRing(3) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 122;
if (cr.countAnyRing(3) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 123;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(3) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 124;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(3) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 125;
if (cr.countSaturatedOrAromaticHeteroContainingRing(3) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 126;
if (cr.countUnsaturatedCarbonOnlyRing(3) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 127;
if (cr.countUnsaturatedNitrogenContainingRing(3) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 128;
if (cr.countUnsaturatedHeteroContainingRing(3) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 129;
if (cr.countAnyRing(4) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 130;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(4) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 131;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(4) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 132;
if (cr.countSaturatedOrAromaticHeteroContainingRing(4) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 133;
if (cr.countUnsaturatedCarbonOnlyRing(4) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 134;
if (cr.countUnsaturatedNitrogenContainingRing(4) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 135;
if (cr.countUnsaturatedHeteroContainingRing(4) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 136;
if (cr.countAnyRing(4) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 137;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(4) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 138;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(4) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 139;
if (cr.countSaturatedOrAromaticHeteroContainingRing(4) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 140;
if (cr.countUnsaturatedCarbonOnlyRing(4) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 141;
if (cr.countUnsaturatedNitrogenContainingRing(4) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 142;
if (cr.countUnsaturatedHeteroContainingRing(4) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 143;
if (cr.countAnyRing(5) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 144;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(5) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 145;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(5) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 146;
if (cr.countSaturatedOrAromaticHeteroContainingRing(5) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 147;
if (cr.countUnsaturatedCarbonOnlyRing(5) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 148;
if (cr.countUnsaturatedNitrogenContainingRing(5) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 149;
if (cr.countUnsaturatedHeteroContainingRing(5) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 150;
if (cr.countAnyRing(5) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 151;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(5) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 152;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(5) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 153;
if (cr.countSaturatedOrAromaticHeteroContainingRing(5) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 154;
if (cr.countUnsaturatedCarbonOnlyRing(5) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 155;
if (cr.countUnsaturatedNitrogenContainingRing(5) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 156;
if (cr.countUnsaturatedHeteroContainingRing(5) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 157;
if (cr.countAnyRing(5) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 158;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(5) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 159;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(5) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 160;
if (cr.countSaturatedOrAromaticHeteroContainingRing(5) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 161;
if (cr.countUnsaturatedCarbonOnlyRing(5) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 162;
if (cr.countUnsaturatedNitrogenContainingRing(5) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 163;
if (cr.countUnsaturatedHeteroContainingRing(5) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 164;
if (cr.countAnyRing(5) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 165;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(5) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 166;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(5) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 167;
if (cr.countSaturatedOrAromaticHeteroContainingRing(5) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 168;
if (cr.countUnsaturatedCarbonOnlyRing(5) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 169;
if (cr.countUnsaturatedNitrogenContainingRing(5) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 170;
if (cr.countUnsaturatedHeteroContainingRing(5) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 171;
if (cr.countAnyRing(5) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 172;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(5) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 173;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(5) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 174;
if (cr.countSaturatedOrAromaticHeteroContainingRing(5) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 175;
if (cr.countUnsaturatedCarbonOnlyRing(5) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 176;
if (cr.countUnsaturatedNitrogenContainingRing(5) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 177;
if (cr.countUnsaturatedHeteroContainingRing(5) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 178;
if (cr.countAnyRing(6) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 179;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(6) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 180;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(6) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 181;
if (cr.countSaturatedOrAromaticHeteroContainingRing(6) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 182;
if (cr.countUnsaturatedCarbonOnlyRing(6) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 183;
if (cr.countUnsaturatedNitrogenContainingRing(6) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 184;
if (cr.countUnsaturatedHeteroContainingRing(6) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 185;
if (cr.countAnyRing(6) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 186;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(6) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 187;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(6) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 188;
if (cr.countSaturatedOrAromaticHeteroContainingRing(6) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 189;
if (cr.countUnsaturatedCarbonOnlyRing(6) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 190;
if (cr.countUnsaturatedNitrogenContainingRing(6) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 191;
if (cr.countUnsaturatedHeteroContainingRing(6) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 192;
if (cr.countAnyRing(6) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 193;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(6) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 194;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(6) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 195;
if (cr.countSaturatedOrAromaticHeteroContainingRing(6) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 196;
if (cr.countUnsaturatedCarbonOnlyRing(6) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 197;
if (cr.countUnsaturatedNitrogenContainingRing(6) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 198;
if (cr.countUnsaturatedHeteroContainingRing(6) >= 3) fp[b >> 3] |= MASK[b % 8];
b = 199;
if (cr.countAnyRing(6) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 200;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(6) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 201;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(6) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 202;
if (cr.countSaturatedOrAromaticHeteroContainingRing(6) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 203;
if (cr.countUnsaturatedCarbonOnlyRing(6) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 204;
if (cr.countUnsaturatedNitrogenContainingRing(6) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 205;
if (cr.countUnsaturatedHeteroContainingRing(6) >= 4) fp[b >> 3] |= MASK[b % 8];
b = 206;
if (cr.countAnyRing(6) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 207;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(6) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 208;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(6) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 209;
if (cr.countSaturatedOrAromaticHeteroContainingRing(6) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 210;
if (cr.countUnsaturatedCarbonOnlyRing(6) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 211;
if (cr.countUnsaturatedNitrogenContainingRing(6) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 212;
if (cr.countUnsaturatedHeteroContainingRing(6) >= 5) fp[b >> 3] |= MASK[b % 8];
b = 213;
if (cr.countAnyRing(7) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 214;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(7) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 215;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(7) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 216;
if (cr.countSaturatedOrAromaticHeteroContainingRing(7) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 217;
if (cr.countUnsaturatedCarbonOnlyRing(7) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 218;
if (cr.countUnsaturatedNitrogenContainingRing(7) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 219;
if (cr.countUnsaturatedHeteroContainingRing(7) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 220;
if (cr.countAnyRing(7) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 221;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(7) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 222;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(7) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 223;
if (cr.countSaturatedOrAromaticHeteroContainingRing(7) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 224;
if (cr.countUnsaturatedCarbonOnlyRing(7) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 225;
if (cr.countUnsaturatedNitrogenContainingRing(7) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 226;
if (cr.countUnsaturatedHeteroContainingRing(7) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 227;
if (cr.countAnyRing(8) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 228;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(8) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 229;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(8) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 230;
if (cr.countSaturatedOrAromaticHeteroContainingRing(8) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 231;
if (cr.countUnsaturatedCarbonOnlyRing(8) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 232;
if (cr.countUnsaturatedNitrogenContainingRing(8) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 233;
if (cr.countUnsaturatedHeteroContainingRing(8) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 234;
if (cr.countAnyRing(8) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 235;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(8) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 236;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(8) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 237;
if (cr.countSaturatedOrAromaticHeteroContainingRing(8) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 238;
if (cr.countUnsaturatedCarbonOnlyRing(8) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 239;
if (cr.countUnsaturatedNitrogenContainingRing(8) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 240;
if (cr.countUnsaturatedHeteroContainingRing(8) >= 2) fp[b >> 3] |= MASK[b % 8];
b = 241;
if (cr.countAnyRing(9) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 242;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(9) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 243;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(9) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 244;
if (cr.countSaturatedOrAromaticHeteroContainingRing(9) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 245;
if (cr.countUnsaturatedCarbonOnlyRing(9) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 246;
if (cr.countUnsaturatedNitrogenContainingRing(9) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 247;
if (cr.countUnsaturatedHeteroContainingRing(9) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 248;
if (cr.countAnyRing(10) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 249;
if (cr.countSaturatedOrAromaticCarbonOnlyRing(10) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 250;
if (cr.countSaturatedOrAromaticNitrogenContainingRing(10) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 251;
if (cr.countSaturatedOrAromaticHeteroContainingRing(10) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 252;
if (cr.countUnsaturatedCarbonOnlyRing(10) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 253;
if (cr.countUnsaturatedNitrogenContainingRing(10) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 254;
if (cr.countUnsaturatedHeteroContainingRing(10) >= 1) fp[b >> 3] |= MASK[b % 8];
b = 255;
if (cr.countAromaticRing() >= 1) fp[b >> 3] |= MASK[b % 8];
b = 256;
if (cr.countHeteroAromaticRing() >= 1) fp[b >> 3] |= MASK[b % 8];
b = 257;
if (cr.countAromaticRing() >= 2) fp[b >> 3] |= MASK[b % 8];
b = 258;
if (cr.countHeteroAromaticRing() >= 2) fp[b >> 3] |= MASK[b % 8];
b = 259;
if (cr.countAromaticRing() >= 3) fp[b >> 3] |= MASK[b % 8];
b = 260;
if (cr.countHeteroAromaticRing() >= 3) fp[b >> 3] |= MASK[b % 8];
b = 261;
if (cr.countAromaticRing() >= 4) fp[b >> 3] |= MASK[b % 8];
b = 262;
if (cr.countHeteroAromaticRing() >= 4) fp[b >> 3] |= MASK[b % 8];
}
private static void countSubstructures(byte[] fp, IAtomContainer mol) throws CDKException {
CountSubstructures cs = new CountSubstructures(mol);
int b;
/*
Section 3: Simple atom pairs. These bits test for the presence
of patterns of bonded atom pairs, regardless of bond order or
count.
*/
b = 263;
if (cs.countSubstructure("[Li&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 264;
if (cs.countSubstructure("[Li]~[Li]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 265;
if (cs.countSubstructure("[Li]~[B]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 266;
if (cs.countSubstructure("[Li]~[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 267;
if (cs.countSubstructure("[Li]~[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 268;
if (cs.countSubstructure("[Li]~[F]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 269;
if (cs.countSubstructure("[Li]~[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 270;
if (cs.countSubstructure("[Li]~[#16]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 271;
if (cs.countSubstructure("[Li]~[Cl]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 272;
if (cs.countSubstructure("[#5&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 273;
if (cs.countSubstructure("[#5]~[#5]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 274;
if (cs.countSubstructure("[#5]~[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 275;
if (cs.countSubstructure("[#5]~[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 276;
if (cs.countSubstructure("[#5]~[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 277;
if (cs.countSubstructure("[#5]~[F]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 278;
if (cs.countSubstructure("[#5]~[Si]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 279;
if (cs.countSubstructure("[#5]~[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 280;
if (cs.countSubstructure("[#5]~[#16]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 281;
if (cs.countSubstructure("[#5]~[Cl]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 282;
if (cs.countSubstructure("[#5]~[Br]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 283;
if (cs.countSubstructure("[#6&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 284;
if (cs.countSubstructure("[#6]~[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 285;
if (cs.countSubstructure("[#6]~[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 286;
if (cs.countSubstructure("[#6]~[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 287;
if (cs.countSubstructure("[#6]~[F]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 288;
if (cs.countSubstructure("[#6]~[Na]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 289;
if (cs.countSubstructure("[#6]~[Mg]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 290;
if (cs.countSubstructure("[#6]~[Al]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 291;
if (cs.countSubstructure("[#6]~[Si]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 292;
if (cs.countSubstructure("[#6]~[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 293;
if (cs.countSubstructure("[#6]~[#16]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 294;
if (cs.countSubstructure("[#6]~[Cl]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 295;
if (cs.countSubstructure("[#6]~[As]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 296;
if (cs.countSubstructure("[#6]~[Se]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 297;
if (cs.countSubstructure("[#6]~[Br]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 298;
if (cs.countSubstructure("[#6]~[I]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 299;
if (cs.countSubstructure("[#7&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 300;
if (cs.countSubstructure("[#7]~[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 301;
if (cs.countSubstructure("[#7]~[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 302;
if (cs.countSubstructure("[#7]~[F]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 303;
if (cs.countSubstructure("[#7]~[Si]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 304;
if (cs.countSubstructure("[#7]~[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 305;
if (cs.countSubstructure("[#7]~[#16]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 306;
if (cs.countSubstructure("[#7]~[Cl]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 307;
if (cs.countSubstructure("[#7]~[Br]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 308;
if (cs.countSubstructure("[#8&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 309;
if (cs.countSubstructure("[#8]~[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 310;
if (cs.countSubstructure("[#8]~[Mg]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 311;
if (cs.countSubstructure("[#8]~[Na]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 312;
if (cs.countSubstructure("[#8]~[Al]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 313;
if (cs.countSubstructure("[#8]~[Si]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 314;
if (cs.countSubstructure("[#8]~[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 315;
if (cs.countSubstructure("[#8]~[K]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 316;
if (cs.countSubstructure("[F]~[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 317;
if (cs.countSubstructure("[F]~[#16]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 318;
if (cs.countSubstructure("[Al&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 319;
if (cs.countSubstructure("[Al]~[Cl]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 320;
if (cs.countSubstructure("[Si&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 321;
if (cs.countSubstructure("[Si]~[Si]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 322;
if (cs.countSubstructure("[Si]~[Cl]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 323;
if (cs.countSubstructure("[#15&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 324;
if (cs.countSubstructure("[#15]~[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 325;
if (cs.countSubstructure("[As&!H0]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 326;
if (cs.countSubstructure("[As]~[As]") > 0) fp[b >> 3] |= MASK[b % 8];
/*
Section 4: Simple atom nearest neighbors. These bits test for the
presence of atom nearest neighbor patterns, regardless of
bond order or count, but where bond aromaticity (denoted by
"~") is significant.
*/
b = 327;
if (cs.countSubstructure("[#6](~Br)(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 328;
if (cs.countSubstructure("[#6](~Br)(~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 329;
if (cs.countSubstructure("[#6&!H0]~[Br]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 330;
if (cs.countSubstructure("[#6](~[Br])(:[c])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 331;
if (cs.countSubstructure("[#6](~[Br])(:[n])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 332;
if (cs.countSubstructure("[#6](~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 333;
if (cs.countSubstructure("[#6](~[#6])(~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 334;
if (cs.countSubstructure("[#6](~[#6])(~[#6])(~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 335;
if (cs.countSubstructure("[#6H1](~[#6])(~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 336;
if (cs.countSubstructure("[#6](~[#6])(~[#6])(~[#6])(~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 337;
if (cs.countSubstructure("[#6](~[#6])(~[#6])(~[#6])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 338;
if (cs.countSubstructure("[#6H1](~[#6])(~[#6])(~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 339;
if (cs.countSubstructure("[#6H1](~[#6])(~[#6])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 340;
if (cs.countSubstructure("[#6](~[#6])(~[#6])(~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 341;
if (cs.countSubstructure("[#6](~[#6])(~[#6])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 342;
if (cs.countSubstructure("[#6](~[#6])(~[Cl])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 343;
if (cs.countSubstructure("[#6&!H0](~[#6])(~[Cl])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 344;
if (cs.countSubstructure("[#6H,#6H2,#6H3,#6H4]~[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 345;
if (cs.countSubstructure("[#6&!H0](~[#6])(~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 346;
if (cs.countSubstructure("[#6&!H0](~[#6])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 347;
if (cs.countSubstructure("[#6H1](~[#6])(~[#8])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 348;
if (cs.countSubstructure("[#6&!H0](~[#6])(~[#15])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 349;
if (cs.countSubstructure("[#6&!H0](~[#6])(~[#16])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 350;
if (cs.countSubstructure("[#6](~[#6])(~[I])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 351;
if (cs.countSubstructure("[#6](~[#6])(~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 352;
if (cs.countSubstructure("[#6](~[#6])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 353;
if (cs.countSubstructure("[#6](~[#6])(~[#16])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 354;
if (cs.countSubstructure("[#6](~[#6])(~[Si])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 355;
if (cs.countSubstructure("[#6](~[#6])(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 356;
if (cs.countSubstructure("[#6](~[#6])(:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 357;
if (cs.countSubstructure("[#6](~[#6])(:c)(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 358;
if (cs.countSubstructure("[#6](~[#6])(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 359;
if (cs.countSubstructure("[#6](~[#6])(:n)(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 360;
if (cs.countSubstructure("[#6](~[Cl])(~[Cl])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 361;
if (cs.countSubstructure("[#6&!H0](~[Cl])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 362;
if (cs.countSubstructure("[#6](~[Cl])(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 363;
if (cs.countSubstructure("[#6](~[F])(~[F])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 364;
if (cs.countSubstructure("[#6](~[F])(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 365;
if (cs.countSubstructure("[#6&!H0](~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 366;
if (cs.countSubstructure("[#6&!H0](~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 367;
if (cs.countSubstructure("[#6&!H0](~[#8])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 368;
if (cs.countSubstructure("[#6&!H0](~[#16])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 369;
if (cs.countSubstructure("[#6&!H0](~[Si])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 370;
if (cs.countSubstructure("[#6&!H0]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 371;
if (cs.countSubstructure("[#6&!H0](:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 372;
if (cs.countSubstructure("[#6&!H0](:c)(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 373;
if (cs.countSubstructure("[#6&!H0](:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 374;
if (cs.countSubstructure("[#6H3]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 375;
if (cs.countSubstructure("[#6](~[#7])(~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 376;
if (cs.countSubstructure("[#6](~[#7])(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 377;
if (cs.countSubstructure("[#6](~[#7])(:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 378;
if (cs.countSubstructure("[#6](~[#7])(:c)(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 379;
if (cs.countSubstructure("[#6](~[#7])(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 380;
if (cs.countSubstructure("[#6](~[#8])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 381;
if (cs.countSubstructure("[#6](~[#8])(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 382;
if (cs.countSubstructure("[#6](~[#8])(:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 383;
if (cs.countSubstructure("[#6](~[#16])(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 384;
if (cs.countSubstructure("[#6](:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 385;
if (cs.countSubstructure("[#6](:c)(:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 386;
if (cs.countSubstructure("[#6](:c)(:c)(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 387;
if (cs.countSubstructure("[#6](:c)(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 388;
if (cs.countSubstructure("[#6](:c)(:n)(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 389;
if (cs.countSubstructure("[#6](:n)(:n)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 390;
if (cs.countSubstructure("[#7](~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 391;
if (cs.countSubstructure("[#7](~[#6])(~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 392;
if (cs.countSubstructure("[#7&!H0](~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 393;
if (cs.countSubstructure("[#7&!H0](~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 394;
if (cs.countSubstructure("[#7&!H0](~[#6])(~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 395;
if (cs.countSubstructure("[#7](~[#6])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 396;
if (cs.countSubstructure("[#7](~[#6])(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 397;
if (cs.countSubstructure("[#7](~[#6])(:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 398;
if (cs.countSubstructure("[#7&!H0](~[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 399;
if (cs.countSubstructure("[#7&!H0](:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 400;
if (cs.countSubstructure("[#7&!H0](:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 401;
if (cs.countSubstructure("[#7](~[#8])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 402;
if (cs.countSubstructure("[#7](~[#8])(:o)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 403;
if (cs.countSubstructure("[#7](:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 404;
if (cs.countSubstructure("[#7](:c)(:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 405;
if (cs.countSubstructure("[#8](~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 406;
if (cs.countSubstructure("[#8&!H0](~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 407;
if (cs.countSubstructure("[#8](~[#6])(~[#15])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 408;
if (cs.countSubstructure("[#8&!H0](~[#16])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 409;
if (cs.countSubstructure("[#8](:c)(:c)") > 0) fp[b >> 3] |= MASK[b % 8];
b = 410;
if (cs.countSubstructure("[#15](~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 411;
if (cs.countSubstructure("[#15](~[#8])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 412;
if (cs.countSubstructure("[#16](~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 413;
if (cs.countSubstructure("[#16&!H0](~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 414;
if (cs.countSubstructure("[#16](~[#6])(~[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 415;
if (cs.countSubstructure("[Si](~[#6])(~[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
/*
Section 5: Detailed atom neighborhoods - These bits test for the
presence of detailed atom neighborhood patterns, regardless
of count, but where bond orders are specific, bond
aromaticity matches both single and double bonds, and where
"-", "=", and "#" matches a single bond, double bond, and
triple bond order, respectively.
*/
b = 416;
if (cs.countSubstructure("[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 417;
if (cs.countSubstructure("[#6]#[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 418;
if (cs.countSubstructure("[#6]=,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 419;
if (cs.countSubstructure("[#6]#[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 420;
if (cs.countSubstructure("[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 421;
if (cs.countSubstructure("[#6]=,:[#16]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 422;
if (cs.countSubstructure("[#7]=,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 423;
if (cs.countSubstructure("[#7]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 424;
if (cs.countSubstructure("[#7]=,:[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 425;
if (cs.countSubstructure("[#15]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 426;
if (cs.countSubstructure("[#15]=,:[#15]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 427;
if (cs.countSubstructure("[#6](#[#6])(-,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 428;
if (cs.countSubstructure("[#6H](#[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 429;
if (cs.countSubstructure("[#6](#[#7])(-,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 430;
if (cs.countSubstructure("[#6](-,:[#6])(-,:[#6])(=,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 431;
if (cs.countSubstructure("[#6](-,:[#6])(-,:[#6])(=,:[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 432;
if (cs.countSubstructure("[#6](-,:[#6])(-,:[#6])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 433;
if (cs.countSubstructure("[#6](-,:[#6])([Cl])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 434;
if (cs.countSubstructure("[#6&!H0](-,:[#6])(=,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 435;
if (cs.countSubstructure("[#6&!H0](-,:[#6])(=,:[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 436;
if (cs.countSubstructure("[#6&!H0](-,:[#6])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 437;
if (cs.countSubstructure("[#6](-,:[#6])(-,:[#7])(=,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 438;
if (cs.countSubstructure("[#6](-,:[#6])(-,:[#7])(=,:[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 439;
if (cs.countSubstructure("[#6](-,:[#6])(-,:[#7])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 440;
if (cs.countSubstructure("[#6](-,:[#6])(-,:[#8])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 441;
if (cs.countSubstructure("[#6](-,:[#6])(=,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 442;
if (cs.countSubstructure("[#6](-,:[#6])(=,:[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 443;
if (cs.countSubstructure("[#6](-,:[#6])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 444;
if (cs.countSubstructure("[#6]([Cl])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 445;
if (cs.countSubstructure("[#6&!H0](-,:[#7])(=,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 446;
if (cs.countSubstructure("[#6&!H0](=,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 447;
if (cs.countSubstructure("[#6&!H0](=,:[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 448;
if (cs.countSubstructure("[#6&!H0](=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 449;
if (cs.countSubstructure("[#6](-,:[#7])(=,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 450;
if (cs.countSubstructure("[#6](-,:[#7])(=,:[#7])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 451;
if (cs.countSubstructure("[#6](-,:[#7])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 452;
if (cs.countSubstructure("[#6](-,:[#8])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 453;
if (cs.countSubstructure("[#7](-,:[#6])(=,:[#6])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 454;
if (cs.countSubstructure("[#7](-,:[#6])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 455;
if (cs.countSubstructure("[#7](-,:[#8])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 456;
if (cs.countSubstructure("[#15](-,:[#8])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 457;
if (cs.countSubstructure("[#16](-,:[#6])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 458;
if (cs.countSubstructure("[#16](-,:[#8])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
b = 459;
if (cs.countSubstructure("[#16](=,:[#8])(=,:[#8])") > 0) fp[b >> 3] |= MASK[b % 8];
/*
Section 6: Simple SMARTS patterns - These bits test for the presence
of simple SMARTS patterns, regardless of count, but where
bond orders are specific and bond aromaticity matches both
single and double bonds.
*/
b = 460;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]#[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 461;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]=,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 462;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 463;
if (cs.countSubstructure("[#7]:[#6]-,:[#16]-[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 464;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 465;
if (cs.countSubstructure("[#8]=,:[#16]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 466;
if (cs.countSubstructure("[#7]#[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 467;
if (cs.countSubstructure("[#6]=,:[#7]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 468;
if (cs.countSubstructure("[#8]=,:[#16]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 469;
if (cs.countSubstructure("[#16]-,:[#16]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 470;
if (cs.countSubstructure("[#6]:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 471;
if (cs.countSubstructure("[#16]:[#6]:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 472;
if (cs.countSubstructure("[#6]:[#7]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 473;
if (cs.countSubstructure("[#16]-,:[#6]:[#7]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 474;
if (cs.countSubstructure("[#16]:[#6]:[#6]:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 475;
if (cs.countSubstructure("[#16]-,:[#6]=,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 476;
if (cs.countSubstructure("[#6]-,:[#8]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 477;
if (cs.countSubstructure("[#7]-,:[#7]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 478;
if (cs.countSubstructure("[#16]-,:[#6]=,:[#7]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 479;
if (cs.countSubstructure("[#16]-,:[#6]-,:[#16]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 480;
if (cs.countSubstructure("[#6]:[#16]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 481;
if (cs.countSubstructure("[#8]-,:[#16]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 482;
if (cs.countSubstructure("[#6]:[#7]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 483;
if (cs.countSubstructure("[#7]-,:[#16]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 484;
if (cs.countSubstructure("[#7]-,:[#6]:[#7]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 485;
if (cs.countSubstructure("[#7]:[#6]:[#6]:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 486;
if (cs.countSubstructure("[#7]-,:[#6]:[#7]:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 487;
if (cs.countSubstructure("[#7]-,:[#6]=,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 488;
if (cs.countSubstructure("[#7]-,:[#6]=,:[#7]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 489;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#16]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 490;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 491;
if (cs.countSubstructure("[#6]-,:[#7]:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 492;
if (cs.countSubstructure("[#7]-,:[#6]:[#8]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 493;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 494;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 495;
if (cs.countSubstructure("[#6]-,:[#7]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 496;
if (cs.countSubstructure("[#7]:[#7]-,:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 497;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 498;
if (cs.countSubstructure("[#8]-,:[#6]=,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 499;
if (cs.countSubstructure("[#7]-,:[#6]:[#6]:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 500;
if (cs.countSubstructure("[#6]-,:[#16]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 501;
if (cs.countSubstructure("[Cl]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 502;
if (cs.countSubstructure("[#7]-,:[#6]=,:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 503;
if (cs.countSubstructure("[Cl]-,:[#6]:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 504;
if (cs.countSubstructure("[#7]:[#6]:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 505;
if (cs.countSubstructure("[Cl]-,:[#6]:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 506;
if (cs.countSubstructure("[#6]-,:[#6]:[#7]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 507;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#16]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 508;
if (cs.countSubstructure("[#16]=,:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 509;
if (cs.countSubstructure("[Br]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 510;
if (cs.countSubstructure("[#1]-,:[#7]-,:[#7]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 511;
if (cs.countSubstructure("[#16]=,:[#6]-,:[#7]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 512;
if (cs.countSubstructure("[#6]-,:[As]-[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 513;
if (cs.countSubstructure("[#16]:[#6]:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 514;
if (cs.countSubstructure("[#8]-,:[#7]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 515;
if (cs.countSubstructure("[#7]-,:[#7]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 516;
if (cs.countSubstructure("[#6H,#6H2,#6H3]=,:[#6H,#6H2,#6H3]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 517;
if (cs.countSubstructure("[#7]-,:[#7]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 518;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#7]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 519;
if (cs.countSubstructure("[#7]=,:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 520;
if (cs.countSubstructure("[#6]=,:[#6]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 521;
if (cs.countSubstructure("[#6]:[#7]-,:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 522;
if (cs.countSubstructure("[#6]-,:[#7]-,:[#7]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 523;
if (cs.countSubstructure("[#7]:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 524;
if (cs.countSubstructure("[#6]-,:[#6]=,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 525;
if (cs.countSubstructure("[As]-,:[#6]:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 526;
if (cs.countSubstructure("[Cl]-,:[#6]:[#6]-,:[Cl]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 527;
if (cs.countSubstructure("[#6]:[#6]:[#7]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 528;
if (cs.countSubstructure("[#1]-,:[#7]-,:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 529;
if (cs.countSubstructure("[Cl]-,:[#6]-,:[#6]-,:[Cl]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 530;
if (cs.countSubstructure("[#7]:[#6]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 531;
if (cs.countSubstructure("[#16]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 532;
if (cs.countSubstructure("[#16]-,:[#6]:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 533;
if (cs.countSubstructure("[#16]-,:[#6]:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 534;
if (cs.countSubstructure("[#16]-,:[#6]:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 535;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 536;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 537;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 538;
if (cs.countSubstructure("[#7]=,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 539;
if (cs.countSubstructure("[#7]=,:[#6]-,:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 540;
if (cs.countSubstructure("[#6]-,:[#7]-,:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 541;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 542;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 543;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 544;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 545;
if (cs.countSubstructure("[#7]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 546;
if (cs.countSubstructure("[#7]-,:[#6]:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 547;
if (cs.countSubstructure("[#7]-,:[#6]:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 548;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 549;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 550;
if (cs.countSubstructure("[Cl]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 551;
if (cs.countSubstructure("[Cl]-,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 552;
if (cs.countSubstructure("[#6]:[#6]-,:[#6]:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 553;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 554;
if (cs.countSubstructure("[Br]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 555;
if (cs.countSubstructure("[#7]=,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 556;
if (cs.countSubstructure("[#6]=,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 557;
if (cs.countSubstructure("[#7]:[#6]-,:[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 558;
if (cs.countSubstructure("[#8]=,:[#7]-,:c:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 559;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#7]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 560;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 561;
if (cs.countSubstructure("[Cl]-,:[#6]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 562;
if (cs.countSubstructure("[Br]-,:[#6]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 563;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 564;
if (cs.countSubstructure("[#6]=,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 565;
if (cs.countSubstructure("[#6]:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 566;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 567;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 568;
if (cs.countSubstructure("N#[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 569;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 570;
if (cs.countSubstructure("[#6]:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 571;
if (cs.countSubstructure("[#1]-[#6]-,:[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 572;
if (cs.countSubstructure("n:c:n:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 573;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 574;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 575;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 576;
if (cs.countSubstructure("[#7]=,:[#6]-,:[#6]:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 577;
if (cs.countSubstructure("c:c-,:[#7]-,:c:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 578;
if (cs.countSubstructure("[#6]-,:[#6]:[#6]-,:c:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 579;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 580;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 581;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 582;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 583;
if (cs.countSubstructure("[Cl]-,:[#6]:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 584;
if (cs.countSubstructure("c:c-,:[#6]=,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 585;
if (cs.countSubstructure("[#6]-,:[#6]:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 586;
if (cs.countSubstructure("[#6]-,:[#16]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 587;
if (cs.countSubstructure("[#7]-,:[#6]:[#6]-,:[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 588;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 589;
if (cs.countSubstructure("[#6]-,:[#6]:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 590;
if (cs.countSubstructure("[#6]-,:[#6]:[#6]-,:[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 591;
if (cs.countSubstructure("[Cl]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 592;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 593;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 594;
if (cs.countSubstructure("[#6]-,:[#8]-,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 595;
if (cs.countSubstructure("c:c-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 596;
if (cs.countSubstructure("[#7]=,:[#6]-,:[#7]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 597;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:c:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 598;
if (cs.countSubstructure("[Cl]-,:[#6]:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 599;
if (cs.countSubstructure("[#6H,#6H2,#6H3]-,:[#6]=,:[#6H,#6H2,#6H3]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 600;
if (cs.countSubstructure("[#7]-,:[#6]:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 601;
if (cs.countSubstructure("[#7]-,:[#6]:[#6]:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 602;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 603;
if (cs.countSubstructure("[#6]-,:c:c:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 604;
if (cs.countSubstructure("[#6]-,:[#8]-,:[#6]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 605;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 606;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 607;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 608;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 609;
if (cs.countSubstructure("[Cl]-,:[#6]-,:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 610;
if (cs.countSubstructure("[#6]-,:[#8]-,:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 611;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 612;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#8]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 613;
if (cs.countSubstructure("[#6]-,:[#7]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 614;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#8]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 615;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 616;
if (cs.countSubstructure("c:c:n:n:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 617;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]-,:[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 618;
if (cs.countSubstructure("c:[#6]-,:[#6]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 619;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]=,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 620;
if (cs.countSubstructure("c:c-,:[#8]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 621;
if (cs.countSubstructure("[#7]-,:[#6]:c:c:n") > 0) fp[b >> 3] |= MASK[b % 8];
b = 622;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#8]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 623;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 624;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 625;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 626;
if (cs.countSubstructure("[#6]-,:[#8]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 627;
if (cs.countSubstructure("[#8]=,:[As]-,:[#6]:c:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 628;
if (cs.countSubstructure("[#6]-,:[#7]-,:[#6]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 629;
if (cs.countSubstructure("[#16]-,:[#6]:c:c-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 630;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 631;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]-,:[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 632;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#8]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 633;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 634;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 635;
if (cs.countSubstructure("[#7]-,:[#7]-,:[#6]-,:[#7]-[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 636;
if (cs.countSubstructure("[#6]-,:[#7]-,:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 637;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 638;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 639;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 640;
if (cs.countSubstructure("[#6]=,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 641;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 642;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 643;
if (cs.countSubstructure("[#1]-[#6]-,:[#6]-,:[#7]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 644;
if (cs.countSubstructure("[#6]-,:[#6]=,:[#7]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 645;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#7]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 646;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#7]-,:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 647;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#7]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 648;
if (cs.countSubstructure("[#8]=,:[#7]-,:[#6]:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 649;
if (cs.countSubstructure("[#8]=,:[#7]-,:c:c-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 650;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#7]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 651;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 652;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 653;
if (cs.countSubstructure("[#8]-,:[#6]:[#6]:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 654;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#7]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 655;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 656;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#7]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 657;
if (cs.countSubstructure("[#6]-,:[#7]-,:[#6]:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 658;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#16]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 659;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#7]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 660;
if (cs.countSubstructure("[#6]-,:[#6]=,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 661;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#8]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 662;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 663;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 664;
if (cs.countSubstructure("[#6]-,:[#6]=,:[#6]-,:[#6]=,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 665;
if (cs.countSubstructure("[#7]-,:[#6]:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 666;
if (cs.countSubstructure("[#6]=,:[#6]-,:[#6]-,:[#8]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 667;
if (cs.countSubstructure("[#6]=,:[#6]-,:[#6]-,:[#8]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 668;
if (cs.countSubstructure("[#6]-,:[#6]:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 669;
if (cs.countSubstructure("[Cl]-,:[#6]:[#6]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 670;
if (cs.countSubstructure("[Br]-,:[#6]:c:c-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 671;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]=,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 672;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]=,:[#6]-,:[#1]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 673;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]=,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 674;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#7]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 675;
if (cs.countSubstructure("[Br]-,:[#6]-,:[#6]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 676;
if (cs.countSubstructure("[#7]#[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 677;
if (cs.countSubstructure("[#6]-,:[#6]=,:[#6]-,:[#6]:c") > 0) fp[b >> 3] |= MASK[b % 8];
b = 678;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]=,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 679;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 680;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 681;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 682;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 683;
if (cs.countSubstructure("[#7]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 684;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 685;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 686;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 687;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 688;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 689;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 690;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 691;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 692;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 693;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 694;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]=,:[#8]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 695;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#7]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 696;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 697;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6](-,:[#6])-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 698;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 699;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6](-,:[#6])-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 700;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#8]-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 701;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6](-,:[#8])-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 702;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#7]-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 703;
if (cs.countSubstructure("[#8]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6](-,:[#7])-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 704;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 705;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6](-,:[#8])-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 706;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6](=,:[#8])-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 707;
if (cs.countSubstructure("[#8]=,:[#6]-,:[#6]-,:[#6]-,:[#6]-,:[#6](-,:[#7])-,:[#6]") > 0)
fp[b >> 3] |= MASK[b % 8];
b = 708;
if (cs.countSubstructure("[#6]-,:[#6](-,:[#6])-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 709;
if (cs.countSubstructure("[#6]-,:[#6](-,:[#6])-,:[#6]-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 710;
if (cs.countSubstructure("[#6]-,:[#6]-,:[#6](-,:[#6])-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 711;
if (cs.countSubstructure("[#6]-,:[#6](-,:[#6])(-,:[#6])-,:[#6]-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
b = 712;
if (cs.countSubstructure("[#6]-,:[#6](-,:[#6])-,:[#6](-,:[#6])-,:[#6]") > 0) fp[b >> 3] |= MASK[b % 8];
/*
Section 7: Complex SMARTS patterns - These bits test for the presence
of complex SMARTS patterns, regardless of count, but where
bond orders and bond aromaticity are specific.
*/
b = 713;
if (cs.countSubstructure("[#6]c1ccc([#6])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 714;
if (cs.countSubstructure("[#6]c1ccc([#8])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 715;
if (cs.countSubstructure("[#6]c1ccc([#16])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 716;
if (cs.countSubstructure("[#6]c1ccc([#7])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 717;
if (cs.countSubstructure("[#6]c1ccc(Cl)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 718;
if (cs.countSubstructure("[#6]c1ccc(Br)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 719;
if (cs.countSubstructure("[#8]c1ccc([#8])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 720;
if (cs.countSubstructure("[#8]c1ccc([#16])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 721;
if (cs.countSubstructure("[#8]c1ccc([#7])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 722;
if (cs.countSubstructure("[#8]c1ccc(Cl)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 723;
if (cs.countSubstructure("[#8]c1ccc(Br)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 724;
if (cs.countSubstructure("[#16]c1ccc([#16])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 725;
if (cs.countSubstructure("[#16]c1ccc([#7])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 726;
if (cs.countSubstructure("[#16]c1ccc(Cl)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 727;
if (cs.countSubstructure("[#16]c1ccc(Br)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 728;
if (cs.countSubstructure("[#7]c1ccc([#7])cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 729;
if (cs.countSubstructure("[#7]c1ccc(Cl)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 730;
if (cs.countSubstructure("[#7]c1ccc(Br)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 731;
if (cs.countSubstructure("Clc1ccc(Cl)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 732;
if (cs.countSubstructure("Clc1ccc(Br)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 733;
if (cs.countSubstructure("Brc1ccc(Br)cc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 734;
if (cs.countSubstructure("[#6]c1cc([#6])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 735;
if (cs.countSubstructure("[#6]c1cc([#8])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 736;
if (cs.countSubstructure("[#6]c1cc([#16])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 737;
if (cs.countSubstructure("[#6]c1cc([#7])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 738;
if (cs.countSubstructure("[#6]c1cc(Cl)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 739;
if (cs.countSubstructure("[#6]c1cc(Br)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 740;
if (cs.countSubstructure("[#8]c1cc([#8])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 741;
if (cs.countSubstructure("[#8]c1cc([#16])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 742;
if (cs.countSubstructure("[#8]c1cc([#7])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 743;
if (cs.countSubstructure("[#8]c1cc(Cl)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 744;
if (cs.countSubstructure("[#8]c1cc(Br)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 745;
if (cs.countSubstructure("[#16]c1cc([#16])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 746;
if (cs.countSubstructure("[#16]c1cc([#7])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 747;
if (cs.countSubstructure("[#16]c1cc(Cl)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 748;
if (cs.countSubstructure("[#16]c1cc(Br)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 749;
if (cs.countSubstructure("[#7]c1cc([#7])ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 750;
if (cs.countSubstructure("[#7]c1cc(Cl)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 751;
if (cs.countSubstructure("[#7]c1cc(Br)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 752;
if (cs.countSubstructure("Clc1cc(Cl)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 753;
if (cs.countSubstructure("Clc1cc(Br)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 754;
if (cs.countSubstructure("Brc1cc(Br)ccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 755;
if (cs.countSubstructure("[#6]c1c([#6])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 756;
if (cs.countSubstructure("[#6]c1c([#8])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 757;
if (cs.countSubstructure("[#6]c1c([#16])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 758;
if (cs.countSubstructure("[#6]c1c([#7])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 759;
if (cs.countSubstructure("[#6]c1c(Cl)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 760;
if (cs.countSubstructure("[#6]c1c(Br)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 761;
if (cs.countSubstructure("[#8]c1c([#8])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 762;
if (cs.countSubstructure("[#8]c1c([#16])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 763;
if (cs.countSubstructure("[#8]c1c([#7])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 764;
if (cs.countSubstructure("[#8]c1c(Cl)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 765;
if (cs.countSubstructure("[#8]c1c(Br)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 766;
if (cs.countSubstructure("[#16]c1c([#16])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 767;
if (cs.countSubstructure("[#16]c1c([#7])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 768;
if (cs.countSubstructure("[#16]c1c(Cl)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 769;
if (cs.countSubstructure("[#16]c1c(Br)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 770;
if (cs.countSubstructure("[#7]c1c([#7])cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 771;
if (cs.countSubstructure("[#7]c1c(Cl)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 772;
if (cs.countSubstructure("[#7]c1c(Br)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 773;
if (cs.countSubstructure("Clc1c(Cl)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 774;
if (cs.countSubstructure("Clc1c(Br)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 775;
if (cs.countSubstructure("Brc1c(Br)cccc1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 776;
if (cs.countSubstructure("[#6][#6]1[#6][#6][#6]([#6])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 777;
if (cs.countSubstructure("[#6][#6]1[#6][#6][#6]([#8])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 778;
if (cs.countSubstructure("[#6][#6]1[#6][#6][#6]([#16])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 779;
if (cs.countSubstructure("[#6][#6]1[#6][#6][#6]([#7])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 780;
if (cs.countSubstructure("[#6][#6]1[#6][#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 781;
if (cs.countSubstructure("[#6][#6]1[#6][#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 782;
if (cs.countSubstructure("[#8][#6]1[#6][#6][#6]([#8])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 783;
if (cs.countSubstructure("[#8][#6]1[#6][#6][#6]([#16])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 784;
if (cs.countSubstructure("[#8][#6]1[#6][#6][#6]([#7])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 785;
if (cs.countSubstructure("[#8][#6]1[#6][#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 786;
if (cs.countSubstructure("[#8][#6]1[#6][#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 787;
if (cs.countSubstructure("[#16][#6]1[#6][#6][#6]([#16])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 788;
if (cs.countSubstructure("[#16][#6]1[#6][#6][#6]([#7])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 789;
if (cs.countSubstructure("[#16][#6]1[#6][#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 790;
if (cs.countSubstructure("[#16][#6]1[#6][#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 791;
if (cs.countSubstructure("[#7][#6]1[#6][#6][#6]([#7])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 792;
if (cs.countSubstructure("[#7][#6]1[#6][#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 793;
if (cs.countSubstructure("[#7][#6]1[#6][#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 794;
if (cs.countSubstructure("Cl[#6]1[#6][#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 795;
if (cs.countSubstructure("Cl[#6]1[#6][#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 796;
if (cs.countSubstructure("Br[#6]1[#6][#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 797;
if (cs.countSubstructure("[#6][#6]1[#6][#6]([#6])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 798;
if (cs.countSubstructure("[#6][#6]1[#6][#6]([#8])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 799;
if (cs.countSubstructure("[#6][#6]1[#6][#6]([#16])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 800;
if (cs.countSubstructure("[#6][#6]1[#6][#6]([#7])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 801;
if (cs.countSubstructure("[#6][#6]1[#6][#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 802;
if (cs.countSubstructure("[#6][#6]1[#6][#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 803;
if (cs.countSubstructure("[#8][#6]1[#6][#6]([#8])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 804;
if (cs.countSubstructure("[#8][#6]1[#6][#6]([#16])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 805;
if (cs.countSubstructure("[#8][#6]1[#6][#6]([#7])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 806;
if (cs.countSubstructure("[#8][#6]1[#6][#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 807;
if (cs.countSubstructure("[#8][#6]1[#6][#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 808;
if (cs.countSubstructure("[#16][#6]1[#6][#6]([#16])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 809;
if (cs.countSubstructure("[#16][#6]1[#6][#6]([#7])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 810;
if (cs.countSubstructure("[#16][#6]1[#6][#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 811;
if (cs.countSubstructure("[#16][#6]1[#6][#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 812;
if (cs.countSubstructure("[#7][#6]1[#6][#6]([#7])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 813;
if (cs.countSubstructure("[#7][#6]1[#6][#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 814;
if (cs.countSubstructure("[#7][#6]1[#6][#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 815;
if (cs.countSubstructure("Cl[#6]1[#6][#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 816;
if (cs.countSubstructure("Cl[#6]1[#6][#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 817;
if (cs.countSubstructure("Br[#6]1[#6][#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 818;
if (cs.countSubstructure("[#6][#6]1[#6]([#6])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 819;
if (cs.countSubstructure("[#6][#6]1[#6]([#8])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 820;
if (cs.countSubstructure("[#6][#6]1[#6]([#16])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 821;
if (cs.countSubstructure("[#6][#6]1[#6]([#7])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 822;
if (cs.countSubstructure("[#6][#6]1[#6](Cl)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 823;
if (cs.countSubstructure("[#6][#6]1[#6](Br)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 824;
if (cs.countSubstructure("[#8][#6]1[#6]([#8])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 825;
if (cs.countSubstructure("[#8][#6]1[#6]([#16])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 826;
if (cs.countSubstructure("[#8][#6]1[#6]([#7])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 827;
if (cs.countSubstructure("[#8][#6]1[#6](Cl)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 828;
if (cs.countSubstructure("[#8][#6]1[#6](Br)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 829;
if (cs.countSubstructure("[#16][#6]1[#6]([#16])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 830;
if (cs.countSubstructure("[#16][#6]1[#6]([#7])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 831;
if (cs.countSubstructure("[#16][#6]1[#6](Cl)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 832;
if (cs.countSubstructure("[#16][#6]1[#6](Br)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 833;
if (cs.countSubstructure("[#7][#6]1[#6]([#7])[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 834;
if (cs.countSubstructure("[#7][#6]1[#6](Cl)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 835;
if (cs.countSubstructure("[#7][#6]1[#6](Br)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 836;
if (cs.countSubstructure("Cl[#6]1[#6](Cl)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 837;
if (cs.countSubstructure("Cl[#6]1[#6](Br)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 838;
if (cs.countSubstructure("Br[#6]1[#6](Br)[#6][#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 839;
if (cs.countSubstructure("[#6][#6]1[#6][#6]([#6])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 840;
if (cs.countSubstructure("[#6][#6]1[#6][#6]([#8])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 841;
if (cs.countSubstructure("[#6][#6]1[#6][#6]([#16])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 842;
if (cs.countSubstructure("[#6][#6]1[#6][#6]([#7])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 843;
if (cs.countSubstructure("[#6][#6]1[#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 844;
if (cs.countSubstructure("[#6][#6]1[#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 845;
if (cs.countSubstructure("[#8][#6]1[#6][#6]([#8])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 846;
if (cs.countSubstructure("[#8][#6]1[#6][#6]([#16])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 847;
if (cs.countSubstructure("[#8][#6]1[#6][#6]([#7])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 848;
if (cs.countSubstructure("[#8][#6]1[#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 849;
if (cs.countSubstructure("[#8][#6]1[#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 850;
if (cs.countSubstructure("[#16][#6]1[#6][#6]([#16])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 851;
if (cs.countSubstructure("[#16][#6]1[#6][#6]([#7])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 852;
if (cs.countSubstructure("[#16][#6]1[#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 853;
if (cs.countSubstructure("[#16][#6]1[#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 854;
if (cs.countSubstructure("[#7][#6]1[#6][#6]([#7])[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 855;
if (cs.countSubstructure("[#7][#6]1[#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 856;
if (cs.countSubstructure("[#7][#6]1[#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 857;
if (cs.countSubstructure("Cl[#6]1[#6][#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 858;
if (cs.countSubstructure("Cl[#6]1[#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 859;
if (cs.countSubstructure("Br[#6]1[#6][#6](Br)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 860;
if (cs.countSubstructure("[#6][#6]1[#6]([#6])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 861;
if (cs.countSubstructure("[#6][#6]1[#6]([#8])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 862;
if (cs.countSubstructure("[#6][#6]1[#6]([#16])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 863;
if (cs.countSubstructure("[#6][#6]1[#6]([#7])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 864;
if (cs.countSubstructure("[#6][#6]1[#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 865;
if (cs.countSubstructure("[#6][#6]1[#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 866;
if (cs.countSubstructure("[#8][#6]1[#6]([#8])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 867;
if (cs.countSubstructure("[#8][#6]1[#6]([#16])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 868;
if (cs.countSubstructure("[#8][#6]1[#6]([#7])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 869;
if (cs.countSubstructure("[#8][#6]1[#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 870;
if (cs.countSubstructure("[#8][#6]1[#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 871;
if (cs.countSubstructure("[#16][#6]1[#6]([#16])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 872;
if (cs.countSubstructure("[#16][#6]1[#6]([#7])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 873;
if (cs.countSubstructure("[#16][#6]1[#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 874;
if (cs.countSubstructure("[#16][#6]1[#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 875;
if (cs.countSubstructure("[#7][#6]1[#6]([#7])[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 876;
if (cs.countSubstructure("[#7][#6]1[#6](Cl)[#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 877;
if (cs.countSubstructure("[#7][#6]1[#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 878;
if (cs.countSubstructure("Cl[#6]1[#6](Cl)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 879;
if (cs.countSubstructure("Cl[#6]1[#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
b = 880;
if (cs.countSubstructure("Br[#6]1[#6](Br)[#6][#6][#6]1") > 0) fp[b >> 3] |= MASK[b % 8];
}
}