Example #1
0
        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;
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }