def _CalculateMoranAutocorrelation(mol: Chem.Mol, lag: int = 1, propertylabel: str = 'm') -> float: """Calculate weighted Moran autocorrelation descriptors. :param lag: topological distance between atom i and atom j. :param propertylabel: type of weighted property """ Natom = mol.GetNumAtoms() prolist = [] for i in mol.GetAtoms(): temp = GetRelativeAtomicProperty(i.GetSymbol(), propertyname=propertylabel) prolist.append(temp) aveweight = sum(prolist) / Natom tempp = [numpy.square(x - aveweight) for x in prolist] GetDistanceMatrix = Chem.GetDistanceMatrix(mol) res = 0.0 index = 0 for i in range(Natom): for j in range(Natom): if GetDistanceMatrix[i, j] == lag: atom1 = mol.GetAtomWithIdx(i) atom2 = mol.GetAtomWithIdx(j) temp1 = GetRelativeAtomicProperty(element=atom1.GetSymbol(), propertyname=propertylabel) temp2 = GetRelativeAtomicProperty(element=atom2.GetSymbol(), propertyname=propertylabel) res = res + (temp1 - aveweight) * (temp2 - aveweight) index += 1 else: res = res + 0.0 if sum(tempp) == 0 or index == 0: result = 0 else: result = (res / index) / (sum(tempp) / Natom) return round(result, 3)
def _GetBurdenMatrix(mol: Chem.Mol, propertylabel: str = 'm') -> numpy.matrix: """Calculate weighted Burden matrix and eigenvalues.""" mol = Chem.AddHs(mol) Natom = mol.GetNumAtoms() AdMatrix = Chem.GetAdjacencyMatrix(mol) bondindex = numpy.argwhere(AdMatrix) AdMatrix1 = numpy.array(AdMatrix, dtype=numpy.float32) # The diagonal elements of B, Bii, are either given by # the carbon normalized atomic mass, # van der Waals volume, Sanderson electronegativity, # and polarizability of atom i. for i in range(Natom): atom = mol.GetAtomWithIdx(i) temp = GetRelativeAtomicProperty(element=atom.GetSymbol(), propertyname=propertylabel) AdMatrix1[i, i] = round(temp, 3) # The element of B connecting atoms i and j, Bij, # is equal to the square root of the bond # order between atoms i and j. for i in bondindex: bond = mol.GetBondBetweenAtoms(int(i[0]), int(i[1])) if bond.GetBondType().name == 'SINGLE': AdMatrix1[i[0], i[1]] = round(numpy.sqrt(1), 3) if bond.GetBondType().name == "DOUBLE": AdMatrix1[i[0], i[1]] = round(numpy.sqrt(2), 3) if bond.GetBondType().name == "TRIPLE": AdMatrix1[i[0], i[1]] = round(numpy.sqrt(3), 3) if bond.GetBondType().name == "AROMATIC": AdMatrix1[i[0], i[1]] = round(numpy.sqrt(1.5), 3) # All other elements of B (corresponding non bonded # atom pairs) are set to 0.001 bondnonindex = numpy.argwhere(AdMatrix == 0) for i in bondnonindex: if i[0] != i[1]: AdMatrix1[i[0], i[1]] = 0.001 return numpy.real(numpy.linalg.eigvals(AdMatrix1))
def CalculatePolarizabilityRDF(ChargeCoordinates): """Calculate RDF descriptors with Polarizability schemes.""" R = GetR(n=30) temp = [] polarizability = [] # ChargeCoordinates=_ReadCoordinates('temp.arc') for i in ChargeCoordinates: # if i[0]!='H': temp.append([float(i[1]), float(i[2]), float(i[3])]) polarizability.append(GetRelativeAtomicProperty(i[0], 'alapha')) DM = GetGeometricalDistanceMatrix(temp) nAT = len(temp) RDFresult = {} for kkk, Ri in enumerate(R): res = 0.0 for j in range(nAT - 1): for k in range(j + 1, nAT): res = res + polarizability[j] * polarizability[k] * math.exp(-_beta * math.pow(Ri - DM[j, k], 2)) RDFresult[f'RDFP{kkk + 1}'] = round(res, 3) return RDFresult
def CalculateVDWVolumeRDF(ChargeCoordinates): """Calculate RDF with atomic van der Waals volume shemes.""" R = GetR(n=30) temp = [] VDW = [] # ChargeCoordinates=_ReadCoordinates('temp.arc') for i in ChargeCoordinates: # if i[0]!='H': temp.append([float(i[1]), float(i[2]), float(i[3])]) VDW.append(GetRelativeAtomicProperty(i[0], 'V')) DM = GetGeometricalDistanceMatrix(temp) nAT = len(temp) RDFresult = {} for kkk, Ri in enumerate(R): res = 0.0 for j in range(nAT - 1): for k in range(j + 1, nAT): res = res + VDW[j] * VDW[k] * math.exp(-_beta * math.pow(Ri - DM[j, k], 2)) RDFresult[f'RDFV{kkk + 1}'] = round(res, 3) return RDFresult
def CalculateVDWVolumeMoRSE(ChargeCoordinates: List[List[float]]) -> dict: """Calculate 3D MoRse descriptors from van der Waals volume. :param ChargeCoordinates: Atomic coordinates and charges as read by chemopy.GeoOpt._ReadCoordinates """ R = GetR(n=30) temp = [] VDW = [] for i in ChargeCoordinates: # if i[0]!='H': temp.append([float(i[1]), float(i[2]), float(i[3])]) VDW.append(GetRelativeAtomicProperty(i[0], 'V')) DM = GetGeometricalDistanceMatrix(temp) nAT = len(temp) RDFresult = {} for kkk, Ri in enumerate(R): res = 0.0 for j in range(nAT - 1): for k in range(j + 1, nAT): res = res + VDW[j] * VDW[k] * math.sin( Ri * DM[j, k]) / (Ri * DM[j, k]) RDFresult[f'MoRSEV{kkk + 1}'] = round(res, 3) return RDFresult