Exemple #1
0
        public void Compress()
        {
            var directionString        = "1F2S1S1R";
            var directions             = new CigarDirection(directionString);
            var uncompressedDirections = new List <DirectionOp>()
            {
                GetDirectionOp(DirectionType.Forward, 1),
                GetDirectionOp(DirectionType.Stitched, 2),
                GetDirectionOp(DirectionType.Stitched, 1),
                GetDirectionOp(DirectionType.Reverse, 1),
            };

            Assert.Equal(directionString, directions.ToString());

            CompareDirections(uncompressedDirections, directions.Directions);

            directions.Compress();

            var compressedDirections = new List <DirectionOp>()
            {
                GetDirectionOp(DirectionType.Forward, 1),
                GetDirectionOp(DirectionType.Stitched, 3),
                GetDirectionOp(DirectionType.Reverse, 1),
            };

            CompareDirections(compressedDirections, directions.Directions);
        }
Exemple #2
0
 public StitchingInfo()
 {
     StitchedCigar      = new CigarAlignment();
     StitchedDirections = new CigarDirection();
     StitchedBases      = new List <char>();
     StitchedQualities  = new List <byte>();
 }
Exemple #3
0
        private List <string> ExpandCigar(CigarAlignment cigar, CigarDirection directions)
        {
            var expandedDirections = new List <DirectionType>();

            foreach (var direction in directions.Directions)
            {
                for (var i = 0; i < direction.Length; i++)
                {
                    expandedDirections.Add(direction.Direction);
                }
            }
            var expandedCigar = new List <string>();

            var index = 0;

            foreach (CigarOp op in cigar)
            {
                for (var i = 0; i < op.Length; i++)
                {
                    expandedCigar.Add(op.Type.ToString()[0].ToString());
                }
            }

            var expandedCigarDirection = new List <string>();

            for (int i = 0; i < expandedCigar.Count; i++)
            {
                var cigarChunk = expandedCigar[i].ToString() + expandedDirections[i].ToString()[0];
                expandedCigarDirection.Add(cigarChunk);
            }

            return(expandedCigarDirection);
        }
        private static string RecalculateApproximateStitchedDirections(CigarDirection cigarDirections, CigarAlignment cigarData, CigarAlignment newCigarData)
        {
            var cigarBaseDirectionMap = cigarDirections.Expand().ToArray();

            var cigarBaseAlleleMap    = cigarData.Expand();
            var newCigarBaseAlleleMap = newCigarData.Expand();

            var sequencedBaseDirectionMap = new DirectionType[cigarData.GetReadSpan()];

            var directions = new List <DirectionOp>();

            var sequencedBaseIndex = 0;

            var cigarBaseIndex    = 0;
            var newCigarBaseIndex = 0;

            while (true)
            {
                if (cigarBaseIndex >= cigarBaseAlleleMap.Count || newCigarBaseIndex >= newCigarBaseAlleleMap.Count)
                {
                    // If new is longer than old, fill out the rest with the last direction of the old cigar
                    if (newCigarBaseIndex < newCigarBaseAlleleMap.Count)
                    {
                        directions.Add(new DirectionOp(cigarBaseDirectionMap[cigarBaseIndex - 1], newCigarBaseAlleleMap.Count - newCigarBaseIndex));
                    }

                    break;
                }

                while (!cigarBaseAlleleMap[cigarBaseIndex].IsReadSpan())
                {
                    // Skip these
                    cigarBaseIndex++;

                    // TODO is it ever possible to go off the end here?
                }

                while (!newCigarBaseAlleleMap[newCigarBaseIndex].IsReadSpan())
                {
                    directions.Add(new DirectionOp(cigarBaseDirectionMap[cigarBaseIndex], 1)); // TODO perhaps something more nuanced here? unclear what the best solution is. For now, just be consistent: take the last one that we were on at this point in the old cigar
                    newCigarBaseIndex++;

                    // TODO is it ever possible to go off the end here?
                }

                sequencedBaseDirectionMap[sequencedBaseIndex] = cigarBaseDirectionMap[cigarBaseIndex];
                directions.Add(new DirectionOp(cigarBaseDirectionMap[cigarBaseIndex], 1));
                sequencedBaseIndex++;

                cigarBaseIndex++;
                newCigarBaseIndex++;
            }

            var compressedDirections = DirectionHelper.CompressDirections(directions);

            return(new CigarDirection(compressedDirections).ToString());
        }
Exemple #5
0
        public void Expander()
        {
            var directionString    = "2F3S2R";
            var directions         = new CigarDirection(directionString);
            var expandedDirections = directions.Expand();
            int i = 0;

            for (var expander = new CigarDirectionExpander(directions); expander.IsNotEnd(); expander.MoveNext())
            {
                Assert.Equal(expandedDirections[i], expander.Current);
                ++i;
            }
        }
Exemple #6
0
        public void Constructor()
        {
            var directionString    = "1F2S1R";
            var expectedDirections = new List <DirectionOp>()
            {
                GetDirectionOp(DirectionType.Forward, 1),
                GetDirectionOp(DirectionType.Stitched, 2),
                GetDirectionOp(DirectionType.Reverse, 1),
            };

            var cigarDirection = new CigarDirection(directionString);

            Assert.Equal(directionString, cigarDirection.ToString());
            CompareDirections(expectedDirections, cigarDirection.Directions);
        }
Exemple #7
0
        public void Expand()
        {
            var directionString    = "2F3S2R";
            var directions         = new CigarDirection(directionString);
            var expandedDirections = new List <DirectionType>()
            {
                DirectionType.Forward,
                DirectionType.Forward,
                DirectionType.Stitched,
                DirectionType.Stitched,
                DirectionType.Stitched,
                DirectionType.Reverse,
                DirectionType.Reverse
            };

            CompareDirectionTypes(expandedDirections, directions.Expand());
        }
        public static string GetUpdatedXdForRealignedStitchedRead(BamAlignment origRead, BamAlignment realignedRead)
        {
            var origXdString = origRead.GetStringTag("XD");

            if (origXdString == null)
            {
                // If we're properly only doing this on stuff that was already stitched, this should never happen anyway
                return(null);
            }

            if (ReadContainsDeletions(origRead) || ReadContainsDeletions(realignedRead))
            {
                var origXd = new CigarDirection(origXdString);
                var newXd  = RecalculateApproximateStitchedDirections(origXd, origRead.CigarData, realignedRead.CigarData);

                return(newXd);
            }
            else
            {
                // We can keep the orig cigar directions - length hasn't changed
                return(origXdString);
            }
        }
Exemple #9
0
 public StitchingInfo()
 {
     StitchedCigar      = new CigarAlignment();
     StitchedDirections = new CigarDirection();
 }