import * as React from 'react';
import _ from 'lodash';
import { observer } from 'mobx-react';
import autobind from 'autobind-decorator';
import LazyMobXTable from 'shared/components/lazyMobXTable/LazyMobXTable';
import { toConditionalPrecision } from 'shared/lib/NumberUtils';
import { ClinicalDataEnrichmentStore } from './ClinicalData';
import { ClinicalDataEnrichmentWithQ } from './GroupComparisonUtils';
import { toConditionalPrecisionWithMinimum } from '../../shared/lib/FormatUtils';
import { makeObservable, observable } from 'mobx';
import { toggleColumnVisibility } from 'cbioportal-frontend-commons';
import { IColumnVisibilityDef } from 'shared/components/columnVisibilityControls/ColumnVisibilityControls';
import { getServerConfig } from 'config/config';
export interface IClinicalDataEnrichmentsTableProps {
dataStore: ClinicalDataEnrichmentStore;
}
export enum ClinicalDataEnrichmentTableColumnType {
CLINICAL_ATTRIBUTE_NAME = 'Clinical Attribute',
CLINICAL_ATTRIBUTE_TYPE = 'Attribute Type',
STATISTICAL_TEST_NAME = 'Statistical Test',
SCORE = 'Score',
P_VALUE = 'p-Value',
Q_VALUE = 'q-Value',
}
const COLUMNS = [
{
name: ClinicalDataEnrichmentTableColumnType.CLINICAL_ATTRIBUTE_NAME,
render: (d: ClinicalDataEnrichmentWithQ) => (
{d.clinicalAttribute.displayName}
),
filter: (
d: ClinicalDataEnrichmentWithQ,
f: string,
filterStringUpper: string
) =>
d.clinicalAttribute.displayName
.toUpperCase()
.indexOf(filterStringUpper) > -1,
sortBy: (d: ClinicalDataEnrichmentWithQ) =>
d.clinicalAttribute.displayName,
download: (d: ClinicalDataEnrichmentWithQ) =>
d.clinicalAttribute.displayName,
width: 160,
visible: true,
},
{
name: ClinicalDataEnrichmentTableColumnType.CLINICAL_ATTRIBUTE_TYPE,
render: (d: ClinicalDataEnrichmentWithQ) => (
{d.clinicalAttribute.patientAttribute ? 'Patient' : 'Sample'}
),
filter: (
d: ClinicalDataEnrichmentWithQ,
f: string,
filterStringUpper: string
) =>
(d.clinicalAttribute.patientAttribute ? 'Patient' : 'Sample')
.toUpperCase()
.indexOf(filterStringUpper) > -1,
sortBy: (d: ClinicalDataEnrichmentWithQ) =>
d.clinicalAttribute.patientAttribute ? 'Patient' : 'Sample',
download: (d: ClinicalDataEnrichmentWithQ) =>
d.clinicalAttribute.patientAttribute ? 'Patient' : 'Sample',
width: 100,
visible: true,
},
{
name: ClinicalDataEnrichmentTableColumnType.STATISTICAL_TEST_NAME,
render: (d: ClinicalDataEnrichmentWithQ) => (
{d.method}
),
filter: (
d: ClinicalDataEnrichmentWithQ,
f: string,
filterStringUpper: string
) => d.method.toUpperCase().indexOf(filterStringUpper) > -1,
sortBy: (d: ClinicalDataEnrichmentWithQ) => d.method,
download: (d: ClinicalDataEnrichmentWithQ) => d.method,
width: 130,
visible: true,
},
{
name: ClinicalDataEnrichmentTableColumnType.P_VALUE,
render: (d: ClinicalDataEnrichmentWithQ) => (
{toConditionalPrecisionWithMinimum(d.pValue, 3, 0.01, -10)}
),
sortBy: (d: ClinicalDataEnrichmentWithQ) => d.pValue,
download: (d: ClinicalDataEnrichmentWithQ) =>
toConditionalPrecision(d.pValue, 3, 0.01),
width: 100,
tooltip: (
p-value of null Hypothesis, derived from Chi-Squared test or
Kruskal-Wallis test
),
visible: true,
},
{
name: ClinicalDataEnrichmentTableColumnType.Q_VALUE,
render: (d: ClinicalDataEnrichmentWithQ) => (
{toConditionalPrecisionWithMinimum(d.qValue, 3, 0.01, -10)}
),
sortBy: (d: ClinicalDataEnrichmentWithQ) => d.qValue,
download: (d: ClinicalDataEnrichmentWithQ) =>
toConditionalPrecision(d.qValue, 3, 0.01),
width: 100,
tooltip: (
Derived from Benjamini-Hochberg FDR correction procedure.
),
visible: true,
},
];
@observer
export default class ClinicalDataEnrichmentsTable extends React.Component<
IClinicalDataEnrichmentsTableProps,
{}
> {
@autobind
private onRowClick(d: ClinicalDataEnrichmentWithQ) {
this.props.dataStore.setHighlighted(d);
}
@observable private columnVisibility: { [group: string]: boolean };
constructor(props: IClinicalDataEnrichmentsTableProps) {
super(props);
makeObservable(this);
this.columnVisibility = this.initColumnVisibility();
}
private initColumnVisibility() {
const P_Q_VALUES_AND_STATISTICAL_TEST_NAME_DICT = _.keyBy(
[
ClinicalDataEnrichmentTableColumnType.STATISTICAL_TEST_NAME,
ClinicalDataEnrichmentTableColumnType.P_VALUE,
ClinicalDataEnrichmentTableColumnType.Q_VALUE,
],
name => name
);
return _.mapValues(
_.keyBy(COLUMNS, c => c.name),
c =>
getServerConfig()
.survival_show_p_q_values_in_survival_type_table
? c.visible!
: !(c.name in P_Q_VALUES_AND_STATISTICAL_TEST_NAME_DICT)
);
}
@autobind
private onColumnToggled(
columnId: string,
columnVisibilityDefs: IColumnVisibilityDef[]
) {
this.columnVisibility = toggleColumnVisibility(
this.columnVisibility,
columnId,
columnVisibilityDefs
);
}
public render() {
return (
);
}
}