Exemple #1
0
 'MaxPartialCharge': (lambda x: des.MaxPartialCharge(x)),
 'MinPartialCharge': (lambda x: des.MinPartialCharge(x)),
 'MaxAbsPartialCharge': (lambda x: des.MaxAbsPartialCharge(x)),
 'MinAbsPartialCharge': (lambda x: des.MinAbsPartialCharge(x)),
 'FpDensityMorgan1': (lambda x: des.FpDensityMorgan1(x)),
 'FpDensityMorgan2': (lambda x: des.FpDensityMorgan2(x)),
 'FpDensityMorgan3': (lambda x: des.FpDensityMorgan3(x)),
 'BalabanJ': (lambda x: des.BalabanJ(x)),
 'BertzCT': (lambda x: des.BertzCT(x)),
 'Chi0': (lambda x: des.Chi0(x)),
 'Chi0n': (lambda x: des.Chi0n(x)),
 'Chi0v': (lambda x: des.Chi0v(x)),
 'Chi1': (lambda x: des.Chi1(x)),
 'Chi1n': (lambda x: des.Chi1n(x)),
 'Chi1v': (lambda x: des.Chi1v(x)),
 'Chi2n': (lambda x: des.Chi2n(x)),
 'Chi2v': (lambda x: des.Chi2v(x)),
 'Chi3n': (lambda x: des.Chi3n(x)),
 'Chi3v': (lambda x: des.Chi3v(x)),
 'Chi4n': (lambda x: des.Chi4n(x)),
 'Chi4v': (lambda x: des.Chi4v(x)),
 'HallKierAlpha': (lambda x: des.HallKierAlpha(x)),
 'Ipc': (lambda x: des.Ipc(x)),
 'Kappa1': (lambda x: des.Kappa1(x)),
 'Kappa2': (lambda x: des.Kappa2(x)),
 'Kappa3': (lambda x: des.Kappa3(x)),
 'LabuteASA': (lambda x: des.LabuteASA(x)),
 'TPSA': (lambda x: des.TPSA(x)),
 'PEOE_VSA1': (lambda x: des.PEOE_VSA1(x)),
 'PEOE_VSA10': (lambda x: des.PEOE_VSA10(x)),
 'PEOE_VSA11': (lambda x: des.PEOE_VSA11(x)),
