Пример #1
0
        public void AddAndGetCandidates_Errors()
        {
            var testRegion = new MyRegionState(1000, 2000);

            Assert.Throws <ArgumentException>(
                () => testRegion.AddCandidate(new CandidateAllele("chr1", 999, "A", "T", AlleleCategory.Snv)));

            Assert.Throws <ArgumentException>(
                () => testRegion.GetAlleleCount(2001, AlleleType.A, DirectionType.Forward));
        }
Пример #2
0
        public void AddAndGetCandidates()
        {
            // -----------------------------------------------
            // simple test case adding candidate to empty region
            // -----------------------------------------------
            var testRegion = new MyRegionState(1000, 2000);
            var snv1       = new CandidateAllele("chr1", 1500, "A", "T", AlleleCategory.Snv)
            {
                SupportByDirection = new[] { 10, 0, 0 }
            };

            testRegion.AddCandidate(snv1);

            var allCandidates = testRegion.GetAllCandidates(false, null);

            Assert.Equal(allCandidates.Count, 1);

            var fetchedCandidate = allCandidates[0];

            Assert.True(fetchedCandidate.Equals(snv1));

            // -----------------------------------------------
            // add same type of candidate but at different position
            // -----------------------------------------------
            var snv2 = new CandidateAllele("chr1", 1501, "A", "T", AlleleCategory.Snv)
            {
                SupportByDirection = new[] { 5, 0, 0 }
            };

            testRegion.AddCandidate(snv2);

            allCandidates = testRegion.GetAllCandidates(false, null);
            Assert.Equal(allCandidates.Count, 2);

            // make sure coverage is preserved
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(snv1));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 10);
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(snv2));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 5);

            // -----------------------------------------------
            // add a different type of candidate at same position
            // -----------------------------------------------
            var deletion1 = new CandidateAllele("chr1", 1500, "AT", "A", AlleleCategory.Deletion)
            {
                SupportByDirection = new[] { 15, 0, 0 }
            };

            testRegion.AddCandidate(deletion1);

            allCandidates = testRegion.GetAllCandidates(false, null);
            Assert.Equal(allCandidates.Count, 3);

            // make sure coverage is preserved
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(snv1));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 10);
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(snv2));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 5);
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(deletion1));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 15);

            // -----------------------------------------------
            // add same variant, but more coverage
            // -----------------------------------------------
            var moreSnv1 = new CandidateAllele("chr1", 1500, "A", "T", AlleleCategory.Snv)
            {
                SupportByDirection = new[] { 2, 0, 0 }, ReadCollapsedCountsMut = new[] { 9, 8, 7, 6, 0, 0, 0, 0 }
            };

            testRegion.AddCandidate(moreSnv1);

            allCandidates = testRegion.GetAllCandidates(false, null);
            Assert.Equal(allCandidates.Count, 3);

            // make sure coverage is incremented, read counts incremented
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(snv1));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 12);
            for (var i = 0; i < Constants.NumReadCollapsedTypes; i++)
            {
                Assert.True(fetchedCandidate != null && fetchedCandidate.ReadCollapsedCountsMut[i] == moreSnv1.ReadCollapsedCountsMut[i]);
            }

            // make sure coverage is preserved, read counts preserved
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(snv2));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 5);
            for (var i = 0; i < Constants.NumReadCollapsedTypes; i++)
            {
                Assert.True(fetchedCandidate != null && fetchedCandidate.ReadCollapsedCountsMut[i] == 0);
            }
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(deletion1));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 15);
            for (var i = 0; i < Constants.NumReadCollapsedTypes; i++)
            {
                Assert.True(fetchedCandidate != null && fetchedCandidate.ReadCollapsedCountsMut[i] == 0);
            }

            var moreDeletion1 = new CandidateAllele("chr1", 1500, "AT", "A", AlleleCategory.Deletion)
            {
                SupportByDirection = new[] { 0, 18, 0 }
            };

            testRegion.AddCandidate(moreDeletion1);

            allCandidates = testRegion.GetAllCandidates(false, null);
            Assert.Equal(allCandidates.Count, 3);

            // make sure coverage is incremented
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(deletion1));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 33);

            // make sure coverage is preserved
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(snv1));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 12);
            fetchedCandidate = allCandidates.FirstOrDefault(c => c.Equals(snv2));
            Assert.True(fetchedCandidate != null && fetchedCandidate.Support == 5);

            // -----------------------------------------------
            // add insertion that goes off block
            // -----------------------------------------------
            var edgeInsertion = new CandidateAllele("chr1", 2000, "A", "TCG", AlleleCategory.Insertion)
            {
                SupportByDirection = new[] { 5, 0, 0 }
            };

            testRegion.AddCandidate(edgeInsertion);

            allCandidates = testRegion.GetAllCandidates(false, null);
            Assert.Equal(allCandidates.Count, 4);
            Assert.Equal(2001, testRegion.MaxAlleleEndpoint);

            // -----------------------------------------------
            // add mnv that goes off block
            // -----------------------------------------------
            var edgeMnv = new CandidateAllele("chr1", 1999, "ATCC", "TCGG", AlleleCategory.Mnv)
            {
                SupportByDirection = new[] { 5, 0, 0 }
            };

            testRegion.AddCandidate(edgeMnv);

            allCandidates = testRegion.GetAllCandidates(false, null);
            Assert.Equal(allCandidates.Count, 5);
            Assert.Equal(2002, testRegion.MaxAlleleEndpoint);

            // -----------------------------------------------
            // add deletion that goes off block
            // -----------------------------------------------
            var edgeDeletion = new CandidateAllele("chr1", 1999, "A" + new string('T', 25), "A", AlleleCategory.Deletion)
            {
                SupportByDirection = new[] { 5, 0, 0 }
            };

            testRegion.AddCandidate(edgeDeletion);

            allCandidates = testRegion.GetAllCandidates(false, null);
            Assert.Equal(allCandidates.Count, 6);
            Assert.Equal(2025, testRegion.MaxAlleleEndpoint);

            // -----------------------------------------------
            // add variant that goes off block but not as far as the deletion did - max endpoint should stay the same
            // -----------------------------------------------
            var edgeMnv2 = new CandidateAllele("chr1", 1999, "ATCGA", "TCGCT", AlleleCategory.Mnv)
            {
                SupportByDirection = new[] { 5, 0, 0 }
            };

            testRegion.AddCandidate(edgeMnv2);

            allCandidates = testRegion.GetAllCandidates(false, null);
            Assert.Equal(allCandidates.Count, 7);
            Assert.Equal(2025, testRegion.MaxAlleleEndpoint);

            // -----------------------------------------------
            // add candidate group
            // -----------------------------------------------
            var candidateGroupAdd1 = new List <CandidateAllele>()
            {
                snv1, snv2
            };
            var candidateGroupAdd2 = new List <CandidateAllele>()
            {
                deletion1, edgeDeletion
            };
            var candidateGroupAdd3 = new List <CandidateAllele>()
            {
                edgeMnv, edgeInsertion, snv1
            };
            var candidateGroupAdd4 = new List <CandidateAllele>()
            {
                moreSnv1
            };
            // candidateGroupAdd5 has the same variants as candidateGroupAdd1. should not generate a new group
            var snv1Duplicate = new CandidateAllele("chr1", 1500, "A", "T", AlleleCategory.Snv)
            {
                SupportByDirection = new[] { 10, 0, 0 }
            };
            var candidateGroupAdd5 = new List <CandidateAllele>()
            {
                snv1Duplicate, snv2
            };

            var candidateGroupAdd = new List <List <CandidateAllele> >()
            {
                candidateGroupAdd1, candidateGroupAdd2, candidateGroupAdd3, candidateGroupAdd4, candidateGroupAdd5
            };

            foreach (var candidate in candidateGroupAdd)
            {
                testRegion.AddCandidateGroup(candidate);
            }

            testRegion.AddCandidateGroup(candidateGroupAdd1);
            var candidateGroupGet = testRegion.GetBlockCandidateGroup();

            Assert.Equal(candidateGroupGet.Count, 5);
            Assert.True(candidateGroupGet.Contains(new Tuple <string, string, string>(snv1.ToString(), snv2.ToString(), null)));
            Assert.False(candidateGroupGet.Contains(new Tuple <string, string, string>(snv2.ToString(), snv1.ToString(), null)));

            Assert.True(candidateGroupGet.Contains(new Tuple <string, string, string>(deletion1.ToString(), edgeDeletion.ToString(), null)));

            Assert.True(candidateGroupGet.Contains(new Tuple <string, string, string>(snv1.ToString(), edgeMnv.ToString(), edgeInsertion.ToString())));
            Assert.True(candidateGroupGet.Contains(new Tuple <string, string, string>(snv1.ToString(), edgeMnv.ToString(), null)));
            Assert.True(candidateGroupGet.Contains(new Tuple <string, string, string>(edgeMnv.ToString(), edgeInsertion.ToString(), null)));
            Assert.False(candidateGroupGet.Contains(new Tuple <string, string, string>(edgeMnv.ToString(), snv1.ToString(), edgeInsertion.ToString())));
            Assert.False(candidateGroupGet.Contains(new Tuple <string, string, string>(snv1.ToString(), edgeInsertion.ToString(), null)));
        }