Esempio n. 1
0
        /// <summary>
        /// Returns the topological matrix for the given AtomContainer.
        /// </summary>
        /// <param name="container">The AtomContainer for which the matrix is calculated</param>
        /// <returns>A topological matrix representating this AtomContainer</returns>
        public static int[][] GetMatrix(IAtomContainer container)
        {
            int[][] conMat        = AdjacencyMatrix.GetMatrix(container);
            int[][] topolDistance = PathTools.ComputeFloydAPSP(conMat);

            return(topolDistance);
        }
        /// <summary>
        /// Calculates the eccentric connectivity
        /// </summary>
        /// <returns>A <see cref="Result"/> value representing the eccentric connectivity index</returns>
        public Result Calculate(IAtomContainer container)
        {
            container = AtomContainerManipulator.RemoveHydrogens(container);

            var natom   = container.Atoms.Count;
            var admat   = AdjacencyMatrix.GetMatrix(container);
            var distmat = PathTools.ComputeFloydAPSP(admat);

            int eccenindex = 0;

            for (int i = 0; i < natom; i++)
            {
                int max = -1;
                for (int j = 0; j < natom; j++)
                {
                    if (distmat[i][j] > max)
                    {
                        max = distmat[i][j];
                    }
                }
                var degree = container.GetConnectedBonds(container.Atoms[i]).Count();
                eccenindex += max * degree;
            }
            return(new Result(eccenindex));
        }
Esempio n. 3
0
        /// <summary>
        /// Returns the diameter of the molecular graph.
        /// </summary>
        /// <param name="atomContainer">The molecule to consider</param>
        /// <returns>The topological diameter</returns>
        public static int GetMolecularGraphDiameter(IAtomContainer atomContainer)
        {
            int natom = atomContainer.Atoms.Count;

            int[][] admat          = AdjacencyMatrix.GetMatrix(atomContainer);
            int[][] distanceMatrix = ComputeFloydAPSP(admat);

            int[] eta = new int[natom];
            for (int i = 0; i < natom; i++)
            {
                int mmax = -99999;
                for (int j = 0; j < natom; j++)
                {
                    if (distanceMatrix[i][j] > mmax)
                    {
                        mmax = distanceMatrix[i][j];
                    }
                }
                eta[i] = mmax;
            }
            int max = -999999;

            foreach (var anEta in eta)
            {
                if (anEta > max)
                {
                    max = anEta;
                }
            }
            return(max);
        }
Esempio n. 4
0
        /// <summary>
        /// This method calculate the ATS Autocorrelation descriptor.
        /// </summary>
        public Result Calculate(IAtomContainer container)
        {
            container = (IAtomContainer)container.Clone();

            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(container);
            var hAdder = CDK.HydrogenAdder;

            hAdder.AddImplicitHydrogens(container);
            AtomContainerManipulator.ConvertImplicitToExplicitHydrogens(container);
            Aromaticity.CDKLegacy.Apply(container);

            // get the distance matrix for pol calcs as well as for later on
            var distancematrix = PathTools.ComputeFloydAPSP(AdjacencyMatrix.GetMatrix(container));

            var w                 = Listpolarizability(container, distancematrix);
            var natom             = container.Atoms.Count;
            var polarizabilitySum = new double[5];

            for (int k = 0; k < 5; k++)
            {
                for (int i = 0; i < natom; i++)
                {
                    if (container.Atoms[i].AtomicNumber.Equals(AtomicNumbers.H))
                    {
                        continue;
                    }
                    for (int j = 0; j < natom; j++)
                    {
                        if (container.Atoms[j].AtomicNumber.Equals(AtomicNumbers.H))
                        {
                            continue;
                        }
                        if (distancematrix[i][j] == k)
                        {
                            polarizabilitySum[k] += w[i] * w[j];
                        }
                        else
                        {
                            polarizabilitySum[k] += 0.0;
                        }
                    }
                }
                if (k > 0)
                {
                    polarizabilitySum[k] = polarizabilitySum[k] / 2;
                }
            }
            return(new Result(polarizabilitySum));
        }
Esempio n. 5
0
        /// <summary>
        /// Returns the number of vertices that are a distance 'd' apart.
        /// <para>In this method, d is the topological distance (i.e. edge count).</para>
        /// </summary>
        /// <param name="atomContainer">The molecule to consider</param>
        /// <param name="distance">The distance to consider</param>
        /// <returns>The number of vertices</returns>
        public static int GetVertexCountAtDistance(IAtomContainer atomContainer, int distance)
        {
            int natom = atomContainer.Atoms.Count;

            int[][] admat          = AdjacencyMatrix.GetMatrix(atomContainer);
            int[][] distanceMatrix = ComputeFloydAPSP(admat);

            int matches = 0;

            for (int i = 0; i < natom; i++)
            {
                for (int j = 0; j < natom; j++)
                {
                    if (distanceMatrix[i][j] == distance)
                    {
                        matches++;
                    }
                }
            }
            return(matches / 2);
        }
Esempio n. 6
0
        private static Result CalculateMain(IAtomContainer container, int nhigh, int nlow)
        {
            var iso    = CDK.IsotopeFactory;
            int nheavy = 0;

            // find number of heavy atoms
            nheavy += container.Atoms.Count(atom => !atom.AtomicNumber.Equals(AtomicNumbers.H));
            if (nheavy == 0)
            {
                throw new CDKException("No heavy atoms in the container");
            }

            var diagvalue = new double[nheavy];

            // get atomic mass weighted BCUT
            try
            {
                var counter = 0;
                foreach (var atom in container.Atoms.Where(atom => !atom.AtomicNumber.Equals(AtomicNumbers.H)))
                {
                    diagvalue[counter] = iso.GetMajorIsotope(atom.AtomicNumber).ExactMass.Value;
                    counter++;
                }
            }
            catch (Exception e)
            {
                throw new CDKException($"Could not calculate weight: {e.Message}", e);
            }

            double[] eval1, eval2, eval3;
            {
                var burdenMatrix = BurdenMatrix.EvalMatrix(container, diagvalue);
                if (HasUndefined(burdenMatrix))
                {
                    throw new CDKException("Burden matrix has undefined values");
                }
                var matrix = Matrix <double> .Build.DenseOfColumnArrays(burdenMatrix);

                var eigenDecomposition = matrix.Evd().EigenValues;
                eval1 = eigenDecomposition.Select(n => n.Real).ToArray();
            }
            try
            {
                // get charge weighted BCUT
                CDK.LonePairElectronChecker.Saturate(container);
                var charges = new double[container.Atoms.Count];
                var peoe    = new GasteigerMarsiliPartialCharges();
                peoe.AssignGasteigerMarsiliSigmaPartialCharges(container, true);
                for (int i = 0; i < container.Atoms.Count; i++)
                {
                    charges[i] += container.Atoms[i].Charge.Value;
                }
                for (int i = 0; i < container.Atoms.Count; i++)
                {
                    container.Atoms[i].Charge = charges[i];
                }
            }
            catch (Exception e)
            {
                throw new CDKException("Could not calculate partial charges: " + e.Message, e);
            }
            {
                var counter = 0;
                foreach (var atom in container.Atoms.Where(atom => !atom.AtomicNumber.Equals(AtomicNumbers.H)))
                {
                    diagvalue[counter++] = atom.Charge.Value;
                }
            }
            {
                var burdenMatrix = BurdenMatrix.EvalMatrix(container, diagvalue);
                if (HasUndefined(burdenMatrix))
                {
                    throw new CDKException("Burden matrix has undefined values");
                }
                var matrix = Matrix <double> .Build.DenseOfColumnArrays(burdenMatrix);

                var eigenDecomposition = matrix.Evd().EigenValues;
                eval2 = eigenDecomposition.Select(n => n.Real).ToArray();
            }

            var topoDistance = PathTools.ComputeFloydAPSP(AdjacencyMatrix.GetMatrix(container));

            // get polarizability weighted BCUT
            {
                var counter = 0;
                foreach (var atom in container.Atoms.Where(atom => !atom.AtomicNumber.Equals(AtomicNumbers.H)))
                {
                    diagvalue[counter++] = Polarizability.CalculateGHEffectiveAtomPolarizability(container, atom, false, topoDistance);
                }
            }
            {
                var burdenMatrix = BurdenMatrix.EvalMatrix(container, diagvalue);
                if (HasUndefined(burdenMatrix))
                {
                    throw new CDKException("Burden matrix has undefined values");
                }
                var matrix = Matrix <double> .Build.DenseOfColumnArrays(burdenMatrix);

                var eigenDecomposition = matrix.Evd().EigenValues;
                eval3 = eigenDecomposition.Select(n => n.Real).ToArray();
            }

            // return only the n highest & lowest eigenvalues
            int lnlow, lnhigh, enlow, enhigh;

            if (nlow > nheavy)
            {
                lnlow = nheavy;
                enlow = nlow - nheavy;
            }
            else
            {
                lnlow = nlow;
                enlow = 0;
            }

            if (nhigh > nheavy)
            {
                lnhigh = nheavy;
                enhigh = nhigh - nheavy;
            }
            else
            {
                lnhigh = nhigh;
                enhigh = 0;
            }

            var retval = new List <double>((lnlow + enlow + lnhigh + enhigh) * 3);

            for (int i = 0; i < lnlow; i++)
            {
                retval.Add(eval1[i]);
            }
            for (int i = 0; i < enlow; i++)
            {
                retval.Add(double.NaN);
            }
            for (int i = 0; i < lnhigh; i++)
            {
                retval.Add(eval1[eval1.Length - i - 1]);
            }
            for (int i = 0; i < enhigh; i++)
            {
                retval.Add(double.NaN);
            }

            for (int i = 0; i < lnlow; i++)
            {
                retval.Add(eval2[i]);
            }
            for (int i = 0; i < enlow; i++)
            {
                retval.Add(double.NaN);
            }
            for (int i = 0; i < lnhigh; i++)
            {
                retval.Add(eval2[eval2.Length - i - 1]);
            }
            for (int i = 0; i < enhigh; i++)
            {
                retval.Add(double.NaN);
            }

            for (int i = 0; i < lnlow; i++)
            {
                retval.Add(eval3[i]);
            }
            for (int i = 0; i < enlow; i++)
            {
                retval.Add(double.NaN);
            }
            for (int i = 0; i < lnhigh; i++)
            {
                retval.Add(eval3[eval3.Length - i - 1]);
            }
            for (int i = 0; i < enhigh; i++)
            {
                retval.Add(double.NaN);
            }

            return(new Result(retval, nhigh, nlow));
        }
Esempio n. 7
0
 public Calculator(IAtomContainer container)
 {
     this.container = AtomContainerManipulator.RemoveHydrogens(container); // it returns clone
     adjMatrix      = AdjacencyMatrix.GetMatrix(container);
     tdist          = PathTools.ComputeFloydAPSP(adjMatrix);
 }