def compute_descriptors(mol, id_string):
    """
		compute rdkit descriptors
    """
    descriptors = [id_string]

    # Property descriptor
    descriptors.append(Descriptors.MolWt(mol))
    descriptors.append(Descriptors.HeavyAtomMolWt(mol))
    descriptors.append(Descriptors.MolLogP(mol))
    descriptors.append(Descriptors.MolMR(mol))
    descriptors.append(Descriptors.TPSA(mol))
    # Constitutional descriptor
    descriptors.append(Descriptors.FractionCSP3(mol))
    # Atom
    descriptors.append(Descriptors.HeavyAtomCount(mol))
    descriptors.append(Descriptors.NHOHCount(mol))
    descriptors.append(Descriptors.NOCount(mol))
    descriptors.append(Descriptors.NumHAcceptors(mol))
    descriptors.append(Descriptors.NumHDonors(mol))
    descriptors.append(Descriptors.NumHeteroatoms(mol))
    #descriptors.append(Descriptors.NumBridgeheadAtoms(mol))
    #descriptors.append(Descriptors.NumSpiroAtoms(mol))
    # Bond
    descriptors.append(Descriptors.NumRotatableBonds(mol))
    # Electronic
    descriptors.append(Descriptors.NumRadicalElectrons(mol))
    descriptors.append(Descriptors.NumValenceElectrons(mol))
    descriptors.append(Descriptors.MaxPartialCharge(mol))
    descriptors.append(Descriptors.MinPartialCharge(mol))
    descriptors.append(Descriptors.MaxAbsPartialCharge(mol))
    descriptors.append(Descriptors.MinAbsPartialCharge(mol))
    # Ring
    #descriptors.append(Descriptors.NumRings(mol))
    descriptors.append(Descriptors.NumAromaticRings(mol))
    descriptors.append(Descriptors.NumSaturatedRings(mol))
    descriptors.append(Descriptors.NumAliphaticRings(mol))
    #descriptors.append(Descriptors.NumCarbocycles(mol))
    descriptors.append(Descriptors.NumAromaticCarbocycles(mol))
    descriptors.append(Descriptors.NumSaturatedCarbocycles(mol))
    descriptors.append(Descriptors.NumAliphaticCarbocycles(mol))
    #descriptors.append(Descriptors.NumHeterocycles(mol))
    descriptors.append(Descriptors.NumAromaticHeterocycles(mol))
    descriptors.append(Descriptors.NumSaturatedHeterocycles(mol))
    descriptors.append(Descriptors.NumAliphaticHeterocycles(mol))
    # Functional Groups
    descriptors.append(Descriptors.fr_Al_COO(mol))
    descriptors.append(Descriptors.fr_Al_OH(mol))
    descriptors.append(Descriptors.fr_Al_OH_noTert(mol))
    descriptors.append(Descriptors.fr_ArN(mol))
    descriptors.append(Descriptors.fr_Ar_COO(mol))
    descriptors.append(Descriptors.fr_Ar_N(mol))
    descriptors.append(Descriptors.fr_Ar_NH(mol))
    descriptors.append(Descriptors.fr_Ar_OH(mol))
    descriptors.append(Descriptors.fr_COO(mol))
    descriptors.append(Descriptors.fr_COO2(mol))
    descriptors.append(Descriptors.fr_C_O(mol))
    descriptors.append(Descriptors.fr_C_O_noCOO(mol))
    descriptors.append(Descriptors.fr_C_S(mol))
    descriptors.append(Descriptors.fr_HOCCN(mol))
    descriptors.append(Descriptors.fr_Imine(mol))
    descriptors.append(Descriptors.fr_NH0(mol))
    descriptors.append(Descriptors.fr_NH1(mol))
    descriptors.append(Descriptors.fr_NH2(mol))
    descriptors.append(Descriptors.fr_N_O(mol))
    descriptors.append(Descriptors.fr_Ndealkylation1(mol))
    descriptors.append(Descriptors.fr_Ndealkylation2(mol))
    descriptors.append(Descriptors.fr_Nhpyrrole(mol))
    descriptors.append(Descriptors.fr_SH(mol))
    descriptors.append(Descriptors.fr_aldehyde(mol))
    descriptors.append(Descriptors.fr_alkyl_carbamate(mol))
    descriptors.append(Descriptors.fr_alkyl_halide(mol))
    descriptors.append(Descriptors.fr_allylic_oxid(mol))
    descriptors.append(Descriptors.fr_amide(mol))
    descriptors.append(Descriptors.fr_amidine(mol))
    descriptors.append(Descriptors.fr_aniline(mol))
    descriptors.append(Descriptors.fr_aryl_methyl(mol))
    descriptors.append(Descriptors.fr_azide(mol))
    descriptors.append(Descriptors.fr_azo(mol))
    descriptors.append(Descriptors.fr_barbitur(mol))
    descriptors.append(Descriptors.fr_benzene(mol))
    descriptors.append(Descriptors.fr_benzodiazepine(mol))
    descriptors.append(Descriptors.fr_bicyclic(mol))
    descriptors.append(Descriptors.fr_diazo(mol))
    descriptors.append(Descriptors.fr_dihydropyridine(mol))
    descriptors.append(Descriptors.fr_epoxide(mol))
    descriptors.append(Descriptors.fr_ester(mol))
    descriptors.append(Descriptors.fr_ether(mol))
    descriptors.append(Descriptors.fr_furan(mol))
    descriptors.append(Descriptors.fr_guanido(mol))
    descriptors.append(Descriptors.fr_halogen(mol))
    descriptors.append(Descriptors.fr_hdrzine(mol))
    descriptors.append(Descriptors.fr_hdrzone(mol))
    descriptors.append(Descriptors.fr_imidazole(mol))
    descriptors.append(Descriptors.fr_imide(mol))
    descriptors.append(Descriptors.fr_isocyan(mol))
    descriptors.append(Descriptors.fr_isothiocyan(mol))
    descriptors.append(Descriptors.fr_ketone(mol))
    descriptors.append(Descriptors.fr_ketone_Topliss(mol))
    descriptors.append(Descriptors.fr_lactam(mol))
    descriptors.append(Descriptors.fr_lactone(mol))
    descriptors.append(Descriptors.fr_methoxy(mol))
    descriptors.append(Descriptors.fr_morpholine(mol))
    descriptors.append(Descriptors.fr_nitrile(mol))
    descriptors.append(Descriptors.fr_nitro(mol))
    descriptors.append(Descriptors.fr_nitro_arom(mol))
    descriptors.append(Descriptors.fr_nitro_arom_nonortho(mol))
    descriptors.append(Descriptors.fr_nitroso(mol))
    descriptors.append(Descriptors.fr_oxazole(mol))
    descriptors.append(Descriptors.fr_oxime(mol))
    descriptors.append(Descriptors.fr_para_hydroxylation(mol))
    descriptors.append(Descriptors.fr_phenol(mol))
    descriptors.append(Descriptors.fr_phenol_noOrthoHbond(mol))
    descriptors.append(Descriptors.fr_phos_acid(mol))
    descriptors.append(Descriptors.fr_phos_ester(mol))
    descriptors.append(Descriptors.fr_piperdine(mol))
    descriptors.append(Descriptors.fr_piperzine(mol))
    descriptors.append(Descriptors.fr_priamide(mol))
    descriptors.append(Descriptors.fr_prisulfonamd(mol))
    descriptors.append(Descriptors.fr_pyridine(mol))
    descriptors.append(Descriptors.fr_quatN(mol))
    descriptors.append(Descriptors.fr_sulfide(mol))
    descriptors.append(Descriptors.fr_sulfonamd(mol))
    descriptors.append(Descriptors.fr_sulfone(mol))
    descriptors.append(Descriptors.fr_term_acetylene(mol))
    descriptors.append(Descriptors.fr_tetrazole(mol))
    descriptors.append(Descriptors.fr_thiazole(mol))
    descriptors.append(Descriptors.fr_thiocyan(mol))
    descriptors.append(Descriptors.fr_thiophene(mol))
    descriptors.append(Descriptors.fr_unbrch_alkane(mol))
    descriptors.append(Descriptors.fr_urea(mol))
    # MOE-type descriptors
    descriptors.append(Descriptors.LabuteASA(mol))
    descriptors.append(Descriptors.PEOE_VSA1(mol))
    descriptors.append(Descriptors.PEOE_VSA2(mol))
    descriptors.append(Descriptors.PEOE_VSA3(mol))
    descriptors.append(Descriptors.PEOE_VSA4(mol))
    descriptors.append(Descriptors.PEOE_VSA5(mol))
    descriptors.append(Descriptors.PEOE_VSA6(mol))
    descriptors.append(Descriptors.PEOE_VSA7(mol))
    descriptors.append(Descriptors.PEOE_VSA8(mol))
    descriptors.append(Descriptors.PEOE_VSA9(mol))
    descriptors.append(Descriptors.PEOE_VSA10(mol))
    descriptors.append(Descriptors.PEOE_VSA11(mol))
    descriptors.append(Descriptors.PEOE_VSA12(mol))
    descriptors.append(Descriptors.PEOE_VSA13(mol))
    descriptors.append(Descriptors.PEOE_VSA14(mol))
    descriptors.append(Descriptors.SMR_VSA1(mol))
    descriptors.append(Descriptors.SMR_VSA2(mol))
    descriptors.append(Descriptors.SMR_VSA3(mol))
    descriptors.append(Descriptors.SMR_VSA4(mol))
    descriptors.append(Descriptors.SMR_VSA5(mol))
    descriptors.append(Descriptors.SMR_VSA6(mol))
    descriptors.append(Descriptors.SMR_VSA7(mol))
    descriptors.append(Descriptors.SMR_VSA8(mol))
    descriptors.append(Descriptors.SMR_VSA9(mol))
    descriptors.append(Descriptors.SMR_VSA10(mol))
    descriptors.append(Descriptors.SlogP_VSA1(mol))
    descriptors.append(Descriptors.SlogP_VSA2(mol))
    descriptors.append(Descriptors.SlogP_VSA3(mol))
    descriptors.append(Descriptors.SlogP_VSA4(mol))
    descriptors.append(Descriptors.SlogP_VSA5(mol))
    descriptors.append(Descriptors.SlogP_VSA6(mol))
    descriptors.append(Descriptors.SlogP_VSA7(mol))
    descriptors.append(Descriptors.SlogP_VSA8(mol))
    descriptors.append(Descriptors.SlogP_VSA9(mol))
    descriptors.append(Descriptors.SlogP_VSA10(mol))
    descriptors.append(Descriptors.SlogP_VSA11(mol))
    descriptors.append(Descriptors.SlogP_VSA12(mol))
    descriptors.append(Descriptors.EState_VSA1(mol))
    descriptors.append(Descriptors.EState_VSA2(mol))
    descriptors.append(Descriptors.EState_VSA3(mol))
    descriptors.append(Descriptors.EState_VSA4(mol))
    descriptors.append(Descriptors.EState_VSA5(mol))
    descriptors.append(Descriptors.EState_VSA6(mol))
    descriptors.append(Descriptors.EState_VSA7(mol))
    descriptors.append(Descriptors.EState_VSA8(mol))
    descriptors.append(Descriptors.EState_VSA9(mol))
    descriptors.append(Descriptors.EState_VSA10(mol))
    descriptors.append(Descriptors.EState_VSA11(mol))
    descriptors.append(Descriptors.VSA_EState1(mol))
    descriptors.append(Descriptors.VSA_EState2(mol))
    descriptors.append(Descriptors.VSA_EState3(mol))
    descriptors.append(Descriptors.VSA_EState4(mol))
    descriptors.append(Descriptors.VSA_EState5(mol))
    descriptors.append(Descriptors.VSA_EState6(mol))
    descriptors.append(Descriptors.VSA_EState7(mol))
    descriptors.append(Descriptors.VSA_EState8(mol))
    descriptors.append(Descriptors.VSA_EState9(mol))
    descriptors.append(Descriptors.VSA_EState10(mol))
    # Topological descriptors
    descriptors.append(Descriptors.BalabanJ(mol))
    descriptors.append(Descriptors.BertzCT(mol))
    descriptors.append(Descriptors.HallKierAlpha(mol))
    descriptors.append(Descriptors.Ipc(mol))
    descriptors.append(Descriptors.Kappa1(mol))
    descriptors.append(Descriptors.Kappa2(mol))
    descriptors.append(Descriptors.Kappa3(mol))
    # Connectivity descriptors
    descriptors.append(Descriptors.Chi0(mol))
    descriptors.append(Descriptors.Chi1(mol))
    descriptors.append(Descriptors.Chi0n(mol))
    descriptors.append(Descriptors.Chi1n(mol))
    descriptors.append(Descriptors.Chi2n(mol))
    descriptors.append(Descriptors.Chi3n(mol))
    descriptors.append(Descriptors.Chi4n(mol))
    descriptors.append(Descriptors.Chi0v(mol))
    descriptors.append(Descriptors.Chi1v(mol))
    descriptors.append(Descriptors.Chi2v(mol))
    descriptors.append(Descriptors.Chi3v(mol))
    descriptors.append(Descriptors.Chi4v(mol))
    # Other properties
    descriptors.append(Descriptors.qed(mol))
    # Morgan FP
    rad = 3
    nBits = 1024
    descriptors.extend(genFP(mol, rad, nBits))

    return (descriptors)
