/// <summary> /// Find the next eligible sequence for alignment/extension /// </summary> /// <param name="clusters">List of clusters</param> /// <param name="currentCluster">Current cluster</param> /// <param name="targetReference">target position in reference sequence</param> /// <param name="targetQuery">target position in query sequence</param> /// <returns>Forward cluster in the list</returns> private Cluster GetNextCluster( IList<Cluster> clusters, Cluster currentCluster, ref long targetReference, ref long targetQuery) { long firstSequenceStart = currentCluster.Matches.Last().ReferenceSequenceOffset + currentCluster.Matches.Last().Length - 1; long secondSequenceStart = currentCluster.Matches.Last().QuerySequenceOffset + currentCluster.Matches.Last().Length - 1; long distance = (targetReference - firstSequenceStart < targetQuery - secondSequenceStart) ? targetReference - firstSequenceStart : targetQuery - secondSequenceStart; Cluster clusterIterator; Cluster cluster = null; for (int clusterIndex = clusters.IndexOf(currentCluster) + 1; clusterIndex < clusters.Count; clusterIndex++) { clusterIterator = clusters[clusterIndex]; if (currentCluster.QueryDirection == clusterIterator.QueryDirection) { long firstSequenceEnd = clusterIterator.Matches.First().ReferenceSequenceOffset; long secondSequenceEnd = clusterIterator.Matches.First().QuerySequenceOffset; if ((firstSequenceEnd < firstSequenceStart) && (clusterIterator.Matches.Last().ReferenceSequenceOffset >= firstSequenceStart) && (clusterIterator.Matches.Last().QuerySequenceOffset >= secondSequenceStart)) { foreach (MatchExtension match in clusterIterator.Matches) { if ((firstSequenceEnd < firstSequenceStart) || (secondSequenceEnd < secondSequenceStart)) { firstSequenceEnd = match.ReferenceSequenceOffset; secondSequenceEnd = match.QuerySequenceOffset; } } } if ((firstSequenceEnd >= firstSequenceStart) && (secondSequenceEnd >= secondSequenceStart)) { long gapHigh; long gapLow; if ((firstSequenceEnd - firstSequenceStart) > (secondSequenceEnd - secondSequenceStart)) { gapHigh = firstSequenceEnd - firstSequenceStart; gapLow = secondSequenceEnd - secondSequenceStart; } else { gapLow = firstSequenceEnd - firstSequenceStart; gapHigh = secondSequenceEnd - secondSequenceStart; } if (gapHigh < BreakLength || ((gapLow * _nucmerAligner.ValidScore) + ((gapHigh - gapLow) * _nucmerAligner.GapExtensionScore)) >= 0) { cluster = clusterIterator; targetReference = firstSequenceEnd; targetQuery = secondSequenceEnd; break; } else if ((gapHigh << 1) - gapLow < distance) { cluster = clusterIterator; targetReference = firstSequenceEnd; targetQuery = secondSequenceEnd; distance = (gapHigh << 1) - gapLow; } } } } return cluster; }
/// <summary> /// Check if the cluster is shadowed (contained in alignment) /// </summary> /// <param name="alignments">List of alignment</param> /// <param name="currentCluster">current cluster</param> /// <param name="currentDeltaAlignment">Current delta alignment</param> /// <returns>Is cluster contained in alignment</returns> private static bool IsClusterShadowed( List<DeltaAlignment> alignments, Cluster currentCluster, DeltaAlignment currentDeltaAlignment) { DeltaAlignment alignment; long firstSequenceStart = currentCluster.Matches.First().ReferenceSequenceOffset; long firstSequenceEnd = currentCluster.Matches.Last().ReferenceSequenceOffset + currentCluster.Matches.Last().Length - 1; long secondSequenceStart = currentCluster.Matches.First().QuerySequenceOffset; long secondSequenceEnd = currentCluster.Matches.Last().QuerySequenceOffset + currentCluster.Matches.Last().Length - 1; if (0 < alignments.Count) { int counter; for (counter = alignments.IndexOf(currentDeltaAlignment); counter >= 0; counter--) { alignment = alignments[counter]; if (alignment.QueryDirection == currentCluster.QueryDirection) { if ((alignment.FirstSequenceEnd >= firstSequenceEnd) && alignment.SecondSequenceEnd >= secondSequenceEnd && alignment.FirstSequenceStart <= firstSequenceStart && alignment.SecondSequenceStart <= secondSequenceStart) { break; } } } if (counter >= 0) { return true; } } return false; }
/// <summary> /// Create a new delta alignment /// </summary> /// <param name="referenceSequence">Reference sequence</param> /// <param name="querySequence">Query sequence</param> /// <param name="cluster">Cluster object</param> /// <param name="match">Match object</param> /// <returns>Newly created DeltaAlignment object</returns> internal static DeltaAlignment NewAlignment( ISequence referenceSequence, ISequence querySequence, Cluster cluster, MatchExtension match) { DeltaAlignment deltaAlignment = new DeltaAlignment(referenceSequence, querySequence) { FirstSequenceStart = match.ReferenceSequenceOffset, SecondSequenceStart = match.QuerySequenceOffset, FirstSequenceEnd = match.ReferenceSequenceOffset + match.Length - 1, SecondSequenceEnd = match.QuerySequenceOffset + match.Length - 1, QueryDirection = cluster.QueryDirection }; return deltaAlignment; }
public void ValidateClusterToString() { var match = new Match(); var matchExtn1 = new MatchExtension(match); matchExtn1.ID = 1; matchExtn1.Length = 20; var matchExtn2 = new MatchExtension(match); matchExtn2.ID = 2; matchExtn2.Length = 30; IList<MatchExtension> extnList = new List<MatchExtension>(); extnList.Add(matchExtn1); extnList.Add(matchExtn2); var clust = new Cluster(extnList); string actualString = clust.ToString(); string expectedString = this.utilityObj.xmlUtil.GetTextValue(Constants.ToStringNodeName, Constants.ClusterExpectedNode); Assert.AreEqual(actualString, expectedString.Replace("\\r\\n", System.Environment.NewLine)); }
public void TestClusterToString() { Match match = new Match(); MatchExtension matchExtn1 = new MatchExtension(match); matchExtn1.ID = 1; matchExtn1.Length = 20; MatchExtension matchExtn2 = new MatchExtension(match); matchExtn2.ID = 2; matchExtn2.Length = 30; IList<MatchExtension> extnList = new List<MatchExtension>(); extnList.Add(matchExtn1); extnList.Add(matchExtn2); Cluster clust = new Cluster(extnList); string actualString = clust.ToString(); string expectedString = "RefStart=0 QueryStart=0 Length=20 Score=0 WrapScore=0 IsGood=False\r\nRefStart=0 QueryStart=0 Length=30 Score=0 WrapScore=0 IsGood=False\r\n".Replace ("\r\n", Environment.NewLine); Assert.AreEqual(actualString, expectedString); }