/// <summary> /// Calculates the weighted path descriptors. /// </summary> /// <returns>A value representing the weighted path values</returns> public Result Calculate(IAtomContainer container) { container = AtomContainerManipulator.RemoveHydrogens(container); int natom = container.Atoms.Count; var retval = new List <double>(5); var pathList = new List <IList <IAtom> >(); // unique paths for (int i = 0; i < natom - 1; i++) { var a = container.Atoms[i]; for (int j = i + 1; j < natom; j++) { var b = container.Atoms[j]; pathList.AddRange(PathTools.GetAllPaths(container, a, b)); } } // heteroatoms var pathWts = GetPathWeights(pathList, container); double mid = 0.0; foreach (var pathWt3 in pathWts) { mid += pathWt3; } mid += natom; // since we don't calculate paths of length 0 above retval.Add(mid); retval.Add(mid / (double)natom); pathList.Clear(); int count = 0; for (int i = 0; i < natom; i++) { var a = container.Atoms[i]; if (a.AtomicNumber.Equals(AtomicNumbers.C)) { continue; } count++; for (int j = 0; j < natom; j++) { var b = container.Atoms[j]; if (a.Equals(b)) { continue; } pathList.AddRange(PathTools.GetAllPaths(container, a, b)); } } pathWts = GetPathWeights(pathList, container); mid = 0.0; foreach (var pathWt2 in pathWts) { mid += pathWt2; } mid += count; retval.Add(mid); // oxygens pathList.Clear(); count = 0; for (int i = 0; i < natom; i++) { var a = container.Atoms[i]; if (!a.AtomicNumber.Equals(AtomicNumbers.O)) { continue; } count++; for (int j = 0; j < natom; j++) { var b = container.Atoms[j]; if (a.Equals(b)) { continue; } pathList.AddRange(PathTools.GetAllPaths(container, a, b)); } } pathWts = GetPathWeights(pathList, container); mid = 0.0; foreach (var pathWt1 in pathWts) { mid += pathWt1; } mid += count; retval.Add(mid); // nitrogens pathList.Clear(); count = 0; for (int i = 0; i < natom; i++) { var a = container.Atoms[i]; if (!a.AtomicNumber.Equals(AtomicNumbers.N)) { continue; } count++; for (int j = 0; j < natom; j++) { var b = container.Atoms[j]; if (a.Equals(b)) { continue; } pathList.AddRange(PathTools.GetAllPaths(container, a, b)); } } pathWts = GetPathWeights(pathList, container); mid = 0.0; foreach (var pathWt in pathWts) { mid += pathWt; } mid += count; retval.Add(mid); return(new Result(retval)); }