Skip to content

Commit 1fc30cf

Browse files
committed
Fix oncoprint track alteration percentage to use as numerator the count of altered AND sequence items
1 parent e08290c commit 1fc30cf

File tree

2 files changed

+87
-40
lines changed

2 files changed

+87
-40
lines changed

src/shared/components/oncoprint/OncoprintUtils.spec.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,68 @@ describe('OncoprintUtils', () => {
105105
// then
106106
assert.equal(info.sequenced, 1);
107107
});
108+
109+
it('counts altered samples that are not profiled for a given gene', () => {
110+
// given - SAMPLE1 and SAMPLE2 have alterations (non-empty arrays),
111+
// but only SAMPLE1 is profiled for BRCA1
112+
// SAMPLE3 and SAMPLE4 are profiled but not altered
113+
const dataByCase = {
114+
samples: {
115+
SAMPLE1: [{} as any], // has alteration, profiled
116+
SAMPLE2: [{} as any], // has alteration, not profiled
117+
SAMPLE3: [], // no alteration, profiled
118+
SAMPLE4: [], // no alteration, profiled
119+
},
120+
patients: {},
121+
};
122+
const sequencedSampleKeysByGene = {
123+
BRCA1: ['SAMPLE1', 'SAMPLE3', 'SAMPLE4'],
124+
};
125+
// when
126+
const info = alterationInfoForCaseAggregatedDataByOQLLine(
127+
true,
128+
{ cases: dataByCase, oql: { gene: 'BRCA1' } },
129+
sequencedSampleKeysByGene,
130+
{}
131+
);
132+
// then - SAMPLE1 is altered and sequenced, SAMPLE2 is altered but not sequenced
133+
// SAMPLE3 and SAMPLE4 are sequenced but not altered
134+
assert.equal(info.sequenced, 3);
135+
assert.equal(info.alteredAndSequenced, 1);
136+
assert.equal(info.altered, 2);
137+
assert.equal(info.percent, '33%'); // 1 altered&sequenced / 3 sequenced = 33%
138+
});
139+
140+
it('counts altered patients that are not profiled for a given gene', () => {
141+
// given - PATIENT1 and PATIENT2 have alterations (non-empty arrays),
142+
// but only PATIENT1 is profiled for TP53
143+
// PATIENT3 and PATIENT4 are profiled but not altered
144+
const dataByCase = {
145+
samples: {},
146+
patients: {
147+
PATIENT1: [{} as any], // has alteration, profiled
148+
PATIENT2: [{} as any], // has alteration, not profiled
149+
PATIENT3: [], // no alteration, profiled
150+
PATIENT4: [], // no alteration, profiled
151+
},
152+
};
153+
const sequencedPatientKeysByGene = {
154+
TP53: ['PATIENT1', 'PATIENT3', 'PATIENT4'],
155+
};
156+
// when
157+
const info = alterationInfoForCaseAggregatedDataByOQLLine(
158+
false,
159+
{ cases: dataByCase, oql: { gene: 'TP53' } },
160+
{},
161+
sequencedPatientKeysByGene
162+
);
163+
// then - PATIENT1 is altered and sequenced, PATIENT2 is altered but not sequenced
164+
// PATIENT3 and PATIENT4 are sequenced but not altered
165+
assert.equal(info.sequenced, 3);
166+
assert.equal(info.alteredAndSequenced, 1);
167+
assert.equal(info.altered, 2);
168+
assert.equal(info.percent, '33%'); // 1 altered&sequenced / 3 sequenced = 33%
169+
});
108170
});
109171

