示例#1
0
        /// <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));
        }