int Element::calcValenceOfAromaticAtom()

in core/indigo-core/molecule/src/elements.cpp [271:455]


int Element::calcValenceOfAromaticAtom(int elem, int charge, int n_arom, int min_conn)
{
    if (elem == ELEM_C)
        return 4;
    if (elem == ELEM_N)
        return (charge == 1 ? 4 : 3);
    if (elem == ELEM_O)
        return (charge >= 1 ? 3 : 2);
    if (elem == ELEM_S && charge == 0)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 2) // no external bonds
                // There are no cases of implicit hydrogens in that condition
                // (PubChem search [sHD2] gives no hits)
                return 2;      // ergo, valence is 2
            if (min_conn == 3) // one single external bond
                // there can be a radical (see CID 11972190),
                // or an implicit hydrogen (see CID 20611310)
                return 4;      // either way, the valence is 4
            if (min_conn == 4) // two single or one double external bond
                // PubChem has no examples of 6-valent aromatic sulphur
                // (searching [sv6] gives no hits)
                return 4; // ergo, valence is 4
            if (min_conn > 4)
                // OK, suppose we have an case of 6-valent aromatic sulphur here
                return 6;
        }
        else if (n_arom == 3)
        {
            if (min_conn <= 4) // no external bonds or one single external bond
                // For one external bond, see CID 10091381
                // For no external bonds, see CID 20756501, although aromaticity
                // there is questionable. Anyway, no hydrogens are possible.
                return 4;
            else
                // 6-valent aromatic sulphur?
                return 6;
        }
        else if (n_arom == 4)
        {
            if (min_conn == 4)
                // Happened only on CID 10882272 and CID 24829837
                return 4; // Valence = 4 in both structures
            else
                // 6-valent aromatic sulphur?
                return 6;
        }
    }
    else if (elem == ELEM_S && charge == 1)
    {
        if (n_arom == 2)
        {
            if (min_conn == 2) // common case: "=[S+]-" in an aromatic ring
                return 3;
            if (min_conn <= 4) // CID 9922592
                return 5;
        }
    }
    else if (elem == ELEM_P && charge == 0)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 2) // no external bonds
                // implicit hydrogen (CID 164575) or radical (CID 10568539) is present
                return 3;      // in any case, the valence is 3
            if (min_conn == 3) // one single external bond
                return 3;
            if (min_conn == 4) // two single on one double external bond
                // two single: CID 140786, CID 341499
                // one double: CID 17776485, CID 20207916
                return 5; // valence is 5 in any case
        }
        if (n_arom == 3) // three aromatic bonds
        {
            if (min_conn == 3) // no external bonds
                return 3;      // CID 15973306; no known examples with valence 5
            if (min_conn == 5) // two single or one double external bond
                return 5;      // the only known example is CID 10887416
        }
        if (n_arom == 4) // four aromatic bonds?
        {
            if (min_conn == 4) // no external bonds
                return 5;      // the only known example is CID 10887416,
                               // yet the aromaticity of the smaller ring is questionable
        }
    }
    else if (elem == ELEM_P && charge == 1)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 3) // one single external bond
                return 4;      // common case: "=[P+]([*])-" in an aromatic ring
        }
    }
    else if (elem == ELEM_P && charge == -1)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 2) // no external bonds
                return 2;      // CID 10932222
        }
    }
    else if (elem == ELEM_Se && charge == 0)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 2) // no external bonds
                return 2;      // common case
            if (min_conn == 3) // one external bond
                return 4;      // CID 10262587
            if (min_conn == 4)
                // CID 21204858, two single external bonds
                // CID 14984497, one double aromatic bond
                return 4;
        }
    }
    else if (elem == ELEM_Se && charge == 1)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 2) // no external bonds
                return 3;      // CID 10872228
            if (min_conn == 3) // one external bond
                return 3;      // CID 11115581
        }
    }
    else if (elem == ELEM_As && charge == 0)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 2) // no external bonds
                return 3;      // CID 136132
            if (min_conn == 3) // one external bond
                return 3;      // CID 237687
                               // no other cases known from PubChem
        }
    }
    else if (elem == ELEM_Te && charge == 0)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 2) // no external bonds
                return 3;      // CID 136053
            if (min_conn == 4)
                // CID 3088544, two single external bonds
                // CID 11457076, one double external bonds
                return 4;
        }
        else if (n_arom == 4)
        {
            if (min_conn == 4)
                // CID 11070061, four aromatic external bonds
                return 4;
        }
        // no other cases known from PubChem
    }
    else if (elem == ELEM_Te && charge == 1)
    {
        if (n_arom == 2) // two aromatic bonds
        {
            if (min_conn == 3) // one external bond
                return 3;      // CID 20802344
        }
        // no other cases known from PubChem
    }
    else if (elem == ELEM_B)
    {
        if (n_arom == 2)
        {
            if (min_conn == 3) // one external bond
                return 3;      // CID 574072
        }
    }
    else if (elem == ELEM_Si)
    {
        if (n_arom == 2)
        {
            if (min_conn == 3) // one external bond
                return 4;      // CID 18943170
        }
    }

    return -1;
}