Ejemplo n.º 1
0
        public List <ILoopPair> FindMatchedLoops(ILoopsCollection LoopsCollection, ILoopCriteria LoopCriteria)
        {
            List <ILoopPair> LoopPairs = new List <ILoopPair>();

            //Search for pairs if we specify
            if (LoopCriteria.SearchForLoopPairs)
            {
                foreach (ILoop LoopA in LoopsCollection.Loops)
                {
                    foreach (ILoop LoopB in LoopsCollection.Loops)
                    {
                        double InterPairDistance = EuclideanDistance(LoopA.ApexAtom, LoopB.ApexAtom);

                        if (InterPairDistance == 0)
                        {
                            //Same loop
                            continue;
                        }

                        double N0Distance = EuclideanDistance(LoopA.NTermAtom, LoopB.NTermAtom);
                        double N1Distance = EuclideanDistance(LoopA.NTermAtomP1, LoopB.NTermAtomP1);
                        double N2Distance = EuclideanDistance(LoopA.NTermAtomP2, LoopB.NTermAtomP2);

                        double C0Distance = EuclideanDistance(LoopA.CTermAtom, LoopB.CTermAtom);
                        double C1Distance = EuclideanDistance(LoopA.CTermAtomP1, LoopB.CTermAtomP1);
                        double C2Distance = EuclideanDistance(LoopA.CTermAtomP2, LoopB.CTermAtomP2);

                        //Old
                        //if (InterPairDistance > LoopCriteria.LoopPairDistanceLowerLimit &&
                        //   InterPairDistance < LoopCriteria.LoopPairDistanceUpperLimit) {

                        //New
                        if (N0Distance < LoopCriteria.NNP0DistanceUpper && N0Distance > LoopCriteria.NNP0DistanceLower &&
                            N1Distance < LoopCriteria.NNP1DistanceUpper && N1Distance > LoopCriteria.NNP1DistanceLower &&
                            N2Distance < LoopCriteria.NNP2DistanceUpper && N2Distance > LoopCriteria.NNP2DistanceLower &&
                            C0Distance < LoopCriteria.CCP0DistanceUpper && C0Distance > LoopCriteria.CCP0DistanceLower &&
                            C1Distance < LoopCriteria.CCP1DistanceUpper && C1Distance > LoopCriteria.CCP1DistanceLower &&
                            C2Distance < LoopCriteria.CCP2DistanceUpper && C2Distance > LoopCriteria.CCP2DistanceLower)
                        {
                            Vector3D vector1 = new Vector3D(1, 0, 0);
                            Vector3D vector2 = new Vector3D(0, 0, 1);
                            double   crossProduct3D;



                            // crossProduct is equal to 50
                            crossProduct3D = Vector3D.AngleBetween(LoopA.UnitVector, LoopB.UnitVector);



                            if (LoopCriteria.RequireLoopsOnSameChain)
                            {
                                if (crossProduct3D > LoopCriteria.LoopOrientationAngleLower &&
                                    crossProduct3D < LoopCriteria.LoopOrientationAngleUpper)
                                {
                                    if (LoopA.Chain == LoopB.Chain)
                                    {
                                        ILoopPair LoopPair = new ILoopPair();
                                        LoopPair.LoopA = LoopA;
                                        LoopPair.LoopB = LoopB;
                                        LoopPairs.Add(LoopPair);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            //return (LoopPairs);
            return(CleanupLoopPairs(LoopPairs));
        }
Ejemplo n.º 2
0
        public List<ILoopPair> FindMatchedLoops(ILoopsCollection LoopsCollection, ILoopCriteria LoopCriteria)
        {
            List<ILoopPair> LoopPairs = new List<ILoopPair>();

            //Search for pairs if we specify
            if (LoopCriteria.SearchForLoopPairs)
            {
                foreach (ILoop LoopA in LoopsCollection.Loops)
                {
                    foreach (ILoop LoopB in LoopsCollection.Loops)
                    {
                        double InterPairDistance = EuclideanDistance(LoopA.ApexAtom, LoopB.ApexAtom);

                        if(InterPairDistance==0) {
                            //Same loop
                            continue;
                        }

                        double N0Distance = EuclideanDistance(LoopA.NTermAtom, LoopB.NTermAtom);
                        double N1Distance = EuclideanDistance(LoopA.NTermAtomP1, LoopB.NTermAtomP1);
                        double N2Distance = EuclideanDistance(LoopA.NTermAtomP2, LoopB.NTermAtomP2);

                        double C0Distance = EuclideanDistance(LoopA.CTermAtom, LoopB.CTermAtom);
                        double C1Distance = EuclideanDistance(LoopA.CTermAtomP1, LoopB.CTermAtomP1);
                        double C2Distance = EuclideanDistance(LoopA.CTermAtomP2, LoopB.CTermAtomP2);

                        //Old
                        //if (InterPairDistance > LoopCriteria.LoopPairDistanceLowerLimit &&
                        //   InterPairDistance < LoopCriteria.LoopPairDistanceUpperLimit) {

                        //New
                        if( N0Distance < LoopCriteria.NNP0DistanceUpper && N0Distance > LoopCriteria.NNP0DistanceLower &&
                            N1Distance < LoopCriteria.NNP1DistanceUpper && N1Distance > LoopCriteria.NNP1DistanceLower &&
                            N2Distance < LoopCriteria.NNP2DistanceUpper && N2Distance > LoopCriteria.NNP2DistanceLower &&
                            C0Distance < LoopCriteria.CCP0DistanceUpper && C0Distance > LoopCriteria.CCP0DistanceLower &&
                            C1Distance < LoopCriteria.CCP1DistanceUpper && C1Distance > LoopCriteria.CCP1DistanceLower &&
                            C2Distance < LoopCriteria.CCP2DistanceUpper && C2Distance > LoopCriteria.CCP2DistanceLower) {

                                Vector3D vector1 = new Vector3D(1, 0, 0);
                                Vector3D vector2 = new Vector3D(0, 0, 1);
                                double crossProduct3D;

                                // crossProduct is equal to 50
                                crossProduct3D = Vector3D.AngleBetween(LoopA.UnitVector, LoopB.UnitVector);

                               if (LoopCriteria.RequireLoopsOnSameChain)
                               {
                                   if (crossProduct3D > LoopCriteria.LoopOrientationAngleLower &&
                                       crossProduct3D < LoopCriteria.LoopOrientationAngleUpper)
                                   {
                                       if (LoopA.Chain == LoopB.Chain)
                                       {
                                           ILoopPair LoopPair = new ILoopPair();
                                           LoopPair.LoopA = LoopA;
                                           LoopPair.LoopB = LoopB;
                                           LoopPairs.Add(LoopPair);
                                       }
                                   }
                               }

                        }
                    }
                }
            }

            //return (LoopPairs);
            return CleanupLoopPairs(LoopPairs);
        }