public CCSDataSet(Sequence ccs, List<Sequence> subreads, BWAPairwiseAlignment aln) { // Call Variants var results = VariantCaller.LeftAlignIndelsAndCallVariants (aln); Variants = results.Item2; Variants.ForEach (p => { p.StartPosition += aln.AlignedSAMSequence.Pos; p.RefName = aln.Reference; }); // Get the ungapped reference var ccs_aligned = results.Item1.SecondSequence; // Generate an ungapped reference var refseq = results.Item1.PairwiseAlignedSequences.First().FirstSequence; var reference = new Sequence (DnaAlphabet.Instance, refseq.Where (bp => bp != '-').ToArray (), false) { ID = aln.Reference + "/" + aln.AlignedSAMSequence.Pos + "-" + aln.AlignedSAMSequence.RefEndPos }; var reference_rc = reference.GetReverseComplementedSequence () as Sequence; Reads = subreads.Select(z => new AlignedSequence(z, reference, reference_rc)).Where( x => (Math.Abs((x.Sequence.Length - reference.Count)) / (double) reference.Count) < 0.2).ToList(); Reads.Insert (0, new AlignedSequence (reference, reference, reference_rc)); ccs.ID = "CCS"; Reads.Insert(1, new AlignedSequence(ccs, reference, reference_rc)); // Now to rejigger the alignments int[] metaOffSets = Enumerable.Range(0, (int)reference.Count). Select (i => Reads.Max( r => r.GetInsertsBeforePosition(i))). ToArray(); Reads.ForEach(r => { r.ReJiggerAlignment(metaOffSets); Console.WriteLine(r.Sequence);}); CCS = ccs; Reference = reference; Aln = aln; }
/// <summary> /// Calculation method. /// </summary> /// <param name="chains"> /// The chains. /// </param> /// <param name="calculators"> /// The calculators. /// </param> /// <param name="links"> /// The links. /// </param> /// <param name="rotate"> /// The rotate flag. /// </param> /// <param name="complementary"> /// The complementary flag. /// </param> /// <param name="rotationLength"> /// The rotation length. /// </param> /// <returns> /// The <see cref="T:double[][]"/>. /// </returns> public static double[][] Calculate(Chain[][] chains, IFullCalculator[] calculators, Link[] links, bool rotate, bool complementary, uint? rotationLength) { var characteristics = new double[chains.Length][]; for (int i = 0; i < chains.Length; i++) { characteristics[i] = new double[calculators.Length]; for (int j = 0; j < calculators.Length; j++) { if (complementary) { var sourceSequence = new Sequence(Alphabets.DNA, chains[i][j].ToString()); var complementarySequence = sourceSequence.GetReverseComplementedSequence(); chains[i][j] = new Chain(complementarySequence.ConvertToString()); } if (rotate) { var building = chains[i][j].Building.Rotate(rotationLength ?? 0); var newSequence = building.Select(t => new ValueInt(t)).Cast<IBaseObject>().ToList(); chains[i][j] = new Chain(newSequence); } chains[i][j].FillIntervalManagers(); characteristics[i][j] = calculators[j].Calculate(chains[i][j], links[j]); } } return characteristics; }
public static void TestTrickyQVInversions() { // This will be hard because normally flip the QV value for a homopolymer, but in this case we won't. // Note the whole notion of flipping is poorly defined. string seq1seq = "ATTGC"; string seq2seq = "ATAGC"; int[] seq2qual = new int[] { 30, 30, 2, 30, 30 }; var refseq = new Sequence(DnaAlphabet.Instance, seq1seq); var query = new Sequence (DnaAlphabet.Instance, seq2seq); var s1rc = refseq.GetReverseComplementedSequence (); var s2rc = query.GetReverseComplementedSequence (); NeedlemanWunschAligner aligner = new NeedlemanWunschAligner (); var aln = aligner.Align (s1rc, s2rc).First(); VariantCallTests.ConvertAlignedSequenceToQualSeq (aln, seq2qual.Reverse ().ToArray ()); aln.PairwiseAlignedSequences [0].Sequences [1].MarkAsReverseComplement (); var variants = VariantCaller.CallVariants (aln); Assert.AreEqual (1, variants.Count); var variant = variants.First (); Assert.AreEqual (VariantType.SNP, variant.Type); Assert.AreEqual (2, variant.QV); var vs = variant as SNPVariant; Assert.AreEqual ('T', vs.AltBP); Assert.AreEqual ('A', vs.RefBP); }
public static void TestReverseComplement1BPIndelCall() { string seq1seq = "ATACCCCTTGCGC"; string seq2seq = "ATA-CCCTTGCGC".Replace("-", String.Empty); int[] seq2qual = new int[] { 30, 30, 30, 2, 30, 30, 30, 30, 30, 30, 30, 30 }; var refseq = new Sequence(DnaAlphabet.Instance, seq1seq); var query = new Sequence (DnaAlphabet.Instance, seq2seq); var s1rc = refseq.GetReverseComplementedSequence (); var s2rc = query.GetReverseComplementedSequence (); NeedlemanWunschAligner aligner = new NeedlemanWunschAligner (); var aln = aligner.Align (s1rc, s2rc).First(); VariantCallTests.ConvertAlignedSequenceToQualSeq (aln, seq2qual.Reverse ().ToArray ()); aln.PairwiseAlignedSequences [0].Sequences [1].MarkAsReverseComplement (); var variants = VariantCaller.CallVariants (aln); Assert.AreEqual (variants.Count, 1); var variant = variants.First (); Assert.AreEqual (2, variant.QV); Assert.AreEqual (5, variant.StartPosition); Assert.AreEqual (VariantType.INDEL, variant.Type); var vi = variant as IndelVariant; Assert.AreEqual (IndelType.Deletion, vi.InsertionOrDeletion); Assert.AreEqual ('G', vi.HomopolymerBase); Assert.AreEqual (1, vi.Length); Assert.AreEqual (4, vi.HomopolymerLengthInReference); Assert.AreEqual (true, vi.InHomopolymer); Assert.AreEqual ("G", vi.InsertedOrDeletedBases); Assert.AreEqual (false, vi.AtEndOfAlignment); Assert.AreEqual (6, vi.EndPosition); }