Esempio n. 1
0
        private static void RunProcessorTest(string inBam, string outBam, string expBam, string outFolder, bool threadbyChr, StitcherOptions stitcherOptions)
        {
            if (File.Exists(outBam))
            {
                File.Delete(outBam);
            }


            Logger.OpenLog(TestPaths.LocalScratchDirectory, "StitcherTestLog.txt", true);
            var processor = threadbyChr ? (IStitcherProcessor) new GenomeProcessor(inBam) : new BamProcessor();

            processor.Process(inBam, outFolder, stitcherOptions);
            Logger.CloseLog();


            Assert.True(File.Exists(outBam));

            var observedAlignment = new BamAlignment();
            var expectedAlignment = new BamAlignment();

            using (var outReader = new BamReader(outBam))
                using (var expReader = new BamReader(expBam))
                {
                    while (true)
                    {
                        var nextObservation = outReader.GetNextAlignment(ref observedAlignment, true);

                        var nextExpected = expReader.GetNextAlignment(ref expectedAlignment, true);

                        if ((nextExpected == false) || (expectedAlignment == null))
                        {
                            break;
                        }


                        Assert.Equal(expectedAlignment.Bases, observedAlignment.Bases);
                        Assert.Equal(expectedAlignment.Position, observedAlignment.Position);
                        Assert.Equal(expectedAlignment.Qualities, observedAlignment.Qualities);
                    }

                    outReader.Close();
                    expReader.Close();
                }
        }
        public void TestMultithreaded()
        {
            BamAlignment bamAlignment = new BamAlignment()
            {
                Bases     = "ACGT",
                Bin       = 0,
                CigarData = new CigarAlignment("4M"),
                Name      = "Should have a constructor which initializes the members",
                Position  = 1,
                Qualities = new byte[4],
                TagData   = new byte[4]
            };

            List <BamAlignment> bamAlignments = new List <BamAlignment>();

            bamAlignments.Add(new BamAlignment(bamAlignment));

            bamAlignment.Position = 2;
            bamAlignments.Add(new BamAlignment(bamAlignment));

            bamAlignment.Position = 10;
            bamAlignments.Add(new BamAlignment(bamAlignment));

            bamAlignment.Position = 11;
            bamAlignments.Add(new BamAlignment(bamAlignment));

            MemoryStream memoryBuffer = new MemoryStream();

            var str = new Mock <MemoryStream>();

            str.Setup(x => x.Write(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>())).Callback <byte[], int, int>((buffer, offset, count) =>
                                                                                                                         { memoryBuffer.Write(buffer, offset, count); });
            str.SetupGet(x => x.CanWrite).Returns(true);

            using (var bamWriter = new BamWriterMultithreaded(
                       str.Object,
                       "",
                       new System.Collections.Generic.List <GenomeMetadata.SequenceMetadata>(),
                       2)) // 2 threads
            {
                var handles = bamWriter.GenerateHandles();

                // Write 2 alignments on the first handle
                // The positions are 1 and 10
                handles[0].WriteAlignment(bamAlignments[0]);
                handles[0].WriteAlignment(bamAlignments[2]);

                // Write 2 alignments on the second handle
                // The positions are 2 and 11
                handles[1].WriteAlignment(bamAlignments[1]);
                handles[1].WriteAlignment(bamAlignments[3]);

                // This will sort and merge the alignments, and write the results to the stream
                bamWriter.Flush();
            }

            memoryBuffer.Position = 0;
            BamReader bamReader = new BamReader();

            bamReader.Open(memoryBuffer);

            var bamAlignmentsWritten = new List <BamAlignment>();

            // Verify that all BamAlignment objects are found
            // and they are in the right order.
            for (int i = 0; i < 4; ++i)
            {
                BamAlignment al = new BamAlignment();
                Assert.True(bamReader.GetNextAlignment(ref al, false));

                bamAlignmentsWritten.Add(new BamAlignment(al));
            }

            bamReader.Close();
            bamReader.Dispose();

            bamAlignmentsWritten.Sort((al1, al2) => (al1.Position.CompareTo(al2.Position)));
            for (int i = 0; i < 4; ++i)
            {
                Assert.Equal(bamAlignmentsWritten[i].Position, bamAlignments[i].Position);
            }
        }