Skip to content

Commit

Permalink
add tests and refactor getMutationCountsByGeneSpecific
Browse files Browse the repository at this point in the history
  • Loading branch information
qlu-cls committed Oct 6, 2023
1 parent 5620839 commit 5a2f880
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 50 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package org.cbioportal.persistence.mybatis;

import org.cbioportal.model.AlleleSpecificCopyNumber;
import org.cbioportal.model.Gene;
import org.cbioportal.model.GeneFilterQuery;
import org.cbioportal.model.Mutation;
import org.cbioportal.model.MutationCountByPosition;
import org.cbioportal.model.*;
import org.cbioportal.model.meta.MutationMeta;
import org.cbioportal.model.util.Select;
import org.junit.Assert;
Expand All @@ -18,6 +14,7 @@

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
Expand Down Expand Up @@ -554,4 +551,18 @@ public void getMutationCountByPosition() throws Exception {
Assert.assertEquals((Integer) 936, result.getProteinPosEnd());
Assert.assertEquals((Integer) 3, result.getCount());
}

@Test
public void getMutationCountsByType() {
GenomicDataCountItem result = mutationMyBatisRepository.getMutationCountsByType(
Collections.singletonList("study_tcga_pub_mutations"),
sampleIds,
Collections.singletonList(207),
"mutations"
);

Assert.assertEquals("AKT1", result.getHugoGeneSymbol());
Assert.assertEquals("mutations", result.getProfileType());
Assert.assertEquals(2, result.getCounts().size());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public interface StudyViewService {
List<AlterationCountByGene> getMutationAlterationCountByGenes(List<String> studyIds, List<String> sampleIds, AlterationFilter annotationFilter)
throws StudyNotFoundException;

List<GenomicDataCountItem> getMutationCountsByGeneSpecific(List<String> studyIds, List<String> sampleIds, List<Pair<String, String>> genomicDataFilters, AlterationFilter annotationFilter);
List<GenomicDataCountItem> getMutationCountsByGeneSpecific(List<String> studyIds, List<String> sampleIds, List<Pair<String, String>> genomicDataFilters, AlterationFilter annotationFilter, String projection);

List<GenomicDataCountItem> getMutationTypeCountsByGeneSpecific(List<String> studyIds, List<String> sampleIds, List<Pair<String, String>> genomicDataFilters);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.cbioportal.service.impl;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.map.MultiKeyMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.math3.util.Pair;
Expand Down Expand Up @@ -111,7 +112,8 @@ public List<AlterationCountByGene> getMutationAlterationCountByGenes(List<String
public List<GenomicDataCountItem> getMutationCountsByGeneSpecific(List<String> studyIds,
List<String> sampleIds,
List<Pair<String, String>> genomicDataFilters,
AlterationFilter alterationFilter) {
AlterationFilter alterationFilter,
String projection) {
List<MolecularProfileCaseIdentifier> caseIdentifiers =
molecularProfileService.getMutationProfileCaseIdentifiers(studyIds, sampleIds);

Expand All @@ -124,14 +126,21 @@ public List<GenomicDataCountItem> getMutationCountsByGeneSpecific(List<String> s
.stream()
.map(Gene::getEntrezGeneId)
.collect(Collectors.toList());

List<AlterationCountByGene> alterationCountByGenes = alterationCountService.getSampleMutationGeneCounts(
caseIdentifiers,
Select.byValues(entrezGeneIds),
true,
false,
alterationFilter).getFirst();


List<GenomicDataCountItem> mutationTypeCountItems;
if (projection.equals("DETAILED")) {
mutationTypeCountItems = getMutationTypeCountsByGeneSpecific(studyIds, sampleIds, genomicDataFilters);
} else {
mutationTypeCountItems = new ArrayList<>();
}

return genomicDataFilters
.stream()
.flatMap(gdFilter -> {
Expand All @@ -145,36 +154,46 @@ public List<GenomicDataCountItem> getMutationCountsByGeneSpecific(List<String> s
.stream()
.filter(g -> StringUtils.isNotEmpty(g.getHugoGeneSymbol()) && g.getHugoGeneSymbol().equals(hugoGeneSymbol))
.findFirst();

if (!filteredAlterationCount.isPresent()) {
return Stream.of();
}

int mutatedCount = filteredAlterationCount.get().getNumberOfAlteredCases();
int profiledCount = filteredAlterationCount.get().getNumberOfProfiledCases();
int totalCount = sampleIds.size();

List<GenomicDataCount> genomicDataCounts = new ArrayList<>();
GenomicDataCount genomicDataCountMutated = new GenomicDataCount();
genomicDataCountMutated.setLabel(MutationFilterOption.MUTATED.name());
genomicDataCountMutated.setValue(MutationFilterOption.MUTATED.name());
genomicDataCountMutated.setCount(mutatedCount);

if (CollectionUtils.isNotEmpty(mutationTypeCountItems)) {
Optional<GenomicDataCountItem> genomicDataCountItemType = mutationTypeCountItems.stream()
.filter(item -> item.getHugoGeneSymbol().equals(hugoGeneSymbol) && item.getProfileType().equals(profileType))
.findFirst();
genomicDataCountItemType.ifPresent(dataCountItem -> genomicDataCounts.addAll(dataCountItem.getCounts()));
}

if (CollectionUtils.isEmpty(genomicDataCounts)) {
GenomicDataCount genomicDataCountMutated = new GenomicDataCount();
genomicDataCountMutated.setLabel(MutationFilterOption.MUTATED.name());
genomicDataCountMutated.setValue(MutationFilterOption.MUTATED.name());
genomicDataCountMutated.setCount(mutatedCount);
genomicDataCounts.add(genomicDataCountMutated);
}

GenomicDataCount genomicDataCountNotMutated = new GenomicDataCount();
genomicDataCountNotMutated.setLabel(MutationFilterOption.NOT_MUTATED.name());
genomicDataCountNotMutated.setValue(MutationFilterOption.NOT_MUTATED.name());
genomicDataCountNotMutated.setCount(profiledCount - mutatedCount);
genomicDataCounts.add(genomicDataCountNotMutated);

GenomicDataCount genomicDataCountNotProfiled = new GenomicDataCount();
genomicDataCountNotProfiled.setLabel(MutationFilterOption.NOT_PROFILED.name());
genomicDataCountNotProfiled.setValue(MutationFilterOption.NOT_PROFILED.name());
genomicDataCountNotProfiled.setCount(totalCount - profiledCount);

genomicDataCounts.add(genomicDataCountMutated);
genomicDataCounts.add(genomicDataCountNotMutated);
genomicDataCounts.add(genomicDataCountNotProfiled);

genomicDataCountItem.setCounts(genomicDataCounts);

return Stream.of(genomicDataCountItem);
})
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package org.cbioportal.service.impl;

import org.cbioportal.model.Gene;
import org.cbioportal.model.GeneFilterQuery;
import org.cbioportal.model.MolecularProfile;
import org.cbioportal.model.Mutation;
import org.cbioportal.model.MutationCountByPosition;
import org.cbioportal.model.*;
import org.cbioportal.model.meta.MutationMeta;
import org.cbioportal.persistence.MutationRepository;
import org.cbioportal.service.MolecularProfileService;
Expand All @@ -19,6 +15,7 @@

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static org.mockito.ArgumentMatchers.anyList;
Expand Down Expand Up @@ -224,4 +221,27 @@ public void fetchMutationCountsByPosition() throws Exception {
Assert.assertEquals(1, result.size());
Assert.assertEquals(expectedMutationCountByPosition, result.get(0));
}

@Test
public void getMutationCountsByType() {
GenomicDataCountItem expectedGenomicDataCountItem = new GenomicDataCountItem();
expectedGenomicDataCountItem.setProfileType(PROFILE_TYPE_1);
expectedGenomicDataCountItem.setHugoGeneSymbol(HUGO_GENE_SYMBOL_1);
GenomicDataCount expectedGenomicDataCount = new GenomicDataCount();
expectedGenomicDataCount.setLabel(MutationEventType.missense_mutation.getMutationType());
expectedGenomicDataCount.setValue(MutationEventType.missense_mutation.getMutationType());
expectedGenomicDataCount.setCount(1);
expectedGenomicDataCountItem.setCounts(Collections.singletonList(expectedGenomicDataCount));

Mockito.when(mutationRepository.getMutationCountsByType(
Collections.singletonList(MOLECULAR_PROFILE_ID), Collections.singletonList(SAMPLE_ID1),
Collections.singletonList(ENTREZ_GENE_ID_1), PROFILE_TYPE_1)).thenReturn(expectedGenomicDataCountItem);

GenomicDataCountItem result = mutationService.getMutationCountsByType(
Collections.singletonList(MOLECULAR_PROFILE_ID), Collections.singletonList(SAMPLE_ID1),
Collections.singletonList(ENTREZ_GENE_ID_1), PROFILE_TYPE_1);

Assert.assertEquals(expectedGenomicDataCountItem, result);
Assert.assertEquals(1, result.getCounts().size());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ public void getMutationCountsByGeneSpecific() {
alterationCountByGene1.setTotalCount(2);
alterationCountByGene1.setNumberOfProfiledCases(2);
alterationCountByGenes.add(alterationCountByGene1);

Mockito.when(alterationCountService.getSampleMutationGeneCounts(anyList(),
any(),
anyBoolean(),
Expand All @@ -234,10 +234,36 @@ public void getMutationCountsByGeneSpecific() {
List<Pair<String, String>> genomicDataFilters = new ArrayList<>();
Pair<String, String> genomicDataFilter = new Pair<>(BaseServiceImplTest.HUGO_GENE_SYMBOL_1, BaseServiceImplTest.PROFILE_TYPE_1);
genomicDataFilters.add(genomicDataFilter);

GenomicDataCountItem genomicDataCountItem = new GenomicDataCountItem();
genomicDataCountItem.setHugoGeneSymbol(BaseServiceImplTest.HUGO_GENE_SYMBOL_1);
genomicDataCountItem.setProfileType(BaseServiceImplTest.PROFILE_TYPE_1);
List<GenomicDataCount> genomicDataCounts = new ArrayList<>();
GenomicDataCount genomicDataCount1 = new GenomicDataCount();
genomicDataCount1.setLabel(MutationEventType.missense_mutation.getMutationType());
genomicDataCount1.setValue(MutationEventType.missense_mutation.getMutationType());
genomicDataCount1.setCount(2);
genomicDataCounts.add(genomicDataCount1);
GenomicDataCount genomicDataCount2 = new GenomicDataCount();
genomicDataCount2.setLabel(MutationEventType.splice_site_indel.getMutationType());
genomicDataCount2.setValue(MutationEventType.splice_site_indel.getMutationType());
genomicDataCount2.setCount(2);
genomicDataCounts.add(genomicDataCount2);
genomicDataCountItem.setCounts(genomicDataCounts);

Mockito.when(studyViewService.getMutationTypeCountsByGeneSpecific(
anyList(), anyList(), anyList()
)).thenReturn(Collections.singletonList(genomicDataCountItem));

List<GenomicDataCountItem> result = studyViewService.getMutationCountsByGeneSpecific(
studyIds, sampleIds, genomicDataFilters, alterationFilter);
studyIds, sampleIds, genomicDataFilters, alterationFilter, "SUMMARY");
Assert.assertEquals(1, result.size());
Assert.assertEquals(3, result.get(0).getCounts().size());

result = studyViewService.getMutationCountsByGeneSpecific(
studyIds, sampleIds, genomicDataFilters, alterationFilter, "DETAILED");
Assert.assertEquals(1, result.size());
Assert.assertTrue(3 <= result.get(0).getCounts().size());
}

@Test
Expand Down
22 changes: 8 additions & 14 deletions web/src/main/java/org/cbioportal/web/StudyViewController.java
Original file line number Diff line number Diff line change
Expand Up @@ -1082,7 +1082,7 @@ public List<ClinicalEventTypeCount> cachedClinicalEventTypeCounts(
@ApiOperation("Fetch mutation data counts by GenomicDataCountFilter")
public ResponseEntity<List<GenomicDataCountItem>> fetchMutationDataCounts(
@ApiParam("Level of detail of the response")
@RequestParam(defaultValue = "MUTATED") MutationOption categorization,
@RequestParam(defaultValue = "SUMMARY") Projection projection,
@ApiParam(required = true, value = "Genomic data count filter") @Valid @RequestBody(required = false) GenomicDataCountFilter genomicDataCountFilter,
@ApiIgnore // prevent reference to this attribute in the swagger-ui interface
@RequestAttribute(required = false, value = "involvedCancerStudies") Collection<String> involvedCancerStudies,
Expand Down Expand Up @@ -1112,19 +1112,13 @@ public ResponseEntity<List<GenomicDataCountItem>> fetchMutationDataCounts(
List<String> sampleIds = new ArrayList<>();
studyViewFilterUtil.extractStudyAndSampleIds(filteredSampleIdentifiers, studyIds, sampleIds);

List<GenomicDataCountItem> result;
if (categorization == MutationOption.MUTATED) {
result = studyViewService.getMutationCountsByGeneSpecific(
studyIds,
sampleIds,
gdFilters.stream().map(gdFilter -> new Pair<>(gdFilter.getHugoGeneSymbol(), gdFilter.getProfileType())).collect(Collectors.toList()),
studyViewFilter.getAlterationFilter());
} else {
result = studyViewService.getMutationTypeCountsByGeneSpecific(
studyIds,
sampleIds,
gdFilters.stream().map(gdFilter -> new Pair<>(gdFilter.getHugoGeneSymbol(), gdFilter.getProfileType())).collect(Collectors.toList()));
}
List<GenomicDataCountItem> result = studyViewService.getMutationCountsByGeneSpecific(
studyIds,
sampleIds,
gdFilters.stream().map(gdFilter -> new Pair<>(gdFilter.getHugoGeneSymbol(), gdFilter.getProfileType())).collect(Collectors.toList()),
studyViewFilter.getAlterationFilter(),
projection.name()
);

return new ResponseEntity<>(result, HttpStatus.OK);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1117,13 +1117,8 @@ public void fetchMutationDataCounts() throws Exception {
anyList(),
anyList(),
anyList(),
any(AlterationFilter.class)))
.thenReturn(genomicDataCountItems);

when(studyViewService.getMutationTypeCountsByGeneSpecific(
anyList(),
anyList(),
anyList()))
any(AlterationFilter.class),
anyString()))
.thenReturn(genomicDataCountItems);

GenomicDataCountFilter genomicDataCountFilter = new GenomicDataCountFilter();
Expand All @@ -1146,10 +1141,10 @@ public void fetchMutationDataCounts() throws Exception {
studyViewFilter.setAlterationFilter(alterationFilter);
genomicDataCountFilter.setStudyViewFilter(studyViewFilter);


ResultActions result1 = mockMvc.perform(MockMvcRequestBuilders.post("/mutation-data-counts/fetch")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.param("projection", "SUMMARY")
.content(objectMapper.writeValueAsString(genomicDataCountFilter)));

result1
Expand All @@ -1175,7 +1170,7 @@ public void fetchMutationDataCounts() throws Exception {
ResultActions result2 = mockMvc.perform(MockMvcRequestBuilders.post("/mutation-data-counts/fetch")
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON)
.param("categorization", "EVENT")
.param("projection", "DETAILED")
.content(objectMapper.writeValueAsString(genomicDataCountFilter)));

result2
Expand Down

0 comments on commit 5a2f880

Please sign in to comment.