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); }
public StitchingInfo() { StitchedCigar = new CigarAlignment(); StitchedDirections = new CigarDirection(); StitchedBases = new List <char>(); StitchedQualities = new List <byte>(); }
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()); }
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; } }
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); }
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); } }
public StitchingInfo() { StitchedCigar = new CigarAlignment(); StitchedDirections = new CigarDirection(); }