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 Mutation Assessor  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 (
{this.mutationAssessorTooltip( {dataSource} )}
{this.mutationAssessorTooltip( {maContent} )}
); } 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 ? (
Mutation Assessor Go to Mutation Assessor
) : null; const msa = msaLink && maData.msaLink.length !== 0 ? (
msa Multiple Sequence Alignment
) : null; const pdb = pdbLink && maData.pdbLink.length !== 0 ? (
3D Mutation Assessor 3D View
) : null; return (
{impact} {msa} {pdb} {xVar}
); } return null; } private mutationAssessorTooltip(tooltipTrigger: JSX.Element) { return ( {MutationAssessor.mutationAssessorText()} {this.mutationAssessorData()} {MutationAssessor.mutationAssessorTooltipTable()} } > {tooltipTrigger} ); } }