110172
describe('makeGeneticTrackWith', () => {

src/shared/components/oncoprint/OncoprintUtils.ts

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ export function percentAltered(altered: number, sequenced: number) {
552552
return fixed + '%';
553553
}
554554

555-
function getAlterationInfoSequenced(
555+
function getAlterationInfo(
556556
sampleMode: boolean,
557557
oql: { gene: string } | string[],
558558
sequencedSampleKeysByGene: { [hugoGeneSymbol: string]: string[] },
@@ -561,9 +561,11 @@ function getAlterationInfoSequenced(
561561
) {
562562
const geneSymbolArray = oql instanceof Array ? oql : [oql.gene];
563563

564-
const counts = {
564+
const report = {
565565
sequenced: 0,
566566
alteredAndSequenced: 0,
567+
altered: alteredKeys.size,
568+
percent: '',
567569
};
568570

569571
if (sampleMode) {
@@ -573,8 +575,8 @@ function getAlterationInfoSequenced(
573575
symbol => sequencedSampleKeysByGene[symbol]
574576
)
575577
);
576-
counts.sequenced = sequenced.length;
577-
counts.alteredAndSequenced = _.intersection(
578+
report.sequenced = sequenced.length;
579+
report.alteredAndSequenced = _.intersection(
578580
sequenced,
579581
Array.from(alteredKeys)
580582
).length;
@@ -585,28 +587,19 @@ function getAlterationInfoSequenced(
585587
symbol => sequencedPatientKeysByGene[symbol]
586588
)
587589
);
588-
counts.sequenced = sequenced.length;
589-
counts.alteredAndSequenced = _.intersection(
590+
report.sequenced = sequenced.length;
591+
report.alteredAndSequenced = _.intersection(
590592
sequenced,
591593
Array.from(alteredKeys)
592594
).length;
593595
}
594596

595-
// const sequenced = sampleMode
596-
// ? _.uniq(
597-
// _.flatMap(
598-
// geneSymbolArray,
599-
// symbol => sequencedSampleKeysByGene[symbol]
600-
// )
601-
// ).length
602-
// : _.uniq(
603-
// _.flatMap(
604-
// geneSymbolArray,
605-
// symbol => sequencedPatientKeysByGene[symbol]
606-
// )
607-
// ).length;
608-
609-
return counts;
597+
report.percent = percentAltered(
598+
report.alteredAndSequenced,
599+
report.sequenced
600+
);
601+
602+
return report;
610603
}
611604

612605
export function alterationInfoForOncoprintTrackData(
@@ -625,23 +618,19 @@ export function alterationInfoForOncoprintTrackData(
625618
return acc;
626619
}, new Set<string>());
627620

628-
const sequenced = getAlterationInfoSequenced(
621+
const info = getAlterationInfo(
629622
sampleMode,
630623
data.oql,
631624
sequencedSampleKeysByGene,
632625
sequencedPatientKeysByGene,
633626
alteredKeys
634627
);
635-
const altered = alteredKeys.size;
636-
const percent = percentAltered(
637-
sequenced.alteredAndSequenced,
638-
sequenced.sequenced
639-
);
628+
640629
return {
641-
sequenced: sequenced.sequenced,
642-
alteredAndSequenced: sequenced.alteredAndSequenced,
643-
altered,
644-
percent,
630+
sequenced: info.sequenced,
631+
alteredAndSequenced: info.alteredAndSequenced,
632+
altered: info.altered,
633+
percent: info.percent,
645634
};
646635
}
647636

@@ -667,23 +656,19 @@ export function alterationInfoForCaseAggregatedDataByOQLLine(
667656
.map(e => e[0])
668657
.value();
669658

670-
const sequenced = getAlterationInfoSequenced(
659+
const info = getAlterationInfo(
671660
sampleMode,
672661
data.oql,
673662
sequencedSampleKeysByGene,
674663
sequencedPatientKeysByGene,
675664
new Set(alteredEntities)
676665
);
677666

678-
const altered = alteredEntities.length;
679-
680-
const percent = percentAltered(altered, sequenced.sequenced);
681-
682667
return {
683-
sequenced: sequenced.sequenced,
684-
alteredAndSequenced: sequenced.alteredAndSequenced,
685-
altered,
686-
percent,
668+
sequenced: info.sequenced,
669+
alteredAndSequenced: info.alteredAndSequenced,
670+
altered: info.altered,
671+
percent: info.percent,
687672
};
688673
}
689674

0 commit comments

Comments
 (0)