def rdkit_descriptors(smiles,
                      ndigits=6,
                      include_pc=True,
                      include_moe=False,
                      include_h_bond=False,
                      ch3_smiles=None,
                      barcode_seed=None,
                      vary_descriptors=None,
                      vary_significant=None):
    """
    Parameters
    ----------
    include_pc : bool, optional, default=True
        Include partial charge descriptors (as defined in
        https://www.chemcomp.com/journal/descr.htm). These are calculated
        using Gasteiger charge assignments and VSA descriptors
        obtained from RDKit.
    """
    mol = Chem.AddHs(Chem.MolFromSmiles(smiles))
    Chem.EmbedMolecule(mol, Chem.ETKDG())

    descriptors = {}

    # Molecular weight
    descriptors['molwt'] = round(Descriptors.ExactMolWt(mol), ndigits)

    # Molecular weight (excluding H's)
    descriptors['molwt-hvy'] = round(Descriptors.HeavyAtomMolWt(mol), ndigits)

    # Number of valence electrons
    descriptors['e-valence'] = Descriptors.NumValenceElectrons(mol)

    # Balaban J value
    descriptors['balabanj'] = round(Descriptors.BalabanJ(mol), ndigits)

    # BertzCT
    descriptors['bertzct'] = round(Descriptors.BertzCT(mol), ndigits)

    # Ipc
    descriptors['ipc'] = round(Descriptors.Ipc(mol), ndigits)

    # Hall-Kier alpha
    descriptors['hk-alpha'] = Descriptors.HallKierAlpha(mol)

    # Hall-Kier kappas
    descriptors['hk-kappa1'] = round(Descriptors.Kappa1(mol), ndigits)
    descriptors['hk-kappa2'] = round(Descriptors.Kappa2(mol), ndigits)
    descriptors['hk-kappa3'] = round(Descriptors.Kappa3(mol), ndigits)

    # Chi values from Rev. Comput. Chem. 2:367-422 (1991)
    descriptors['chi0'] = round(Descriptors.Chi0(mol), ndigits)
    descriptors['chi1'] = round(Descriptors.Chi1(mol), ndigits)
    descriptors['chi0n'] = round(Descriptors.Chi0n(mol), ndigits)
    descriptors['chi1n'] = round(Descriptors.Chi1n(mol), ndigits)
    descriptors['chi2n'] = round(Descriptors.Chi2n(mol), ndigits)
    descriptors['chi3n'] = round(Descriptors.Chi3n(mol), ndigits)
    descriptors['chi4n'] = round(Descriptors.Chi4n(mol), ndigits)
    descriptors['chi0v'] = round(Descriptors.Chi0v(mol), ndigits)
    descriptors['chi1v'] = round(Descriptors.Chi1v(mol), ndigits)
    descriptors['chi2v'] = round(Descriptors.Chi2v(mol), ndigits)
    descriptors['chi3v'] = round(Descriptors.Chi3v(mol), ndigits)
    descriptors['chi4v'] = round(Descriptors.Chi4v(mol), ndigits)

    # Wildman-Crippen LogP value
    descriptors['logP'] = round(Descriptors.MolLogP(mol), ndigits)

    # Wildman-Crippen MR value
    descriptors['MR'] = round(Descriptors.MolMR(mol), ndigits)

    # Number of rotateable bonds
    descriptors['rbonds'] = Descriptors.NumRotatableBonds(mol)

    # Number of heavy atoms
    descriptors['nheavy'] = Descriptors.HeavyAtomCount(mol)

    # TPSA, J. Med. Chem. 43:3714-7, (2000)
    descriptors['tpsa'] = round(Descriptors.TPSA(mol), ndigits)

    # Labute's Approximate Surface Area, J. Mol. Graph. Mod. 18:464-77 (2000)
    descriptors['labuteASA'] = round(Descriptors.LabuteASA(mol), ndigits)

    # MOE-type descriptors using partial charges and SA contributions
    moe = {}
    moe['peoe-vsa1'] = round(Descriptors.PEOE_VSA1(mol), ndigits)
    moe['peoe-vsa2'] = round(Descriptors.PEOE_VSA2(mol), ndigits)
    moe['peoe-vsa3'] = round(Descriptors.PEOE_VSA3(mol), ndigits)
    moe['peoe-vsa4'] = round(Descriptors.PEOE_VSA4(mol), ndigits)
    moe['peoe-vsa5'] = round(Descriptors.PEOE_VSA5(mol), ndigits)
    moe['peoe-vsa6'] = round(Descriptors.PEOE_VSA6(mol), ndigits)
    moe['peoe-vsa7'] = round(Descriptors.PEOE_VSA7(mol), ndigits)
    moe['peoe-vsa8'] = round(Descriptors.PEOE_VSA8(mol), ndigits)
    moe['peoe-vsa9'] = round(Descriptors.PEOE_VSA9(mol), ndigits)
    moe['peoe-vsa10'] = round(Descriptors.PEOE_VSA10(mol), ndigits)
    moe['peoe-vsa11'] = round(Descriptors.PEOE_VSA11(mol), ndigits)
    moe['peoe-vsa12'] = round(Descriptors.PEOE_VSA12(mol), ndigits)
    moe['peoe-vsa13'] = round(Descriptors.PEOE_VSA13(mol), ndigits)
    moe['peoe-vsa14'] = round(Descriptors.PEOE_VSA14(mol), ndigits)

    # MOE-type descriptors using MR and SA contributions
    moe['smr-vsa1'] = round(Descriptors.SMR_VSA1(mol), ndigits)
    moe['smr-vsa2'] = round(Descriptors.SMR_VSA2(mol), ndigits)
    moe['smr-vsa3'] = round(Descriptors.SMR_VSA3(mol), ndigits)
    moe['smr-vsa4'] = round(Descriptors.SMR_VSA4(mol), ndigits)
    moe['smr-vsa5'] = round(Descriptors.SMR_VSA5(mol), ndigits)
    moe['smr-vsa6'] = round(Descriptors.SMR_VSA6(mol), ndigits)
    moe['smr-vsa7'] = round(Descriptors.SMR_VSA7(mol), ndigits)
    moe['smr-vsa8'] = round(Descriptors.SMR_VSA8(mol), ndigits)
    moe['smr-vsa9'] = round(Descriptors.SMR_VSA9(mol), ndigits)
    moe['smr-vsa10'] = round(Descriptors.SMR_VSA10(mol), ndigits)

    # MOE-type descriptors using LogP and SA contributions
    moe['slogP-vsa1'] = round(Descriptors.SlogP_VSA1(mol), ndigits)
    moe['slogP-vsa2'] = round(Descriptors.SlogP_VSA2(mol), ndigits)
    moe['slogP-vsa3'] = round(Descriptors.SlogP_VSA3(mol), ndigits)
    moe['slogP-vsa4'] = round(Descriptors.SlogP_VSA4(mol), ndigits)
    moe['slogP-vsa5'] = round(Descriptors.SlogP_VSA5(mol), ndigits)
    moe['slogP-vsa6'] = round(Descriptors.SlogP_VSA6(mol), ndigits)
    moe['slogP-vsa7'] = round(Descriptors.SlogP_VSA7(mol), ndigits)
    moe['slogP-vsa8'] = round(Descriptors.SlogP_VSA8(mol), ndigits)
    moe['slogP-vsa9'] = round(Descriptors.SlogP_VSA9(mol), ndigits)
    moe['slogP-vsa10'] = round(Descriptors.SlogP_VSA10(mol), ndigits)
    moe['slogP-vsa11'] = round(Descriptors.SlogP_VSA11(mol), ndigits)
    moe['slogP-vsa12'] = round(Descriptors.SlogP_VSA12(mol), ndigits)

    # MOE-type descriptors using EState indices as SA contributions
    moe['estate-vsa1'] = round(Descriptors.EState_VSA1(mol), ndigits)
    moe['estate-vsa2'] = round(Descriptors.EState_VSA2(mol), ndigits)
    moe['estate-vsa3'] = round(Descriptors.EState_VSA3(mol), ndigits)
    moe['estate-vsa4'] = round(Descriptors.EState_VSA4(mol), ndigits)
    moe['estate-vsa5'] = round(Descriptors.EState_VSA5(mol), ndigits)
    moe['estate-vsa6'] = round(Descriptors.EState_VSA6(mol), ndigits)
    moe['estate-vsa7'] = round(Descriptors.EState_VSA7(mol), ndigits)
    moe['estate-vsa8'] = round(Descriptors.EState_VSA8(mol), ndigits)
    moe['estate-vsa9'] = round(Descriptors.EState_VSA9(mol), ndigits)
    moe['estate-vsa10'] = round(Descriptors.EState_VSA10(mol), ndigits)
    moe['estate-vsa11'] = round(Descriptors.EState_VSA11(mol), ndigits)

    # MOE-type descriptors using EState indices as SA contributions
    moe['vsa-estate1'] = round(Descriptors.VSA_EState1(mol), ndigits)
    moe['vsa-estate2'] = round(Descriptors.VSA_EState2(mol), ndigits)
    moe['vsa-estate3'] = round(Descriptors.VSA_EState3(mol), ndigits)
    moe['vsa-estate4'] = round(Descriptors.VSA_EState4(mol), ndigits)
    moe['vsa-estate5'] = round(Descriptors.VSA_EState5(mol), ndigits)
    moe['vsa-estate6'] = round(Descriptors.VSA_EState6(mol), ndigits)
    moe['vsa-estate7'] = round(Descriptors.VSA_EState7(mol), ndigits)
    moe['vsa-estate8'] = round(Descriptors.VSA_EState8(mol), ndigits)
    moe['vsa-estate9'] = round(Descriptors.VSA_EState9(mol), ndigits)
    moe['vsa-estate10'] = round(Descriptors.VSA_EState10(mol), ndigits)

    if include_moe:
        descriptors.update(moe)

    # Plane of best fit, Firth et al., JCIM 52:2516-25
    descriptors['pbf'] = round(rdMolDescriptors.CalcPBF(mol), ndigits)

    # Principal moments of inertia
    descriptors['pmi1'] = round(rdMolDescriptors.CalcPMI1(mol), ndigits)
    descriptors['pmi2'] = round(rdMolDescriptors.CalcPMI2(mol), ndigits)
    descriptors['pmi3'] = round(rdMolDescriptors.CalcPMI3(mol), ndigits)

    # Normalized principal moments ratios Sauer and Schwarz JCIM 43:987-1003 (2003)
    descriptors['npr1'] = round(rdMolDescriptors.CalcNPR1(mol), ndigits)
    descriptors['npr2'] = round(rdMolDescriptors.CalcNPR2(mol), ndigits)

    # Radius of gyration
    descriptors['rg'] = round(rdMolDescriptors.CalcRadiusOfGyration(mol),
                              ndigits)

    # Inertial shape factor
    descriptors['isf'] = round(rdMolDescriptors.CalcInertialShapeFactor(mol),
                               ndigits)

    # Eccentricity
    descriptors['eccentricity'] = round(rdMolDescriptors.CalcEccentricity(mol),
                                        ndigits)

    # Asphericity
    descriptors['asphericity'] = round(rdMolDescriptors.CalcAsphericity(mol),
                                       ndigits)

    # Spherocity Index
    descriptors['spherocity'] = round(
        rdMolDescriptors.CalcSpherocityIndex(mol), ndigits)

    # Charge descriptors
    if include_pc:
        Chem.ComputeGasteigerCharges(mol)
        charges = [
            float(atom.GetProp('_GasteigerCharge')) for atom in mol.GetAtoms()
        ]
        positive_charges = [c for c in charges if c > 0]
        negative_charges = [c for c in charges if c < 0]
        atoms = [atom for atom in mol.GetAtoms()]

        # Total positive charge
        descriptors['pc+'] = round(sum(positive_charges), ndigits)

        # Total negative charge
        descriptors['pc-'] = round(sum(negative_charges), ndigits)

        # Relative positive partial charge
        descriptors['rpc+'] = round(
            max(positive_charges) / sum(positive_charges), ndigits)

        # Relative negative partial charge
        descriptors['rpc-'] = round(
            min(negative_charges) / sum(negative_charges), ndigits)

        # Total positive van der Waals surface area
        descriptors['vsa+'] = round(
            sum([moe['peoe-vsa{}'.format(val)] for val in range(8, 15)]),
            ndigits)

        # Total negative van der Waals surface area
        descriptors['vsa-'] = round(
            sum([moe['peoe-vsa{}'.format(val)] for val in range(1, 8)]),
            ndigits)

        total_vsa = round(descriptors['vsa+'] + descriptors['vsa-'], ndigits)

        # Total positive polar van der Waals surface area
        descriptors['vsa-polar+'] = round(
            sum([moe['peoe-vsa{}'.format(val)] for val in range(12, 15)]),
            ndigits)

        # Total negative polar van der Waals surface area
        descriptors['vsa-polar-'] = round(
            sum([moe['peoe-vsa{}'.format(val)] for val in range(1, 4)]),
            ndigits)

        # Total hydrophobic van der Waals surface area
        descriptors['vsa-hyd'] = round(
            sum([moe['peoe-vsa{}'.format(val)] for val in range(4, 12)]),
            ndigits)

        # Total polar van der Waals surface area
        descriptors['vsa-polar'] = round(
            descriptors['vsa-polar+'] + descriptors['vsa-polar-'], ndigits)

        # Fractional positive van der Waals surface area
        descriptors['vsa-fpos'] = round(descriptors['vsa+'] / total_vsa,
                                        ndigits)

        # Fractional negative van der Waals surface area
        descriptors['vsa-fneg'] = round(descriptors['vsa-'] / total_vsa,
                                        ndigits)

        # Fractional positive polar van der Waals surface area
        descriptors['vsa-fppos'] = round(descriptors['vsa-polar+'] / total_vsa,
                                         ndigits)

        # Fractional negative polar van der Waals surface area
        descriptors['vsa-fpneg'] = round(descriptors['vsa-polar-'] / total_vsa,
                                         ndigits)

        # Fractional hydrophobic van der Waals surface area
        descriptors['vsa-fhyd'] = round(descriptors['vsa-hyd'] / total_vsa,
                                        ndigits)

        # Fractional polar van der Waals surface area
        descriptors['vsa-polar'] = round(descriptors['vsa-polar'] / total_vsa,
                                         ndigits)

    # If the number of H-bond donors and acceptors are desired then
    # an additional smiles needs to be provided where groups are CH3-
    # terminated
    if include_h_bond:
        assert (ch3_smiles)
        mol_ch3 = Chem.AddHs(Chem.MolFromSmiles(ch3_smiles))
        descriptors['hdonors'] = Descriptors.NumHDonors(mol_ch3)
        descriptors['hacceptors'] = Descriptors.NumHAcceptors(mol_ch3)

    return descriptors