import { DefaultTooltip } from 'cbioportal-frontend-commons';
import classNames from 'classnames';
import { MutationAssessor as MutationAssessorData } from 'genome-nexus-ts-api-client';
import { observer } from 'mobx-react';
import * as React from 'react';
import { Table } from 'react-bootstrap';
import featureTableStyle from '../featureTable/FeatureTable.module.scss';
import functionalImpactColor from '../featureTable/FunctionalImpactTooltip.module.scss';
import tooltipStyles from './MutationAssessorTooltip.module.scss';
import mutationAssessorLogo from '../../image/mutationAssessor.png';
// Most of this component comes from cBioPortal-frontend
export interface IMutationAssessorProps {
mutationAssessor: MutationAssessorData | undefined;
isCanonicalTranscriptSelected: boolean;
}
export function hideArrow(tooltipEl: any) {
const arrowEl = tooltipEl.querySelector('.rc-tooltip-arrow');
arrowEl.style.display = 'true';
}
@observer
export default class MutationAssessor extends React.Component<
IMutationAssessorProps,
{}
> {
private static MUTATION_ASSESSOR_URL: string =
'http://mutationassessor.org/r3/';
private static mutationAssessorText() {
return (
Mutation Assessor
{' '}
predicts the functional impact of amino-acid substitutions in
proteins, such as mutations discovered in cancer or missense
polymorphisms. The functional impact is assessed based on
evolutionary conservation of the affected amino acid in protein
homologs. The method has been validated on a large set (60k) of
disease associated (OMIM) and polymorphic variants.
);
}
private static mutationAssessorTooltipTable() {
return (
| Legend |
Qualitative prediction
|
|
|
High
|
|
|
Medium
|
|
|
Low
|
|
|
Neutral
|
);
}
// This is mostly to make the legacy MA links work
private static maLink(link: string | undefined) {
let url = null;
// ignore invalid links ("", "NA", "Not Available")
if (link) {
// getma.org is the legacy link, need to replace it with the actual value
url = link.replace('getma.org', 'mutationassessor.org/r3');
// prepend "http://" if needed
if (url.indexOf('http://') !== 0) {
url = `http://${url}`;
}
}
return url;
}
constructor(props: IMutationAssessorProps) {
super(props);
this.mutationAssessorData = this.mutationAssessorData.bind(this);
}
public render() {
let maContent: JSX.Element = ;
const dataSource = (
<>
Mutation Assessor
{!this.props.isCanonicalTranscriptSelected && *}
>
);
if (
this.props.mutationAssessor &&
this.props.mutationAssessor.functionalImpact != null &&
this.props.mutationAssessor.functionalImpact !== ''
) {
const maData = this.props.mutationAssessor;
maContent = {maData.functionalImpact};
} else {
maContent = N/A;
}
return (
);
}
private mutationAssessorData() {
if (this.props.mutationAssessor) {
const maData = this.props.mutationAssessor;
const xVarLink = MutationAssessor.maLink(
`http://mutationassessor.org/r3/?cm=var&p=${maData.uniprotId}&var=${maData.variant}`
);
const msaLink = MutationAssessor.maLink(maData.msaLink);
const pdbLink = MutationAssessor.maLink(maData.pdbLink);
const impact = maData.functionalImpact ? (
{(maData.functionalImpactScore ||
maData.functionalImpactScore === 0) && (
| Score |
{maData.functionalImpactScore.toFixed(
2
)}
|
)}
Please refer to the score range{' '}
here
.
) : null;
const xVar =
xVarLink &&
maData.uniprotId.length !== 0 &&
maData.variant.length !== 0 ? (
) : null;
const msa =
msaLink && maData.msaLink.length !== 0 ? (
) : null;
const pdb =
pdbLink && maData.pdbLink.length !== 0 ? (
) : null;
return (
{impact}
{msa}
{pdb}
{xVar}
);
}
return null;
}
private mutationAssessorTooltip(tooltipTrigger: JSX.Element) {
return (
{MutationAssessor.mutationAssessorText()}
{this.mutationAssessorData()}
{MutationAssessor.mutationAssessorTooltipTable()}
}
>
{tooltipTrigger}
);
}
}