Exemple #1
0
        /// <summary>
        /// Finds contig pairs having valid mate pairs connection between them.
        /// </summary>
        /// <param name="reads">Input list of reads.</param>
        /// <param name="alignment">Reads contig alignment.</param>
        /// <returns>Contig Mate pair map.</returns>
        public ContigMatePairs MapContigToMatePairs(IEnumerable <ISequence> reads, ReadContigMap alignment)
        {
            if (alignment == null)
            {
                throw new ArgumentNullException("alignment");
            }

            if (reads == null)
            {
                throw new ArgumentNullException("reads");
            }

            Dictionary <ISequence, IList <ReadMap> > contigs1;
            Dictionary <ISequence, IList <ReadMap> > contigs2;
            ContigMatePairs contigMatePairs = new ContigMatePairs();

            foreach (ISequence read in reads)
            {
                Match match = this.readExpression.Match(read.ID);
                if (match.Success)
                {
                    string mateDisplayID = GenerateExpression(match);
                    if (alignment.TryGetValue(read.ID, out contigs1) && alignment.TryGetValue(mateDisplayID, out contigs2))
                    {
                        MatePair pair;
                        if (match.Groups[2].Value == "X1" || match.Groups[2].Value == "F" ||
                            match.Groups[2].Value == "1" || match.Groups[2].Value == "x1" ||
                            match.Groups[2].Value == "f" || match.Groups[2].Value == "a" ||
                            match.Groups[2].Value == "A")
                        {
                            pair = new MatePair(read.ID, mateDisplayID, match.Groups[3].Value);
                            ContigMatePairMapper(contigs1, contigs2, pair, contigMatePairs);
                        }
                        else
                        {
                            pair = new MatePair(mateDisplayID, read.ID, match.Groups[3].Value);
                            ContigMatePairMapper(contigs2, contigs1, pair, contigMatePairs);
                        }

                        alignment.Remove(read.ID);
                        alignment.Remove(mateDisplayID);
                    }
                }
            }

            return(contigMatePairs);
        }
