Skip to content

Commit dcaa432

Browse files
committed
Genomic and Generic Assay bin counts endpoints
1 parent b36bffb commit dcaa432

17 files changed

+966
-82
lines changed

src/main/java/org/cbioportal/persistence/StudyViewRepository.java

+7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.cbioportal.model.CopyNumberCountByGene;
1010
import org.cbioportal.model.GenomicDataCountItem;
1111
import org.cbioportal.model.GenomicDataCount;
12+
import org.cbioportal.model.MolecularProfile;
1213
import org.cbioportal.model.PatientTreatment;
1314
import org.cbioportal.model.Sample;
1415
import org.cbioportal.model.SampleTreatment;
@@ -67,4 +68,10 @@ public interface StudyViewRepository {
6768
Map<String, Integer> getMutationCounts(StudyViewFilterContext studyViewFilterContext, GenomicDataFilter genomicDataFilter);
6869

6970
List<GenomicDataCountItem> getMutationCountsByType(StudyViewFilterContext studyViewFilterContext, List<GenomicDataFilter> genomicDataFilters);
71+
72+
List<ClinicalDataCount> getGenomicDataBinCounts(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes);
73+
74+
List<ClinicalDataCount> getGenericAssayDataBinCounts(StudyViewFilterContext studyViewFilterContext, List<String> filteredAttributes);
75+
76+
List<MolecularProfile> getGenericAssayProfiles();
7077
}

src/main/java/org/cbioportal/persistence/helper/StudyViewFilterHelper.java

+73-35
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.cbioportal.persistence.helper;
22

33
import org.cbioportal.model.ClinicalAttribute;
4+
import org.cbioportal.model.MolecularProfile;
45
import org.cbioportal.persistence.enums.ClinicalAttributeDataSource;
56
import org.cbioportal.web.parameter.CategorizedClinicalDataCountFilter;
67
import org.cbioportal.web.parameter.CustomSampleIdentifier;
@@ -13,21 +14,26 @@
1314
import java.util.List;
1415
import java.util.Map;
1516
import java.util.Objects;
17+
import java.util.stream.Collectors;
1618

