示例#1
0
 /// <summary>
 ///  Find if positions occur simultaneously of read in contig,
 ///  if contig is traced from left direction.
 /// </summary>
 /// <param name="map">map from previous position of read</param>
 /// <param name="readPosition">position of read</param>
 /// <param name="contigPosition">position of contig</param>
 /// <param name="length">length of kmer</param>
 /// <returns>true if continuous position of reads in contig.</returns>
 private static bool IsContinousLeft(
     ReadMap map,
     int readPosition,
     int contigPosition,
     int length)
 {
     return((map.Length - length + map.StartPositionOfRead + 1) == readPosition &&
            (map.StartPositionOfContig - 1) == contigPosition);
 }
示例#2
0
        /// <summary>
        /// Merge continuous positions of a read in kmer indexes.
        /// </summary>
        /// <param name="kmer">Position of contig kmer.</param>
        /// <param name="readMaps">Alignment between read and contig.</param>
        /// <param name="position">Position of kmer in read.</param>
        /// <param name="kmerLength">Length of kmer.</param>
        /// <param name="readLength">Length of the read.</param>
        private static void FindContinuous(
            KmerIndexer kmer,
            IList <ReadMap> readMaps,
            int position,
            int kmerLength,
            int readLength)
        {
            //Create new object ReadInformation as read is encountered first time.
            if (readMaps.Count == 0)
            {
                foreach (int pos in kmer.Positions)
                {
                    ReadMap readMap = new ReadMap();
                    readMap.StartPositionOfContig = pos;
                    readMap.StartPositionOfRead   = position;
                    readMap.Length = kmerLength;
                    SetReadContigOverlap(readLength, readMap);
                    readMaps.Add(readMap);
                }
            }
            else
            {
                //Merge current kmer node with previous kmer node of DeBruijn Graph,
                //if they are continuous in either right or left traversal of graph.
                bool isMerged = false;
                foreach (int pos in kmer.Positions)
                {
                    foreach (ReadMap read in readMaps)
                    {
                        if (IsContinousRight(read, position, pos, kmerLength) ||
                            IsContinousLeft(read, position, pos, kmerLength))
                        {
                            read.Length++;
                            if (read.StartPositionOfContig > pos)
                            {
                                read.StartPositionOfContig = pos;
                            }

                            SetReadContigOverlap(readLength, read);
                            isMerged = true;
                            break;
                        }
                    }

                    //If not continuous a new object ReadMap is created to store new overlap.
                    if (isMerged == false)
                    {
                        ReadMap readmap = new ReadMap();
                        readmap.StartPositionOfContig = pos;
                        readmap.StartPositionOfRead   = position;
                        readmap.Length = kmerLength;
                        SetReadContigOverlap(readLength, readmap);
                        readMaps.Add(readmap);
                    }
                }
            }
        }
示例#3
0
 /// <summary>
 /// Determines whether read is full or partial overlap between read and contig.
 /// Overlap of read and contig
 /// FullOverlap
 /// ------------- Contig
 ///    ------     Read
 /// PartialOverlap
 /// -------------       Contig
 ///            ------   Read
 /// </summary>
 /// <param name="length">length of read</param>
 /// <param name="read">map of read to contig</param>
 private static void SetReadContigOverlap(int length, ReadMap read)
 {
     if (length == read.Length)
     {
         read.ReadOverlap = ContigReadOverlapType.FullOverlap;
     }
     else
     {
         read.ReadOverlap = ContigReadOverlapType.PartialOverlap;
     }
 }