예제 #1
0
 public LocalizationRecord(string value  = "", string hint = "",
                           Source source = Source.Code, PairStatus status = PairStatus.New, string context = "")
 {
     Value        = value;
     Hint         = hint;
     Status       = status;
     Source       = source;
     this.context = context;
 }
예제 #2
0
        public static ReadPair GetPair(string cigar1, string cigar2, uint mapq1 = 30, uint mapq2 = 30, PairStatus pairStatus = PairStatus.Paired, bool singleReadOnly = false, int nm = 0, int read2Offset = 0, int?nm2 = null, string name = null, string basesRaw = "AAAGTTTTCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", int read1Position = 99, string read1Bases = null, string read2Bases = null)
        {
            int nmRead2 = nm2 ?? nm;

            var tagUtils = new TagUtils();

            if (nm >= 0)
            {
                tagUtils.AddIntTag("NM", nm);
            }

            var cigarAln1 = new CigarAlignment(cigar1);

            var qualities1 = new List <byte>();

            for (int i = 0; i < cigarAln1.GetReadSpan(); i++)
            {
                qualities1.Add(30);
            }

            //var basesRaw = "AAAGTTTTCCCCCCCCCCCC";
            var alignment = new BamAlignment
            {
                Name       = name ?? "hi:1:2:3:4:5:6",
                RefID      = 1,
                Position   = read1Position,
                Bases      = read1Bases ?? basesRaw.Substring(0, (int)cigarAln1.GetReadSpan()),
                CigarData  = cigarAln1,
                Qualities  = qualities1.ToArray(),
                MapQuality = mapq1
            };

            alignment.TagData = tagUtils.ToBytes();
            if (!singleReadOnly)
            {
                alignment.SetIsProperPair(true);
                alignment.MateRefID = 1;
            }
            var pair = new ReadPair(alignment);

            if (!singleReadOnly)
            {
                alignment.SetIsMateUnmapped(false);
                var tagUtils2 = new TagUtils();
                if (nmRead2 >= 0)
                {
                    tagUtils2.AddIntTag("NM", nmRead2);
                }

                var cigarAln2 = new CigarAlignment(cigar2);

                var qualities2 = new List <byte>();
                for (int i = 0; i < cigarAln2.GetReadSpan(); i++)
                {
                    qualities2.Add(30);
                }

                var alignment2 = new BamAlignment
                {
                    Name       = "hi:1:2:3:4:5:6",
                    RefID      = 1,
                    Position   = read1Position + read2Offset,
                    Bases      = read2Bases ?? basesRaw.Substring(read2Offset, (int)cigarAln2.GetReadSpan()),
                    CigarData  = cigarAln2,
                    Qualities  = qualities2.ToArray(),
                    MapQuality = mapq2
                };

                alignment2.MateRefID = pair.Read1.RefID;
                alignment2.SetIsProperPair(true);
                alignment2.SetIsSecondMate(true);
                alignment2.SetIsReverseStrand(true);
                alignment2.TagData = tagUtils2.ToBytes();
                pair.AddAlignment(alignment2);
            }


            pair.PairStatus = pairStatus;
            return(pair);
        }
예제 #3
0
        static void AddToStorage(SortedDictionary <string, LocalizationRecord> storage,
                                 string key, string value, string hint, Source source, PairStatus status, string context)
        {
            if (string.IsNullOrEmpty(hint))
            {
                hint = "Empty";
            }
            if (storage.ContainsKey(key))
            {
                var hintOld = storage[key].Hint;

                if (hintOld == "Empty" && hint != "Empty")
                {
                    storage[key].Hint = hint;
                }
                else if (hintOld != hint && hint != "Empty")
                {
                    UnityEngine.Debug.LogError($"Key {key} hint \"{hint}\" from {context} is not same as hint \"{hintOld}\" from {storage[key].context}");
                }
                return;
            }
            storage.Add(key, new LocalizationRecord(value, hint, source, status, context));
        }
예제 #4
0
 public void ClearRemoved()
 {
     Status &= ~PairStatus.PairRemoved;
 }
예제 #5
0
 public void SetFinal()
 {
     Status |= PairStatus.PairFinal;
 }
예제 #6
0
 public void SetRemoved()
 {
     Status |= PairStatus.PairRemoved;
 }
예제 #7
0
 public void ClearBuffered()
 {
     Status &= ~PairStatus.PairBuffered;
 }
예제 #8
0
 public void SetBuffered()
 {
     Status |= PairStatus.PairBuffered;
 }