1719
public final class StudyViewFilterHelper {
1820
public static StudyViewFilterHelper build(@Nullable StudyViewFilter studyViewFilter,
1921
@Nullable Map<ClinicalAttributeDataSource, List<ClinicalAttribute>> clinicalAttributesMap,
22+
@Nullable Map<ClinicalAttributeDataSource, List<MolecularProfile>> genericAssayProfilesMap,
2023
@Nullable List<CustomSampleIdentifier> customDataSamples) {
2124
if (Objects.isNull(studyViewFilter)) {
2225
studyViewFilter = new StudyViewFilter();
2326
}
2427
if (Objects.isNull(clinicalAttributesMap)) {
2528
clinicalAttributesMap = new EnumMap<>(ClinicalAttributeDataSource.class);
2629
}
30+
if (Objects.isNull(genericAssayProfilesMap)) {
31+
genericAssayProfilesMap = new EnumMap<>(ClinicalAttributeDataSource.class);
32+
}
2733
if (Objects.isNull(customDataSamples)) {
2834
customDataSamples = new ArrayList<>();
2935
}
30-
return new StudyViewFilterHelper(studyViewFilter, clinicalAttributesMap, customDataSamples);
36+
return new StudyViewFilterHelper(studyViewFilter, clinicalAttributesMap, genericAssayProfilesMap, customDataSamples);
3137
}
3238

3339
private final StudyViewFilter studyViewFilter;
@@ -37,9 +43,10 @@ public static StudyViewFilterHelper build(@Nullable StudyViewFilter studyViewFil
3743

3844

3945
private StudyViewFilterHelper(@NonNull StudyViewFilter studyViewFilter, @NonNull Map<ClinicalAttributeDataSource, List<ClinicalAttribute>> clinicalAttributesMap,
46+
@NonNull Map<ClinicalAttributeDataSource, List<MolecularProfile>> genericAssayProfilesMap,
4047
@NonNull List<CustomSampleIdentifier> customDataSamples) {
4148
this.studyViewFilter = studyViewFilter;
42-
this.categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter, clinicalAttributesMap);
49+
this.categorizedClinicalDataCountFilter = extractClinicalDataCountFilters(studyViewFilter, clinicalAttributesMap, genericAssayProfilesMap);
4350
this.customDataSamples = customDataSamples;
4451
this.applyPatientIdFilters = shouldApplyPatientIdFilters();
4552
}
@@ -56,46 +63,77 @@ public List<CustomSampleIdentifier> customDataSamples() {
5663
return this.customDataSamples;
5764
}
5865

59-
private CategorizedClinicalDataCountFilter extractClinicalDataCountFilters(final StudyViewFilter studyViewFilter, Map<ClinicalAttributeDataSource, List<ClinicalAttribute>> clinicalAttributesMap) {
60-
61-
if (studyViewFilter.getClinicalDataFilters() == null || clinicalAttributesMap.isEmpty()) {
66+
private CategorizedClinicalDataCountFilter extractClinicalDataCountFilters(final StudyViewFilter studyViewFilter, Map<ClinicalAttributeDataSource, List<ClinicalAttribute>> clinicalAttributesMap, Map<ClinicalAttributeDataSource, List<MolecularProfile>> genericAssayProfilesMap) {
67+
if ((studyViewFilter.getClinicalDataFilters() == null || clinicalAttributesMap.isEmpty()) &&
68+
(studyViewFilter.getGenericAssayDataFilters() == null || genericAssayProfilesMap.isEmpty()) &&
69+
studyViewFilter.getGenomicDataFilters() == null)
70+
{
6271
return CategorizedClinicalDataCountFilter.getBuilder().build();
6372
}
6473

65-
List<String> patientCategoricalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.PATIENT)
66-
.stream().filter(ca -> ca.getDatatype().equals("STRING"))
67-
.map(ClinicalAttribute::getAttrId)
68-
.toList();
74+
CategorizedClinicalDataCountFilter.Builder builder = CategorizedClinicalDataCountFilter.getBuilder();
75+
76+
if (studyViewFilter.getClinicalDataFilters() != null) {
77+
List<String> patientCategoricalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.PATIENT)
78+
.stream().filter(ca -> ca.getDatatype().equals("STRING"))
79+
.map(ClinicalAttribute::getAttrId)
80+
.toList();
6981

70-
List<String> patientNumericalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.PATIENT)
71-
.stream().filter(ca -> ca.getDatatype().equals("NUMBER"))
72-
.map(ClinicalAttribute::getAttrId)
73-
.toList();
82+
List<String> patientNumericalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.PATIENT)
83+
.stream().filter(ca -> ca.getDatatype().equals("NUMBER"))
84+
.map(ClinicalAttribute::getAttrId)
85+
.toList();
7486

75-
List<String> sampleCategoricalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.SAMPLE)
76-
.stream().filter(ca -> ca.getDatatype().equals("STRING"))
77-
.map(ClinicalAttribute::getAttrId)
78-
.toList();
87+
List<String> sampleCategoricalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.SAMPLE)
88+
.stream().filter(ca -> ca.getDatatype().equals("STRING"))
89+
.map(ClinicalAttribute::getAttrId)
90+
.toList();
7991