Exemple #2
0
        /// <summary>
        /// Creates Paired Read Contig Map.
        /// </summary>
        /// <param name="forwardContigs">Contigs aligning to forward read.</param>
        /// <param name="reverseContigs">Contigs aligning to reverse read.</param>
        /// <param name="pair">Mate Pair.</param>
        /// <param name="contigMatePairs">Contig mate pair.</param>
        private static void ContigMatePairMapper(
            Dictionary <ISequence, IList <ReadMap> > forwardContigs,
            Dictionary <ISequence, IList <ReadMap> > reverseContigs,
            MatePair pair,
            ContigMatePairs contigMatePairs)
        {
            foreach (KeyValuePair <ISequence, IList <ReadMap> > forwardContigMaps in forwardContigs)
            {
                Dictionary <ISequence, IList <ValidMatePair> > forwardContig;
                if (!contigMatePairs.TryGetValue(forwardContigMaps.Key, out forwardContig))
                {
                    forwardContig = new Dictionary <ISequence, IList <ValidMatePair> >();
                    contigMatePairs.Add(forwardContigMaps.Key, forwardContig);
                }

                foreach (KeyValuePair <ISequence, IList <ReadMap> > reverseContigMaps in reverseContigs)
                {
                    IList <ValidMatePair> matePairs;
                    if (!forwardContig.TryGetValue(reverseContigMaps.Key, out matePairs))
                    {
                        matePairs = new List <ValidMatePair>();
                        forwardContig.Add(reverseContigMaps.Key, matePairs);
                    }

                    foreach (ReadMap forwardMap in forwardContigMaps.Value)
                    {
                        foreach (ReadMap reverseMap in reverseContigMaps.Value)
                        {
                            ValidMatePair validPairedRead = new ValidMatePair();
                            validPairedRead.PairedRead = pair;
                            validPairedRead.ForwardReadStartPosition.Add(forwardMap.StartPositionOfContig);
                            validPairedRead.ReverseReadStartPosition.Add(
                                reverseMap.StartPositionOfContig + reverseMap.Length - 1);
                            validPairedRead.ReverseReadReverseComplementStartPosition.Add(
                                reverseContigMaps.Key.Count - reverseMap.StartPositionOfContig - 1);
                            matePairs.Add(validPairedRead);
                        }
                    }
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// Map reads to mate pairs.
        /// </summary>
        /// <param name="reads">List of Reads.</param>
        /// <returns>List of mate pairs.</returns>
        public IList<MatePair> Map(IEnumerable<ISequence> reads)
        {
            if (null == reads)
            {
                throw new ArgumentNullException("reads");
            }

            Dictionary<string, MatePair> pairs = new Dictionary<string, MatePair>();
            MatePair mate;
            string exp = string.Empty;

            foreach (ISequence read in reads)
            {
                if (read == null)
                {
                    throw new ArgumentException(Properties.Resource.ReadCannotBeNull);
                }

                if (pairs.TryGetValue(read.ID, out mate))
                {
                    if (string.IsNullOrEmpty(mate.ForwardReadID))
                    {
                        mate.ForwardReadID = read.ID;
                    }
                    else
                    {
                        mate.ReverseReadID = read.ID;
                    }
                }
                else
                {
                    Match match = this.readExpression.Match(read.ID);
                    if (match.Success)
                    {
                        mate = new MatePair(match.Groups[3].Value);
                        if (match.Groups[2].Value == "X1" || match.Groups[2].Value == "F" ||
                            match.Groups[2].Value == "1" || match.Groups[2].Value == "x1" ||
                            match.Groups[2].Value == "f" || match.Groups[2].Value == "a" ||
                            match.Groups[2].Value == "A")
                        {
                            mate.ForwardReadID = read.ID;
                        }
                        else
                        {
                            mate.ReverseReadID = read.ID;
                        }

                        exp = GenerateExpression(match);
                        if (!pairs.ContainsKey(exp))
                        {
                            pairs.Add(exp, mate);
                        }
                        else
                        {
                            throw new FormatException(
                                string.Format(CultureInfo.CurrentCulture,Properties.Resource.DuplicatingReadIds, read.ID));
                        }
                    }
                }
            }

            return pairs.Values.Where(pair => !string.IsNullOrEmpty(pair.ForwardReadID)
                && !string.IsNullOrEmpty(pair.ReverseReadID)).ToList();
        }
Exemple #4
0
        /// <summary>
        /// Creates Paired Read Contig Map.
        /// </summary>
        /// <param name="forwardContigs">Contigs aligning to forward read.</param>
        /// <param name="reverseContigs">Contigs aligning to reverse read.</param>
        /// <param name="pair">Mate Pair.</param>
        /// <param name="contigMatePairs">Contig mate pair.</param>
        private static void ContigMatePairMapper(
            Dictionary<ISequence, IList<ReadMap>> forwardContigs,
            Dictionary<ISequence, IList<ReadMap>> reverseContigs,
            MatePair pair,
            ContigMatePairs contigMatePairs)
        {
            foreach (KeyValuePair<ISequence, IList<ReadMap>> forwardContigMaps in forwardContigs)
            {
                Dictionary<ISequence, IList<ValidMatePair>> forwardContig;
                if (!contigMatePairs.TryGetValue(forwardContigMaps.Key, out forwardContig))
                {
                    forwardContig = new Dictionary<ISequence, IList<ValidMatePair>>();
                    contigMatePairs.Add(forwardContigMaps.Key, forwardContig);
                }

                foreach (KeyValuePair<ISequence, IList<ReadMap>> reverseContigMaps in reverseContigs)
                {
                    IList<ValidMatePair> matePairs;
                    if (!forwardContig.TryGetValue(reverseContigMaps.Key, out matePairs))
                    {
                        matePairs = new List<ValidMatePair>();
                        forwardContig.Add(reverseContigMaps.Key, matePairs);
                    }
                    
                    foreach (ReadMap forwardMap in forwardContigMaps.Value)
                    {
                        foreach (ReadMap reverseMap in reverseContigMaps.Value)
                        {
                            ValidMatePair validPairedRead = new ValidMatePair();
                            validPairedRead.PairedRead = pair;
                            validPairedRead.ForwardReadStartPosition.Add(forwardMap.StartPositionOfContig);
                            validPairedRead.ReverseReadStartPosition.Add(
                                reverseMap.StartPositionOfContig + reverseMap.Length - 1);
                            validPairedRead.ReverseReadReverseComplementStartPosition.Add(
                                reverseContigMaps.Key.Count - reverseMap.StartPositionOfContig - 1);
                            matePairs.Add(validPairedRead);
                        }
                    }
                }
            }
        }
Exemple #5
0
        /// <summary>
        /// Finds contig pairs having valid mate pairs connection between them.
        /// </summary>
        /// <param name="reads">Input list of reads.</param>
        /// <param name="alignment">Reads contig alignment.</param>
        /// <returns>Contig Mate pair map.</returns>
        public ContigMatePairs MapContigToMatePairs(IEnumerable<ISequence> reads, ReadContigMap alignment)
        {
            if (alignment == null)
            {
                throw new ArgumentNullException("alignment");
            }

            if (reads == null)
            {
                throw new ArgumentNullException("reads");
            }

            Dictionary<ISequence, IList<ReadMap>> contigs1;
            Dictionary<ISequence, IList<ReadMap>> contigs2;
            ContigMatePairs contigMatePairs = new ContigMatePairs();
            foreach (ISequence read in reads)
            {
                Match match = this.readExpression.Match(read.ID);
                if (match.Success)
                {
                    string mateDisplayID = GenerateExpression(match);
                    if (alignment.TryGetValue(read.ID, out contigs1) && alignment.TryGetValue(mateDisplayID, out contigs2))
                    {
                        MatePair pair;
                        if (match.Groups[2].Value == "X1" || match.Groups[2].Value == "F" ||
                            match.Groups[2].Value == "1" || match.Groups[2].Value == "x1" ||
                            match.Groups[2].Value == "f" || match.Groups[2].Value == "a" ||
                            match.Groups[2].Value == "A")
                        {
                            pair = new MatePair(read.ID, mateDisplayID, match.Groups[3].Value);
                            ContigMatePairMapper(contigs1, contigs2, pair, contigMatePairs);
                        }
                        else
                        {
                            pair = new MatePair(mateDisplayID, read.ID, match.Groups[3].Value);
                            ContigMatePairMapper(contigs2, contigs1, pair, contigMatePairs);
                        }

                        alignment.Remove(read.ID);
                        alignment.Remove(mateDisplayID);
                    }
                }
            }

            return contigMatePairs;
        }
 public void ValidateMatePairToString()
 {
     var p = new MatePair("2K") {ForwardReadID = "F", ReverseReadID = "R"};
     string actualString = p.ToString();
     string expectedString = this.utilityObj.xmlUtil.GetTextValue(Constants.ToStringNodeName,
                                                             Constants.MatePairExpectedNode);
     Assert.AreEqual(actualString, expectedString);
 }
Exemple #7
0
        /// <summary>
        /// Map reads to mate pairs.
        /// </summary>
        /// <param name="reads">List of Reads.</param>
        /// <returns>List of mate pairs.</returns>
        public IList <MatePair> Map(IEnumerable <ISequence> reads)
        {
            if (null == reads)
            {
                throw new ArgumentNullException("reads");
            }

            Dictionary <string, MatePair> pairs = new Dictionary <string, MatePair>();
            MatePair mate;
            string   exp = string.Empty;

            foreach (ISequence read in reads)
            {
                if (read == null)
                {
                    throw new ArgumentException(Properties.Resource.ReadCannotBeNull);
                }

                if (pairs.TryGetValue(read.ID, out mate))
                {
                    if (string.IsNullOrEmpty(mate.ForwardReadID))
                    {
                        mate.ForwardReadID = read.ID;
                    }
                    else
                    {
                        mate.ReverseReadID = read.ID;
                    }
                }
                else
                {
                    Match match = this.readExpression.Match(read.ID);
                    if (match.Success)
                    {
                        mate = new MatePair(match.Groups[3].Value);
                        if (match.Groups[2].Value == "X1" || match.Groups[2].Value == "F" ||
                            match.Groups[2].Value == "1" || match.Groups[2].Value == "x1" ||
                            match.Groups[2].Value == "f" || match.Groups[2].Value == "a" ||
                            match.Groups[2].Value == "A")
                        {
                            mate.ForwardReadID = read.ID;
                        }
                        else
                        {
                            mate.ReverseReadID = read.ID;
                        }

                        exp = GenerateExpression(match);
                        if (!pairs.ContainsKey(exp))
                        {
                            pairs.Add(exp, mate);
                        }
                        else
                        {
                            throw new FormatException(
                                      string.Format(CultureInfo.CurrentCulture, Properties.Resource.DuplicatingReadIds, read.ID));
                        }
                    }
                }
            }

            return(pairs.Values.Where(pair => !string.IsNullOrEmpty(pair.ForwardReadID) &&
                                      !string.IsNullOrEmpty(pair.ReverseReadID)).ToList());
        }
Exemple #8
0
 public void TestMatePairToString()
 {
     MatePair p = new MatePair("2K") {ForwardReadID = "F", ReverseReadID = "R"};
     string actualString = p.ToString();
     const string expectedString = "ForwardReadID=F, ReverseReadID=R, MeanLength=2000, Standard Deviation=100";
     Assert.AreEqual(actualString, expectedString); 
 }