public void CallSomaticVariants_LowDepthTest()
        {
            List <ChrReference> chrRef = new List <ChrReference>()
            {
                new ChrReference()
                {
                    Name     = "chr19",
                    Sequence = "TTGTCAGTGCGCTTTTCCCAACACCACCTGCTCCGACCACCACCAGTTTGTACTCAGTCATTTCACACCAGCAAGAACCTGTTGGAAACCAGTAATCAGGGTTAATTGGCGGCGAAAAAAAAAAAAAAAAAAAAAAAAAA"
                }
            };

            var options = new ApplicationOptions()
            {
                BAMPaths    = new[] { _bamSmallS1 },
                GenomePaths = new[] { _genomeChr19 },
                //IntervalPaths = new[] { _intervalsChr17Chr19 },
                DebugMode          = true,
                CallMNVs           = true,
                UseMNVReallocation = false,
                MaxSizeMNV         = 100,
                OutputgVCFFiles    = true,
                MinimumCoverage    = 1000,
                OutputFolder       = UnitTestPaths.TestDataDirectory
            };

            var vcfFilePath = Path.ChangeExtension(options.BAMPaths[0], "genome.vcf");

            var     factory = new Factory(options);
            IGenome genomeRef;

            genomeRef = new MockGenome(chrRef);

            var bp = new BamProcessor(factory, genomeRef);

            bp.Execute(1);
            List <VcfVariant> coverage1000results = VcfReader.GetAllVariantsInFile(vcfFilePath);

            options = new ApplicationOptions()
            {
                BAMPaths    = new[] { _bamSmallS1 },
                GenomePaths = new[] { _genomeChr19 },
                // IntervalPaths = new[] { _intervalsChr17Chr19 },
                DebugMode          = true,
                CallMNVs           = true,
                UseMNVReallocation = false,
                OutputgVCFFiles    = true,
                OutputFolder       = UnitTestPaths.TestDataDirectory
            };
            factory = new Factory(options);
            bp      = new BamProcessor(factory, genomeRef);
            bp.Execute(1);
            List <VcfVariant> coverage10results = VcfReader.GetAllVariantsInFile(vcfFilePath);

            // Assert.NotEqual(coverage1000results.Count, coverage10results.Count);
            // Assert.Equal(coverage1000results.Count, 84);
            // Assert.Equal(coverage10results.Count, 100);
        }
        public void TestCommandLineGeneration()
        {
            var         jobManager = new Mock <IJobManager>();
            List <IJob> jobs       = null;

            jobManager.Setup(x => x.Process(It.IsAny <List <IJob> >()))
            .Callback <List <IJob> >(x => jobs = x);
            List <ChrReference> chrRef = new List <ChrReference>()
            {
                new ChrReference()
                {
                    Name = "chr19", Sequence = "AAA"
                },
                new ChrReference()
                {
                    Name = "chrX", Sequence = "AAA"
                },
            };
            var genome = new MockGenome(chrRef);
            var files  = new[] { @"C:\foo\foo.bam", @"C:\foo\bar.bam" };

            var processor = new MyProcessor(genome, jobManager.Object, files,
                                            new[] { "-bamFoLder", @"C:\foo", "-maxNumThreads", "5", "-outFOLDER", @"C:\blee" },
                                            @"C:\blee", "");

            processor.Execute(0);
            // should be 1 job for each file x each chromosome
            Assert.NotNull(jobs);
            var realJobs = jobs.Cast <ExternalProcessJob>().ToArray();

            Assert.Equal(4, realJobs.Length);
            Assert.Equal(0, realJobs.Count(x => x.CommandLineArguments.Contains("outFOLDER")));
            Assert.Equal(0, realJobs.Count(x => x.CommandLineArguments.Contains("bamFoLder")));
            Assert.Equal(2, realJobs.Count(x => x.CommandLineArguments.Contains(@"-OutFolder C:\blee\chr19")));
            Assert.Equal(2, realJobs.Count(x => x.CommandLineArguments.Contains(@"-OutFolder C:\blee\chrX")));
            Assert.Equal(2, realJobs.Count(x => x.CommandLineArguments.Contains(@"-bampaths C:\foo\foo.bam")));
            Assert.Equal(2, realJobs.Count(x => x.CommandLineArguments.Contains(@"-bampaths C:\foo\bar.bam")));
            Assert.Equal(2, realJobs.Count(x => x.CommandLineArguments.Contains("-chrfilter chr19")));
            Assert.Equal(2, realJobs.Count(x => x.CommandLineArguments.Contains("-chrfilter chrX")));
            Assert.Equal(4, realJobs.Count(x => x.CommandLineArguments.Contains("-InsideSubProcess true")));
            Assert.Equal(4, realJobs.Count(x => x.CommandLineArguments.Contains("-MaxNumThreads 1")));
        }
        public void Execute(
            string bamFilePath,
            string vcfFilePath,
            string intervalPath,
            List <BaseCalledAllele> expectedVariants,
            List <ChrReference> fakeReferences = null,
            bool doCheckVariants            = true,
            bool doCheckReferences          = false,
            int expectedNumCoveredPositions = 0,
            bool threadByChr = false,
            int doCountsOnly = 0,
            bool doLog       = false,
            bool callMnvs    = true,
            ApplicationOptions applicationOptions = null)
        {
            if (doCheckReferences)
            {
                vcfFilePath = Path.ChangeExtension(vcfFilePath, "genome.vcf");
            }

            if (applicationOptions == null)
            {
                applicationOptions = new ApplicationOptions
                {
                    BAMPaths               = new[] { bamFilePath },
                    IntervalPaths          = string.IsNullOrEmpty(intervalPath) ? null : new[] { intervalPath },
                    GenomePaths            = new[] { GenomeDirectory },
                    OutputgVCFFiles        = doCheckReferences,
                    OutputBiasFiles        = true,
                    DebugMode              = doLog,
                    MinimumBaseCallQuality = 20,
                    CallMNVs               = callMnvs
                };
            }

            Logger.TryOpenLog(applicationOptions.LogFolder, ApplicationOptions.LogFileName);

            var factory = GetFactory(applicationOptions);

            IGenome genome;

            if (fakeReferences == null)
            {
                genome = factory.GetReferenceGenome(GenomeDirectory);
            }
            else
            {
                genome = new MockGenome(fakeReferences, GenomeDirectory);
            }

            if (threadByChr)
            {
                var processor = new BamProcessor(factory, genome);

                processor.Execute(1);
            }
            else
            {
                var processor = new GenomeProcessor(factory, genome);

                processor.Execute(1);
            }

            Logger.TryCloseLog();

            using (var reader = new VcfReader(vcfFilePath))
            {
                var alleles = reader.GetVariants().ToList();

                var variantCalls = alleles.Where(a => a.VariantAlleles[0] != ".").ToList();

                if (doCheckVariants)
                {
                    if (doCountsOnly > 0)
                    {
                        Assert.Equal(variantCalls.Count(), doCountsOnly);
                    }
                    else
                    {
                        CheckVariants(variantCalls, expectedVariants);
                    }
                }

                if (doCheckReferences)
                {
                    var referenceAlleles = alleles.Where(a => a.VariantAlleles[0] == ".").ToList();

                    // make sure no reference calls at variant positions
                    Assert.Equal(referenceAlleles.Count(), alleles.Count(a => !variantCalls.Select(v => v.ReferencePosition).Contains(a.ReferencePosition)));
                }
            }
        }
        public void Execute(
            string bamFilePath,
            string vcfFilePath,
            string intervalPath,
            List <CalledAllele> expectedVariants,
            List <ChrReference> fakeReferences = null,
            bool doCheckVariants            = true,
            bool doCheckReferences          = false,
            int expectedNumCoveredPositions = 0,
            bool threadByChr = false,
            int doCountsOnly = 0,
            bool doLog       = false,
            bool callMnvs    = true,
            PiscesApplicationOptions applicationOptions = null,
            bool collapse = true)
        {
            if (doCheckReferences)
            {
                vcfFilePath = Path.ChangeExtension(vcfFilePath, "genome.vcf");
            }

            if (applicationOptions == null)
            {
                applicationOptions = new PiscesApplicationOptions
                {
                    BAMPaths            = new[] { bamFilePath },
                    IntervalPaths       = string.IsNullOrEmpty(intervalPath) ? null : new[] { intervalPath },
                    GenomePaths         = new[] { GenomeDirectory },
                    OutputBiasFiles     = true,
                    DebugMode           = doLog,
                    CallMNVs            = callMnvs,
                    MaxGapBetweenMNV    = 10,
                    MaxSizeMNV          = 15,
                    Collapse            = collapse,
                    BamFilterParameters = new BamFilterParameters()
                    {
                        MinimumBaseCallQuality = 20
                    },
                    VariantCallingParameters = new VariantCallingParameters(),
                    VcfWritingParameters     = new VcfWritingParameters()
                    {
                        OutputGvcfFile = doCheckReferences,
                    },
                    CommandLineArguments = new string[] { "some", "cmds" }
                };
            }

            applicationOptions.OutputDirectory = OutputDirectory;

            var factory = GetFactory(applicationOptions);

            IGenome genome;

            if (fakeReferences == null)
            {
                genome = factory.GetReferenceGenome(GenomeDirectory);
            }
            else
            {
                genome = new MockGenome(fakeReferences, GenomeDirectory);
            }

            if (threadByChr)
            {
                var processor = new GenomeProcessor(factory, genome, false);

                processor.Execute(1);
            }
            else
            {
                var processor = new GenomeProcessor(factory, genome);

                processor.Execute(1);
            }

            var alleles      = AlleleReader.GetAllVariantsInFile(vcfFilePath);
            var variantCalls = alleles.Where(a => !a.IsRefType).ToList();

            if (doCheckVariants)
            {
                if (doCountsOnly > 0)
                {
                    Assert.Equal(variantCalls.Count(), doCountsOnly);
                }
                else
                {
                    CheckVariants(variantCalls, expectedVariants);
                }
            }

            if (doCheckReferences)
            {
                var referenceAlleles = alleles.Where(a => a.IsRefType).ToList();

                // make sure no reference calls at variant positions
                Assert.Equal(referenceAlleles.Count(),
                             alleles.Count(a => !variantCalls.Select(v => v.ReferencePosition).Contains(a.ReferencePosition)));
            }
        }
        public void Pisces_LowDepthTest()
        {
            List <ChrReference> chrRef = new List <ChrReference>()
            {
                new ChrReference()
                {
                    Name     = "chr19",
                    Sequence = "TTGTCAGTGCGCTTTTCCCAACACCACCTGCTCCGACCACCACCAGTTTGTACTCAGTCATTTCACACCAGCAAGAACCTGTTGGAAACCAGTAATCAGGGTTAATTGGCGGCGAAAAAAAAAAAAAAAAAAAAAAAAAA"
                }
            };

            var options = new PiscesApplicationOptions()
            {
                BAMPaths    = new[] { _bamSmallS1 },
                GenomePaths = new[] { _genomeChr19 },
                //IntervalPaths = new[] { _intervalsChr17Chr19 },
                DebugMode           = true,
                CallMNVs            = true,
                UseMNVReallocation  = false,
                MaxSizeMNV          = 100,
                OutputDirectory     = TestPaths.LocalTestDataDirectory,
                BamFilterParameters = new Domain.Options.BamFilterParameters()
                {
                    MinimumBaseCallQuality = 20
                },
                VariantCallingParameters = new Domain.Options.VariantCallingParameters()
                {
                    MinimumVariantQScore = 20,
                    MinimumCoverage      = 1000,
                },
                VcfWritingParameters = new Domain.Options.VcfWritingParameters()
                {
                    OutputGvcfFile = true,
                }
            };

            var vcfFilePath = Path.ChangeExtension(options.BAMPaths[0], "genome.vcf");

            var     factory = new Factory(options);
            IGenome genomeRef;

            genomeRef = new MockGenome(chrRef, _genomeChr19);

            var bp = new GenomeProcessor(factory, genomeRef);

            bp.Execute(1);
            var coverage1000results = AlleleReader.GetAllVariantsInFile(vcfFilePath);

            options = new PiscesApplicationOptions()
            {
                BAMPaths    = new[] { _bamSmallS1 },
                GenomePaths = new[] { _genomeChr19 },
                // IntervalPaths = new[] { _intervalsChr17Chr19 },
                DebugMode            = true,
                CallMNVs             = true,
                UseMNVReallocation   = false,
                OutputDirectory      = TestPaths.LocalTestDataDirectory,
                VcfWritingParameters = new Domain.Options.VcfWritingParameters()
                {
                    OutputGvcfFile = false,
                }
            };
            factory = new Factory(options);
            bp      = new GenomeProcessor(factory, genomeRef);
            bp.Execute(1);
            var coverage10results = AlleleReader.GetAllVariantsInFile(vcfFilePath);
        }