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)); }
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); }