import * as React from 'react';
import {
DiscreteCopyNumberData,
CopyNumberCount,
} from 'cbioportal-ts-api-client';
import FrequencyBar from 'shared/components/cohort/FrequencyBar';
import { IGisticData, IGisticSummary } from 'shared/model/Gistic';
import { getPercentage } from 'shared/lib/FormatUtils';
import CopyNumberCountCache from '../../clinicalInformation/CopyNumberCountCache';
import { CacheData } from '../../../../shared/lib/LazyMobXCache';
import { DefaultTooltip } from 'cbioportal-frontend-commons';
import { If, Then } from 'react-if';
import GisticAnnotation from 'shared/components/annotation/Gistic';
export default class CohortColumnFormatter {
public static renderFunction(
data: DiscreteCopyNumberData[],
copyNumberCountCache: CopyNumberCountCache,
gisticData: IGisticData
) {
const copyNumberCount = CohortColumnFormatter.getCopyNumberCount(
data,
copyNumberCountCache
);
const freqViz = CohortColumnFormatter.makeCohortFrequencyViz(
data,
copyNumberCount
);
const gisticValue = CohortColumnFormatter.getGisticValue(
data,
gisticData
);
let qValue = 0;
let peakGeneCount = 0;
if (gisticValue !== null) {
qValue = gisticValue.qValue;
peakGeneCount = gisticValue.peakGeneCount;
}
return (
{freqViz !== null && freqViz}
);
}
public static makeCohortFrequencyViz(
data: DiscreteCopyNumberData[],
cacheDatum: CacheData | null
) {
if (cacheDatum !== null) {
const copyNumberCount = cacheDatum.data;
if (cacheDatum.status === 'complete' && copyNumberCount) {
const counts = [
copyNumberCount.numberOfSamplesWithAlterationInGene,
];
const colors = data[0].alteration > 0 ? ['red'] : ['blue'];
return (
);
} else if (cacheDatum.status === 'complete') {
return (
Data not available for this gene and alteration.
}
>
NA
);
} else {
return (
Error retrieving data.}
>
ERROR
);
}
} else {
return (
Querying server for data.}
>
LOADING
);
}
}
public static tooltipContent(
data: DiscreteCopyNumberData[],
copyNumberCount: CopyNumberCount
) {
const count = copyNumberCount.numberOfSamplesWithAlterationInGene;
const proportion =
copyNumberCount.numberOfSamplesWithAlterationInGene /
copyNumberCount.numberOfSamples;
const boldPercentage = {getPercentage(proportion)};
const gene = data[0].gene.hugoGeneSymbol;
const cna = data[0].alteration === -2 ? 'deleted' : 'amplified';
const samples = count === 1 ? 'sample' : 'samples';
const have = count === 1 ? 'has' : 'have';
return (
{count} {samples} ({boldPercentage}) in this study {have} {cna}{' '}
{gene}
);
}
public static getSortValue(
data: DiscreteCopyNumberData[],
copyNumberCountCache: CopyNumberCountCache
): number | null {
const copyNumberCount = CohortColumnFormatter.getCopyNumberCount(
data,
copyNumberCountCache
);
if (copyNumberCount && copyNumberCount.data) {
return copyNumberCount.data.numberOfSamplesWithAlterationInGene;
} else {
return null;
}
}
public static getDownloadValue(
data: DiscreteCopyNumberData[],
copyNumberCountCache: CopyNumberCountCache
) {
const copyNumberCount = CohortColumnFormatter.getCopyNumberCount(
data,
copyNumberCountCache
);
if (copyNumberCount && copyNumberCount.data) {
const proportion =
copyNumberCount.data.numberOfSamplesWithAlterationInGene /
copyNumberCount.data.numberOfSamples;
return getPercentage(proportion);
} else {
return 'N/A';
}
}
private static getCopyNumberCount(
data: DiscreteCopyNumberData[],
copyNumberCountCache: CopyNumberCountCache
): CacheData | null {
return copyNumberCountCache.get({
entrezGeneId: data[0].entrezGeneId,
alteration: data[0].alteration,
});
}
public static getGisticValue(
data: DiscreteCopyNumberData[],
gisticData: IGisticData
): IGisticSummary | null {
const gistic = gisticData[data[0].entrezGeneId];
let summary: IGisticSummary | undefined;
if (gistic) {
// here we are assuming that we have at most 2 values in the GisticSummary array:
// one for amp === true, and one for amp === false
const targetAmp = data[0].alteration === 2;
summary = gistic.find((gs: IGisticSummary) => {
// alteration === 2 => amplified
// otherwise => not amplified (deleted)
return gs.amp === targetAmp;
});
}
return summary === undefined ? null : summary;
}
}