예제 #9
0
        private static StatementPair GetCorrespondingPairByStatementPairs(StatementPair pair1, StatementPair pair2, StatementPair pair3, Conclusion conclusion)
        {
            PairStatus status = GetPairResultStatus(pair1, pair2, pair3);

            switch (status)
            {
            case PairStatus.AllAreInvalid:    //==>All pair results are invalid
                return(null);

            case PairStatus.AllAreValid:                                        //==>All pair results are valid

                if (CheckCorrespondingPairs(conclusion, pair1.ResultStatement)) //Checking First Pair
                {
                    return(pair1);
                }
                else if (CheckCorrespondingPairs(conclusion, pair2.ResultStatement))     //Checking Second Pair
                {
                    return(pair2);
                }
                else if (CheckCorrespondingPairs(conclusion, pair3.ResultStatement))     //Checking Third Pair
                {
                    return(pair3);
                }
                return(null);

            case PairStatus.FirstPairAloneIsValid:                              //==> pair1 result alone is valid

                if (CheckCorrespondingPairs(conclusion, pair1.ResultStatement)) //Checking First Pair
                {
                    return(pair1);
                }

                return(null);

            case PairStatus.SecondPairAloneIsValid:                             //==> pair2 result alone is valid

                if (CheckCorrespondingPairs(conclusion, pair2.ResultStatement)) //Checking Second Pair
                {
                    return(pair2);
                }

                return(null);

            case PairStatus.ThirdPairAloneIsValid:                              //==> pair3 result alone is valid

                if (CheckCorrespondingPairs(conclusion, pair3.ResultStatement)) //Checking Third Pair
                {
                    return(pair3);
                }

                return(null);

            case PairStatus.FirstAndSecondPairsAreValid:                        //==> pair1  & pair2 results are valid

                if (CheckCorrespondingPairs(conclusion, pair1.ResultStatement)) //Checking First Pair
                {
                    return(pair1);
                }
                else if (CheckCorrespondingPairs(conclusion, pair2.ResultStatement))    //Checking Second Pair
                {
                    return(pair2);
                }
                return(null);

            case PairStatus.SecondAndThirdPairsAreValid:                        //==> pair2  & pair3 results are valid

                if (CheckCorrespondingPairs(conclusion, pair2.ResultStatement)) //Checking Second Pair
                {
                    return(pair2);
                }
                else if (CheckCorrespondingPairs(conclusion, pair3.ResultStatement))    //Checking Third Pair
                {
                    return(pair3);
                }
                return(null);

            case PairStatus.FirstAndThirdPairsAreValid:                         //==> pair1  & pair3 results are valid
                if (CheckCorrespondingPairs(conclusion, pair1.ResultStatement)) //Checking First Pair
                {
                    return(pair1);
                }
                else if (CheckCorrespondingPairs(conclusion, pair3.ResultStatement))    //Checking Third Pair
                {
                    return(pair3);
                }
                return(null);
            }

            return(null);
        }
예제 #10
0
        public ReadPair TryPair(BamAlignment alignment, PairStatus pairStatus = PairStatus.Unknown)
        {
            if (_readsProcessed % 100000 == 0)
            {
                LogStatus(alignment.RefID + ":" + alignment.Position);
            }

            _readsProcessed++;

            LastRefId = alignment.RefID;

            var readIndexer = ReadIndexer(alignment);

            // Check if this read should be blacklisted
            if (ShouldBlacklistReadIndexer(alignment))
            {
                _blacklistedReads.Add(readIndexer);
            }

            // If this read is in the blacklist, or is a read that should be "aggressively" skipped, skip the read. If we've already started tracking a mate, remove it from the mate lookup.
            if (ShouldSkipAndRemoveWaitingMates(alignment) || _blacklistedReads.Contains(readIndexer))
            {
                _readsAggressivelySkipped++;

                if (_readsWaitingForMate.ContainsKey(readIndexer))
                {
                    _readsWaitingForMate.Remove(readIndexer);
                }
                return(null);
            }

            if (ShouldSkipRead(alignment))
            {
                _readsSkipped++;
                return(null);
            }

            if (!_readsWaitingForMate.ContainsKey(readIndexer))
            {
                // TODO do we really need to create a new copy here? I think we're already doing it later
                _readsWaitingForMate.Add(readIndexer, new ReadPair(alignment, readIndexer, GetReadNumber(alignment))
                {
                    PairStatus = pairStatus
                });
                return(null);
            }
            else
            {
                var readPair = _readsWaitingForMate[readIndexer];
                readPair.AddAlignment(alignment, GetReadNumber(alignment));

                if (!readPair.IsComplete(_requireSupplementaries) || _pairEvaluator.TreatReadPairAsIncomplete(readPair))
                {
                    return(null);
                }

                _pairsProcessed++;

                // Check pair and either skip or return pair
                var shouldSkip = ShouldSkipPair(readPair);

                if (!shouldSkip || _removeFailedPairs)
                {
                    _readsWaitingForMate.Remove(readIndexer); // If succeeded, no longer waiting for mate; if failed and we're being strict on failures, remove
                }
                if (ShouldWhitelistReadIndexer(alignment, shouldSkip))
                {
                    _whitelistedReads.Add(readIndexer);
                }

                if (shouldSkip)
                {
                    _pairsSkipped++;
                }
                else
                {
                    _pairsPaired++;
                }

                return(shouldSkip ? null : readPair);
            }
        }