80-
List<String> sampleNumericalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.SAMPLE)
81-
.stream().filter(ca -> ca.getDatatype().equals("NUMBER"))
82-
.map(ClinicalAttribute::getAttrId)
83-
.toList();
92+
List<String> sampleNumericalAttributes = clinicalAttributesMap.get(ClinicalAttributeDataSource.SAMPLE)
93+
.stream().filter(ca -> ca.getDatatype().equals("NUMBER"))
94+
.map(ClinicalAttribute::getAttrId)
95+
.toList();
96+
97+
builder.setPatientCategoricalClinicalDataFilters(studyViewFilter.getClinicalDataFilters()
98+
.stream().filter(clinicalDataFilter -> patientCategoricalAttributes.contains(clinicalDataFilter.getAttributeId()))
99+
.collect(Collectors.toList()))
100+
.setPatientNumericalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream()
101+
.filter(clinicalDataFilter -> patientNumericalAttributes.contains(clinicalDataFilter.getAttributeId()))
102+
.collect(Collectors.toList()))
103+
.setSampleCategoricalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream()
104+
.filter(clinicalDataFilter -> sampleCategoricalAttributes.contains(clinicalDataFilter.getAttributeId()))
105+
.collect(Collectors.toList()))
106+
.setSampleNumericalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream()
107+
.filter(clinicalDataFilter -> sampleNumericalAttributes.contains(clinicalDataFilter.getAttributeId()))
108+
.collect(Collectors.toList()));
109+
}
110+
if (studyViewFilter.getGenomicDataFilters() != null) {
111+
builder.setSampleNumericalGenomicDataFilters(studyViewFilter.getGenomicDataFilters().stream()
112+
.filter(genomicDataFilter -> !genomicDataFilter.getProfileType().equals("cna") && !genomicDataFilter.getProfileType().equals("gistic"))
113+
.collect(Collectors.toList()));
114+
builder.setSampleCategoricalGenomicDataFilters(studyViewFilter.getGenomicDataFilters().stream()
115+
.filter(genomicDataFilter -> genomicDataFilter.getProfileType().equals("cna") || genomicDataFilter.getProfileType().equals("gistic"))
116+
.collect(Collectors.toList()));
117+
}
118+
if (studyViewFilter.getGenericAssayDataFilters() != null) {
119+
// TODO: Support patient level profiles and data filtering
120+
List<String> sampleCategoricalProfileTypes = genericAssayProfilesMap.get(ClinicalAttributeDataSource.SAMPLE)
121+
.stream().filter(profile -> profile.getDatatype().equals("CATEGORICAL") || profile.getDatatype().equals("BINARY"))
122+
.map(profile -> profile.getStableId().replace(profile.getCancerStudyIdentifier() + "_", ""))
123+
.toList();
84124

85-
return CategorizedClinicalDataCountFilter.getBuilder()
86-
.setPatientCategoricalClinicalDataFilters(studyViewFilter.getClinicalDataFilters()
87-
.stream().filter(clinicalDataFilter -> patientCategoricalAttributes.contains(clinicalDataFilter.getAttributeId()))
88-
.toList())
89-
.setPatientNumericalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream()
90-
.filter(clinicalDataFilter -> patientNumericalAttributes.contains(clinicalDataFilter.getAttributeId()))
91-
.toList())
92-
.setSampleCategoricalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream()
93-
.filter(clinicalDataFilter -> sampleCategoricalAttributes.contains(clinicalDataFilter.getAttributeId()))
94-
.toList())
95-
.setSampleNumericalClinicalDataFilters(studyViewFilter.getClinicalDataFilters().stream()
96-
.filter(clinicalDataFilter -> sampleNumericalAttributes.contains(clinicalDataFilter.getAttributeId()))
97-
.toList())
98-
.build();
125+
List<String> sampleNumericalProfileTypes = genericAssayProfilesMap.get(ClinicalAttributeDataSource.SAMPLE)
126+
.stream().filter(profile -> profile.getDatatype().equals("LIMIT-VALUE"))
127+
.map(profile -> profile.getStableId().replace(profile.getCancerStudyIdentifier() + "_", ""))
128+
.toList();
129+
builder.setSampleNumericalGenericAssayDataFilters(studyViewFilter.getGenericAssayDataFilters().stream()
130+
.filter(genericAssayDataFilter -> sampleNumericalProfileTypes.contains(genericAssayDataFilter.getProfileType()))
131+
.collect(Collectors.toList()));
132+
builder.setSampleCategoricalGenericAssayDataFilters(studyViewFilter.getGenericAssayDataFilters().stream()
133+
.filter(genericAssayDataFilter -> sampleCategoricalProfileTypes.contains(genericAssayDataFilter.getProfileType()))
134+
.collect(Collectors.toList()));
135+
}
136+
return builder.build();
99137
}
100138

