import _ from 'lodash'; import * as React from 'react'; import classnames from 'classnames'; import { observer } from 'mobx-react'; import featureTableStyle from '../featureTable/FeatureTable.module.scss'; import { action, computed, makeObservable, observable } from 'mobx'; import { DefaultTooltip } from 'cbioportal-frontend-commons'; import { SignalAnnotation, SignalMutation } from 'genome-nexus-ts-api-client'; import { signalLogoInTable } from '../featureTable/SignalLogo'; import mskImpactStyle from './MskImpact.module.scss'; import { formatFrequencyValue } from 'cbioportal-utils'; import { MskImpactFrequencyDigits } from '../../util/Constants'; interface IMskImpactProps { signalAnnotation: SignalAnnotation | undefined; } @observer class MskImpact extends React.Component { @observable private showFrequencies = false; constructor(props: IMskImpactProps) { super(props); makeObservable(this); } @computed get mskImpactContent() { let mskImpactFrequency = (
N/A
); if ( this.props.signalAnnotation && this.props.signalAnnotation.annotation.length > 0 ) { _.forEach(this.props.signalAnnotation.annotation, annotation => { if ( annotation.generalPopulationStats && annotation.generalPopulationStats.frequencies ) { // only germline mutation has generalPopulationStats, so mskImpactFrequency won't be overwritten by somatic mskImpactFrequency = (
{formatFrequencyValue( annotation.generalPopulationStats.frequencies .impact, MskImpactFrequencyDigits )} {`% `}
); } }); } return mskImpactFrequency; } private generateFrequencyCell(population: string, frequency: number) { return (
{`> ${_.upperCase(population)}`}
{`${formatFrequencyValue( frequency, MskImpactFrequencyDigits )}%`}
); } private frequenciesTable(signalAnnotation: SignalMutation[]) { let frequenciesTable: JSX.Element[] = []; // could have both somatic and germline mutations, only germline mutation has generalPopulationStats _.forEach(signalAnnotation, mutation => { if ( mutation.generalPopulationStats && mutation.generalPopulationStats.frequencies ) { // generate table element with population and frequency _.map( mutation.generalPopulationStats.frequencies, (frequency, population) => { if (population !== 'impact') { frequenciesTable.push( this.generateFrequencyCell( population, frequency ) ); } } ); } }); return frequenciesTable; } public render() { return ( <>
Frequency of the variant in MSK-IMPACT cohort } > MSK-IMPACT {signalLogoInTable}
{this.mskImpactContent}
{/* only when frequencies data exists, showFrequencies could be true, otherwise showFrequencies is always false */} {this.showFrequencies && this.frequenciesTable( this.props.signalAnnotation!.annotation )} ); } @action.bound public onClick() { this.showFrequencies = !this.showFrequencies; } } export default MskImpact;