101139
public boolean shouldApplyPatientIdFilters() {

src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMapper.java

+6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.cbioportal.model.GenomicDataCount;
1313
import org.cbioportal.model.GenomicDataCountItem;
1414
import org.cbioportal.model.PatientTreatment;
15+
import org.cbioportal.model.MolecularProfile;
1516
import org.cbioportal.model.Sample;
1617
import org.cbioportal.model.SampleTreatment;
1718
import org.cbioportal.persistence.helper.AlterationFilterHelper;
@@ -65,4 +66,9 @@ public interface StudyViewMapper {
6566
Map<String, Integer> getMutationCounts(StudyViewFilterHelper studyViewFilterHelper, GenomicDataFilter genomicDataFilter);
6667

6768
List<GenomicDataCountItem> getMutationCountsByType(StudyViewFilterHelper studyViewFilterHelper, List<GenomicDataFilter> genomicDataFilters);
69+
70+
List<ClinicalDataCount> getGenomicDataBinCounts(StudyViewFilterHelper studyViewFilterHelper, List<String> attributeIds);
71+
List<ClinicalDataCount> getGenericAssayDataBinCounts(StudyViewFilterHelper studyViewFilterHelper, List<String> attributeIds);
72+
73+
List<MolecularProfile> getGenericAssayProfiles();
6874
}

src/main/java/org/cbioportal/persistence/mybatisclickhouse/StudyViewMyBatisRepository.java

+33-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.cbioportal.model.GenomicDataCountItem;
1010
import org.cbioportal.model.GenomicDataCount;
1111
import org.cbioportal.model.CopyNumberCountByGene;
12+
import org.cbioportal.model.MolecularProfile;
1213
import org.cbioportal.model.PatientTreatment;
1314
import org.cbioportal.model.Sample;
1415
import org.cbioportal.model.SampleTreatment;
@@ -17,8 +18,10 @@
1718
import org.cbioportal.persistence.enums.ClinicalAttributeDataSource;
1819
import org.cbioportal.persistence.helper.AlterationFilterHelper;
1920
import org.cbioportal.persistence.helper.StudyViewFilterHelper;
21+
import org.cbioportal.web.parameter.CategorizedClinicalDataCountFilter;
2022
import org.cbioportal.web.parameter.ClinicalDataType;
2123
import org.cbioportal.web.parameter.GenomicDataFilter;
24+
import org.cbioportal.web.parameter.StudyViewFilter;
2225
import org.springframework.beans.factory.annotation.Autowired;
2326
import org.springframework.stereotype.Repository;
2427

@@ -34,6 +37,7 @@
3437
public class StudyViewMyBatisRepository implements StudyViewRepository {
3538

3639
private Map<ClinicalAttributeDataSource, List<ClinicalAttribute>> clinicalAttributesMap = new HashMap<>();
40+
private Map<ClinicalAttributeDataSource, List<MolecularProfile>> genericAssayProfilesMap = new HashMap<>();
3741

3842

3943
private static final List<String> FILTERED_CLINICAL_ATTR_VALUES = Collections.emptyList();
@@ -101,14 +105,19 @@ public List<GenomicDataCount> getMolecularProfileSampleCounts(StudyViewFilterCon
101105
}
102106

103107
public StudyViewFilterHelper createStudyViewFilterHelper(StudyViewFilterContext studyViewFilterContext) {
104-
return StudyViewFilterHelper.build(studyViewFilterContext.studyViewFilter(), getClinicalAttributeNameMap(), studyViewFilterContext.customDataFilterSamples());
108+
return StudyViewFilterHelper.build(studyViewFilterContext.studyViewFilter(), getClinicalAttributeNameMap(), getGenericAssayProfilesMap(), studyViewFilterContext.customDataFilterSamples());
105109
}
106110

107111
@Override
108112
public List<ClinicalAttribute> getClinicalAttributes() {
109113
return mapper.getClinicalAttributes();
110114
}
111115

116+
@Override
117+
public List<MolecularProfile> getGenericAssayProfiles() {
118+
return mapper.getGenericAssayProfiles();
119+
}
120+
112121
@Override
113122
public Map<String, ClinicalDataType> getClinicalAttributeDatatypeMap() {
114123
if (clinicalAttributesMap.isEmpty()) {
@@ -199,19 +208,42 @@ public List<SampleTreatment> getSampleTreatments(StudyViewFilterContext studyVie
199208
public int getTotalSampleTreatmentCount(StudyViewFilterContext studyViewFilterContext) {
200209
return mapper.getTotalSampleTreatmentCounts(createStudyViewFilterHelper(studyViewFilterContext));
201210
}
211+
212+
@Override
213+
public List<ClinicalDataCount> getGenomicDataBinCounts(StudyViewFilterContext studyViewFilterContext, List<String> attributeIds) {
214+
return mapper.getGenomicDataBinCounts(createStudyViewFilterHelper(studyViewFilterContext), attributeIds);
215+
}
216+
217+
@Override
218+
public List<ClinicalDataCount> getGenericAssayDataBinCounts(StudyViewFilterContext studyViewFilterContext, List<String> attributeIds) {
219+
return mapper.getGenericAssayDataBinCounts(createStudyViewFilterHelper(studyViewFilterContext), attributeIds);
220+
}
202221

203222
private void buildClinicalAttributeNameMap() {
204223
clinicalAttributesMap = this.getClinicalAttributes()
205224
.stream()
206225
.collect(Collectors.groupingBy(ca -> ca.getPatientAttribute() ? ClinicalAttributeDataSource.PATIENT : ClinicalAttributeDataSource.SAMPLE));
207226
}
227+
228+
private void buildGenericAssayProfilesMap() {
229+
genericAssayProfilesMap = this.getGenericAssayProfiles()
230+
.stream()
231+
.collect(Collectors.groupingBy(ca -> ca.getPatientLevel() ? ClinicalAttributeDataSource.PATIENT : ClinicalAttributeDataSource.SAMPLE));
232+
}
208233

209234
private Map<ClinicalAttributeDataSource, List<ClinicalAttribute>> getClinicalAttributeNameMap() {
210235
if (clinicalAttributesMap.isEmpty()) {
211236
buildClinicalAttributeNameMap();
212237
}
213238
return clinicalAttributesMap;
214239
}
240+
241+
private Map<ClinicalAttributeDataSource, List<MolecularProfile>> getGenericAssayProfilesMap() {
242+
if (genericAssayProfilesMap.isEmpty()) {
243+
buildGenericAssayProfilesMap();
244+
}
245+
return genericAssayProfilesMap;
246+
}
215247

216248
@Override
217249
public List<GenomicDataCountItem> getCNACounts(StudyViewFilterContext studyViewFilterContext, List<GenomicDataFilter> genomicDataFilters) {

src/main/java/org/cbioportal/service/StudyViewColumnarService.java

+4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ public interface StudyViewColumnarService {
4545
List<GenomicDataCountItem> getCNACountsByGeneSpecific(StudyViewFilter studyViewFilter, List<GenomicDataFilter> genomicDataFilters);
4646

4747
List<GenomicDataCountItem> getMutationCountsByGeneSpecific(StudyViewFilter studyViewFilter, List<GenomicDataFilter> genomicDataFilters);
48+
49+
List<ClinicalDataCountItem> getGenomicDataBinCounts(StudyViewFilter studyViewFilter, List<String> filteredAttributes);
50+
51+
List<ClinicalDataCountItem> getGenericAssayDataBinCounts(StudyViewFilter studyViewFilter, List<String> filteredAttributes);
4852

4953
List<GenomicDataCountItem> getMutationTypeCountsByGeneSpecific(StudyViewFilter studyViewFilter, List<GenomicDataFilter> genomicDataFilters);
5054
}

src/main/java/org/cbioportal/service/impl/StudyViewColumnarServiceImpl.java

+24
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,30 @@ public SampleTreatmentReport getSampleTreatmentReport(StudyViewFilter studyViewF
8181
return treatmentCountReportService.getSampleTreatmentReport(createContext(studyViewFilter));
8282
}
8383

84+
@Override
85+
public List<ClinicalDataCountItem> getGenomicDataBinCounts(StudyViewFilter studyViewFilter, List<String> filteredAttributes) {
86+
return studyViewRepository.getGenomicDataBinCounts(createContext(studyViewFilter), filteredAttributes)
87+
.stream().collect(Collectors.groupingBy(ClinicalDataCount::getAttributeId))
88+
.entrySet().parallelStream().map(e -> {
89+
ClinicalDataCountItem item = new ClinicalDataCountItem();
90+
item.setAttributeId(e.getKey());
91+
item.setCounts(e.getValue());
92+
return item;
93+
}).collect(Collectors.toList());
94+
}
95+
96+
@Override
97+
public List<ClinicalDataCountItem> getGenericAssayDataBinCounts(StudyViewFilter studyViewFilter, List<String> filteredAttributes) {
98+
return studyViewRepository.getGenericAssayDataBinCounts(createContext(studyViewFilter), filteredAttributes)
99+
.stream().collect(Collectors.groupingBy(ClinicalDataCount::getAttributeId))
100+
.entrySet().parallelStream().map(e -> {
101+
ClinicalDataCountItem item = new ClinicalDataCountItem();
102+
item.setAttributeId(e.getKey());
103+
item.setCounts(e.getValue());
104+
return item;
105+
}).collect(Collectors.toList());
106+
}
107+
84108
public List<CopyNumberCountByGene> getCnaGenes(StudyViewFilter studyViewFilter) {
85109
return alterationCountService.getCnaGenes(createContext(studyViewFilter));
86110
}

0 commit comments

Comments
 (0)