From 10ca8f11433759a76f602f4f30357d4541b8eadb Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Wed, 16 Aug 2023 17:39:31 -0400 Subject: [PATCH 01/15] oncoprint color config for mutations testing --- src/pages/resultsView/ResultsViewPageStore.ts | 56 ++++++ src/shared/components/oncoprint/DeltaUtils.ts | 59 ++++-- src/shared/components/oncoprint/Oncoprint.tsx | 6 +- .../oncoprint/ResultsViewOncoprint.tsx | 81 +++++++- .../oncoprint/controls/OncoprintColors.tsx | 181 ++++++++++++++++++ .../oncoprint/controls/OncoprintControls.tsx | 96 +++++++++- 6 files changed, 455 insertions(+), 24 deletions(-) create mode 100644 src/shared/components/oncoprint/controls/OncoprintColors.tsx diff --git a/src/pages/resultsView/ResultsViewPageStore.ts b/src/pages/resultsView/ResultsViewPageStore.ts index 42e6e8f635f..204530f996c 100644 --- a/src/pages/resultsView/ResultsViewPageStore.ts +++ b/src/pages/resultsView/ResultsViewPageStore.ts @@ -304,6 +304,7 @@ import { ONCOKB_DEFAULT_INFO, USE_DEFAULT_PUBLIC_INSTANCE_FOR_ONCOKB, } from 'react-mutation-mapper'; +import { RGBAColor } from 'oncoprintjs'; type Optional = | { isApplicable: true; value: T } @@ -573,6 +574,15 @@ export class ResultsViewPageStore extends AnalysisStore @observable queryFormVisible: boolean = false; + @observable userAlterationColors: { + [alteration: string]: string | undefined; + } = {}; + + private _selectedComparisonGroupsWarningSigns = observable.map< + string, + boolean + >({}, { deep: false }); + @computed get doNonSelectedDownloadableMolecularProfilesExist() { return ( this.nonSelectedDownloadableMolecularProfilesGroupByName.result && @@ -586,6 +596,52 @@ export class ResultsViewPageStore extends AnalysisStore | ModifyQueryParams | undefined = undefined; + @action.bound + public onAlterationColorChange( + alteration: string, + color: string | undefined + ) { + if (color == undefined && this.userAlterationColors[alteration]) { + delete this.userAlterationColors[alteration]; + } else this.userAlterationColors[alteration] = color; + } + + @action public showAlterationWarningSign( + alteration: string, + markedValue: boolean + ) { + this._selectedComparisonGroupsWarningSigns.set(alteration, markedValue); + } + + public flagDuplicateColorsForAlterations( + alteration: string, + color: string | undefined + ) { + let colors: { [color: string]: number } = {}; + + Object.keys(this.userAlterationColors).forEach( + (a: string, i: number) => { + let alterationColor = + a === alteration ? color : this.userAlterationColors[a]; + if ( + alterationColor == undefined || + colors[alterationColor] == undefined + ) { + if (alterationColor != undefined) + colors[alterationColor] = 1; + this.showAlterationWarningSign(alteration, false); + } else { + colors[alterationColor] = colors[alterationColor] + 1; + this.showAlterationWarningSign(alteration, true); + } + } + ); + } + + public isAlterationMarkedWithWarningSign(alteration: string): boolean { + return !!this._selectedComparisonGroupsWarningSigns.get(alteration); + } + @action.bound public setOncoprintAnalysisCaseType(e: OncoprintAnalysisCaseType) { this.urlWrapper.updateURL({ diff --git a/src/shared/components/oncoprint/DeltaUtils.ts b/src/shared/components/oncoprint/DeltaUtils.ts index c4225c5b9bd..0f53eb589e4 100644 --- a/src/shared/components/oncoprint/DeltaUtils.ts +++ b/src/shared/components/oncoprint/DeltaUtils.ts @@ -15,6 +15,7 @@ import { SortConfig, TrackId, UserTrackSpec, + IGeneticAlterationRuleSetParams, } from 'oncoprintjs'; import _ from 'lodash'; import { @@ -60,7 +61,8 @@ export function transition( getTrackSpecKeyToTrackId: () => { [key: string]: TrackId }, getMolecularProfileMap: () => | { [molecularProfileId: string]: MolecularProfile } - | undefined + | undefined, + customRule?: IGeneticAlterationRuleSetParams ) { const notKeepingSorted = shouldNotKeepSortedForTransition( nextProps, @@ -90,7 +92,8 @@ export function transition( prevProps, oncoprint, getTrackSpecKeyToTrackId, - getMolecularProfileMap + getMolecularProfileMap, + customRule ); transitionSortConfig(nextProps, prevProps, oncoprint); transitionTrackGroupSortPriority(nextProps, prevProps, oncoprint); @@ -587,7 +590,8 @@ function hasGeneticTrackRuleSetChanged( prevProps.distinguishMutationType || nextProps.distinguishDrivers !== prevProps.distinguishDrivers || nextProps.distinguishGermlineMutations !== - prevProps.distinguishGermlineMutations + prevProps.distinguishGermlineMutations || + nextProps.test !== prevProps.test ); } @@ -598,7 +602,8 @@ function transitionTracks( getTrackSpecKeyToTrackId: () => { [key: string]: TrackId }, getMolecularProfileMap: () => | { [molecularProfileId: string]: MolecularProfile } - | undefined + | undefined, + customRule?: IGeneticAlterationRuleSetParams ) { // Initialize tracks for rule set sharing const trackIdForRuleSetSharing = { @@ -740,7 +745,9 @@ function transitionTracks( oncoprint, nextProps, prevProps, - trackIdForRuleSetSharing + trackIdForRuleSetSharing, + undefined, + customRule ); delete prevGeneticTracks[track.key]; } @@ -756,7 +763,9 @@ function transitionTracks( oncoprint, nextProps, prevProps, - trackIdForRuleSetSharing + trackIdForRuleSetSharing, + undefined, + customRule ); } } @@ -1093,13 +1102,26 @@ function transitionGeneticTrack( nextProps: IOncoprintProps, prevProps: Partial, trackIdForRuleSetSharing: { genetic?: TrackId }, - expansionParentKey?: string + expansionParentKey?: string, + customRule?: IGeneticAlterationRuleSetParams ) { const trackSpecKeyToTrackId = getTrackSpecKeyToTrackId(); if (tryRemoveTrack(nextSpec, prevSpec, trackSpecKeyToTrackId, oncoprint)) { // Remove track return; } else if (nextSpec && !prevSpec) { + let rule = customRule + ? customRule + : getGeneticTrackRuleSetParams( + nextProps.distinguishMutationType, + nextProps.distinguishDrivers, + nextProps.distinguishGermlineMutations + ); + console.log(rule); + // if (rule.rule_params.conditional.disp_mut.inframe) { + // console.log('hi') + // rule.rule_params.conditional.disp_mut.inframe.shapes[0].fill = [153, 52, 4, 1] + // } // Add track const createCustomOncoprintTooltip = getCustomJsFunctions() .createCustomOncoprintTooltip; @@ -1115,11 +1137,7 @@ function transitionGeneticTrack( ); } const geneticTrackParams: UserTrackSpec = { - rule_set_params: getGeneticTrackRuleSetParams( - nextProps.distinguishMutationType, - nextProps.distinguishDrivers, - nextProps.distinguishGermlineMutations - ), + rule_set_params: rule, label: nextSpec.label, sublabel: nextSpec.sublabel, track_label_color: nextSpec.labelColor || undefined, @@ -1211,15 +1229,16 @@ function transitionGeneticTrack( trackId ); } else { + let rule = customRule + ? customRule + : getGeneticTrackRuleSetParams( + nextProps.distinguishMutationType, + nextProps.distinguishDrivers, + nextProps.distinguishGermlineMutations + ); + console.log(rule); // otherwise, update ruleset - oncoprint.setRuleSet( - trackId, - getGeneticTrackRuleSetParams( - nextProps.distinguishMutationType, - nextProps.distinguishDrivers, - nextProps.distinguishGermlineMutations - ) - ); + oncoprint.setRuleSet(trackId, rule); } } // either way, use this one now diff --git a/src/shared/components/oncoprint/Oncoprint.tsx b/src/shared/components/oncoprint/Oncoprint.tsx index 25a7fd6059d..95e82776165 100644 --- a/src/shared/components/oncoprint/Oncoprint.tsx +++ b/src/shared/components/oncoprint/Oncoprint.tsx @@ -7,6 +7,7 @@ import { TrackSortDirection, InitParams, ColumnLabel, + IGeneticAlterationRuleSetParams, } from 'oncoprintjs'; import { GenePanelData, MolecularProfile } from 'cbioportal-ts-api-client'; import { observer } from 'mobx-react'; @@ -275,6 +276,8 @@ export interface IOncoprintProps { alterationTypesInQuery?: string[]; distinguishMutationType?: boolean; + test?: boolean; + rule?: IGeneticAlterationRuleSetParams; distinguishDrivers?: boolean; distinguishGermlineMutations?: boolean; @@ -386,7 +389,8 @@ export default class Oncoprint extends React.Component { () => this.trackSpecKeyToTrackId, () => { return this.props.molecularProfileIdToMolecularProfile; - } + }, + this.props.rule ); this.lastTransitionProps = _.clone(props); } diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index b3ccc60fac7..fa47d1a0909 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -42,6 +42,7 @@ import { AlterationTypeConstants } from 'shared/constants'; import { ResultsViewPageStore } from '../../../pages/resultsView/ResultsViewPageStore'; import { getAlteredUids, + getGeneticTrackRuleSetParams, getUnalteredUids, makeClinicalTracksMobxPromise, makeGenericAssayProfileCategoricalTracksMobxPromise, @@ -55,7 +56,13 @@ import _ from 'lodash'; import { onMobxPromise, toPromise } from 'cbioportal-frontend-commons'; import { getServerConfig } from 'config/config'; import LoadingIndicator from 'shared/components/loadingIndicator/LoadingIndicator'; -import { OncoprintJS, TrackGroupIndex, TrackId } from 'oncoprintjs'; +import { + IGeneticAlterationRuleSetParams, + OncoprintJS, + RGBAColor, + TrackGroupIndex, + TrackId, +} from 'oncoprintjs'; import fileDownload from 'react-file-download'; import tabularDownload from './tabularDownload'; import classNames from 'classnames'; @@ -90,6 +97,7 @@ import '../../../globalStyles/oncoprintStyles.scss'; import { GenericAssayTrackInfo } from 'pages/studyView/addChartButton/genericAssaySelection/GenericAssaySelection'; import { toDirectionString } from './SortUtils'; import { RestoreClinicalTracksMenu } from 'pages/resultsView/oncoprint/RestoreClinicalTracksMenu'; +import { hexToRGBA } from 'shared/lib/Colors'; interface IResultsViewOncoprintProps { divId: string; @@ -254,6 +262,15 @@ export default class ResultsViewOncoprint extends React.Component< @observable renderingComplete = false; + @observable + rule: IGeneticAlterationRuleSetParams = getGeneticTrackRuleSetParams( + this.distinguishMutationType, + this.distinguishDrivers, + this.distinguishGermlineMutations + ); + + @observable test: boolean = false; + private heatmapGeneInputValueUpdater: IReactionDisposer; private molecularProfileIdToTrackGroupIndex: { @@ -486,9 +503,15 @@ export default class ResultsViewOncoprint extends React.Component< get sortByCaseListDisabled() { return !self.caseListSortPossible; }, + get rule() { + return self.rule; + }, get distinguishMutationType() { return self.distinguishMutationType; }, + get test() { + return self.test; + }, get distinguishDrivers() { return self.distinguishDrivers; }, @@ -706,6 +729,12 @@ export default class ResultsViewOncoprint extends React.Component< onSelectDistinguishMutationType: (s: boolean) => { this.distinguishMutationType = s; }, + onSelectTest: (s: boolean) => { + this.test = s; + }, + onSetRule: (rule: IGeneticAlterationRuleSetParams) => { + this.rule = rule; + }, onSelectDistinguishDrivers: action((s: boolean) => { if (!s) { this.props.store.driverAnnotationSettings.oncoKb = false; @@ -1691,6 +1720,7 @@ export default class ResultsViewOncoprint extends React.Component< this .selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl } + setRules={this.setRules} /> ); @@ -1794,6 +1824,53 @@ export default class ResultsViewOncoprint extends React.Component< return WindowStore.size.width - 75; } + @action.bound + public setRules(alteration: string, color: RGBAColor | undefined) { + if (color == undefined) { + this.rule = getGeneticTrackRuleSetParams( + this.distinguishMutationType, + this.distinguishDrivers, + this.distinguishGermlineMutations + ); + for (alteration in this.props.store.userAlterationColors) { + if ( + this.props.store.userAlterationColors[alteration] !== + undefined + ) { + this.rule.rule_params.conditional.disp_mut[ + alteration + ].shapes[0].fill = hexToRGBA( + this.props.store.userAlterationColors[alteration]! + ); + } + } + } else { + // const rules = getGeneticTrackRuleSetParams(this.distinguishMutationType, + // this.distinguishDrivers, + // this.distinguishGermlineMutations + // ); + // if (rules.rule_params.conditional.disp_mut.missense && this.test) { + // rules.rule_params.conditional.disp_mut.missense.shapes[0].fill = [0, 128, 0, 1] + // } + // else if (rules.rule_params.conditional.disp_mut.missense && !this.test) { + // rules.rule_params.conditional.disp_mut.missense.shapes[0].fill = [83, 212, 0, 1] + // } + if (this.rule.rule_params.conditional.disp_mut[alteration]) { + this.rule.rule_params.conditional.disp_mut[ + alteration + ].shapes[0].fill = color; + } + // else if (rules.rule_params.conditional.disp_mut['splice,missense,inframe,trunc,promoter,other'] && this.test) { + // rules.rule_params.conditional.disp_mut['splice,missense,inframe,trunc,promoter,other'].shapes[0].fill = [0, 128, 0, 1] + // } + // else if (rules.rule_params.conditional.disp_mut['splice,missense,inframe,trunc,promoter,other'] && !this.test) { + // rules.rule_params.conditional.disp_mut['splice,missense,inframe,trunc,promoter,other'].shapes[0].fill = [83, 212, 0, 1] + // } + // this.rule = rules; + } + console.log(this.rule); + } + public render() { getBrowserWindow().donk = this; return ( @@ -1895,6 +1972,7 @@ export default class ResultsViewOncoprint extends React.Component< distinguishMutationType={ this.distinguishMutationType } + test={this.test} distinguishDrivers={this.distinguishDrivers} distinguishGermlineMutations={ this.distinguishGermlineMutations @@ -1918,6 +1996,7 @@ export default class ResultsViewOncoprint extends React.Component< initParams={{ max_height: Number.POSITIVE_INFINITY, }} + rule={this.rule} /> diff --git a/src/shared/components/oncoprint/controls/OncoprintColors.tsx b/src/shared/components/oncoprint/controls/OncoprintColors.tsx new file mode 100644 index 00000000000..8cd23a2c4eb --- /dev/null +++ b/src/shared/components/oncoprint/controls/OncoprintColors.tsx @@ -0,0 +1,181 @@ +import * as React from 'react'; +import { observer } from 'mobx-react'; +import autobind from 'autobind-decorator'; +import { action, computed, makeObservable, observable } from 'mobx'; +import styles from '../styles.module.scss'; +import { CirclePicker, CirclePickerProps } from 'react-color'; +import { OverlayTrigger, Popover } from 'react-bootstrap'; +import { DefaultTooltip } from 'cbioportal-frontend-commons'; +import { ColorPickerIcon } from 'pages/groupComparison/comparisonGroupManager/ColorPickerIcon'; +import { + CLI_FEMALE_COLOR, + CLI_NO_COLOR, + CLI_YES_COLOR, + DARK_GREY, +} from 'shared/lib/Colors'; +import { COLORS } from 'pages/studyView/StudyViewUtils'; +import { ResultsViewPageStore } from 'pages/resultsView/ResultsViewPageStore'; +import { + IOncoprintControlsHandlers, + IOncoprintControlsState, +} from './OncoprintControls'; +import { RGBAColor } from 'oncoprintjs'; + +export interface IGroupCheckboxProps { + alteration: string; + store?: ResultsViewPageStore; + handlers: IOncoprintControlsHandlers; + state: IOncoprintControlsState; + setRules?: (alteration: string, color: RGBAColor | undefined) => void; + color?: string; + markedWithWarningSign: boolean; +} + +const COLOR_UNDEFINED = '#FFFFFF'; + +const alterationToLabel: { [alteration: string]: string } = { + missense: 'Missense Mutation (unknown significance)', + missense_rec: 'Missense Mutation (putative driver)', + trunc: 'Truncating Mutation (unknown significance)', + trunc_rec: 'Truncating Mutation (putative driver)', + inframe: 'Inframe Mutation (unknown significance)', + inframe_rec: 'Inframe Mutation (putative driver)', + splice: 'Splice Mutation (unknown significance)', + splice_rec: 'Splice Mutation (putative driver)', + promoter: 'Promoter Mutation (unknown significance)', + promoter_rec: 'Promoter Mutation (putative driver)', + other: 'Other Mutation (unknown significance)', + other_rec: 'Other Mutation (putative driver)', +}; + +@observer +export default class OncoprintColors extends React.Component< + IGroupCheckboxProps, + {} +> { + constructor(props: IGroupCheckboxProps) { + super(props); + makeObservable(this); + } + + @action.bound + handleChangeComplete = (color: any, event: any) => { + // if same color is select, unselect it (go back to no color) + if (color.hex === this.props.color) { + this.props.store?.onAlterationColorChange( + this.props.alteration, + undefined + ); + this.props.setRules && + this.props.setRules(this.props.alteration, undefined); + this.props.store!.flagDuplicateColorsForAlterations( + this.props.alteration, + undefined + ); + } else { + this.props.store?.onAlterationColorChange( + this.props.alteration, + color.hex + ); + this.props.setRules && + this.props.setRules(this.props.alteration, [ + color.rgb.r, + color.rgb.g, + color.rgb.b, + color.rgb.a, + ]); + this.props.store!.flagDuplicateColorsForAlterations( + this.props.alteration, + color.hex + ); + } + this.props.handlers.onSelectTest && + this.props.handlers.onSelectTest(!this.props.state.test!); + this.props.handlers.onSetRule && + this.props.handlers.onSetRule(this.props.state.rule!); + }; + + @computed get colorList() { + let colors: string[] = COLORS.slice(0, 20); + colors.push(CLI_YES_COLOR); + colors.push(CLI_NO_COLOR); + colors.push(CLI_FEMALE_COLOR); + colors.push(DARK_GREY); + return colors; + } + + buildColorChooserWidget = () => ( + +
{ + e.nativeEvent.stopImmediatePropagation(); + }} + onClick={e => { + e.nativeEvent.stopImmediatePropagation(); + }} + > + +
+
+ ); + + render() { + return ( +
+ {alterationToLabel[this.props.alteration]} + + + {this.props.markedWithWarningSign && ( + + )} + + + + + + + + + +
+ ); + } +} diff --git a/src/shared/components/oncoprint/controls/OncoprintControls.tsx b/src/shared/components/oncoprint/controls/OncoprintControls.tsx index f08855e191a..d31bb002a55 100644 --- a/src/shared/components/oncoprint/controls/OncoprintControls.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintControls.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { observer } from 'mobx-react'; -import { Button, ButtonGroup } from 'react-bootstrap'; +import { Button, ButtonGroup, OverlayTrigger, Popover } from 'react-bootstrap'; import CustomDropdown from './CustomDropdown'; import ConfirmNgchmModal from './ConfirmNgchmModal'; import ReactSelect from 'react-select1'; @@ -32,7 +32,9 @@ import { import OQLTextArea, { GeneBoxType } from '../../GeneSelectionBox/OQLTextArea'; import autobind from 'autobind-decorator'; import { SingleGeneQuery } from '../../../lib/oql/oql-parser'; -import TracksMenu from 'pages/resultsView/oncoprint/TracksMenu'; +import TracksMenu, { + MIN_DROPDOWN_WIDTH, +} from 'pages/resultsView/oncoprint/TracksMenu'; import { GenericAssayTrackInfo } from 'pages/studyView/addChartButton/genericAssaySelection/GenericAssaySelection'; import { IDriverAnnotationControlsHandlers, @@ -44,6 +46,8 @@ import { ClinicalTrackConfigMap, } from 'shared/components/oncoprint/Oncoprint'; import { getServerConfig } from 'config/config'; +import { IGeneticAlterationRuleSetParams, RGBAColor } from 'oncoprintjs'; +import OncoprintColors from './OncoprintColors'; export interface IOncoprintControlsHandlers extends IDriverAnnotationControlsHandlers { @@ -58,6 +62,8 @@ export interface IOncoprintControlsHandlers onSelectShowMinimap: (showMinimap: boolean) => void; onSelectDistinguishMutationType: (distinguish: boolean) => void; onSelectDistinguishGermlineMutations: (distinguish: boolean) => void; + onSelectTest?: (distinguish: boolean) => void; + onSetRule?: (rule: IGeneticAlterationRuleSetParams) => void; onSelectHideVUS: (hide: boolean) => void; onSelectHideGermlineMutations: (hide: boolean) => void; @@ -101,6 +107,8 @@ export interface IOncoprintControlsState sortByCaseListDisabled: boolean; hidePutativePassengers: boolean; hideGermlineMutations: boolean; + test?: boolean; + rule?: IGeneticAlterationRuleSetParams; sortMode?: SortMode; clinicalAttributesPromise?: MobxPromise; @@ -136,6 +144,7 @@ export interface IOncoprintControlsProps { selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl?: { [genericAssayType: string]: string[]; }; + setRules?: (alteration: string, color: RGBAColor | undefined) => void; } export interface ISelectOption { @@ -178,6 +187,8 @@ const EVENT_KEY = { downloadOncoprinter: '29.1', horzZoomSlider: '30', viewNGCHM: '31', + test: '32', + rule: '33', }; @observer @@ -319,7 +330,23 @@ export default class OncoprintControls extends React.Component< this.props.handlers.onSelectDistinguishMutationType( !this.props.state.distinguishMutationType ); + // this.props.test && this.props.test(); + // this.props.handlers.onSetRule && + // this.props.handlers.onSetRule( + // this.props.state.rule + // ); break; + // case EVENT_KEY.rule: + // this.props.handlers.onSelectTest && + // this.props.handlers.onSelectTest( + // !this.props.state.test + // ); + // this.props.test && this.props.test(); + // this.props.handlers.onSetRule && + // this.props.handlers.onSetRule( + // this.props.state.rule + // ); + // break; case EVENT_KEY.distinguishGermlineMutations: this.props.handlers.onSelectDistinguishGermlineMutations( !this.props.state.distinguishGermlineMutations @@ -830,6 +857,70 @@ export default class OncoprintControls extends React.Component< } } + private ColorsMenuOncoprint = observer(() => { + return ( + +
+ {[ + 'missense', + 'missense_rec', + 'trunc', + 'trunc_rec', + 'inframe', + 'inframe_rec', + 'splice', + 'splice_rec', + 'promoter', + 'promoter_rec', + 'other', + 'other_rec', + ].map(alteration => ( + + ))} + {/*
Color by Alteration
+
+
+ +
+
*/} +
+
+ ); + }); + private MutationColorMenu = observer(() => { return ( + From bdab324f879a808789eb9a4cb5df766a33c38e6c Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Fri, 18 Aug 2023 16:18:24 -0400 Subject: [PATCH 02/15] add color config for all alterations --- src/pages/resultsView/ResultsViewPageStore.ts | 85 +++++++++----- .../oncoprint/ResultsViewOncoprint.tsx | 81 +++++++------ .../oncoprint/controls/OncoprintColors.tsx | 110 +++++++++++------- .../oncoprint/controls/OncoprintControls.tsx | 91 +++++---------- src/shared/lib/Colors.ts | 17 +++ 5 files changed, 214 insertions(+), 170 deletions(-) diff --git a/src/pages/resultsView/ResultsViewPageStore.ts b/src/pages/resultsView/ResultsViewPageStore.ts index 204530f996c..4e58c6f2f7f 100644 --- a/src/pages/resultsView/ResultsViewPageStore.ts +++ b/src/pages/resultsView/ResultsViewPageStore.ts @@ -304,7 +304,7 @@ import { ONCOKB_DEFAULT_INFO, USE_DEFAULT_PUBLIC_INSTANCE_FOR_ONCOKB, } from 'react-mutation-mapper'; -import { RGBAColor } from 'oncoprintjs'; +import { IGeneticAlterationRuleSetParams, RGBAColor } from 'oncoprintjs'; type Optional = | { isApplicable: true; value: T } @@ -575,7 +575,9 @@ export class ResultsViewPageStore extends AnalysisStore @observable queryFormVisible: boolean = false; @observable userAlterationColors: { - [alteration: string]: string | undefined; + [alteration: string]: { + [type: string]: RGBAColor | undefined; + }; } = {}; private _selectedComparisonGroupsWarningSigns = observable.map< @@ -599,45 +601,64 @@ export class ResultsViewPageStore extends AnalysisStore @action.bound public onAlterationColorChange( alteration: string, - color: string | undefined + type: string, + color: RGBAColor ) { - if (color == undefined && this.userAlterationColors[alteration]) { - delete this.userAlterationColors[alteration]; - } else this.userAlterationColors[alteration] = color; + this.userAlterationColors[alteration][type] = color; } - @action public showAlterationWarningSign( - alteration: string, - markedValue: boolean - ) { - this._selectedComparisonGroupsWarningSigns.set(alteration, markedValue); - } - - public flagDuplicateColorsForAlterations( - alteration: string, - color: string | undefined + @action.bound + public setDefaultUserAlterationColors( + rule: IGeneticAlterationRuleSetParams ) { - let colors: { [color: string]: number } = {}; - - Object.keys(this.userAlterationColors).forEach( - (a: string, i: number) => { - let alterationColor = - a === alteration ? color : this.userAlterationColors[a]; - if ( - alterationColor == undefined || - colors[alterationColor] == undefined - ) { - if (alterationColor != undefined) - colors[alterationColor] = 1; - this.showAlterationWarningSign(alteration, false); + for (let alteration in rule.rule_params.conditional) { + this.userAlterationColors[alteration] = {}; + for (let type in rule.rule_params.conditional[alteration]) { + if (alteration === 'disp_mrna') { + this.userAlterationColors[alteration][type] = rule + .rule_params.conditional[alteration][type].shapes[0] + .stroke as RGBAColor; } else { - colors[alterationColor] = colors[alterationColor] + 1; - this.showAlterationWarningSign(alteration, true); + this.userAlterationColors[alteration][type] = rule + .rule_params.conditional[alteration][type].shapes[0] + .fill as RGBAColor; } } - ); + } } + // @action public showAlterationWarningSign( + // alteration: string, + // markedValue: boolean + // ) { + // this._selectedComparisonGroupsWarningSigns.set(alteration, markedValue); + // } + + // public flagDuplicateColorsForAlterations( + // alteration: string, + // color: string | undefined + // ) { + // let colors: { [color: string]: number } = {}; + + // Object.keys(this.userAlterationColors).forEach( + // (a: string, i: number) => { + // let alterationColor = + // a === alteration ? color : this.userAlterationColors[a]; + // if ( + // alterationColor == undefined || + // colors[alterationColor] == undefined + // ) { + // if (alterationColor != undefined) + // colors[alterationColor] = 1; + // this.showAlterationWarningSign(alteration, false); + // } else { + // colors[alterationColor] = colors[alterationColor] + 1; + // this.showAlterationWarningSign(alteration, true); + // } + // } + // ); + // } + public isAlterationMarkedWithWarningSign(alteration: string): boolean { return !!this._selectedComparisonGroupsWarningSigns.get(alteration); } diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index fa47d1a0909..ee0661bf7f3 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -97,7 +97,6 @@ import '../../../globalStyles/oncoprintStyles.scss'; import { GenericAssayTrackInfo } from 'pages/studyView/addChartButton/genericAssaySelection/GenericAssaySelection'; import { toDirectionString } from './SortUtils'; import { RestoreClinicalTracksMenu } from 'pages/resultsView/oncoprint/RestoreClinicalTracksMenu'; -import { hexToRGBA } from 'shared/lib/Colors'; interface IResultsViewOncoprintProps { divId: string; @@ -424,6 +423,7 @@ export default class ResultsViewOncoprint extends React.Component< super(props); makeObservable(this); + this.props.store.setDefaultUserAlterationColors(this.rule); this.showOqlInLabels = props.store.queryContainsOql; (window as any).resultsViewOncoprint = this; @@ -1825,50 +1825,65 @@ export default class ResultsViewOncoprint extends React.Component< } @action.bound - public setRules(alteration: string, color: RGBAColor | undefined) { + public setRules( + alteration: string, + type: string, + color: RGBAColor | undefined + ) { if (color == undefined) { this.rule = getGeneticTrackRuleSetParams( this.distinguishMutationType, this.distinguishDrivers, this.distinguishGermlineMutations ); - for (alteration in this.props.store.userAlterationColors) { - if ( - this.props.store.userAlterationColors[alteration] !== - undefined - ) { - this.rule.rule_params.conditional.disp_mut[ - alteration - ].shapes[0].fill = hexToRGBA( - this.props.store.userAlterationColors[alteration]! - ); + for (let a in this.props.store.userAlterationColors) { + for (let t in this.props.store.userAlterationColors[a]) { + if (a === 'disp_mrna') { + if (a !== alteration && t !== type) { + this.rule.rule_params.conditional[a][ + t + ].shapes[0].stroke = this.props.store.userAlterationColors[ + a + ][t]; + } else { + this.props.store.onAlterationColorChange( + alteration, + type, + this.rule.rule_params.conditional[a][t] + .shapes[0].stroke as RGBAColor + ); + } + } else { + if (a !== alteration || t !== type) { + this.rule.rule_params.conditional[a][ + t + ].shapes[0].fill = this.props.store.userAlterationColors[ + a + ][t]; + } else { + this.props.store.onAlterationColorChange( + alteration, + type, + this.rule.rule_params.conditional[a][t] + .shapes[0].fill as RGBAColor + ); + } + } } } } else { - // const rules = getGeneticTrackRuleSetParams(this.distinguishMutationType, - // this.distinguishDrivers, - // this.distinguishGermlineMutations - // ); - // if (rules.rule_params.conditional.disp_mut.missense && this.test) { - // rules.rule_params.conditional.disp_mut.missense.shapes[0].fill = [0, 128, 0, 1] - // } - // else if (rules.rule_params.conditional.disp_mut.missense && !this.test) { - // rules.rule_params.conditional.disp_mut.missense.shapes[0].fill = [83, 212, 0, 1] - // } - if (this.rule.rule_params.conditional.disp_mut[alteration]) { - this.rule.rule_params.conditional.disp_mut[ - alteration + if (alteration === 'disp_mrna') { + this.rule.rule_params.conditional[alteration][ + type + ].shapes[0].stroke = color; + } else { + this.rule.rule_params.conditional[alteration][ + type ].shapes[0].fill = color; } - // else if (rules.rule_params.conditional.disp_mut['splice,missense,inframe,trunc,promoter,other'] && this.test) { - // rules.rule_params.conditional.disp_mut['splice,missense,inframe,trunc,promoter,other'].shapes[0].fill = [0, 128, 0, 1] - // } - // else if (rules.rule_params.conditional.disp_mut['splice,missense,inframe,trunc,promoter,other'] && !this.test) { - // rules.rule_params.conditional.disp_mut['splice,missense,inframe,trunc,promoter,other'].shapes[0].fill = [83, 212, 0, 1] - // } - // this.rule = rules; + this.props.store.onAlterationColorChange(alteration, type, color); } - console.log(this.rule); + // console.log(this.rule); } public render() { diff --git a/src/shared/components/oncoprint/controls/OncoprintColors.tsx b/src/shared/components/oncoprint/controls/OncoprintColors.tsx index 8cd23a2c4eb..0d0a5bd1ec6 100644 --- a/src/shared/components/oncoprint/controls/OncoprintColors.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintColors.tsx @@ -12,6 +12,7 @@ import { CLI_NO_COLOR, CLI_YES_COLOR, DARK_GREY, + rgbaToHex, } from 'shared/lib/Colors'; import { COLORS } from 'pages/studyView/StudyViewUtils'; import { ResultsViewPageStore } from 'pages/resultsView/ResultsViewPageStore'; @@ -23,29 +24,65 @@ import { RGBAColor } from 'oncoprintjs'; export interface IGroupCheckboxProps { alteration: string; + type: string; store?: ResultsViewPageStore; handlers: IOncoprintControlsHandlers; state: IOncoprintControlsState; - setRules?: (alteration: string, color: RGBAColor | undefined) => void; - color?: string; + setRules?: ( + alteration: string, + type: string, + color: RGBAColor | undefined + ) => void; + color: RGBAColor; markedWithWarningSign: boolean; } const COLOR_UNDEFINED = '#FFFFFF'; -const alterationToLabel: { [alteration: string]: string } = { - missense: 'Missense Mutation (unknown significance)', - missense_rec: 'Missense Mutation (putative driver)', - trunc: 'Truncating Mutation (unknown significance)', - trunc_rec: 'Truncating Mutation (putative driver)', - inframe: 'Inframe Mutation (unknown significance)', - inframe_rec: 'Inframe Mutation (putative driver)', - splice: 'Splice Mutation (unknown significance)', - splice_rec: 'Splice Mutation (putative driver)', - promoter: 'Promoter Mutation (unknown significance)', - promoter_rec: 'Promoter Mutation (putative driver)', - other: 'Other Mutation (unknown significance)', - other_rec: 'Other Mutation (putative driver)', +export const alterationToTypeToLabel: { + [alteration: string]: { [type: string]: string }; +} = { + // disp_cna + disp_cna: { + 'amp_rec,amp': 'Amplification', + 'gain_rec,gain': 'Gain', + 'hetloss_rec,hetloss': 'Shallow Deletion', + 'homdel_rec,homdel': 'Deep Deletion', + }, + // disp_germ + disp_germ: { + true: 'Germline Mutation', + }, + // disp_mrna + disp_mrna: { + high: 'mRNA High', + low: 'mRNA Low', + }, + // disp_mut + disp_mut: { + missense: 'Missense Mutation (unknown significance)', + missense_rec: 'Missense Mutation (putative driver)', + trunc: 'Truncating Mutation (unknown significance)', + trunc_rec: 'Truncating Mutation (putative driver)', + inframe: 'Inframe Mutation (unknown significance)', + inframe_rec: 'Inframe Mutation (putative driver)', + splice: 'Splice Mutation (unknown significance)', + splice_rec: 'Splice Mutation (putative driver)', + promoter: 'Promoter Mutation (unknown significance)', + promoter_rec: 'Promoter Mutation (putative driver)', + other: 'Other Mutation (unknown significance)', + other_rec: 'Other Mutation (putative driver)', + }, + // disp_prot + disp_prot: { + high: 'Protein High', + low: 'Protein Low', + }, + // disp_structuralVariant + disp_structuralVariant: { + sv: 'Structural Variant (unknown significance)', + sv_rec: 'Structural Variant (putative driver)', + }, }; @observer @@ -61,38 +98,24 @@ export default class OncoprintColors extends React.Component< @action.bound handleChangeComplete = (color: any, event: any) => { // if same color is select, unselect it (go back to no color) - if (color.hex === this.props.color) { - this.props.store?.onAlterationColorChange( - this.props.alteration, - undefined - ); + if (color.hex === rgbaToHex(this.props.color)) { this.props.setRules && - this.props.setRules(this.props.alteration, undefined); - this.props.store!.flagDuplicateColorsForAlterations( - this.props.alteration, - undefined - ); + this.props.setRules( + this.props.alteration, + this.props.type, + undefined + ); } else { - this.props.store?.onAlterationColorChange( - this.props.alteration, - color.hex - ); this.props.setRules && - this.props.setRules(this.props.alteration, [ + this.props.setRules(this.props.alteration, this.props.type, [ color.rgb.r, color.rgb.g, color.rgb.b, color.rgb.a, ]); - this.props.store!.flagDuplicateColorsForAlterations( - this.props.alteration, - color.hex - ); } this.props.handlers.onSelectTest && this.props.handlers.onSelectTest(!this.props.state.test!); - this.props.handlers.onSetRule && - this.props.handlers.onSetRule(this.props.state.rule!); }; @computed get colorList() { @@ -119,7 +142,7 @@ export default class OncoprintColors extends React.Component< circleSize={20} circleSpacing={3} onChangeComplete={this.handleChangeComplete} - color={this.props.color} + color={rgbaToHex(this.props.color)} width="140px" /> @@ -129,7 +152,11 @@ export default class OncoprintColors extends React.Component< render() { return (
- {alterationToLabel[this.props.alteration]} + { + alterationToTypeToLabel[this.props.alteration][ + this.props.type + ] + } diff --git a/src/shared/components/oncoprint/controls/OncoprintControls.tsx b/src/shared/components/oncoprint/controls/OncoprintControls.tsx index d31bb002a55..8703a996a4e 100644 --- a/src/shared/components/oncoprint/controls/OncoprintControls.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintControls.tsx @@ -47,7 +47,7 @@ import { } from 'shared/components/oncoprint/Oncoprint'; import { getServerConfig } from 'config/config'; import { IGeneticAlterationRuleSetParams, RGBAColor } from 'oncoprintjs'; -import OncoprintColors from './OncoprintColors'; +import OncoprintColors, { alterationToTypeToLabel } from './OncoprintColors'; export interface IOncoprintControlsHandlers extends IDriverAnnotationControlsHandlers { @@ -144,7 +144,11 @@ export interface IOncoprintControlsProps { selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl?: { [genericAssayType: string]: string[]; }; - setRules?: (alteration: string, color: RGBAColor | undefined) => void; + setRules?: ( + alteration: string, + type: string, + color: RGBAColor | undefined + ) => void; } export interface ISelectOption { @@ -330,23 +334,7 @@ export default class OncoprintControls extends React.Component< this.props.handlers.onSelectDistinguishMutationType( !this.props.state.distinguishMutationType ); - // this.props.test && this.props.test(); - // this.props.handlers.onSetRule && - // this.props.handlers.onSetRule( - // this.props.state.rule - // ); break; - // case EVENT_KEY.rule: - // this.props.handlers.onSelectTest && - // this.props.handlers.onSelectTest( - // !this.props.state.test - // ); - // this.props.test && this.props.test(); - // this.props.handlers.onSetRule && - // this.props.handlers.onSetRule( - // this.props.state.rule - // ); - // break; case EVENT_KEY.distinguishGermlineMutations: this.props.handlers.onSelectDistinguishGermlineMutations( !this.props.state.distinguishGermlineMutations @@ -869,53 +857,28 @@ export default class OncoprintControls extends React.Component< className="oncoprint__controls__color_menu" data-test="oncoprintColorDropdownMenu" > - {[ - 'missense', - 'missense_rec', - 'trunc', - 'trunc_rec', - 'inframe', - 'inframe_rec', - 'splice', - 'splice_rec', - 'promoter', - 'promoter_rec', - 'other', - 'other_rec', - ].map(alteration => ( - + Object.keys( + alterationToTypeToLabel[alteration] + ).map(type => ( + - ))} - {/*
Color by Alteration
-
-
- -
-
*/} + )} + /> + )) + )}
); diff --git a/src/shared/lib/Colors.ts b/src/shared/lib/Colors.ts index 9546100ae7d..4913e3dce63 100644 --- a/src/shared/lib/Colors.ts +++ b/src/shared/lib/Colors.ts @@ -13,6 +13,7 @@ import { STRUCTURAL_VARIANT_COLOR, } from 'cbioportal-frontend-commons'; import { MUT_PROFILE_COUNT_NOT_MUTATED } from 'pages/resultsView/plots/PlotsTabUtils'; +import { RGBAColor } from 'oncoprintjs'; // Default grey export const BLACK = '#000000'; export const LIGHT_GREY = '#D3D3D3'; @@ -178,3 +179,19 @@ export function hexToRGBA(str: string): [number, number, number, number] { const b = parseInt(str[5] + str[6], 16); return [r, g, b, 1]; } + +export function rgbaToHex(rgba: RGBAColor): string { + let hexR = rgba[0].toString(16); + let hexG = rgba[1].toString(16); + let hexB = rgba[2].toString(16); + if (hexR.length === 1) { + hexR = '0' + hexR; + } + if (hexG.length === 1) { + hexG = '0' + hexG; + } + if (hexB.length === 1) { + hexB = '0' + hexB; + } + return `#${hexR}${hexG}${hexB}`; +} From 17ac47c0ec0b0b38580ac3ef3e32065fa590436a Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Thu, 7 Sep 2023 16:49:15 -0400 Subject: [PATCH 03/15] use default colors as computed and refactor --- src/pages/resultsView/ResultsViewPageStore.ts | 76 ++++++++---- src/shared/components/oncoprint/DeltaUtils.ts | 7 +- src/shared/components/oncoprint/Oncoprint.tsx | 2 +- .../oncoprint/ResultsViewOncoprint.tsx | 113 ++++++++---------- .../oncoprint/controls/OncoprintColors.tsx | 14 +-- .../oncoprint/controls/OncoprintControls.tsx | 37 +++--- 6 files changed, 133 insertions(+), 116 deletions(-) diff --git a/src/pages/resultsView/ResultsViewPageStore.ts b/src/pages/resultsView/ResultsViewPageStore.ts index 4e58c6f2f7f..1e3e173689d 100644 --- a/src/pages/resultsView/ResultsViewPageStore.ts +++ b/src/pages/resultsView/ResultsViewPageStore.ts @@ -574,9 +574,15 @@ export class ResultsViewPageStore extends AnalysisStore @observable queryFormVisible: boolean = false; - @observable userAlterationColors: { - [alteration: string]: { - [type: string]: RGBAColor | undefined; + @observable userSelectedAlterationColors: { + [alterationType: string]: { + [type: string]: RGBAColor; + }; + } = {}; + + @observable _defaultAlterationColors: { + [alterationType: string]: { + [type: string]: RGBAColor; }; } = {}; @@ -600,31 +606,57 @@ export class ResultsViewPageStore extends AnalysisStore @action.bound public onAlterationColorChange( - alteration: string, + alterationType: string, type: string, - color: RGBAColor + color: RGBAColor | undefined ) { - this.userAlterationColors[alteration][type] = color; + if ( + !color && + this.userSelectedAlterationColors[alterationType] && + this.userSelectedAlterationColors[alterationType][type] + ) { + delete this.userSelectedAlterationColors[alterationType][type]; + } else if (color) { + if (!this.userSelectedAlterationColors[alterationType]) { + this.userSelectedAlterationColors[alterationType] = {}; + } + this.userSelectedAlterationColors[alterationType][type] = color; + } + } + + @computed get defaultAlterationColors() { + return this._defaultAlterationColors; } @action.bound - public setDefaultUserAlterationColors( - rule: IGeneticAlterationRuleSetParams - ) { - for (let alteration in rule.rule_params.conditional) { - this.userAlterationColors[alteration] = {}; - for (let type in rule.rule_params.conditional[alteration]) { - if (alteration === 'disp_mrna') { - this.userAlterationColors[alteration][type] = rule - .rule_params.conditional[alteration][type].shapes[0] - .stroke as RGBAColor; - } else { - this.userAlterationColors[alteration][type] = rule - .rule_params.conditional[alteration][type].shapes[0] - .fill as RGBAColor; - } + public setDefaultAlterationColors(rule: IGeneticAlterationRuleSetParams) { + let alterationColors: { + [alterationType: string]: { + [type: string]: RGBAColor; + }; + } = {}; + _.forIn( + Object.keys(rule.rule_params.conditional), + (alterationType: string) => { + alterationColors[alterationType] = {}; + _.forIn( + Object.keys(rule.rule_params.conditional[alterationType]), + (type: string) => { + if (alterationType === 'disp_mrna') { + alterationColors[alterationType][type] = rule + .rule_params.conditional[alterationType][type] + .shapes[0].stroke as RGBAColor; + } else { + alterationColors[alterationType][type] = rule + .rule_params.conditional[alterationType][type] + .shapes[0].fill as RGBAColor; + } + } + ); } - } + ); + this._defaultAlterationColors = alterationColors; + this.userSelectedAlterationColors = {}; } // @action public showAlterationWarningSign( diff --git a/src/shared/components/oncoprint/DeltaUtils.ts b/src/shared/components/oncoprint/DeltaUtils.ts index 0f53eb589e4..ba6d611ec54 100644 --- a/src/shared/components/oncoprint/DeltaUtils.ts +++ b/src/shared/components/oncoprint/DeltaUtils.ts @@ -591,7 +591,7 @@ function hasGeneticTrackRuleSetChanged( nextProps.distinguishDrivers !== prevProps.distinguishDrivers || nextProps.distinguishGermlineMutations !== prevProps.distinguishGermlineMutations || - nextProps.test !== prevProps.test + nextProps.changeRule !== prevProps.changeRule ); } @@ -1117,11 +1117,6 @@ function transitionGeneticTrack( nextProps.distinguishDrivers, nextProps.distinguishGermlineMutations ); - console.log(rule); - // if (rule.rule_params.conditional.disp_mut.inframe) { - // console.log('hi') - // rule.rule_params.conditional.disp_mut.inframe.shapes[0].fill = [153, 52, 4, 1] - // } // Add track const createCustomOncoprintTooltip = getCustomJsFunctions() .createCustomOncoprintTooltip; diff --git a/src/shared/components/oncoprint/Oncoprint.tsx b/src/shared/components/oncoprint/Oncoprint.tsx index 95e82776165..98377441a1c 100644 --- a/src/shared/components/oncoprint/Oncoprint.tsx +++ b/src/shared/components/oncoprint/Oncoprint.tsx @@ -276,7 +276,7 @@ export interface IOncoprintProps { alterationTypesInQuery?: string[]; distinguishMutationType?: boolean; - test?: boolean; + changeRule?: boolean; rule?: IGeneticAlterationRuleSetParams; distinguishDrivers?: boolean; distinguishGermlineMutations?: boolean; diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index ee0661bf7f3..3824a01bdf4 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -139,6 +139,37 @@ export type AdditionalTrackGroupRecord = { molecularProfile: MolecularProfile; }; +export function editRule( + color: RGBAColor | undefined, + alteration: string, + type: string, + store: ResultsViewPageStore, + currentRule: IGeneticAlterationRuleSetParams +) { + let rule: IGeneticAlterationRuleSetParams = currentRule; + if (color == undefined) { + if (alteration === 'disp_mrna') { + rule.rule_params.conditional[alteration][type].shapes[0].stroke = + store.defaultAlterationColors[alteration][type]; + } else { + rule.rule_params.conditional[alteration][type].shapes[0].fill = + store.defaultAlterationColors[alteration][type]; + } + } else { + if (alteration === 'disp_mrna') { + rule.rule_params.conditional[alteration][ + type + ].shapes[0].stroke = color; + } else { + rule.rule_params.conditional[alteration][ + type + ].shapes[0].fill = color; + } + } + store.onAlterationColorChange(alteration, type, color); + return rule; +} + /* fields and methods in the class below are ordered based on roughly /* chronological setup concerns, rather than on encapsulation and public API */ /* tslint:disable: member-ordering */ @@ -268,7 +299,7 @@ export default class ResultsViewOncoprint extends React.Component< this.distinguishGermlineMutations ); - @observable test: boolean = false; + @observable changeRule: boolean = false; private heatmapGeneInputValueUpdater: IReactionDisposer; @@ -423,7 +454,7 @@ export default class ResultsViewOncoprint extends React.Component< super(props); makeObservable(this); - this.props.store.setDefaultUserAlterationColors(this.rule); + this.props.store.setDefaultAlterationColors(this.rule); this.showOqlInLabels = props.store.queryContainsOql; (window as any).resultsViewOncoprint = this; @@ -509,8 +540,8 @@ export default class ResultsViewOncoprint extends React.Component< get distinguishMutationType() { return self.distinguishMutationType; }, - get test() { - return self.test; + get changeRule() { + return self.changeRule; }, get distinguishDrivers() { return self.distinguishDrivers; @@ -729,11 +760,8 @@ export default class ResultsViewOncoprint extends React.Component< onSelectDistinguishMutationType: (s: boolean) => { this.distinguishMutationType = s; }, - onSelectTest: (s: boolean) => { - this.test = s; - }, - onSetRule: (rule: IGeneticAlterationRuleSetParams) => { - this.rule = rule; + onChangeRule: (s: boolean) => { + this.changeRule = s; }, onSelectDistinguishDrivers: action((s: boolean) => { if (!s) { @@ -1720,7 +1748,7 @@ export default class ResultsViewOncoprint extends React.Component< this .selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl } - setRules={this.setRules} + setRule={this.setRule} /> ); @@ -1825,65 +1853,18 @@ export default class ResultsViewOncoprint extends React.Component< } @action.bound - public setRules( + public setRule( alteration: string, type: string, color: RGBAColor | undefined ) { - if (color == undefined) { - this.rule = getGeneticTrackRuleSetParams( - this.distinguishMutationType, - this.distinguishDrivers, - this.distinguishGermlineMutations - ); - for (let a in this.props.store.userAlterationColors) { - for (let t in this.props.store.userAlterationColors[a]) { - if (a === 'disp_mrna') { - if (a !== alteration && t !== type) { - this.rule.rule_params.conditional[a][ - t - ].shapes[0].stroke = this.props.store.userAlterationColors[ - a - ][t]; - } else { - this.props.store.onAlterationColorChange( - alteration, - type, - this.rule.rule_params.conditional[a][t] - .shapes[0].stroke as RGBAColor - ); - } - } else { - if (a !== alteration || t !== type) { - this.rule.rule_params.conditional[a][ - t - ].shapes[0].fill = this.props.store.userAlterationColors[ - a - ][t]; - } else { - this.props.store.onAlterationColorChange( - alteration, - type, - this.rule.rule_params.conditional[a][t] - .shapes[0].fill as RGBAColor - ); - } - } - } - } - } else { - if (alteration === 'disp_mrna') { - this.rule.rule_params.conditional[alteration][ - type - ].shapes[0].stroke = color; - } else { - this.rule.rule_params.conditional[alteration][ - type - ].shapes[0].fill = color; - } - this.props.store.onAlterationColorChange(alteration, type, color); - } - // console.log(this.rule); + this.rule = editRule( + color, + alteration, + type, + this.props.store, + this.rule + ); } public render() { @@ -1987,7 +1968,7 @@ export default class ResultsViewOncoprint extends React.Component< distinguishMutationType={ this.distinguishMutationType } - test={this.test} + changeRule={this.changeRule} distinguishDrivers={this.distinguishDrivers} distinguishGermlineMutations={ this.distinguishGermlineMutations diff --git a/src/shared/components/oncoprint/controls/OncoprintColors.tsx b/src/shared/components/oncoprint/controls/OncoprintColors.tsx index 0d0a5bd1ec6..373b788c0f7 100644 --- a/src/shared/components/oncoprint/controls/OncoprintColors.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintColors.tsx @@ -28,7 +28,7 @@ export interface IGroupCheckboxProps { store?: ResultsViewPageStore; handlers: IOncoprintControlsHandlers; state: IOncoprintControlsState; - setRules?: ( + setRule?: ( alteration: string, type: string, color: RGBAColor | undefined @@ -99,23 +99,23 @@ export default class OncoprintColors extends React.Component< handleChangeComplete = (color: any, event: any) => { // if same color is select, unselect it (go back to no color) if (color.hex === rgbaToHex(this.props.color)) { - this.props.setRules && - this.props.setRules( + this.props.setRule && + this.props.setRule( this.props.alteration, this.props.type, undefined ); } else { - this.props.setRules && - this.props.setRules(this.props.alteration, this.props.type, [ + this.props.setRule && + this.props.setRule(this.props.alteration, this.props.type, [ color.rgb.r, color.rgb.g, color.rgb.b, color.rgb.a, ]); } - this.props.handlers.onSelectTest && - this.props.handlers.onSelectTest(!this.props.state.test!); + this.props.handlers.onChangeRule && + this.props.handlers.onChangeRule(!this.props.state.changeRule!); }; @computed get colorList() { diff --git a/src/shared/components/oncoprint/controls/OncoprintControls.tsx b/src/shared/components/oncoprint/controls/OncoprintControls.tsx index 8703a996a4e..0a6ebfeec5a 100644 --- a/src/shared/components/oncoprint/controls/OncoprintControls.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintControls.tsx @@ -46,7 +46,7 @@ import { ClinicalTrackConfigMap, } from 'shared/components/oncoprint/Oncoprint'; import { getServerConfig } from 'config/config'; -import { IGeneticAlterationRuleSetParams, RGBAColor } from 'oncoprintjs'; +import { RGBAColor } from 'oncoprintjs'; import OncoprintColors, { alterationToTypeToLabel } from './OncoprintColors'; export interface IOncoprintControlsHandlers @@ -62,8 +62,7 @@ export interface IOncoprintControlsHandlers onSelectShowMinimap: (showMinimap: boolean) => void; onSelectDistinguishMutationType: (distinguish: boolean) => void; onSelectDistinguishGermlineMutations: (distinguish: boolean) => void; - onSelectTest?: (distinguish: boolean) => void; - onSetRule?: (rule: IGeneticAlterationRuleSetParams) => void; + onChangeRule?: (changed: boolean) => void; onSelectHideVUS: (hide: boolean) => void; onSelectHideGermlineMutations: (hide: boolean) => void; @@ -107,8 +106,7 @@ export interface IOncoprintControlsState sortByCaseListDisabled: boolean; hidePutativePassengers: boolean; hideGermlineMutations: boolean; - test?: boolean; - rule?: IGeneticAlterationRuleSetParams; + changeRule?: boolean; sortMode?: SortMode; clinicalAttributesPromise?: MobxPromise; @@ -144,7 +142,7 @@ export interface IOncoprintControlsProps { selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl?: { [genericAssayType: string]: string[]; }; - setRules?: ( + setRule?: ( alteration: string, type: string, color: RGBAColor | undefined @@ -191,10 +189,21 @@ const EVENT_KEY = { downloadOncoprinter: '29.1', horzZoomSlider: '30', viewNGCHM: '31', - test: '32', - rule: '33', }; +export function getOncoprintColor( + alteration: string, + type: string, + store?: ResultsViewPageStore +): RGBAColor { + return store + ? !store.userSelectedAlterationColors[alteration] || + !store.userSelectedAlterationColors[alteration][type] + ? store.defaultAlterationColors[alteration][type] + : store.userSelectedAlterationColors[alteration][type] + : ([255, 255, 255, 1] as RGBAColor); +} + @observer export default class OncoprintControls extends React.Component< IOncoprintControlsProps, @@ -866,13 +875,13 @@ export default class OncoprintControls extends React.Component< type={type} handlers={this.props.handlers} state={this.props.state} - setRules={this.props.setRules} + setRule={this.props.setRule} store={this.props.store} - color={ - this.props.store?.userAlterationColors[ - alteration - ][type]! - } + color={getOncoprintColor( + alteration, + type, + this.props.store + )} markedWithWarningSign={this.props.store!.isAlterationMarkedWithWarningSign( alteration )} From e175bd79a13e3fca78eeba1728efeae0b3d427b6 Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Fri, 29 Sep 2023 13:11:59 -0400 Subject: [PATCH 04/15] added color config for clinical tracks --- src/pages/resultsView/ResultsViewPageStore.ts | 111 ++++++++------ src/shared/components/oncoprint/DeltaUtils.ts | 77 +++++----- src/shared/components/oncoprint/Oncoprint.tsx | 8 +- .../components/oncoprint/OncoprintUtils.ts | 14 +- .../oncoprint/ResultsViewOncoprint.tsx | 142 +++++++++++------- .../oncoprint/controls/OncoprintColors.tsx | 105 ++++--------- .../oncoprint/controls/OncoprintControls.tsx | 94 +++++++----- 7 files changed, 289 insertions(+), 262 deletions(-) diff --git a/src/pages/resultsView/ResultsViewPageStore.ts b/src/pages/resultsView/ResultsViewPageStore.ts index 1e3e173689d..7d4b4a0793d 100644 --- a/src/pages/resultsView/ResultsViewPageStore.ts +++ b/src/pages/resultsView/ResultsViewPageStore.ts @@ -305,6 +305,7 @@ import { USE_DEFAULT_PUBLIC_INSTANCE_FOR_ONCOKB, } from 'react-mutation-mapper'; import { IGeneticAlterationRuleSetParams, RGBAColor } from 'oncoprintjs'; +import { hexToRGBA } from 'shared/lib/Colors'; type Optional = | { isApplicable: true; value: T } @@ -574,22 +575,22 @@ export class ResultsViewPageStore extends AnalysisStore @observable queryFormVisible: boolean = false; - @observable userSelectedAlterationColors: { - [alterationType: string]: { - [type: string]: RGBAColor; + @observable _userSelectedClinicalAttributeColors: { + [label: string]: { + [value: string]: RGBAColor; }; } = {}; - @observable _defaultAlterationColors: { - [alterationType: string]: { - [type: string]: RGBAColor; + @observable _defaultClinicalAttributeColors: { + [label: string]: { + [value: string]: RGBAColor; }; } = {}; - private _selectedComparisonGroupsWarningSigns = observable.map< - string, - boolean - >({}, { deep: false }); + // private _selectedComparisonGroupsWarningSigns = observable.map< + // string, + // boolean + // >({}, { deep: false }); @computed get doNonSelectedDownloadableMolecularProfilesExist() { return ( @@ -605,58 +606,68 @@ export class ResultsViewPageStore extends AnalysisStore | undefined = undefined; @action.bound - public onAlterationColorChange( - alterationType: string, - type: string, + public onClinicalAttributeColorChange( + label: string, + value: string, color: RGBAColor | undefined ) { + // if color is undefined, delete color from userSelectedClinicalAttributeColors if exists if ( !color && - this.userSelectedAlterationColors[alterationType] && - this.userSelectedAlterationColors[alterationType][type] + this._userSelectedClinicalAttributeColors[label] && + this._userSelectedClinicalAttributeColors[label][value] ) { - delete this.userSelectedAlterationColors[alterationType][type]; + delete this._userSelectedClinicalAttributeColors[label][value]; + // else, set the color in userSelectedClinicalAttributeColors } else if (color) { - if (!this.userSelectedAlterationColors[alterationType]) { - this.userSelectedAlterationColors[alterationType] = {}; + if (!this._userSelectedClinicalAttributeColors[label]) { + this._userSelectedClinicalAttributeColors[label] = {}; } - this.userSelectedAlterationColors[alterationType][type] = color; + this._userSelectedClinicalAttributeColors[label][value] = color; } } - @computed get defaultAlterationColors() { - return this._defaultAlterationColors; + @computed get defaultClinicalAttributeColors() { + return this._defaultClinicalAttributeColors; + } + + @computed get userSelectedClinicalAttributeColors() { + return this._userSelectedClinicalAttributeColors; } @action.bound - public setDefaultAlterationColors(rule: IGeneticAlterationRuleSetParams) { - let alterationColors: { - [alterationType: string]: { - [type: string]: RGBAColor; - }; - } = {}; - _.forIn( - Object.keys(rule.rule_params.conditional), - (alterationType: string) => { - alterationColors[alterationType] = {}; - _.forIn( - Object.keys(rule.rule_params.conditional[alterationType]), - (type: string) => { - if (alterationType === 'disp_mrna') { - alterationColors[alterationType][type] = rule - .rule_params.conditional[alterationType][type] - .shapes[0].stroke as RGBAColor; - } else { - alterationColors[alterationType][type] = rule - .rule_params.conditional[alterationType][type] - .shapes[0].fill as RGBAColor; - } - } + public setDefaultClinicalAttributeColor( + label: string, + categoryToColor?: { [value: string]: string }, + countsCategoryLabels?: string[], + countsCategoryFills?: RGBAColor[] + ) { + // if default for attribute doesn't already exist + if (!this._defaultClinicalAttributeColors[label]) { + // if categoryToColor given, use this mapping for colors + if (categoryToColor) { + this._defaultClinicalAttributeColors[label] = _.mapValues( + categoryToColor, + hexToRGBA ); + // sample type attributes have unique "Mixed" label with set color + if (label === 'Sample Type' || label === 'Sample type id') { + this._defaultClinicalAttributeColors[label]['Mixed'] = [ + 48, + 97, + 194, + 1, + ]; + } + // if labels and fills given, set each label with its corresponding color + } else if (countsCategoryLabels && countsCategoryFills) { + this._defaultClinicalAttributeColors[label] = {}; + _.forEach(countsCategoryLabels, (value, i) => { + this._defaultClinicalAttributeColors[label][value] = + countsCategoryFills[i]; + }); } - ); - this._defaultAlterationColors = alterationColors; - this.userSelectedAlterationColors = {}; + } } // @action public showAlterationWarningSign( @@ -691,9 +702,9 @@ export class ResultsViewPageStore extends AnalysisStore // ); // } - public isAlterationMarkedWithWarningSign(alteration: string): boolean { - return !!this._selectedComparisonGroupsWarningSigns.get(alteration); - } + // public isAlterationMarkedWithWarningSign(alteration: string): boolean { + // return !!this._selectedComparisonGroupsWarningSigns.get(alteration); + // } @action.bound public setOncoprintAnalysisCaseType(e: OncoprintAnalysisCaseType) { diff --git a/src/shared/components/oncoprint/DeltaUtils.ts b/src/shared/components/oncoprint/DeltaUtils.ts index ba6d611ec54..b9ee4ca3772 100644 --- a/src/shared/components/oncoprint/DeltaUtils.ts +++ b/src/shared/components/oncoprint/DeltaUtils.ts @@ -61,8 +61,7 @@ export function transition( getTrackSpecKeyToTrackId: () => { [key: string]: TrackId }, getMolecularProfileMap: () => | { [molecularProfileId: string]: MolecularProfile } - | undefined, - customRule?: IGeneticAlterationRuleSetParams + | undefined ) { const notKeepingSorted = shouldNotKeepSortedForTransition( nextProps, @@ -92,8 +91,7 @@ export function transition( prevProps, oncoprint, getTrackSpecKeyToTrackId, - getMolecularProfileMap, - customRule + getMolecularProfileMap ); transitionSortConfig(nextProps, prevProps, oncoprint); transitionTrackGroupSortPriority(nextProps, prevProps, oncoprint); @@ -590,8 +588,7 @@ function hasGeneticTrackRuleSetChanged( prevProps.distinguishMutationType || nextProps.distinguishDrivers !== prevProps.distinguishDrivers || nextProps.distinguishGermlineMutations !== - prevProps.distinguishGermlineMutations || - nextProps.changeRule !== prevProps.changeRule + prevProps.distinguishGermlineMutations ); } @@ -602,8 +599,7 @@ function transitionTracks( getTrackSpecKeyToTrackId: () => { [key: string]: TrackId }, getMolecularProfileMap: () => | { [molecularProfileId: string]: MolecularProfile } - | undefined, - customRule?: IGeneticAlterationRuleSetParams + | undefined ) { // Initialize tracks for rule set sharing const trackIdForRuleSetSharing = { @@ -745,9 +741,7 @@ function transitionTracks( oncoprint, nextProps, prevProps, - trackIdForRuleSetSharing, - undefined, - customRule + trackIdForRuleSetSharing ); delete prevGeneticTracks[track.key]; } @@ -763,9 +757,7 @@ function transitionTracks( oncoprint, nextProps, prevProps, - trackIdForRuleSetSharing, - undefined, - customRule + trackIdForRuleSetSharing ); } } @@ -788,7 +780,8 @@ function transitionTracks( prevClinicalTracks[track.key], getTrackSpecKeyToTrackId, oncoprint, - nextProps + nextProps, + prevProps ); delete prevClinicalTracks[track.key]; } @@ -800,7 +793,8 @@ function transitionTracks( prevClinicalTracks[track.key], getTrackSpecKeyToTrackId, oncoprint, - nextProps + nextProps, + prevProps ); } } @@ -1102,21 +1096,13 @@ function transitionGeneticTrack( nextProps: IOncoprintProps, prevProps: Partial, trackIdForRuleSetSharing: { genetic?: TrackId }, - expansionParentKey?: string, - customRule?: IGeneticAlterationRuleSetParams + expansionParentKey?: string ) { const trackSpecKeyToTrackId = getTrackSpecKeyToTrackId(); if (tryRemoveTrack(nextSpec, prevSpec, trackSpecKeyToTrackId, oncoprint)) { // Remove track return; } else if (nextSpec && !prevSpec) { - let rule = customRule - ? customRule - : getGeneticTrackRuleSetParams( - nextProps.distinguishMutationType, - nextProps.distinguishDrivers, - nextProps.distinguishGermlineMutations - ); // Add track const createCustomOncoprintTooltip = getCustomJsFunctions() .createCustomOncoprintTooltip; @@ -1132,7 +1118,11 @@ function transitionGeneticTrack( ); } const geneticTrackParams: UserTrackSpec = { - rule_set_params: rule, + rule_set_params: getGeneticTrackRuleSetParams( + nextProps.distinguishMutationType, + nextProps.distinguishDrivers, + nextProps.distinguishGermlineMutations + ), label: nextSpec.label, sublabel: nextSpec.sublabel, track_label_color: nextSpec.labelColor || undefined, @@ -1224,16 +1214,15 @@ function transitionGeneticTrack( trackId ); } else { - let rule = customRule - ? customRule - : getGeneticTrackRuleSetParams( - nextProps.distinguishMutationType, - nextProps.distinguishDrivers, - nextProps.distinguishGermlineMutations - ); - console.log(rule); // otherwise, update ruleset - oncoprint.setRuleSet(trackId, rule); + oncoprint.setRuleSet( + trackId, + getGeneticTrackRuleSetParams( + nextProps.distinguishMutationType, + nextProps.distinguishDrivers, + nextProps.distinguishGermlineMutations + ) + ); } } // either way, use this one now @@ -1268,7 +1257,8 @@ function transitionClinicalTrack( prevSpec: ClinicalTrackSpec | undefined, getTrackSpecKeyToTrackId: () => { [key: string]: TrackId }, oncoprint: OncoprintJS, - nextProps: IOncoprintProps + nextProps: IOncoprintProps, + prevProps: Partial ) { const trackSpecKeyToTrackId = getTrackSpecKeyToTrackId(); if (tryRemoveTrack(nextSpec, prevSpec, trackSpecKeyToTrackId, oncoprint)) { @@ -1337,6 +1327,21 @@ function transitionClinicalTrack( if (prevSpec.custom_options !== nextSpec.custom_options) { oncoprint.setTrackCustomOptions(trackId, nextSpec.custom_options); } + + // update ruleset for changed track key + if ( + nextProps.changedTrackKey && + getTrackSpecKeyToTrackId()[nextProps.changedTrackKey] === trackId + ) { + let rule_set_params = getClinicalTrackRuleSetParams(nextSpec); + rule_set_params.legend_label = nextSpec.label; + rule_set_params.exclude_from_legend = !nextProps.showClinicalTrackLegends; + rule_set_params.na_legend_label = nextSpec.na_legend_label; + oncoprint.setRuleSet(trackId, rule_set_params); + // set changed track key back to none + nextProps.onSetChangedTrackKey && + nextProps.onSetChangedTrackKey(''); + } } } function transitionGenesetHeatmapTrack( diff --git a/src/shared/components/oncoprint/Oncoprint.tsx b/src/shared/components/oncoprint/Oncoprint.tsx index 98377441a1c..f149fcdd5b1 100644 --- a/src/shared/components/oncoprint/Oncoprint.tsx +++ b/src/shared/components/oncoprint/Oncoprint.tsx @@ -276,8 +276,6 @@ export interface IOncoprintProps { alterationTypesInQuery?: string[]; distinguishMutationType?: boolean; - changeRule?: boolean; - rule?: IGeneticAlterationRuleSetParams; distinguishDrivers?: boolean; distinguishGermlineMutations?: boolean; @@ -301,6 +299,9 @@ export interface IOncoprintProps { onTrackSortDirectionChange?: (trackId: TrackId, dir: number) => void; onTrackGapChange?: (trackId: TrackId, gap: boolean) => void; + changedTrackKey?: string; + onSetChangedTrackKey?: (key: string) => void; + suppressRendering?: boolean; onSuppressRendering?: () => void; onReleaseRendering?: () => void; @@ -389,8 +390,7 @@ export default class Oncoprint extends React.Component { () => this.trackSpecKeyToTrackId, () => { return this.props.molecularProfileIdToMolecularProfile; - }, - this.props.rule + } ); this.lastTransitionProps = _.clone(props); } diff --git a/src/shared/components/oncoprint/OncoprintUtils.ts b/src/shared/components/oncoprint/OncoprintUtils.ts index acc75f0ca17..e7cf5aec771 100644 --- a/src/shared/components/oncoprint/OncoprintUtils.ts +++ b/src/shared/components/oncoprint/OncoprintUtils.ts @@ -491,8 +491,8 @@ export function getClinicalTrackRuleSetParams(track: ClinicalTrackSpec) { category_key: 'attr_val', category_to_color: Object.assign( {}, - track.category_to_color, - _.mapValues(RESERVED_CLINICAL_VALUE_COLORS, hexToRGBA) + _.mapValues(RESERVED_CLINICAL_VALUE_COLORS, hexToRGBA), + track.category_to_color ), universal_rule_categories: track.universal_rule_categories, }; @@ -1071,6 +1071,10 @@ export function makeClinicalTracksMobxPromise( dataAndColors.categoryToColor, hexToRGBA ); + oncoprint.props.store.setDefaultClinicalAttributeColor( + attribute.displayName, + dataAndColors.categoryToColor + ); } else if ( attribute.clinicalAttributeId === SpecialAttribute.MutationSpectrum @@ -1078,6 +1082,12 @@ export function makeClinicalTracksMobxPromise( ret.datatype = 'counts'; (ret as any).countsCategoryLabels = MUTATION_SPECTRUM_CATEGORIES; (ret as any).countsCategoryFills = MUTATION_SPECTRUM_FILLS; + oncoprint.props.store.setDefaultClinicalAttributeColor( + attribute.displayName, + undefined, + MUTATION_SPECTRUM_CATEGORIES, + MUTATION_SPECTRUM_FILLS + ); } const trackConfig = diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index 3824a01bdf4..f8a7db68d58 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -42,7 +42,6 @@ import { AlterationTypeConstants } from 'shared/constants'; import { ResultsViewPageStore } from '../../../pages/resultsView/ResultsViewPageStore'; import { getAlteredUids, - getGeneticTrackRuleSetParams, getUnalteredUids, makeClinicalTracksMobxPromise, makeGenericAssayProfileCategoricalTracksMobxPromise, @@ -56,13 +55,7 @@ import _ from 'lodash'; import { onMobxPromise, toPromise } from 'cbioportal-frontend-commons'; import { getServerConfig } from 'config/config'; import LoadingIndicator from 'shared/components/loadingIndicator/LoadingIndicator'; -import { - IGeneticAlterationRuleSetParams, - OncoprintJS, - RGBAColor, - TrackGroupIndex, - TrackId, -} from 'oncoprintjs'; +import { OncoprintJS, RGBAColor, TrackGroupIndex, TrackId } from 'oncoprintjs'; import fileDownload from 'react-file-download'; import tabularDownload from './tabularDownload'; import classNames from 'classnames'; @@ -139,35 +132,64 @@ export type AdditionalTrackGroupRecord = { molecularProfile: MolecularProfile; }; -export function editRule( +export function getClinicalAttributeValues( + attributeLabel: string, + clinicalTracks: ClinicalTrackSpec[] +): any[] { + // find track that matches given label + let index = _.findIndex(clinicalTracks, i => i.label === attributeLabel); + // if the datatype is "counts", the attribute values are under countsCategoryLabels + if (clinicalTracks[index] && clinicalTracks[index].datatype === 'counts') { + return (clinicalTracks[index] as any).countsCategoryLabels; + // if the datatype is "string", get attribute values from the track data + } else if ( + clinicalTracks[index] && + clinicalTracks[index].datatype === 'string' + ) { + return _(clinicalTracks[index].data) + .map(d => d.attr_val) + .uniq() + .without(undefined) + .value(); + } + return []; +} + +export function setClinicalAttributeValueColorsInTrack( + attributeLabel: string, + attributeValue: string, color: RGBAColor | undefined, - alteration: string, - type: string, - store: ResultsViewPageStore, - currentRule: IGeneticAlterationRuleSetParams + track: ClinicalTrackSpec, + store: ResultsViewPageStore ) { - let rule: IGeneticAlterationRuleSetParams = currentRule; - if (color == undefined) { - if (alteration === 'disp_mrna') { - rule.rule_params.conditional[alteration][type].shapes[0].stroke = - store.defaultAlterationColors[alteration][type]; + if (track.datatype === 'string') { + // set new color of attribute value in track's category_to_color + if (color) { + (track as any).category_to_color[attributeValue] = color; + // if undefined color, set attribute value's color in track's category_to_color back to its default } else { - rule.rule_params.conditional[alteration][type].shapes[0].fill = - store.defaultAlterationColors[alteration][type]; + (track as any).category_to_color[attributeValue] = + store.defaultClinicalAttributeColors[attributeLabel][ + attributeValue + ]; } - } else { - if (alteration === 'disp_mrna') { - rule.rule_params.conditional[alteration][ - type - ].shapes[0].stroke = color; + } else if (track.datatype === 'counts') { + // get index of attribute value that corresponds with its color + let valueIndex = _.indexOf( + (track as any).countsCategoryLabels, + attributeValue + ); + // set new color of attribute value in track's countsCategoryFills using valueIndex + if (color) { + (track as any).countsCategoryFills[valueIndex] = color; + // if undefined color, set attribute value's color in track's countsCategoryFills back to its default } else { - rule.rule_params.conditional[alteration][ - type - ].shapes[0].fill = color; + (track as any).countsCategoryFills[valueIndex] = + store.defaultClinicalAttributeColors[attributeLabel][ + attributeValue + ]; } } - store.onAlterationColorChange(alteration, type, color); - return rule; } /* fields and methods in the class below are ordered based on roughly @@ -292,14 +314,7 @@ export default class ResultsViewOncoprint extends React.Component< @observable renderingComplete = false; - @observable - rule: IGeneticAlterationRuleSetParams = getGeneticTrackRuleSetParams( - this.distinguishMutationType, - this.distinguishDrivers, - this.distinguishGermlineMutations - ); - - @observable changeRule: boolean = false; + @observable changedTrackKey: string = ''; private heatmapGeneInputValueUpdater: IReactionDisposer; @@ -454,7 +469,6 @@ export default class ResultsViewOncoprint extends React.Component< super(props); makeObservable(this); - this.props.store.setDefaultAlterationColors(this.rule); this.showOqlInLabels = props.store.queryContainsOql; (window as any).resultsViewOncoprint = this; @@ -534,14 +548,11 @@ export default class ResultsViewOncoprint extends React.Component< get sortByCaseListDisabled() { return !self.caseListSortPossible; }, - get rule() { - return self.rule; - }, get distinguishMutationType() { return self.distinguishMutationType; }, - get changeRule() { - return self.changeRule; + get changedTrackKey() { + return self.changedTrackKey; }, get distinguishDrivers() { return self.distinguishDrivers; @@ -760,8 +771,8 @@ export default class ResultsViewOncoprint extends React.Component< onSelectDistinguishMutationType: (s: boolean) => { this.distinguishMutationType = s; }, - onChangeRule: (s: boolean) => { - this.changeRule = s; + onSetChangedTrackKey: (s: string) => { + this.changedTrackKey = s; }, onSelectDistinguishDrivers: action((s: boolean) => { if (!s) { @@ -1748,7 +1759,10 @@ export default class ResultsViewOncoprint extends React.Component< this .selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl } - setRule={this.setRule} + handleClinicalAttributeColorChange={ + this.handleClinicalAttributeColorChange + } + clinicalTracks={this.clinicalTracks.result} /> ); @@ -1853,17 +1867,29 @@ export default class ResultsViewOncoprint extends React.Component< } @action.bound - public setRule( - alteration: string, - type: string, + public handleClinicalAttributeColorChange( + attributeLabel: string, + attributeValue: string, color: RGBAColor | undefined ) { - this.rule = editRule( + // find track that matches given label + let index = _.findIndex( + this.clinicalTracks.result, + i => i.label === attributeLabel + ); + const track = this.clinicalTracks.result[index]; + + setClinicalAttributeValueColorsInTrack( + attributeLabel, + attributeValue, color, - alteration, - type, - this.props.store, - this.rule + track, + this.props.store + ); + this.props.store.onClinicalAttributeColorChange( + attributeLabel, + attributeValue, + color ); } @@ -1968,7 +1994,7 @@ export default class ResultsViewOncoprint extends React.Component< distinguishMutationType={ this.distinguishMutationType } - changeRule={this.changeRule} + changedTrackKey={this.changedTrackKey} distinguishDrivers={this.distinguishDrivers} distinguishGermlineMutations={ this.distinguishGermlineMutations @@ -1992,7 +2018,9 @@ export default class ResultsViewOncoprint extends React.Component< initParams={{ max_height: Number.POSITIVE_INFINITY, }} - rule={this.rule} + onSetChangedTrackKey={ + this.controlsHandlers.onSetChangedTrackKey + } /> diff --git a/src/shared/components/oncoprint/controls/OncoprintColors.tsx b/src/shared/components/oncoprint/controls/OncoprintColors.tsx index 373b788c0f7..7c563d03e2f 100644 --- a/src/shared/components/oncoprint/controls/OncoprintColors.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintColors.tsx @@ -21,70 +21,27 @@ import { IOncoprintControlsState, } from './OncoprintControls'; import { RGBAColor } from 'oncoprintjs'; +import { ClinicalTrackSpec } from '../Oncoprint'; +import _ from 'lodash'; export interface IGroupCheckboxProps { - alteration: string; - type: string; store?: ResultsViewPageStore; handlers: IOncoprintControlsHandlers; state: IOncoprintControlsState; - setRule?: ( - alteration: string, - type: string, + handleClinicalAttributeColorChange?: ( + label: string, + value: string, color: RGBAColor | undefined ) => void; + clinicalAttributeLabel: string; + clinicalAttributeValue: any; color: RGBAColor; - markedWithWarningSign: boolean; + clinicalTrack: ClinicalTrackSpec; + // markedWithWarningSign: boolean; } const COLOR_UNDEFINED = '#FFFFFF'; -export const alterationToTypeToLabel: { - [alteration: string]: { [type: string]: string }; -} = { - // disp_cna - disp_cna: { - 'amp_rec,amp': 'Amplification', - 'gain_rec,gain': 'Gain', - 'hetloss_rec,hetloss': 'Shallow Deletion', - 'homdel_rec,homdel': 'Deep Deletion', - }, - // disp_germ - disp_germ: { - true: 'Germline Mutation', - }, - // disp_mrna - disp_mrna: { - high: 'mRNA High', - low: 'mRNA Low', - }, - // disp_mut - disp_mut: { - missense: 'Missense Mutation (unknown significance)', - missense_rec: 'Missense Mutation (putative driver)', - trunc: 'Truncating Mutation (unknown significance)', - trunc_rec: 'Truncating Mutation (putative driver)', - inframe: 'Inframe Mutation (unknown significance)', - inframe_rec: 'Inframe Mutation (putative driver)', - splice: 'Splice Mutation (unknown significance)', - splice_rec: 'Splice Mutation (putative driver)', - promoter: 'Promoter Mutation (unknown significance)', - promoter_rec: 'Promoter Mutation (putative driver)', - other: 'Other Mutation (unknown significance)', - other_rec: 'Other Mutation (putative driver)', - }, - // disp_prot - disp_prot: { - high: 'Protein High', - low: 'Protein Low', - }, - // disp_structuralVariant - disp_structuralVariant: { - sv: 'Structural Variant (unknown significance)', - sv_rec: 'Structural Variant (putative driver)', - }, -}; - @observer export default class OncoprintColors extends React.Component< IGroupCheckboxProps, @@ -99,23 +56,25 @@ export default class OncoprintColors extends React.Component< handleChangeComplete = (color: any, event: any) => { // if same color is select, unselect it (go back to no color) if (color.hex === rgbaToHex(this.props.color)) { - this.props.setRule && - this.props.setRule( - this.props.alteration, - this.props.type, + this.props.handleClinicalAttributeColorChange && + this.props.handleClinicalAttributeColorChange( + this.props.clinicalAttributeLabel, + this.props.clinicalAttributeValue, undefined ); } else { - this.props.setRule && - this.props.setRule(this.props.alteration, this.props.type, [ - color.rgb.r, - color.rgb.g, - color.rgb.b, - color.rgb.a, - ]); + this.props.handleClinicalAttributeColorChange && + this.props.handleClinicalAttributeColorChange( + this.props.clinicalAttributeLabel, + this.props.clinicalAttributeValue, + [color.rgb.r, color.rgb.g, color.rgb.b, color.rgb.a] + ); } - this.props.handlers.onChangeRule && - this.props.handlers.onChangeRule(!this.props.state.changeRule!); + // set changed track key + this.props.handlers.onSetChangedTrackKey && + this.props.handlers.onSetChangedTrackKey( + this.props.clinicalTrack.key + ); }; @computed get colorList() { @@ -152,17 +111,13 @@ export default class OncoprintColors extends React.Component< render() { return (
- { - alterationToTypeToLabel[this.props.alteration][ - this.props.type - ] - } - - + > */} + {/* {this.props.markedWithWarningSign && ( )} - - + */} + {/* */} void; onSelectDistinguishMutationType: (distinguish: boolean) => void; onSelectDistinguishGermlineMutations: (distinguish: boolean) => void; - onChangeRule?: (changed: boolean) => void; + onSetChangedTrackKey?: (key: string) => void; onSelectHideVUS: (hide: boolean) => void; onSelectHideGermlineMutations: (hide: boolean) => void; @@ -106,7 +107,7 @@ export interface IOncoprintControlsState sortByCaseListDisabled: boolean; hidePutativePassengers: boolean; hideGermlineMutations: boolean; - changeRule?: boolean; + changedTrackKey?: string; sortMode?: SortMode; clinicalAttributesPromise?: MobxPromise; @@ -142,11 +143,12 @@ export interface IOncoprintControlsProps { selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl?: { [genericAssayType: string]: string[]; }; - setRule?: ( - alteration: string, - type: string, + handleClinicalAttributeColorChange?: ( + label: string, + value: string, color: RGBAColor | undefined ) => void; + clinicalTracks?: ClinicalTrackSpec[]; } export interface ISelectOption { @@ -192,16 +194,22 @@ const EVENT_KEY = { }; export function getOncoprintColor( - alteration: string, - type: string, + label: string, + value: string, store?: ResultsViewPageStore ): RGBAColor { - return store - ? !store.userSelectedAlterationColors[alteration] || - !store.userSelectedAlterationColors[alteration][type] - ? store.defaultAlterationColors[alteration][type] - : store.userSelectedAlterationColors[alteration][type] - : ([255, 255, 255, 1] as RGBAColor); + if (store) { + if ( + !store.userSelectedClinicalAttributeColors[label] || + !store.userSelectedClinicalAttributeColors[label][value] + ) { + return store.defaultClinicalAttributeColors[label][value]; + } else { + return store.userSelectedClinicalAttributeColors[label][value]; + } + } else { + return [255, 255, 255, 1] as RGBAColor; + } } @observer @@ -866,28 +874,38 @@ export default class OncoprintControls extends React.Component< className="oncoprint__controls__color_menu" data-test="oncoprintColorDropdownMenu" > - {Object.keys(alterationToTypeToLabel).map(alteration => - Object.keys( - alterationToTypeToLabel[alteration] - ).map(type => ( - - )) - )} + {this.props.clinicalTracks!.map(track => { + return ( +
+ {track.label} + {getClinicalAttributeValues( + track.label, + this.props.clinicalTracks! + ).map(value => ( + + ))} +
+ ); + })}
); From 3606f25858aa5bb92d7a0a15add11a907508cde7 Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Thu, 5 Oct 2023 17:52:37 -0400 Subject: [PATCH 05/15] add toggle to select between white/grey glyph backgrounds and refactoring --- src/pages/resultsView/ResultsViewPageStore.ts | 58 ++++++------ src/shared/components/oncoprint/DeltaUtils.ts | 10 ++- src/shared/components/oncoprint/Oncoprint.tsx | 1 + .../components/oncoprint/OncoprintUtils.ts | 60 ++++++++++--- .../oncoprint/ResultsViewOncoprint.tsx | 42 +++++---- .../oncoprint/controls/OncoprintColors.tsx | 5 +- .../oncoprint/controls/OncoprintControls.tsx | 88 +++++++++++++------ 7 files changed, 172 insertions(+), 92 deletions(-) diff --git a/src/pages/resultsView/ResultsViewPageStore.ts b/src/pages/resultsView/ResultsViewPageStore.ts index 7d4b4a0793d..a3f57341294 100644 --- a/src/pages/resultsView/ResultsViewPageStore.ts +++ b/src/pages/resultsView/ResultsViewPageStore.ts @@ -276,7 +276,10 @@ import { ICBioData } from 'pathway-mapper'; import { getAlterationData } from 'shared/components/oncoprint/OncoprintUtils'; import { PageUserSession } from 'shared/userSession/PageUserSession'; import { PageType } from 'shared/userSession/PageType'; -import { ClinicalTrackConfig } from 'shared/components/oncoprint/Oncoprint'; +import { + ClinicalTrackConfig, + ClinicalTrackSpec, +} from 'shared/components/oncoprint/Oncoprint'; import eventBus from 'shared/events/eventBus'; import { ErrorMessages } from 'shared/errorMessages'; import AnalysisStore from 'shared/lib/comparison/AnalysisStore'; @@ -304,8 +307,7 @@ import { ONCOKB_DEFAULT_INFO, USE_DEFAULT_PUBLIC_INSTANCE_FOR_ONCOKB, } from 'react-mutation-mapper'; -import { IGeneticAlterationRuleSetParams, RGBAColor } from 'oncoprintjs'; -import { hexToRGBA } from 'shared/lib/Colors'; +import { RGBAColor } from 'oncoprintjs'; type Optional = | { isApplicable: true; value: T } @@ -638,35 +640,33 @@ export class ResultsViewPageStore extends AnalysisStore @action.bound public setDefaultClinicalAttributeColor( label: string, - categoryToColor?: { [value: string]: string }, - countsCategoryLabels?: string[], + values: any[], + categoryToColor?: { + [category: string]: [number, number, number, number]; + }, countsCategoryFills?: RGBAColor[] ) { - // if default for attribute doesn't already exist - if (!this._defaultClinicalAttributeColors[label]) { - // if categoryToColor given, use this mapping for colors - if (categoryToColor) { - this._defaultClinicalAttributeColors[label] = _.mapValues( - categoryToColor, - hexToRGBA - ); - // sample type attributes have unique "Mixed" label with set color - if (label === 'Sample Type' || label === 'Sample type id') { - this._defaultClinicalAttributeColors[label]['Mixed'] = [ - 48, - 97, - 194, - 1, - ]; - } - // if labels and fills given, set each label with its corresponding color - } else if (countsCategoryLabels && countsCategoryFills) { - this._defaultClinicalAttributeColors[label] = {}; - _.forEach(countsCategoryLabels, (value, i) => { - this._defaultClinicalAttributeColors[label][value] = - countsCategoryFills[i]; - }); + if (categoryToColor) { + this._defaultClinicalAttributeColors[label] = {}; + _.forEach(values, value => { + this._defaultClinicalAttributeColors[label][value] = + categoryToColor[value]; + }); + // sample type attributes have unique "Mixed" label with set color + if (label === 'Sample Type' || label === 'Sample type id') { + this._defaultClinicalAttributeColors[label]['Mixed'] = [ + 48, + 97, + 194, + 1, + ]; } + } else if (countsCategoryFills) { + this._defaultClinicalAttributeColors[label] = {}; + _.forEach(values, (value, i) => { + this._defaultClinicalAttributeColors[label][value] = + countsCategoryFills[i]; + }); } } diff --git a/src/shared/components/oncoprint/DeltaUtils.ts b/src/shared/components/oncoprint/DeltaUtils.ts index b9ee4ca3772..5dc5a3b5611 100644 --- a/src/shared/components/oncoprint/DeltaUtils.ts +++ b/src/shared/components/oncoprint/DeltaUtils.ts @@ -588,7 +588,9 @@ function hasGeneticTrackRuleSetChanged( prevProps.distinguishMutationType || nextProps.distinguishDrivers !== prevProps.distinguishDrivers || nextProps.distinguishGermlineMutations !== - prevProps.distinguishGermlineMutations + prevProps.distinguishGermlineMutations || + nextProps.enableWhiteBackgroundForGlyphs !== + prevProps.enableWhiteBackgroundForGlyphs ); } @@ -1121,7 +1123,8 @@ function transitionGeneticTrack( rule_set_params: getGeneticTrackRuleSetParams( nextProps.distinguishMutationType, nextProps.distinguishDrivers, - nextProps.distinguishGermlineMutations + nextProps.distinguishGermlineMutations, + nextProps.enableWhiteBackgroundForGlyphs ), label: nextSpec.label, sublabel: nextSpec.sublabel, @@ -1220,7 +1223,8 @@ function transitionGeneticTrack( getGeneticTrackRuleSetParams( nextProps.distinguishMutationType, nextProps.distinguishDrivers, - nextProps.distinguishGermlineMutations + nextProps.distinguishGermlineMutations, + nextProps.enableWhiteBackgroundForGlyphs ) ); } diff --git a/src/shared/components/oncoprint/Oncoprint.tsx b/src/shared/components/oncoprint/Oncoprint.tsx index f149fcdd5b1..c3f6aecb6cb 100644 --- a/src/shared/components/oncoprint/Oncoprint.tsx +++ b/src/shared/components/oncoprint/Oncoprint.tsx @@ -292,6 +292,7 @@ export interface IOncoprintProps { }; showClinicalTrackLegends?: boolean; showWhitespaceBetweenColumns?: boolean; + enableWhiteBackgroundForGlyphs?: boolean; showMinimap?: boolean; onMinimapClose?: () => void; diff --git a/src/shared/components/oncoprint/OncoprintUtils.ts b/src/shared/components/oncoprint/OncoprintUtils.ts index e7cf5aec771..e1c9831ab8d 100644 --- a/src/shared/components/oncoprint/OncoprintUtils.ts +++ b/src/shared/components/oncoprint/OncoprintUtils.ts @@ -32,8 +32,10 @@ import { makeGeneticTrackData, makeHeatmapTrackData, } from './DataUtils'; -import ResultsViewOncoprint from './ResultsViewOncoprint'; import _, { isNumber } from 'lodash'; +import ResultsViewOncoprint, { + getClinicalAttributeValues, +} from './ResultsViewOncoprint'; import { action, IObservableArray, ObservableMap, runInAction } from 'mobx'; import { MobxPromise } from 'mobxpromise'; import GenesetCorrelatedGeneCache from 'shared/cache/GenesetCorrelatedGeneCache'; @@ -54,7 +56,11 @@ import { MUTATION_SPECTRUM_FILLS, SpecialAttribute, } from '../../cache/ClinicalDataCache'; -import { hexToRGBA, RESERVED_CLINICAL_VALUE_COLORS } from 'shared/lib/Colors'; +import { + ASCN_WHITE, + hexToRGBA, + RESERVED_CLINICAL_VALUE_COLORS, +} from 'shared/lib/Colors'; import { ISelectOption } from './controls/OncoprintControls'; import ifNotDefined from '../../lib/ifNotDefined'; import { @@ -446,7 +452,8 @@ export function getGenesetHeatmapTrackRuleSetParams() { export function getGeneticTrackRuleSetParams( distinguishMutationType?: boolean, distinguishDrivers?: boolean, - distinguishGermlineMutations?: boolean + distinguishGermlineMutations?: boolean, + enableWhiteBackgroundForGlyphs?: boolean ): IGeneticAlterationRuleSetParams { let rule_set; if (!distinguishMutationType && !distinguishDrivers) { @@ -462,6 +469,18 @@ export function getGeneticTrackRuleSetParams( if (distinguishGermlineMutations) { Object.assign(rule_set.rule_params.conditional, germline_rule_params); } + if (enableWhiteBackgroundForGlyphs) { + rule_set.legend_base_color = hexToRGBA(ASCN_WHITE); + if (rule_set.rule_params.always) { + rule_set.rule_params.always.shapes = [ + { + type: 'rectangle', + fill: hexToRGBA(ASCN_WHITE), + z: 1, + }, + ]; + } + } return rule_set; } @@ -1071,10 +1090,18 @@ export function makeClinicalTracksMobxPromise( dataAndColors.categoryToColor, hexToRGBA ); - oncoprint.props.store.setDefaultClinicalAttributeColor( - attribute.displayName, - dataAndColors.categoryToColor - ); + // if default for attribute doesn't already exist + if ( + !oncoprint.props.store.defaultClinicalAttributeColors[ + attribute.displayName + ] + ) { + oncoprint.props.store.setDefaultClinicalAttributeColor( + attribute.displayName, + getClinicalAttributeValues(ret), + (ret as any).category_to_color + ); + } } else if ( attribute.clinicalAttributeId === SpecialAttribute.MutationSpectrum @@ -1082,12 +1109,19 @@ export function makeClinicalTracksMobxPromise( ret.datatype = 'counts'; (ret as any).countsCategoryLabels = MUTATION_SPECTRUM_CATEGORIES; (ret as any).countsCategoryFills = MUTATION_SPECTRUM_FILLS; - oncoprint.props.store.setDefaultClinicalAttributeColor( - attribute.displayName, - undefined, - MUTATION_SPECTRUM_CATEGORIES, - MUTATION_SPECTRUM_FILLS - ); + // if default for attribute doesn't already exist + if ( + !oncoprint.props.store.defaultClinicalAttributeColors[ + attribute.displayName + ] + ) { + oncoprint.props.store.setDefaultClinicalAttributeColor( + attribute.displayName, + MUTATION_SPECTRUM_CATEGORIES, + undefined, + MUTATION_SPECTRUM_FILLS + ); + } } const trackConfig = diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index f8a7db68d58..e5b60bb1db6 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -133,20 +133,14 @@ export type AdditionalTrackGroupRecord = { }; export function getClinicalAttributeValues( - attributeLabel: string, - clinicalTracks: ClinicalTrackSpec[] + track: Partial ): any[] { - // find track that matches given label - let index = _.findIndex(clinicalTracks, i => i.label === attributeLabel); // if the datatype is "counts", the attribute values are under countsCategoryLabels - if (clinicalTracks[index] && clinicalTracks[index].datatype === 'counts') { - return (clinicalTracks[index] as any).countsCategoryLabels; - // if the datatype is "string", get attribute values from the track data - } else if ( - clinicalTracks[index] && - clinicalTracks[index].datatype === 'string' - ) { - return _(clinicalTracks[index].data) + // else if the datatype is "string", get attribute values from the track data + if (track.datatype === 'counts') { + return (track as any).countsCategoryLabels; + } else if (track.datatype === 'string') { + return _(track.data) .map(d => d.attr_val) .uniq() .without(undefined) @@ -293,6 +287,7 @@ export default class ResultsViewOncoprint extends React.Component< @observable showClinicalTrackLegends: boolean = true; @observable _onlyShowClinicalLegendForAlteredCases = false; @observable showOqlInLabels = false; + @observable enableWhiteBackgroundForGlyphs: boolean = false; @computed get onlyShowClinicalLegendForAlteredCases() { return ( @@ -536,6 +531,9 @@ export default class ResultsViewOncoprint extends React.Component< get showOqlInLabels() { return self.showOqlInLabels; }, + get enableWhiteBackgroundForGlyphs() { + return self.enableWhiteBackgroundForGlyphs; + }, get showMinimap() { return self.showMinimap; }, @@ -551,15 +549,15 @@ export default class ResultsViewOncoprint extends React.Component< get distinguishMutationType() { return self.distinguishMutationType; }, - get changedTrackKey() { - return self.changedTrackKey; - }, get distinguishDrivers() { return self.distinguishDrivers; }, get distinguishGermlineMutations() { return self.distinguishGermlineMutations; }, + get changedTrackKey() { + return self.changedTrackKey; + }, get annotateDriversOncoKb() { return self.props.store.driverAnnotationSettings.oncoKb; }, @@ -765,15 +763,15 @@ export default class ResultsViewOncoprint extends React.Component< onSelectShowOqlInLabels: (show: boolean) => { this.showOqlInLabels = show; }, + onSelectEnableWhiteBackgroundForGlyphs: (s: boolean) => { + this.enableWhiteBackgroundForGlyphs = s; + }, onSelectShowMinimap: (show: boolean) => { this.showMinimap = show; }, onSelectDistinguishMutationType: (s: boolean) => { this.distinguishMutationType = s; }, - onSetChangedTrackKey: (s: string) => { - this.changedTrackKey = s; - }, onSelectDistinguishDrivers: action((s: boolean) => { if (!s) { this.props.store.driverAnnotationSettings.oncoKb = false; @@ -815,6 +813,9 @@ export default class ResultsViewOncoprint extends React.Component< onSelectDistinguishGermlineMutations: (s: boolean) => { this.distinguishGermlineMutations = s; }, + onSetChangedTrackKey: (s: string) => { + this.changedTrackKey = s; + }, onSelectAnnotateOncoKb: action((s: boolean) => { this.props.store.driverAnnotationSettings.oncoKb = s; }), @@ -1994,11 +1995,11 @@ export default class ResultsViewOncoprint extends React.Component< distinguishMutationType={ this.distinguishMutationType } - changedTrackKey={this.changedTrackKey} distinguishDrivers={this.distinguishDrivers} distinguishGermlineMutations={ this.distinguishGermlineMutations } + changedTrackKey={this.changedTrackKey} sortConfig={this.oncoprintLibrarySortConfig} showClinicalTrackLegends={ this.showClinicalTrackLegends @@ -2006,6 +2007,9 @@ export default class ResultsViewOncoprint extends React.Component< showWhitespaceBetweenColumns={ this.showWhitespaceBetweenColumns } + enableWhiteBackgroundForGlyphs={ + this.enableWhiteBackgroundForGlyphs + } showMinimap={this.showMinimap} onMinimapClose={this.onMinimapClose} onDeleteClinicalTrack={ diff --git a/src/shared/components/oncoprint/controls/OncoprintColors.tsx b/src/shared/components/oncoprint/controls/OncoprintColors.tsx index 7c563d03e2f..60780660ec7 100644 --- a/src/shared/components/oncoprint/controls/OncoprintColors.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintColors.tsx @@ -21,7 +21,6 @@ import { IOncoprintControlsState, } from './OncoprintControls'; import { RGBAColor } from 'oncoprintjs'; -import { ClinicalTrackSpec } from '../Oncoprint'; import _ from 'lodash'; export interface IGroupCheckboxProps { @@ -36,7 +35,7 @@ export interface IGroupCheckboxProps { clinicalAttributeLabel: string; clinicalAttributeValue: any; color: RGBAColor; - clinicalTrack: ClinicalTrackSpec; + clinicalTrackKey: string; // markedWithWarningSign: boolean; } @@ -73,7 +72,7 @@ export default class OncoprintColors extends React.Component< // set changed track key this.props.handlers.onSetChangedTrackKey && this.props.handlers.onSetChangedTrackKey( - this.props.clinicalTrack.key + this.props.clinicalTrackKey ); }; diff --git a/src/shared/components/oncoprint/controls/OncoprintControls.tsx b/src/shared/components/oncoprint/controls/OncoprintControls.tsx index 58bed1e2223..3ce881fc169 100644 --- a/src/shared/components/oncoprint/controls/OncoprintControls.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintControls.tsx @@ -63,6 +63,7 @@ export interface IOncoprintControlsHandlers onSelectShowMinimap: (showMinimap: boolean) => void; onSelectDistinguishMutationType: (distinguish: boolean) => void; onSelectDistinguishGermlineMutations: (distinguish: boolean) => void; + onSelectEnableWhiteBackgroundForGlyphs?: (use: boolean) => void; onSetChangedTrackKey?: (key: string) => void; onSelectHideVUS: (hide: boolean) => void; @@ -96,6 +97,7 @@ export interface IOncoprintControlsState showClinicalTrackLegends?: boolean; onlyShowClinicalLegendForAlteredCases?: boolean; showOqlInLabels?: boolean; + enableWhiteBackgroundForGlyphs?: boolean; showMinimap: boolean; isClinicalTrackConfigDirty: boolean; isLoggedIn: boolean; @@ -164,6 +166,7 @@ const EVENT_KEY = { showClinicalTrackLegends: '4', onlyShowClinicalLegendForAlteredCases: '4.1', showOqlInLabels: '4.2', + enableWhiteBackgroundForGlyphs: '4.3', distinguishMutationType: '5', distinguishGermlineMutations: '5.1', sortByMutationType: '6', @@ -308,6 +311,12 @@ export default class OncoprintControls extends React.Component< !this.props.state.showOqlInLabels ); break; + case EVENT_KEY.enableWhiteBackgroundForGlyphs: + this.props.handlers.onSelectEnableWhiteBackgroundForGlyphs && + this.props.handlers.onSelectEnableWhiteBackgroundForGlyphs( + !this.props.state.enableWhiteBackgroundForGlyphs + ); + break; case EVENT_KEY.columnTypeSample: this.props.handlers.onSelectColumnType && this.props.handlers.onSelectColumnType('sample'); @@ -878,31 +887,30 @@ export default class OncoprintControls extends React.Component< return (
{track.label} - {getClinicalAttributeValues( - track.label, - this.props.clinicalTracks! - ).map(value => ( - - ))} + {getClinicalAttributeValues(track).map( + value => ( + + ) + )}
); })} @@ -1009,6 +1017,21 @@ export default class OncoprintControls extends React.Component< Show legends for clinical tracks +
+ +
); }); @@ -1127,6 +1150,21 @@ export default class OncoprintControls extends React.Component< Show OQL filters +
+ +
); }); From 89a2ce4d6eb54b040ad41185d7d4c38c7e05d5bd Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Fri, 6 Oct 2023 17:10:36 -0400 Subject: [PATCH 06/15] add white background for glyphs query to url --- src/pages/resultsView/ResultsViewURLWrapper.ts | 3 +++ .../components/oncoprint/ResultsViewOncoprint.tsx | 11 +++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/pages/resultsView/ResultsViewURLWrapper.ts b/src/pages/resultsView/ResultsViewURLWrapper.ts index c0a2b75d813..71fb650fa9e 100644 --- a/src/pages/resultsView/ResultsViewURLWrapper.ts +++ b/src/pages/resultsView/ResultsViewURLWrapper.ts @@ -77,6 +77,7 @@ export enum ResultsViewURLQueryEnum { geneset_list = 'geneset_list', generic_assay_groups = 'generic_assay_groups', show_samples = 'show_samples', + enable_white_background_for_glyphs = 'enable_white_background_for_glyphs', heatmap_track_groups = 'heatmap_track_groups', oncoprint_sortby = 'oncoprint_sortby', oncoprint_cluster_profile = 'oncoprint_cluster_profile', @@ -127,6 +128,7 @@ export type ResultsViewURLQuery = { const shouldForceRemount: { [prop in keyof ResultsViewURLQuery]: boolean } = { clinicallist: false, show_samples: false, + enable_white_background_for_glyphs: false, heatmap_track_groups: false, oncoprint_sortby: false, oncoprint_cluster_profile: false, @@ -181,6 +183,7 @@ const propertiesMap = _.mapValues( // oncoprint props clinicallist: { isSessionProp: false }, show_samples: { isSessionProp: false }, + enable_white_background_for_glyphs: { isSessionProp: false }, heatmap_track_groups: { isSessionProp: false }, oncoprint_sortby: { isSessionProp: false }, oncoprint_cluster_profile: { isSessionProp: false }, diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index e5b60bb1db6..f40380a5ed4 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -238,6 +238,12 @@ export default class ResultsViewOncoprint extends React.Component< ); } + @computed get enableWhiteBackgroundForGlyphs() { + return ( + this.urlWrapper.query.enable_white_background_for_glyphs === 'true' + ); + } + @computed get genericAssayPromises() { if (this.props.store.studyIds.result.length === 1) { // we only support generic assay in oncoprint for single study, @@ -287,7 +293,6 @@ export default class ResultsViewOncoprint extends React.Component< @observable showClinicalTrackLegends: boolean = true; @observable _onlyShowClinicalLegendForAlteredCases = false; @observable showOqlInLabels = false; - @observable enableWhiteBackgroundForGlyphs: boolean = false; @computed get onlyShowClinicalLegendForAlteredCases() { return ( @@ -764,7 +769,9 @@ export default class ResultsViewOncoprint extends React.Component< this.showOqlInLabels = show; }, onSelectEnableWhiteBackgroundForGlyphs: (s: boolean) => { - this.enableWhiteBackgroundForGlyphs = s; + this.urlWrapper.updateURL({ + enable_white_background_for_glyphs: s.toString(), + }); }, onSelectShowMinimap: (show: boolean) => { this.showMinimap = show; From 0a0665dfd7e90de4305ba5d9a337f9a41c46bd81 Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Tue, 10 Oct 2023 16:12:14 -0400 Subject: [PATCH 07/15] add button to reset colors and fix crash when going into oncoprinter --- src/pages/resultsView/ResultsViewPageStore.ts | 41 ------ .../oncoprint/controls/OncoprintColors.tsx | 21 --- .../oncoprint/controls/OncoprintControls.tsx | 137 ++++++++++++------ 3 files changed, 94 insertions(+), 105 deletions(-) diff --git a/src/pages/resultsView/ResultsViewPageStore.ts b/src/pages/resultsView/ResultsViewPageStore.ts index a3f57341294..0db3db8295a 100644 --- a/src/pages/resultsView/ResultsViewPageStore.ts +++ b/src/pages/resultsView/ResultsViewPageStore.ts @@ -589,11 +589,6 @@ export class ResultsViewPageStore extends AnalysisStore }; } = {}; - // private _selectedComparisonGroupsWarningSigns = observable.map< - // string, - // boolean - // >({}, { deep: false }); - @computed get doNonSelectedDownloadableMolecularProfilesExist() { return ( this.nonSelectedDownloadableMolecularProfilesGroupByName.result && @@ -670,42 +665,6 @@ export class ResultsViewPageStore extends AnalysisStore } } - // @action public showAlterationWarningSign( - // alteration: string, - // markedValue: boolean - // ) { - // this._selectedComparisonGroupsWarningSigns.set(alteration, markedValue); - // } - - // public flagDuplicateColorsForAlterations( - // alteration: string, - // color: string | undefined - // ) { - // let colors: { [color: string]: number } = {}; - - // Object.keys(this.userAlterationColors).forEach( - // (a: string, i: number) => { - // let alterationColor = - // a === alteration ? color : this.userAlterationColors[a]; - // if ( - // alterationColor == undefined || - // colors[alterationColor] == undefined - // ) { - // if (alterationColor != undefined) - // colors[alterationColor] = 1; - // this.showAlterationWarningSign(alteration, false); - // } else { - // colors[alterationColor] = colors[alterationColor] + 1; - // this.showAlterationWarningSign(alteration, true); - // } - // } - // ); - // } - - // public isAlterationMarkedWithWarningSign(alteration: string): boolean { - // return !!this._selectedComparisonGroupsWarningSigns.get(alteration); - // } - @action.bound public setOncoprintAnalysisCaseType(e: OncoprintAnalysisCaseType) { this.urlWrapper.updateURL({ diff --git a/src/shared/components/oncoprint/controls/OncoprintColors.tsx b/src/shared/components/oncoprint/controls/OncoprintColors.tsx index 60780660ec7..d0212699808 100644 --- a/src/shared/components/oncoprint/controls/OncoprintColors.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintColors.tsx @@ -36,7 +36,6 @@ export interface IGroupCheckboxProps { clinicalAttributeValue: any; color: RGBAColor; clinicalTrackKey: string; - // markedWithWarningSign: boolean; } const COLOR_UNDEFINED = '#FFFFFF'; @@ -111,26 +110,6 @@ export default class OncoprintColors extends React.Component< return (
{this.props.clinicalAttributeValue} - {/* */} - {/* - {this.props.markedWithWarningSign && ( - - )} - */} - {/* */} { - return ( - -
- {this.props.clinicalTracks!.map(track => { - return ( -
- {track.label} - {getClinicalAttributeValues(track).map( - value => ( - + {this.props.clinicalTracks!.map(track => { + if (track.datatype !== 'number') { + return ( +
+ {track.label} + {getClinicalAttributeValues(track).map( + value => ( + + ) + )} +
- ); - })} -
- - ); + onClick={() => { + getClinicalAttributeValues( + track + ).forEach(v => { + this.props + .handleClinicalAttributeColorChange && + this.props.handleClinicalAttributeColorChange( + track.label, + v, + undefined + ); + this.props.handlers + .onSetChangedTrackKey && + this.props.handlers.onSetChangedTrackKey( + track.key + ); + }); + }} + > + Reset Colors + +
+ ); + } + })} +
+ + ); + } else { + return null; + } }); private MutationColorMenu = observer(() => { From ecaf631d7c71d5db94e2d520a1f31010283a836e Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Thu, 12 Oct 2023 18:11:00 -0400 Subject: [PATCH 08/15] move color menu to modal under individual track menu --- src/pages/resultsView/ResultsViewPageStore.ts | 40 ++-- ...olors.tsx => ClinicalTrackColorPicker.tsx} | 43 ++-- src/shared/components/oncoprint/DeltaUtils.ts | 22 +- src/shared/components/oncoprint/Oncoprint.tsx | 5 +- .../components/oncoprint/OncoprintUtils.ts | 28 ++- .../oncoprint/ResultsViewOncoprint.tsx | 195 +++++++++++++----- .../oncoprint/controls/OncoprintControls.tsx | 151 +------------- 7 files changed, 219 insertions(+), 265 deletions(-) rename src/shared/components/oncoprint/{controls/OncoprintColors.tsx => ClinicalTrackColorPicker.tsx} (71%) diff --git a/src/pages/resultsView/ResultsViewPageStore.ts b/src/pages/resultsView/ResultsViewPageStore.ts index 0db3db8295a..be918e03dcf 100644 --- a/src/pages/resultsView/ResultsViewPageStore.ts +++ b/src/pages/resultsView/ResultsViewPageStore.ts @@ -577,13 +577,13 @@ export class ResultsViewPageStore extends AnalysisStore @observable queryFormVisible: boolean = false; - @observable _userSelectedClinicalAttributeColors: { + @observable _userSelectedClinicalTracksColors: { [label: string]: { [value: string]: RGBAColor; }; } = {}; - @observable _defaultClinicalAttributeColors: { + @observable _defaultClinicalTracksColors: { [label: string]: { [value: string]: RGBAColor; }; @@ -603,37 +603,37 @@ export class ResultsViewPageStore extends AnalysisStore | undefined = undefined; @action.bound - public onClinicalAttributeColorChange( + public setUserSelectedClinicalTrackColor( label: string, value: string, color: RGBAColor | undefined ) { // if color is undefined, delete color from userSelectedClinicalAttributeColors if exists + // else, set the color in userSelectedClinicalAttributeColors if ( !color && - this._userSelectedClinicalAttributeColors[label] && - this._userSelectedClinicalAttributeColors[label][value] + this._userSelectedClinicalTracksColors[label] && + this._userSelectedClinicalTracksColors[label][value] ) { - delete this._userSelectedClinicalAttributeColors[label][value]; - // else, set the color in userSelectedClinicalAttributeColors + delete this._userSelectedClinicalTracksColors[label][value]; } else if (color) { - if (!this._userSelectedClinicalAttributeColors[label]) { - this._userSelectedClinicalAttributeColors[label] = {}; + if (!this._userSelectedClinicalTracksColors[label]) { + this._userSelectedClinicalTracksColors[label] = {}; } - this._userSelectedClinicalAttributeColors[label][value] = color; + this._userSelectedClinicalTracksColors[label][value] = color; } } - @computed get defaultClinicalAttributeColors() { - return this._defaultClinicalAttributeColors; + @computed get defaultClinicalTracksColors() { + return this._defaultClinicalTracksColors; } - @computed get userSelectedClinicalAttributeColors() { - return this._userSelectedClinicalAttributeColors; + @computed get userSelectedClinicalTracksColors() { + return this._userSelectedClinicalTracksColors; } @action.bound - public setDefaultClinicalAttributeColor( + public setDefaultClinicalTrackColors( label: string, values: any[], categoryToColor?: { @@ -642,14 +642,14 @@ export class ResultsViewPageStore extends AnalysisStore countsCategoryFills?: RGBAColor[] ) { if (categoryToColor) { - this._defaultClinicalAttributeColors[label] = {}; + this._defaultClinicalTracksColors[label] = {}; _.forEach(values, value => { - this._defaultClinicalAttributeColors[label][value] = + this._defaultClinicalTracksColors[label][value] = categoryToColor[value]; }); // sample type attributes have unique "Mixed" label with set color if (label === 'Sample Type' || label === 'Sample type id') { - this._defaultClinicalAttributeColors[label]['Mixed'] = [ + this._defaultClinicalTracksColors[label]['Mixed'] = [ 48, 97, 194, @@ -657,9 +657,9 @@ export class ResultsViewPageStore extends AnalysisStore ]; } } else if (countsCategoryFills) { - this._defaultClinicalAttributeColors[label] = {}; + this._defaultClinicalTracksColors[label] = {}; _.forEach(values, (value, i) => { - this._defaultClinicalAttributeColors[label][value] = + this._defaultClinicalTracksColors[label][value] = countsCategoryFills[i]; }); } diff --git a/src/shared/components/oncoprint/controls/OncoprintColors.tsx b/src/shared/components/oncoprint/ClinicalTrackColorPicker.tsx similarity index 71% rename from src/shared/components/oncoprint/controls/OncoprintColors.tsx rename to src/shared/components/oncoprint/ClinicalTrackColorPicker.tsx index d0212699808..429bf0b2a78 100644 --- a/src/shared/components/oncoprint/controls/OncoprintColors.tsx +++ b/src/shared/components/oncoprint/ClinicalTrackColorPicker.tsx @@ -16,32 +16,24 @@ import { } from 'shared/lib/Colors'; import { COLORS } from 'pages/studyView/StudyViewUtils'; import { ResultsViewPageStore } from 'pages/resultsView/ResultsViewPageStore'; -import { - IOncoprintControlsHandlers, - IOncoprintControlsState, -} from './OncoprintControls'; import { RGBAColor } from 'oncoprintjs'; import _ from 'lodash'; export interface IGroupCheckboxProps { - store?: ResultsViewPageStore; - handlers: IOncoprintControlsHandlers; - state: IOncoprintControlsState; - handleClinicalAttributeColorChange?: ( - label: string, + store: ResultsViewPageStore; + handleClinicalTrackColorChange?: ( value: string, color: RGBAColor | undefined ) => void; - clinicalAttributeLabel: string; - clinicalAttributeValue: any; + clinicalTrackValue: any; color: RGBAColor; - clinicalTrackKey: string; + setClinicalTrackColorChanged: (changed: boolean) => void; } const COLOR_UNDEFINED = '#FFFFFF'; @observer -export default class OncoprintColors extends React.Component< +export default class ClinicalTrackColorPicker extends React.Component< IGroupCheckboxProps, {} > { @@ -52,27 +44,22 @@ export default class OncoprintColors extends React.Component< @action.bound handleChangeComplete = (color: any, event: any) => { - // if same color is select, unselect it (go back to no color) + // if same color is selected, unselect it (go back to default color) if (color.hex === rgbaToHex(this.props.color)) { - this.props.handleClinicalAttributeColorChange && - this.props.handleClinicalAttributeColorChange( - this.props.clinicalAttributeLabel, - this.props.clinicalAttributeValue, + this.props.handleClinicalTrackColorChange && + this.props.handleClinicalTrackColorChange( + this.props.clinicalTrackValue, undefined ); } else { - this.props.handleClinicalAttributeColorChange && - this.props.handleClinicalAttributeColorChange( - this.props.clinicalAttributeLabel, - this.props.clinicalAttributeValue, + this.props.handleClinicalTrackColorChange && + this.props.handleClinicalTrackColorChange( + this.props.clinicalTrackValue, [color.rgb.r, color.rgb.g, color.rgb.b, color.rgb.a] ); } // set changed track key - this.props.handlers.onSetChangedTrackKey && - this.props.handlers.onSetChangedTrackKey( - this.props.clinicalTrackKey - ); + this.props.setClinicalTrackColorChanged(true); }; @computed get colorList() { @@ -109,7 +96,7 @@ export default class OncoprintColors extends React.Component< render() { return (
- {this.props.clinicalAttributeValue} + {this.props.clinicalTrackValue} { [key: string]: TrackId }, oncoprint: OncoprintJS, - nextProps: IOncoprintProps, - prevProps: Partial + nextProps: IOncoprintProps ) { const trackSpecKeyToTrackId = getTrackSpecKeyToTrackId(); if (tryRemoveTrack(nextSpec, prevSpec, trackSpecKeyToTrackId, oncoprint)) { @@ -1332,19 +1329,20 @@ function transitionClinicalTrack( oncoprint.setTrackCustomOptions(trackId, nextSpec.custom_options); } - // update ruleset for changed track key + // update ruleset if color has changed for selected track if ( - nextProps.changedTrackKey && - getTrackSpecKeyToTrackId()[nextProps.changedTrackKey] === trackId + nextProps.clinicalTrackColorChanged && + nextProps.selectedClinicalTrackKey && + getTrackSpecKeyToTrackId()[nextProps.selectedClinicalTrackKey] === + trackId ) { let rule_set_params = getClinicalTrackRuleSetParams(nextSpec); rule_set_params.legend_label = nextSpec.label; rule_set_params.exclude_from_legend = !nextProps.showClinicalTrackLegends; rule_set_params.na_legend_label = nextSpec.na_legend_label; oncoprint.setRuleSet(trackId, rule_set_params); - // set changed track key back to none - nextProps.onSetChangedTrackKey && - nextProps.onSetChangedTrackKey(''); + nextProps.setClinicalTrackColorChanged && + nextProps.setClinicalTrackColorChanged(false); } } } diff --git a/src/shared/components/oncoprint/Oncoprint.tsx b/src/shared/components/oncoprint/Oncoprint.tsx index c3f6aecb6cb..eb9e5c77ef5 100644 --- a/src/shared/components/oncoprint/Oncoprint.tsx +++ b/src/shared/components/oncoprint/Oncoprint.tsx @@ -300,8 +300,9 @@ export interface IOncoprintProps { onTrackSortDirectionChange?: (trackId: TrackId, dir: number) => void; onTrackGapChange?: (trackId: TrackId, gap: boolean) => void; - changedTrackKey?: string; - onSetChangedTrackKey?: (key: string) => void; + selectedClinicalTrackKey?: string | null; + clinicalTrackColorChanged?: boolean; + setClinicalTrackColorChanged?: (changed: boolean) => void; suppressRendering?: boolean; onSuppressRendering?: () => void; diff --git a/src/shared/components/oncoprint/OncoprintUtils.ts b/src/shared/components/oncoprint/OncoprintUtils.ts index e1c9831ab8d..6dc5969dcff 100644 --- a/src/shared/components/oncoprint/OncoprintUtils.ts +++ b/src/shared/components/oncoprint/OncoprintUtils.ts @@ -34,7 +34,7 @@ import { } from './DataUtils'; import _, { isNumber } from 'lodash'; import ResultsViewOncoprint, { - getClinicalAttributeValues, + getClinicalTrackValues, } from './ResultsViewOncoprint'; import { action, IObservableArray, ObservableMap, runInAction } from 'mobx'; import { MobxPromise } from 'mobxpromise'; @@ -1092,16 +1092,24 @@ export function makeClinicalTracksMobxPromise( ); // if default for attribute doesn't already exist if ( - !oncoprint.props.store.defaultClinicalAttributeColors[ + !oncoprint.props.store.defaultClinicalTracksColors[ attribute.displayName ] ) { - oncoprint.props.store.setDefaultClinicalAttributeColor( + oncoprint.props.store.setDefaultClinicalTrackColors( attribute.displayName, - getClinicalAttributeValues(ret), + getClinicalTrackValues(ret), (ret as any).category_to_color ); } + // add option to open up color config modal + ret.custom_options = [ + { + label: 'Color', + onClick: () => + oncoprint.setSelectedClinicalTrackKey(ret.key!), + }, + ]; } else if ( attribute.clinicalAttributeId === SpecialAttribute.MutationSpectrum @@ -1111,17 +1119,25 @@ export function makeClinicalTracksMobxPromise( (ret as any).countsCategoryFills = MUTATION_SPECTRUM_FILLS; // if default for attribute doesn't already exist if ( - !oncoprint.props.store.defaultClinicalAttributeColors[ + !oncoprint.props.store.defaultClinicalTracksColors[ attribute.displayName ] ) { - oncoprint.props.store.setDefaultClinicalAttributeColor( + oncoprint.props.store.setDefaultClinicalTrackColors( attribute.displayName, MUTATION_SPECTRUM_CATEGORIES, undefined, MUTATION_SPECTRUM_FILLS ); } + // add options to open up color config modal + ret.custom_options = [ + { + label: 'Color', + onClick: () => + oncoprint.setSelectedClinicalTrackKey(ret.key!), + }, + ]; } const trackConfig = diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index f40380a5ed4..c8dea71a035 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -90,6 +90,8 @@ import '../../../globalStyles/oncoprintStyles.scss'; import { GenericAssayTrackInfo } from 'pages/studyView/addChartButton/genericAssaySelection/GenericAssaySelection'; import { toDirectionString } from './SortUtils'; import { RestoreClinicalTracksMenu } from 'pages/resultsView/oncoprint/RestoreClinicalTracksMenu'; +import { Modal } from 'react-bootstrap'; +import ClinicalTrackColorPicker from './ClinicalTrackColorPicker'; interface IResultsViewOncoprintProps { divId: string; @@ -132,11 +134,11 @@ export type AdditionalTrackGroupRecord = { molecularProfile: MolecularProfile; }; -export function getClinicalAttributeValues( +export function getClinicalTrackValues( track: Partial ): any[] { - // if the datatype is "counts", the attribute values are under countsCategoryLabels - // else if the datatype is "string", get attribute values from the track data + // if the datatype is "counts", the values are under countsCategoryLabels + // else if the datatype is "string", get values from the track data if (track.datatype === 'counts') { return (track as any).countsCategoryLabels; } else if (track.datatype === 'string') { @@ -149,40 +151,51 @@ export function getClinicalAttributeValues( return []; } -export function setClinicalAttributeValueColorsInTrack( - attributeLabel: string, - attributeValue: string, - color: RGBAColor | undefined, +export function setClinicalTrackColor( track: ClinicalTrackSpec, + value: string, + color: RGBAColor | undefined, store: ResultsViewPageStore ) { if (track.datatype === 'string') { - // set new color of attribute value in track's category_to_color + // set new color of value in track's category_to_color + // if undefined color, set value's color in track's category_to_color back to its default if (color) { - (track as any).category_to_color[attributeValue] = color; - // if undefined color, set attribute value's color in track's category_to_color back to its default + (track as any).category_to_color[value] = color; } else { - (track as any).category_to_color[attributeValue] = - store.defaultClinicalAttributeColors[attributeLabel][ - attributeValue - ]; + (track as any).category_to_color[value] = + store.defaultClinicalTracksColors[track.label][value]; } } else if (track.datatype === 'counts') { - // get index of attribute value that corresponds with its color - let valueIndex = _.indexOf( - (track as any).countsCategoryLabels, - attributeValue - ); - // set new color of attribute value in track's countsCategoryFills using valueIndex + // get index of value that corresponds with its color + let valueIndex = _.indexOf((track as any).countsCategoryLabels, value); + // set new color of value in track's countsCategoryFills using valueIndex + // if undefined color, set value's color in track's countsCategoryFills back to its default if (color) { (track as any).countsCategoryFills[valueIndex] = color; - // if undefined color, set attribute value's color in track's countsCategoryFills back to its default } else { (track as any).countsCategoryFills[valueIndex] = - store.defaultClinicalAttributeColors[attributeLabel][ - attributeValue - ]; + store.defaultClinicalTracksColors[track.label][value]; + } + } +} + +export function getClinicalTrackColor( + label: string, + value: string, + store?: ResultsViewPageStore +): RGBAColor { + if (store) { + if ( + !store.userSelectedClinicalTracksColors[label] || + !store.userSelectedClinicalTracksColors[label][value] + ) { + return store.defaultClinicalTracksColors[label][value]; + } else { + return store.userSelectedClinicalTracksColors[label][value]; } + } else { + return [255, 255, 255, 1] as RGBAColor; } } @@ -1767,10 +1780,6 @@ export default class ResultsViewOncoprint extends React.Component< this .selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl } - handleClinicalAttributeColorChange={ - this.handleClinicalAttributeColorChange - } - clinicalTracks={this.clinicalTracks.result} /> ); @@ -1875,32 +1884,49 @@ export default class ResultsViewOncoprint extends React.Component< } @action.bound - public handleClinicalAttributeColorChange( - attributeLabel: string, - attributeValue: string, + public handleClinicalTrackColorChange( + value: string, color: RGBAColor | undefined ) { - // find track that matches given label - let index = _.findIndex( - this.clinicalTracks.result, - i => i.label === attributeLabel - ); - const track = this.clinicalTracks.result[index]; - - setClinicalAttributeValueColorsInTrack( - attributeLabel, - attributeValue, + setClinicalTrackColor( + this.selectedClinicalTrack, + value, color, - track, this.props.store ); - this.props.store.onClinicalAttributeColorChange( - attributeLabel, - attributeValue, + this.props.store.setUserSelectedClinicalTrackColor( + this.selectedClinicalTrack.label, + value, color ); } + @observable selectedClinicalTrackKey: string | null = null; + + @action.bound + setSelectedClinicalTrackKey(key: string | null) { + this.selectedClinicalTrackKey = key; + } + + @computed get selectedClinicalTrack() { + let index = _.findIndex( + this.clinicalTracks.result, + t => t.key === this.selectedClinicalTrackKey + ); + return this.clinicalTracks.result[index]; + } + + @computed get selectedClinicalTrackValues() { + return getClinicalTrackValues(this.selectedClinicalTrack); + } + + @observable clinicalTrackColorChanged: boolean = false; + + @action.bound + setClinicalTrackColorChanged(changed: boolean) { + this.clinicalTrackColorChanged = changed; + } + public render() { getBrowserWindow().donk = this; return ( @@ -1938,6 +1964,74 @@ export default class ResultsViewOncoprint extends React.Component< />
+ {this.selectedClinicalTrack && ( + this.setSelectedClinicalTrackKey(null)} + > + + + {this.selectedClinicalTrack.label} + + + +
+ {this.selectedClinicalTrackValues.map(value => ( + + ))} + +
+
+
+ )} +
diff --git a/src/shared/components/oncoprint/controls/OncoprintControls.tsx b/src/shared/components/oncoprint/controls/OncoprintControls.tsx index 540d15d2320..3b87dbec08f 100644 --- a/src/shared/components/oncoprint/controls/OncoprintControls.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintControls.tsx @@ -7,7 +7,7 @@ import ReactSelect from 'react-select1'; import { MobxPromise } from 'mobxpromise'; import { action, computed, observable, reaction, makeObservable } from 'mobx'; import _ from 'lodash'; -import { getClinicalAttributeValues, SortMode } from '../ResultsViewOncoprint'; +import { SortMode } from '../ResultsViewOncoprint'; import { Gene, MolecularProfile, @@ -32,9 +32,7 @@ import { import OQLTextArea, { GeneBoxType } from '../../GeneSelectionBox/OQLTextArea'; import autobind from 'autobind-decorator'; import { SingleGeneQuery } from '../../../lib/oql/oql-parser'; -import TracksMenu, { - MIN_DROPDOWN_WIDTH, -} from 'pages/resultsView/oncoprint/TracksMenu'; +import TracksMenu from 'pages/resultsView/oncoprint/TracksMenu'; import { GenericAssayTrackInfo } from 'pages/studyView/addChartButton/genericAssaySelection/GenericAssaySelection'; import { IDriverAnnotationControlsHandlers, @@ -44,11 +42,8 @@ import DriverAnnotationControls from 'shared/components/driverAnnotations/Driver import { ClinicalTrackConfig, ClinicalTrackConfigMap, - ClinicalTrackSpec, } from 'shared/components/oncoprint/Oncoprint'; import { getServerConfig } from 'config/config'; -import { RGBAColor } from 'oncoprintjs'; -import OncoprintColors from './OncoprintColors'; export interface IOncoprintControlsHandlers extends IDriverAnnotationControlsHandlers { @@ -64,7 +59,6 @@ export interface IOncoprintControlsHandlers onSelectDistinguishMutationType: (distinguish: boolean) => void; onSelectDistinguishGermlineMutations: (distinguish: boolean) => void; onSelectEnableWhiteBackgroundForGlyphs?: (use: boolean) => void; - onSetChangedTrackKey?: (key: string) => void; onSelectHideVUS: (hide: boolean) => void; onSelectHideGermlineMutations: (hide: boolean) => void; @@ -109,7 +103,6 @@ export interface IOncoprintControlsState sortByCaseListDisabled: boolean; hidePutativePassengers: boolean; hideGermlineMutations: boolean; - changedTrackKey?: string; sortMode?: SortMode; clinicalAttributesPromise?: MobxPromise; @@ -145,12 +138,6 @@ export interface IOncoprintControlsProps { selectedGenericAssayEntitiesGroupedByGenericAssayTypeFromUrl?: { [genericAssayType: string]: string[]; }; - handleClinicalAttributeColorChange?: ( - label: string, - value: string, - color: RGBAColor | undefined - ) => void; - clinicalTracks?: ClinicalTrackSpec[]; } export interface ISelectOption { @@ -196,25 +183,6 @@ const EVENT_KEY = { viewNGCHM: '31', }; -export function getOncoprintColor( - label: string, - value: string, - store?: ResultsViewPageStore -): RGBAColor { - if (store) { - if ( - !store.userSelectedClinicalAttributeColors[label] || - !store.userSelectedClinicalAttributeColors[label][value] - ) { - return store.defaultClinicalAttributeColors[label][value]; - } else { - return store.userSelectedClinicalAttributeColors[label][value]; - } - } else { - return [255, 255, 255, 1] as RGBAColor; - } -} - @observer export default class OncoprintControls extends React.Component< IOncoprintControlsProps, @@ -871,105 +839,6 @@ export default class OncoprintControls extends React.Component< } } - private ColorsMenuOncoprint = observer(() => { - if (this.props.store) { - return ( - -
- {this.props.clinicalTracks!.map(track => { - if (track.datatype !== 'number') { - return ( -
- {track.label} - {getClinicalAttributeValues(track).map( - value => ( - - ) - )} - -
- ); - } - })} -
-
- ); - } else { - return null; - } - }); - private MutationColorMenu = observer(() => { return ( -
- -
); }); @@ -1384,7 +1238,6 @@ export default class OncoprintControls extends React.Component< - From ce96829925e7f770fd572a0c9f560cd24634af9b Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Mon, 30 Oct 2023 17:38:50 -0400 Subject: [PATCH 09/15] address review comments --- src/pages/resultsView/ResultsViewPageStore.ts | 48 +---- .../oncoprint/ClinicalTrackColorPicker.tsx | 59 +++--- src/shared/components/oncoprint/DeltaUtils.ts | 30 ++- src/shared/components/oncoprint/Oncoprint.tsx | 6 +- .../components/oncoprint/OncoprintUtils.ts | 71 +++---- .../oncoprint/ResultsViewOncoprint.tsx | 185 +++++++++--------- .../oncoprint/controls/OncoprintControls.tsx | 19 +- 7 files changed, 181 insertions(+), 237 deletions(-) diff --git a/src/pages/resultsView/ResultsViewPageStore.ts b/src/pages/resultsView/ResultsViewPageStore.ts index be918e03dcf..9f52d43f2af 100644 --- a/src/pages/resultsView/ResultsViewPageStore.ts +++ b/src/pages/resultsView/ResultsViewPageStore.ts @@ -276,10 +276,7 @@ import { ICBioData } from 'pathway-mapper'; import { getAlterationData } from 'shared/components/oncoprint/OncoprintUtils'; import { PageUserSession } from 'shared/userSession/PageUserSession'; import { PageType } from 'shared/userSession/PageType'; -import { - ClinicalTrackConfig, - ClinicalTrackSpec, -} from 'shared/components/oncoprint/Oncoprint'; +import { ClinicalTrackConfig } from 'shared/components/oncoprint/Oncoprint'; import eventBus from 'shared/events/eventBus'; import { ErrorMessages } from 'shared/errorMessages'; import AnalysisStore from 'shared/lib/comparison/AnalysisStore'; @@ -583,12 +580,6 @@ export class ResultsViewPageStore extends AnalysisStore }; } = {}; - @observable _defaultClinicalTracksColors: { - [label: string]: { - [value: string]: RGBAColor; - }; - } = {}; - @computed get doNonSelectedDownloadableMolecularProfilesExist() { return ( this.nonSelectedDownloadableMolecularProfilesGroupByName.result && @@ -624,47 +615,10 @@ export class ResultsViewPageStore extends AnalysisStore } } - @computed get defaultClinicalTracksColors() { - return this._defaultClinicalTracksColors; - } - @computed get userSelectedClinicalTracksColors() { return this._userSelectedClinicalTracksColors; } - @action.bound - public setDefaultClinicalTrackColors( - label: string, - values: any[], - categoryToColor?: { - [category: string]: [number, number, number, number]; - }, - countsCategoryFills?: RGBAColor[] - ) { - if (categoryToColor) { - this._defaultClinicalTracksColors[label] = {}; - _.forEach(values, value => { - this._defaultClinicalTracksColors[label][value] = - categoryToColor[value]; - }); - // sample type attributes have unique "Mixed" label with set color - if (label === 'Sample Type' || label === 'Sample type id') { - this._defaultClinicalTracksColors[label]['Mixed'] = [ - 48, - 97, - 194, - 1, - ]; - } - } else if (countsCategoryFills) { - this._defaultClinicalTracksColors[label] = {}; - _.forEach(values, (value, i) => { - this._defaultClinicalTracksColors[label][value] = - countsCategoryFills[i]; - }); - } - } - @action.bound public setOncoprintAnalysisCaseType(e: OncoprintAnalysisCaseType) { this.urlWrapper.updateURL({ diff --git a/src/shared/components/oncoprint/ClinicalTrackColorPicker.tsx b/src/shared/components/oncoprint/ClinicalTrackColorPicker.tsx index 429bf0b2a78..0d09d2ef37e 100644 --- a/src/shared/components/oncoprint/ClinicalTrackColorPicker.tsx +++ b/src/shared/components/oncoprint/ClinicalTrackColorPicker.tsx @@ -71,37 +71,44 @@ export default class ClinicalTrackColorPicker extends React.Component< return colors; } - buildColorChooserWidget = () => ( - -
{ - e.nativeEvent.stopImmediatePropagation(); - }} - onClick={e => { - e.nativeEvent.stopImmediatePropagation(); - }} - > - -
-
- ); + @computed get colorChooserElement() { + return ( + +
{ + e.nativeEvent.stopImmediatePropagation(); + }} + onClick={e => { + e.nativeEvent.stopImmediatePropagation(); + }} + > + +
+
+ ); + } render() { return ( -
+
{this.props.clinicalTrackValue} - + + nextProps.setTrackKeySelectedForEdit!( + nextSpec.key + ), + }, + ...(nextSpec.custom_options || []), + ] + : nextSpec.custom_options, track_can_show_gaps: nextSpec.datatype === 'string', show_gaps_on_init: nextSpec.gapOn, }; @@ -1332,8 +1346,8 @@ function transitionClinicalTrack( // update ruleset if color has changed for selected track if ( nextProps.clinicalTrackColorChanged && - nextProps.selectedClinicalTrackKey && - getTrackSpecKeyToTrackId()[nextProps.selectedClinicalTrackKey] === + nextProps.trackKeySelectedForEdit && + getTrackSpecKeyToTrackId()[nextProps.trackKeySelectedForEdit] === trackId ) { let rule_set_params = getClinicalTrackRuleSetParams(nextSpec); diff --git a/src/shared/components/oncoprint/Oncoprint.tsx b/src/shared/components/oncoprint/Oncoprint.tsx index eb9e5c77ef5..52dbebbfe13 100644 --- a/src/shared/components/oncoprint/Oncoprint.tsx +++ b/src/shared/components/oncoprint/Oncoprint.tsx @@ -7,7 +7,6 @@ import { TrackSortDirection, InitParams, ColumnLabel, - IGeneticAlterationRuleSetParams, } from 'oncoprintjs'; import { GenePanelData, MolecularProfile } from 'cbioportal-ts-api-client'; import { observer } from 'mobx-react'; @@ -292,7 +291,7 @@ export interface IOncoprintProps { }; showClinicalTrackLegends?: boolean; showWhitespaceBetweenColumns?: boolean; - enableWhiteBackgroundForGlyphs?: boolean; + isWhiteBackgroundForGlyphsEnabled?: boolean; showMinimap?: boolean; onMinimapClose?: () => void; @@ -300,7 +299,8 @@ export interface IOncoprintProps { onTrackSortDirectionChange?: (trackId: TrackId, dir: number) => void; onTrackGapChange?: (trackId: TrackId, gap: boolean) => void; - selectedClinicalTrackKey?: string | null; + trackKeySelectedForEdit?: string | null; + setTrackKeySelectedForEdit?: (key: string | null) => void; clinicalTrackColorChanged?: boolean; setClinicalTrackColorChanged?: (changed: boolean) => void; diff --git a/src/shared/components/oncoprint/OncoprintUtils.ts b/src/shared/components/oncoprint/OncoprintUtils.ts index 6dc5969dcff..492df088405 100644 --- a/src/shared/components/oncoprint/OncoprintUtils.ts +++ b/src/shared/components/oncoprint/OncoprintUtils.ts @@ -453,7 +453,7 @@ export function getGeneticTrackRuleSetParams( distinguishMutationType?: boolean, distinguishDrivers?: boolean, distinguishGermlineMutations?: boolean, - enableWhiteBackgroundForGlyphs?: boolean + isWhiteBackgroundForGlyphsEnabled?: boolean ): IGeneticAlterationRuleSetParams { let rule_set; if (!distinguishMutationType && !distinguishDrivers) { @@ -469,7 +469,7 @@ export function getGeneticTrackRuleSetParams( if (distinguishGermlineMutations) { Object.assign(rule_set.rule_params.conditional, germline_rule_params); } - if (enableWhiteBackgroundForGlyphs) { + if (isWhiteBackgroundForGlyphsEnabled) { rule_set.legend_base_color = hexToRGBA(ASCN_WHITE); if (rule_set.rule_params.always) { rule_set.rule_params.always.shapes = [ @@ -1086,58 +1086,37 @@ export function makeClinicalTracksMobxPromise( } } else if (attribute.datatype === 'STRING') { ret.datatype = 'string'; - (ret as any).category_to_color = _.mapValues( - dataAndColors.categoryToColor, - hexToRGBA - ); - // if default for attribute doesn't already exist - if ( - !oncoprint.props.store.defaultClinicalTracksColors[ + (ret as any).category_to_color = Object.assign( + {}, + _.mapValues(dataAndColors.categoryToColor, hexToRGBA), + oncoprint.props.store.userSelectedClinicalTracksColors[ attribute.displayName ] - ) { - oncoprint.props.store.setDefaultClinicalTrackColors( - attribute.displayName, - getClinicalTrackValues(ret), - (ret as any).category_to_color - ); - } - // add option to open up color config modal - ret.custom_options = [ - { - label: 'Color', - onClick: () => - oncoprint.setSelectedClinicalTrackKey(ret.key!), - }, - ]; + ); } else if ( attribute.clinicalAttributeId === SpecialAttribute.MutationSpectrum ) { ret.datatype = 'counts'; (ret as any).countsCategoryLabels = MUTATION_SPECTRUM_CATEGORIES; - (ret as any).countsCategoryFills = MUTATION_SPECTRUM_FILLS; - // if default for attribute doesn't already exist - if ( - !oncoprint.props.store.defaultClinicalTracksColors[ - attribute.displayName - ] - ) { - oncoprint.props.store.setDefaultClinicalTrackColors( - attribute.displayName, - MUTATION_SPECTRUM_CATEGORIES, - undefined, - MUTATION_SPECTRUM_FILLS - ); - } - // add options to open up color config modal - ret.custom_options = [ - { - label: 'Color', - onClick: () => - oncoprint.setSelectedClinicalTrackKey(ret.key!), - }, - ]; + (ret as any).countsCategoryFills = MUTATION_SPECTRUM_FILLS.slice(); + _.forEach((ret as any).countsCategoryLabels, (label, i) => { + if ( + oncoprint.props.store + .userSelectedClinicalTracksColors[ + attribute.displayName + ] && + oncoprint.props.store + .userSelectedClinicalTracksColors[ + attribute.displayName + ][label] + ) { + (ret as any).countsCategoryFills[i] = + oncoprint.props.store.userSelectedClinicalTracksColors[ + attribute.displayName + ][label]; + } + }); } const trackConfig = diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index c8dea71a035..12462b295da 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -61,6 +61,8 @@ import tabularDownload from './tabularDownload'; import classNames from 'classnames'; import { clinicalAttributeIsLocallyComputed, + MUTATION_SPECTRUM_CATEGORIES, + MUTATION_SPECTRUM_FILLS, SpecialAttribute, } from '../../cache/ClinicalDataCache'; import OqlStatusBanner from '../banners/OqlStatusBanner'; @@ -92,6 +94,7 @@ import { toDirectionString } from './SortUtils'; import { RestoreClinicalTracksMenu } from 'pages/resultsView/oncoprint/RestoreClinicalTracksMenu'; import { Modal } from 'react-bootstrap'; import ClinicalTrackColorPicker from './ClinicalTrackColorPicker'; +import { hexToRGBA } from 'shared/lib/Colors'; interface IResultsViewOncoprintProps { divId: string; @@ -134,66 +137,41 @@ export type AdditionalTrackGroupRecord = { molecularProfile: MolecularProfile; }; -export function getClinicalTrackValues( - track: Partial -): any[] { +export function getClinicalTrackValues(track: ClinicalTrackSpec): any[] { // if the datatype is "counts", the values are under countsCategoryLabels // else if the datatype is "string", get values from the track data if (track.datatype === 'counts') { - return (track as any).countsCategoryLabels; + return track.countsCategoryLabels; } else if (track.datatype === 'string') { - return _(track.data) + const values = _(track.data) .map(d => d.attr_val) .uniq() .without(undefined) .value(); + return values.sort((a: string, b: string) => + a < b ? -1 : a > b ? 1 : 0 + ); } return []; } -export function setClinicalTrackColor( - track: ClinicalTrackSpec, - value: string, - color: RGBAColor | undefined, - store: ResultsViewPageStore -) { - if (track.datatype === 'string') { - // set new color of value in track's category_to_color - // if undefined color, set value's color in track's category_to_color back to its default - if (color) { - (track as any).category_to_color[value] = color; - } else { - (track as any).category_to_color[value] = - store.defaultClinicalTracksColors[track.label][value]; - } - } else if (track.datatype === 'counts') { - // get index of value that corresponds with its color - let valueIndex = _.indexOf((track as any).countsCategoryLabels, value); - // set new color of value in track's countsCategoryFills using valueIndex - // if undefined color, set value's color in track's countsCategoryFills back to its default - if (color) { - (track as any).countsCategoryFills[valueIndex] = color; - } else { - (track as any).countsCategoryFills[valueIndex] = - store.defaultClinicalTracksColors[track.label][value]; - } - } -} - export function getClinicalTrackColor( - label: string, - value: string, - store?: ResultsViewPageStore + track: ClinicalTrackSpec, + value: string ): RGBAColor { - if (store) { + if (track.datatype === 'counts') { + // get index of value that corresponds with its color + let valueIndex = _.indexOf(track.countsCategoryLabels, value); + return track.countsCategoryFills[valueIndex]; + } else if (track.datatype === 'string' && track.category_to_color) { if ( - !store.userSelectedClinicalTracksColors[label] || - !store.userSelectedClinicalTracksColors[label][value] + (track.label === 'Sample Type' || + track.label === 'Sample type id') && + value === 'Mixed' ) { - return store.defaultClinicalTracksColors[label][value]; - } else { - return store.userSelectedClinicalTracksColors[label][value]; + return track.category_to_color[value] || [48, 97, 194, 1]; } + return track.category_to_color[value]; } else { return [255, 255, 255, 1] as RGBAColor; } @@ -251,7 +229,7 @@ export default class ResultsViewOncoprint extends React.Component< ); } - @computed get enableWhiteBackgroundForGlyphs() { + @computed get isWhiteBackgroundForGlyphsEnabled() { return ( this.urlWrapper.query.enable_white_background_for_glyphs === 'true' ); @@ -327,8 +305,6 @@ export default class ResultsViewOncoprint extends React.Component< @observable renderingComplete = false; - @observable changedTrackKey: string = ''; - private heatmapGeneInputValueUpdater: IReactionDisposer; private molecularProfileIdToTrackGroupIndex: { @@ -549,8 +525,8 @@ export default class ResultsViewOncoprint extends React.Component< get showOqlInLabels() { return self.showOqlInLabels; }, - get enableWhiteBackgroundForGlyphs() { - return self.enableWhiteBackgroundForGlyphs; + get isWhiteBackgroundForGlyphsEnabled() { + return self.isWhiteBackgroundForGlyphsEnabled; }, get showMinimap() { return self.showMinimap; @@ -573,9 +549,6 @@ export default class ResultsViewOncoprint extends React.Component< get distinguishGermlineMutations() { return self.distinguishGermlineMutations; }, - get changedTrackKey() { - return self.changedTrackKey; - }, get annotateDriversOncoKb() { return self.props.store.driverAnnotationSettings.oncoKb; }, @@ -781,7 +754,7 @@ export default class ResultsViewOncoprint extends React.Component< onSelectShowOqlInLabels: (show: boolean) => { this.showOqlInLabels = show; }, - onSelectEnableWhiteBackgroundForGlyphs: (s: boolean) => { + onSelectIsWhiteBackgroundForGlyphsEnabled: (s: boolean) => { this.urlWrapper.updateURL({ enable_white_background_for_glyphs: s.toString(), }); @@ -833,9 +806,6 @@ export default class ResultsViewOncoprint extends React.Component< onSelectDistinguishGermlineMutations: (s: boolean) => { this.distinguishGermlineMutations = s; }, - onSetChangedTrackKey: (s: string) => { - this.changedTrackKey = s; - }, onSelectAnnotateOncoKb: action((s: boolean) => { this.props.store.driverAnnotationSettings.oncoKb = s; }), @@ -1884,40 +1854,66 @@ export default class ResultsViewOncoprint extends React.Component< } @action.bound - public handleClinicalTrackColorChange( + public handleSelectedClinicalTrackColorChange( value: string, color: RGBAColor | undefined ) { - setClinicalTrackColor( - this.selectedClinicalTrack, - value, - color, - this.props.store - ); - this.props.store.setUserSelectedClinicalTrackColor( - this.selectedClinicalTrack.label, - value, - color - ); + if (this.selectedClinicalTrack) { + this.props.store.setUserSelectedClinicalTrackColor( + this.selectedClinicalTrack.label, + value, + color + ); + } } - @observable selectedClinicalTrackKey: string | null = null; + @observable trackKeySelectedForEdit: string | null = null; @action.bound - setSelectedClinicalTrackKey(key: string | null) { - this.selectedClinicalTrackKey = key; + setTrackKeySelectedForEdit(key: string | null) { + this.trackKeySelectedForEdit = key; } @computed get selectedClinicalTrack() { - let index = _.findIndex( + return _.find( this.clinicalTracks.result, - t => t.key === this.selectedClinicalTrackKey + t => t.key === this.trackKeySelectedForEdit ); - return this.clinicalTracks.result[index]; + } + + @autobind + private getDefaultSelectedClinicalTrackColor(value: string) { + if (!this.selectedClinicalTrack) { + return [255, 255, 255, 1]; + } + if (this.selectedClinicalTrack.datatype === 'counts') { + return MUTATION_SPECTRUM_FILLS[ + _.indexOf(MUTATION_SPECTRUM_CATEGORIES, value) + ]; + } else if (this.selectedClinicalTrack.datatype === 'string') { + if ( + (this.selectedClinicalTrack.label === 'Sample Type' || + this.selectedClinicalTrack.label === 'Sample type id') && + value === 'Mixed' + ) { + return [48, 97, 194, 1]; + } else { + return hexToRGBA( + this.props.store.clinicalDataCache.get( + this.props.store.clinicalAttributeIdToClinicalAttribute + .result![this.selectedClinicalTrack!.attributeId] + ).result!.categoryToColor![value] + ); + } + } + return [255, 255, 255, 1]; } @computed get selectedClinicalTrackValues() { - return getClinicalTrackValues(this.selectedClinicalTrack); + if (this.selectedClinicalTrack) { + return getClinicalTrackValues(this.selectedClinicalTrack); + } + return []; } @observable clinicalTrackColorChanged: boolean = false; @@ -1967,10 +1963,11 @@ export default class ResultsViewOncoprint extends React.Component< {this.selectedClinicalTrack && ( this.setSelectedClinicalTrackKey(null)} + onHide={() => this.setTrackKeySelectedForEdit(null)} > + Color Configuration:{' '} {this.selectedClinicalTrack.label} @@ -1980,13 +1977,13 @@ export default class ResultsViewOncoprint extends React.Component< getClinicalTrackColor( - this.selectedClinicalTrack - .label, - v as string, - this.props.store + this.selectedClinicalTrack!, + v as string ) === - this.props.store - .defaultClinicalTracksColors[ - this.selectedClinicalTrack.label - ][v] + this.getDefaultSelectedClinicalTrackColor( + v + ) )} onClick={() => { this.selectedClinicalTrackValues.forEach( v => { - this.handleClinicalTrackColorChange( + this.handleSelectedClinicalTrackColorChange( v, undefined ); @@ -2107,8 +2097,8 @@ export default class ResultsViewOncoprint extends React.Component< showWhitespaceBetweenColumns={ this.showWhitespaceBetweenColumns } - enableWhiteBackgroundForGlyphs={ - this.enableWhiteBackgroundForGlyphs + isWhiteBackgroundForGlyphsEnabled={ + this.isWhiteBackgroundForGlyphsEnabled } showMinimap={this.showMinimap} onMinimapClose={this.onMinimapClose} @@ -2122,8 +2112,11 @@ export default class ResultsViewOncoprint extends React.Component< initParams={{ max_height: Number.POSITIVE_INFINITY, }} - selectedClinicalTrackKey={ - this.selectedClinicalTrackKey + trackKeySelectedForEdit={ + this.trackKeySelectedForEdit + } + setTrackKeySelectedForEdit={ + this.setTrackKeySelectedForEdit } clinicalTrackColorChanged={ this.clinicalTrackColorChanged diff --git a/src/shared/components/oncoprint/controls/OncoprintControls.tsx b/src/shared/components/oncoprint/controls/OncoprintControls.tsx index 3b87dbec08f..3b7a0740ceb 100644 --- a/src/shared/components/oncoprint/controls/OncoprintControls.tsx +++ b/src/shared/components/oncoprint/controls/OncoprintControls.tsx @@ -58,7 +58,7 @@ export interface IOncoprintControlsHandlers onSelectShowMinimap: (showMinimap: boolean) => void; onSelectDistinguishMutationType: (distinguish: boolean) => void; onSelectDistinguishGermlineMutations: (distinguish: boolean) => void; - onSelectEnableWhiteBackgroundForGlyphs?: (use: boolean) => void; + onSelectIsWhiteBackgroundForGlyphsEnabled?: (use: boolean) => void; onSelectHideVUS: (hide: boolean) => void; onSelectHideGermlineMutations: (hide: boolean) => void; @@ -91,7 +91,7 @@ export interface IOncoprintControlsState showClinicalTrackLegends?: boolean; onlyShowClinicalLegendForAlteredCases?: boolean; showOqlInLabels?: boolean; - enableWhiteBackgroundForGlyphs?: boolean; + isWhiteBackgroundForGlyphsEnabled?: boolean; showMinimap: boolean; isClinicalTrackConfigDirty: boolean; isLoggedIn: boolean; @@ -153,7 +153,7 @@ const EVENT_KEY = { showClinicalTrackLegends: '4', onlyShowClinicalLegendForAlteredCases: '4.1', showOqlInLabels: '4.2', - enableWhiteBackgroundForGlyphs: '4.3', + isWhiteBackgroundForGlyphsEnabled: '4.3', distinguishMutationType: '5', distinguishGermlineMutations: '5.1', sortByMutationType: '6', @@ -279,10 +279,10 @@ export default class OncoprintControls extends React.Component< !this.props.state.showOqlInLabels ); break; - case EVENT_KEY.enableWhiteBackgroundForGlyphs: - this.props.handlers.onSelectEnableWhiteBackgroundForGlyphs && - this.props.handlers.onSelectEnableWhiteBackgroundForGlyphs( - !this.props.state.enableWhiteBackgroundForGlyphs + case EVENT_KEY.isWhiteBackgroundForGlyphsEnabled: + this.props.handlers.onSelectIsWhiteBackgroundForGlyphsEnabled && + this.props.handlers.onSelectIsWhiteBackgroundForGlyphsEnabled( + !this.props.state.isWhiteBackgroundForGlyphsEnabled ); break; case EVENT_KEY.columnTypeSample: @@ -1059,9 +1059,10 @@ export default class OncoprintControls extends React.Component< + ); } } diff --git a/src/shared/components/oncoprint/DeltaUtils.ts b/src/shared/components/oncoprint/DeltaUtils.ts index 9a1e3439a3e..f8bbffb20f8 100644 --- a/src/shared/components/oncoprint/DeltaUtils.ts +++ b/src/shared/components/oncoprint/DeltaUtils.ts @@ -1307,7 +1307,7 @@ function transitionClinicalTrack( ? // add edit color option that opens color config modal to custom options [ { - label: 'Edit Color', + label: 'Edit Colors', onClick: () => nextProps.setTrackKeySelectedForEdit!( nextSpec.key diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index 287fb9c1f2c..ecb4b8e0305 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -1972,56 +1972,69 @@ export default class ResultsViewOncoprint extends React.Component< -
+ {this.selectedClinicalTrackValues.map(value => ( - - ))} - + + + + ))} +
{value} + +
+ -
+ ) === + rgbaToHex( + this.getDefaultSelectedClinicalTrackColor( + v + ) as RGBAColor + ) + )} + onClick={() => { + this.selectedClinicalTrackValues.forEach( + v => { + this.handleSelectedClinicalTrackColorChange( + v, + undefined + ); + } + ); + this.setClinicalTrackColorChanged(true); + }} + > + Reset Colors +
)} From 5459293f509ac3b2dc929f9875ec3efd98ed02d9 Mon Sep 17 00:00:00 2001 From: Bryan Lai Date: Wed, 8 Nov 2023 16:39:58 -0500 Subject: [PATCH 12/15] add e2e tests and screenshots --- ...efault_colors_element_chrome_1600x1000.png | Bin 0 -> 134246 bytes ...lected_colors_element_chrome_1600x1000.png | Bin 0 -> 134794 bytes ...n_not_toggled_element_chrome_1600x1000.png | Bin 0 -> 101238 bytes ...ption_toggled_element_chrome_1600x1000.png | Bin 0 -> 94042 bytes .../core/resultsOncoprintColorConfig.spec.js | 184 ++++++++++++++++++ .../oncoprint/ResultsViewOncoprint.tsx | 1 + .../oncoprint/controls/OncoprintControls.tsx | 1 + 7 files changed, 186 insertions(+) create mode 100644 end-to-end-test/remote/screenshots/reference/oncoprint_reflects_default_colors_element_chrome_1600x1000.png create mode 100644 end-to-end-test/remote/screenshots/reference/oncoprint_reflects_user_selected_colors_element_chrome_1600x1000.png create mode 100644 end-to-end-test/remote/screenshots/reference/oncoprint_uses_default_background_for_glyphs_when_option_not_toggled_element_chrome_1600x1000.png create mode 100644 end-to-end-test/remote/screenshots/reference/oncoprint_uses_white_background_for_glyphs_when_option_toggled_element_chrome_1600x1000.png create mode 100644 end-to-end-test/remote/specs/core/resultsOncoprintColorConfig.spec.js diff --git a/end-to-end-test/remote/screenshots/reference/oncoprint_reflects_default_colors_element_chrome_1600x1000.png b/end-to-end-test/remote/screenshots/reference/oncoprint_reflects_default_colors_element_chrome_1600x1000.png new file mode 100644 index 0000000000000000000000000000000000000000..d078d8cc02950c473f62bb3c12f856d19d03d283 GIT binary patch literal 134246 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

H{)&4&-AA1m@& zSk9Eu;R_ozXP@NvSV&-Tk?mw0MMJ;kK9PfAzL)*F_3) zRl`n~VE>dh9|5_(L7p8A3>L?wrEC*>jxMWP$LN@ttbC7x1H>c)P*S~vRPmIlQwC>V zPmutgT-6OADd}E$A4yh}xI~xMdjqJdM(iS_xhE^F%adu7{&#d~M7tM=u%yUizefA@}ZXIOSAGc=n=FK9=V$8OZO1dan<}Ef_ zs3eX-3pNtdY>-}=Ah@MB%ICRJ#hVHUUA7&%(iO$`m#(bqfke8vKQ;3J-K zA1kX}NDlsR_NL3tkMa&#M+@^JG{;|?$uoLy{~|qIt4@_HGT~X)xYSQ2uVZQcu@?S1 zEL!_C7Uy^zb_=pI(un;yAWR^Lfb6g~HZ>z6A|RS5I1S-83m3+Gof+695{MU%WaoRB zG99FMCFjk{N--uqLRZgVGB1VRD1P$XFNCs&0!jJTtg31K#9xj&D&7-8TI$Hq_-D({D@l5t8;rvt8Qbvr8W~Yp!|ZlCO;&2& zu!c(A8Y{f3tcWm%RWSPOoRvI>0W=ML_Dn~bt}`3h7o{a@@TH6G1}2RS*yq&F%C<+h z@*S_A_Fk4#&wy!vy>ROY*Ww9(`Tre=e4VsmAx@{OV>%rXPMzbq-Nv-Lm_sM$W9=)A=3x2&ZG0}Tn`G%Dj zmTz9kxOPEB>l(^6mV1A6$={U!C@_3?liiE=ZZwN}{`k7>F5ApIxAxu-JiFOveUpe{TKtTJQ8IKQ7SyLF^x6WT`#(w@H3)C09kdR5z(37vxMBeC5WCW(-Ax2L0wt z>%dL&5L}X7lqyA7bSb`cx5--9);B%p$n)m@{qj?k`P`QXkYgx5GG@Jv8#XHm1$kAT z6QIV|I~|zhq}se`(`7LIxNjCTU9eSnS4lkRWNc;2hg*Jm8syfRG_3I@?&It4+_8nS zqqHL8O8{8vttK)sBS)%t+TV$hTJqOlMjdW!>0zwe>+tAt?N0jeta#DdSe5Ut#*<#| zU8PclF>Pum?4DSw#&VhgH*eL(mv>1#_+rG;B|MhzkNM7-ce6QE9Qe(v$gtp?uGR0j z#Hro2$Dy;X1Z?g0<%>7eEhzH-n6@o$mToKGrY9V4+uPk>*bOdgby=Pt6&ogG94e|Vy)CpKj(3FKhhVEgu@fyKDQ308p}&pG(^e6C&TwGyqGy12bilb>(QfN|K)I}UmdQ!+hEe6*Lv64wN4gXQwts%*r~@IA4A99 zY7MkoPMlUv;-7+hgLD2FrRvc2%$dBwr*<9j&y7efTo}CTpzppv`)%^NddAgTei{Ba z(SO~77qusT{%o<~eXh!oe-drvdpC43wX*$?*=}H`h=}zyswodKY1h^E#f4u6-n!ef z_;o{5KmG8kgjc0+m>|Wys6nX!jF&eL9S={f)Z4E8rLv^-o~P=tXPav2Z;4hleDhy5 zY^6`^w|UMFmy!~rnlnEH5TsoH{#GMG*RI>YKhR{h5BBu1efSN5%}6`nJ7S+E6ky1b zc-h|r{jVXsZQZ@R1Z6e;$&>!rFvLw==guXJ6&r<|bIG?)ncNldq&Sc#Vz!<;wUyx5J{RXR2-S+WG6Nbp?) zL&JfkffZmg#Nz}-`tW*$5JxUt_yxYMXxV)^`0eWDk?e(phze50N|jo)ZM&D)i*sC! zjeYUzm4lPhYWNA*qi^u$7X(8fct#ZH>=?K_18F?>ZNu*elfL3!C67cznQ@nbgM%0I zYz?{1o;`otYZD~S9lJOV(sc$w;qjfA_P}7!+&7C29iMI-b>H0hGDwQJfXu%@bIhnZvc;z~t|Eg*twzU$KN9TjpRSeQR({@mia4lQNq;l3Z;$du?e%x>{B_HgfLk|z zVRZm>QS9{bQ&NQHobS|ZzrLpIjcbv>>cx|phs8j0fWs#P^u z8493r!&;&uckGxxqL%%^H60ur@Qk-0rx_g`JsjpasHfk`m5R>~_KnDMXJt7fr74}} zQ&Ljy+_@w8D;^t!tj2nJHNFGW#gmKeMbw#xu`R+yN0iw)^=jSk2QMnv0t;aVV=%hW zJK)fvLsnK+14fPN_xtay@Nh_I-g@}(YGh;ug@HOT=gmlAB15Scr<=@q5^|ElX(zkx z^#0`#$*^fDf3s0vFmq(e!5jht19u%hyb44f6bG5Y5XJO9Bk^T*i;3k$P|n3zx*>d&Imvli<>pw+y# z_fvO`AAeD}WtocBc)92)M~N&o#Bf2oYY(xv7izdOD2vFge|?L>2z!`mazWD{{Z0D} zrHV_YJ^H(PP@E;&`Jg#SN%GM$7DVt#1`DdTzP>(^@3p)wyu7`4GHShb7Aq_YFC{jJ zX^COm$h-2`V#)POEJbo!@u1>73{Mo|fKbIVatA{zVARm4mRSX(ykMa@H`n9q{_^G7 z!6%k3A8@QUcbe6VT(_j3zaLcm{#r>86d_WmC{@^3lGX&qV)^m>DwO*bhi~$X8H$TY z1coP0Y$~$+%u|-SkggREG8cnOG7Kg5O(5?`i|83=S1KfTh_sG-hemsU9UMfd;vrhBoCur6I z=xO8PV$f>npJmrJaXP@eP(VuD{aI-D4jMEFSUyddAKx=>vWGdnecb8cqep%E_ix&^ ztv~i}(BQ#WVq-%P$u05zC(oQ2qp*a)FD_rXk_6#y*Y4eG)~$d;kJG@-r@}hc0Sw@t<)Gr1!!`t< zXPXjUGHIHIW*z}BM@iFk^2lpPIt!m=XX*8TeIkv^lNQ&DaGyCLBvF{SI!&88Qy-=9 z{gxKSIBg2q9%*D&xpHM82jOWkHH9&xU<4^H>*wKNI%dq6e~}A<{VLD5tXoU9>4#~Q zP4DjK-np&+|MncvSnEA|vS*M8YWmV*r25`LgS<>Oti3ezmD@=5=i$pc8XCHX&z>~t z)}{cj{FDxL>c?bUm7LIDrvoHcbO5^8zQ50z20zTsKCRrK-<@UmhX?CLMhh?!kUQhv z;@`++xW;eZ?42JmuXCr(hu^sdpSgA0`(4tWETtvk{c7N$_B!HRhUx9&<8M&o`Jc7fS`UUEXy8ZzRPWl3=R9QwHy5|k) zCx!ZW&xDo4OHv{yTy5;5{`1dHI6P+W_uC94aI#sLts?j*g^SL13-c%P4)-@F?@gXE zW!$~PV~XXNfd{3`ZJ!OTj!cURa@@AZkmQIHMaI(6 z-RZUbEi{tW-3{8Mb8@L=6aP%7_Yrk=*UP%MCj5EQ%N6HJdEx-JY`Jwj zMGusz(>m5ws!;r7m|#4FTX*j+%aKM(Qeh=&FgEI9Aac9u6=F42RaGr8amVfM%LRKS zPEL3MM;2O2&Y_tLeDT_yaJ$Qn|5;J!o<*WI7^j(j9jZAiT=D*c7iKQe%!KE^wiq{l z*4#V^arx)Bg9?qLHZd$rBMtK8<5_WCrak=2o5)o9mzm{;#vP+m4F34a97u=?ps1(r z!h~f+V}ZMN=>$)@5qL!k2ohdM_U+WE`VI^20V$8$7m!UTWu_U#_hVw>#d zRZhbremwi$m|`%P)>{xMvS|Y0B4q$Ho*FQ8=;dRg=#4^SEcG8~gf7$y0xMO}Z9%!$|tYleWb zhg#JtdRM7Xj*8FUAPF4#h?u*qH0}!ag76g!wWXLiAaMf$p`Ckb-G$rsZlC8fw`J?r z&nQXzikw}WU%!SttDGX>M2lr#P(#hDh04B*eep_!Kyhnq3z+6QIywW?TYuqCTwOfz z+nbZds!I9?($Liz8V9TX7s=zzr0)k+Ts7}<}&)V~iS%U{w$RXzEMZbS7Z2QnXbsuyT( zb7yf*TK@DlrgLlL*!LLWX`XQ^>htFbW6mtiPuXbFAv&Y))%&VnQM@7U&#MjGu-8Uq zi2FyQD=8@!P5u24)%%h!b^}VR znp5ceb-=$Y`P-}FJ|&jL`)dEs!TWv~)<)($j|L_Fx+BKDPGILs)2Bn^YCdR?uqhWzpnFM4<7fvZluj~K7_j4$447(0rxtaJk4`fT4wB;TIB}}5U1e_Aon%8IRV)PfY5mUht{w)$C0w7QO@!2 z2Nj=#ot^MeKoZw)+I0Kgy%=!D)YMe4OnqbH-o%*Tdp*lU;k)~7x`_3FZ31m9KrIR>bt5U41kd|=Sm|4rzR#{$12jeSK%URsxAKkGx> zc^Nvgv2${T`fcqZ6=FFHAp|SFVb?dz&kC0UYM6tYo2tTvLAIT+s%5om7p9-0A&1k4 z){o~jc>TDtW89_br@Hm3Sb{Hp50wM)TwREHfSf@fk||qY+6@>oB#K%FeB83JyM*Wl z2AAm1#yok(CidsZlRkuVaB8l7Kd2DJTGLAl9wDnjI&Hxt1QE9#HtaSnztYnc!zS$} z!ny9yAsUxp%FLOL5CTBXZqt?Y{(V(Zs37hI6;zn9QsY6%v!R)pHBb$W%N)VxNjVGc zh}8=!2s5=z{C5Kl3TW3UfG_MG%NgavqeCx!Kd5m1tGtfVow!-EX0*@|00OIlM+*Qk zku(A|976XF2vDSJ3QK8wm-(mXy>E%fJ&`7c;>rWg9e0e=APsyK<5jsrxiYI_Filv5 zX})e9P!=7IFOkV08jvyR)Tt~xl5)W>&OFsOp>y7-i{1sic*TPX3rVF~MXBE*v(j9( z+Hnvp(k<4YYfK~P6x%=raVkooIx-m@QNw_14I$-+U&^o&NwR#!`^cwL6j99o4K9QC zeSOPUOHgdx;?lIaAi56!8~_AOEQ44?Mn=;1k-o!?e*^%_tnG0S;@&(uWk?9eW0Q&w zxZFFaxKTW)Fi^0=z>CK*F7$U3G?`Ju%Vbu~d3}FTVumBiCuN?UA;As+xAYE%tR_vU z1T6l3P~rQvn~V;1Sw_JEp7D?&Lw*hbDonx~%u}d<6Ntm4viIuMzS5&p@gQ@t%r@!0 za^=MQ>{KR@GUQTLE3DtfxPI84+ceNt*jc=kSeF2MTM21tZpP*|sy7UZ|aQOR{}dzY;*msL%wWd6q;+g>xyc>k}0{o-QQ zk5#62`sJ&}s>si!m-}}zy^ngl9i10cq~bD5ZRCmN|D8;4ASpnC-X!>+JgMuE-s7mV z_PG!0`wH8Bcv`9T)pGWExsFcj%?&HoZdtMS-vJM&F5S7ONqc{5%W75Us-%wjM|I4F zkh|OeSv_q`i>1d$KAisk{zJ`&cl+L4m2WWh?4=vpgYEja+B(g0ma9g$igkXk)Avx1 zb_N;lH)dadpOZK1M2A)nKPQ~>xiS9Ojsq=Ce4`d0IFR1DURAJdUvF=jdQ#`6qS6Ci zGlU#1RBVYl255xUG@xQ}c{R050G#q(+aWz2j}8C+B|Vl`OM>6@>DjXj=iKRPu9;c*DZ`Lr zMTpF9AO=7COg-Oau$`r8_wpKz`ntLr3DSwCl7*$^tdfIQtM}3-pHrl(3rzq0LOFST zSR%Hzb!ME}3QL3>qSM(YAndj4)}>KrGj5zBud+jOVtDI)2YhD0I2}Fv?hwH(r4aG% zkYQ582E$O=T+2TEFD{i@D^YVg9Qs`S+9X3MWZUxl;c<8Jb29%Kg(^uyP5s3{13OC2 zqVPoEC3|^!T}a7N2IIG|sG#A$f>qz7NfSEIv0FL=SA~>$d?nwaXJ)qj=+SmY{k6@^ zG|n#2p<1JS%?ssg{uMk$UEyheJL%K+^E!c!0+)(7j?m{r`e)~a_w@S`BnWi zYgQ~zzv*@hO;xL9ZVJz2o)y30x8FSKHdZXi4UVhaO)0*4L*G?<+8WP$fA_Cy>J|fH zcXU(Anw@uHS}(7#^pvCR7T;N;U3qHn-dg(_H~v*he+wK2TCTEqH|FK#HC{#69SySL zUOv09sKBt3hMITYhxR=!Rd%gv*k`qgi%z%e@$nVfGn1Mw)l#Sy_A+a(po62_{avRY zu1$Xx{oPJIx}GR~tueFi&(>Hf8K_nZuxduLx45n&|E^1b70<~H!g$VWRW=ZD!jIUSlTE*T=JV3+wDL1D6CMv8J8jB)a^N?AkXI2oHumoA;YFFhF{bRK;$ ztspPPycuOSD>UYLk@S?3OZl=VGo*Y+VnQ+|#}Kt(?fcxF+H@ZzH$)zQ6+|ltCAx_; z2LFCTNd4SvJb^+mVm1P}?&OQkV0z(k=(cDvj*F{6h&7PNj%&S2peRBJ=`UZ7X9wr< z>OH~JCIKWI4^mUof^X-1tP)EiNeKA}WO~M;vD6)tLKWH$aIMB+KF|`@tyyzXT1`et z)yZ376ifejAvRKI=Ru3$KvVa%BD;i!iayqk?2!;-1=@p_Qgw)}?bDom)plcl;qg** zk~Oh~^>0!8GySJJ<;>~TDZ^oXj+v{^;BL+>M_W0!)U{rAX!e2rB(7= zm2B%Y`*hxXjz;a*Dm2ec^fdPgb|Uk&yy*QfKbHi{yqNxv@40Cfe@DqT-YmYb9fJd_ zaK@VtddSEpPSkW=@JF)k<@{MS?1w-M@Cjaxj9*moC7cc@KA|Xw)afa#%D+AjYrto> zFP}g8^IvtN_B+``bnzI1Q`ci)9f|q>uz9GKdd`2~jZZgMx+KKtrY%r7^Y0&bRpu7y zS6{(7b(!b0aSToE!jBCKKW5nv46IVK;Qg;9Bc<@E;_DsvV18`+!Q!hL?mYH4`}M)P zx;~4oOAU)j)czgDbr(8k)_>jQe0@&iyCi&U#*6ce_>hbv$&YxEAuo!%-_kAem$`A4 z@AvbH!CbXfH5(NVV#&C4+gtp$wEdrs*5Etxl4ACM-chgQw|u=pb$;tP@Ma62#lgDi zb$WIiSjTnF*+xAF=23Lg|Bm-5RqlP~$o6py2icsPZ`RLj;fA95$wk5PjX%58kk8A7 zxu0x1e7y$bq8ARr_n`y-IYku4j|>Ix!_$b&4qc5OWbGB_JTh|k7y^d0EP$&Y@heC z1sQDGeA}oRJ86}&k?b_>vYSdoid>@8P5^}v-720mn)4VzPYx2cf3l%r>>3$n`JNQ z-LGGdO=QbpC3lB5APD6SfhO!GPTuwfA4W(+ zTgev?hKFW^eG*k5R0O1&DV^OV0J$XT)d?^9Ia__oX2A zBvK-VXCNTfJ@Me$u0HDoivQeW8(`Dgo9zI`b1_MJF?W!gE308Ple5i+O4_<(;pg%YT`L} zLndQ-wTk6)6Xv&N+Y!~e#|uBbk$A6hkLAh`&SmdaPCiJz#aIaB6}seHGc@Ig-CoK+ zv9%Nu7qE4Lm* z)QoYoHXoh-_oEppXk0a>I5oVfj?PlLDldcDc#I<2iq%vv{59pa6my@sd2@geH&Blf zPS+XdlxTf8+Dr2eK!unxdGgblBLMi|^rg;pr!epIO)^O_@QgxlHGEN{a7})%3Gq|U zsXb}`hxU_;yNz!(N?)72PPX9>e>~8MY94?0Zq(~vPxSGz2|jqxw{xY(eFk~dHnBWY zKI_Tz-g9@H9e25UX40>P1NmTuPPZD3M%yMff5huJ)%smlNfE6=@_10U8WdG z-JVtF|6!Eo5vN-?J6)V;$ui-Z2ko{ejxo zukPEY>&nTymHIh@#}Ge^8%men#$mdgd^KnL^0P>fSnd8n2j^X#VOTZ(@Nzg8N+^}r zfomImYf*mYWsiVL8y(Fqta&>Ybr=wur@iMYKP&lh>SVb5n!HjHOr`Xm+s-w8K$tHL zu)EP^T8net1Vxah(<0QSx%qm-KK8Ng?~RTK-)HccG6`hmXHLdSCV^q~p0vMkx%pfbqx645{rog- zth$%WsaQ>`eHS4Y$=qA|t}+>_c4II6(rlNF)@7c?m!Ga3J@TBe{ik*%Uc!OXS6^vm z9dzy6Z&u^SH<1&5y~MB!mw#LME=1G0#i@jOt>kBuLp#*~vjrx2a%qFQckg~0w=ifTt61C>h~nC?pPY5%?`;^WfaJDa3e4V(MX$a~wi3QgzCX%cyFTzcp% zrTF?i=gh7(A@7Mq-AxN05PvCrYJs&<>D`f@ z3$wZ_4vR&QO4)P&X9ueE@D_)H|3@w*#!ET5!TWeiO=|mZcz(X;nUwqK>s*MRORRe- zB0{ahG*wa)GB%0Lw7YxFl;}*uztYzWT(B-NBaPJ~QO_D}OObBlX1r$hqdUV)D=hcd zK@4j^G$7v|)}Qz?OrQAg>wxFYz$nW5@;WU0Npu?7v03ZZ)xMrEvHG}iZiGC7&G!oKfmEk#Yo1Fm!s_m38y=Nb9Z@=zmBU6HYXUD%VD z=j$8gsbsnTPk!nS7D`zg_8+*qdwA=5I7xm74vh8z#!|}i2b|E08h=b{>FI3SA*q9a z!HVxHIHT&nJ5s3_-OIBf zu~EvPUVf^Jl#{PQdR5(IfcSaw!mvoJf623zuI>(4_#{59A*K*yEME(%39BJ$l)wQ!JK}!>g0~uW*y8I{ zEMDPx$Ne(Gi_FA>ZK12Hg?hmgkOOz(+Y!hbL5~$0jU(Q?XgUgy4`G_kkP~1DhyoYT zSaF3pm6+Oko2vF4=!TN9{?_Zl#a*GfFhD3X6y^(P0E8`6z%KLZh|XvDrzaVzC^M04 znuKDcAls1mljfWa#cLDhIefy=SK&^`LjZPgEG)=xXzcU{jC_}4@Lwb?@7~qyAaIG3$y%B zkJhWxGYMWy)U*x?&RBBL;LB)xqaJ}ftH%!Y*$Wgt`!h{3`ri&f5m}sMNcJMi3aH`A zdQX=sM&Gt!mr0Wyee`D99kTlVj?|7r3h(%+wUfesP32P)BK<6gx@Rf|` zIvxx3kIQ)Mvv6@I0}jHzr7Eo97-Rs>km^l#2|axir6SpG86)wr;qeHUE*r03rCz<| zGtm7xmzV5I#8vU^lN;zc)JklWmN3iZZI|YXe|ZXX~INk9srP`gVc~|$_)eQ1Hu>IrU_jiI0>@BqI@_z5j{pLgBc9R?< zr0B49rEeR%bE-=&{*jomx8$3``u)c)$v&#=sD;&FA_*V21#?~g-raiC-+mH!9PzC; z)L-$>f90k8het<{shesx+fBV^+}zQvpbds|2SrB|ttqpY!B?V!77|%Q#^=V=lWPM4 zE>kjgns}EC0R)!Y&=k;urNXEQ#3#6YQl~ayf{v%}lNo8$Q?{m(7YtKslM6S(A>0Ip zp8f8&4HLK*kvz+2H+5XGlGugjAn(SvcbPQ{v-y--WYuaFNmDEX-glKXEfM7zG+c6| zrkZJ>mnL=4#E&9B#$GJ~{sJ!oJtE$wa&yF?p|C(jxmZe+XPjz~^(4N~MQzi&+qJ`d zDB}_SjFbU~^>4OL5_#EZdel-^_qmago8oFxxq9_f7tA{#KrHEQH&YE)@~V@!L~rt*%O2<50*3&&2w%KUpQOH@(m&Tf z{ntc~x>QyOX8YJJWu?bft7a zqLdz|)4qM({3X(ZLsi<)3?3^7Wx zPp=KT_vjH%(R-kEbAq`q*PkJP5G^9|p)x8}uii5)_mi{9wx!FLyL5to=N}XC<ue2 z+0#tQR&wIZr7+Sg$e%Hh{v5=7n5z5JI#Bo>AuLU@7w)(lvH&46M@>3$j4Cj&*KO2* z!qwP}pq@Abk&#aNuq{O{8^!9&SFd(Yb21iOiKJuqG?!3>pd#MP37Hi-8k`;v1dF_r zJI9Q~qyV5%B?GCK((mJ>ELfx8UcP{yHeBfLw~bse4ioWWMB)jF#uKn#(WUFpo`cPX zQps1e+j^ZEqVXq3h7N}%20bZeve9wYrr_gf_4I%V;N|NpN;-}Y|C)k7LB%Xp)s8b70-(xjz?lV% z6@vbYRuq;WdoT^wsZfF+OryTC_QAVXA%BRD1goEYJO@c_{TYvqNkQI6e>Tp%$Q1Q> zn7o*e2k3dgr=?zf{D}wRMA>wCUk6X~nGlnyRmOPNXOD*Z6aV0iG%uMlW5y(uABBLc zq7o6smN|HjRdK;mt5#LFMI?<)j`VJ5;;OVQHnj-~%BLQ!ypigHD%c7#%3KbMhV7R? zaL5p-c@b$j)S6yJpo-im8|IgnshkVhw@<16?VHo_z=iC^qL7Rs`DIZiESb8pU+@*v zIt(5$!u#&j)bZr5#Fq+*_xkbNd(c$cdc7Ar8@C>CeG;OM$3`9+y>IW{N(>kFT0o5- z2hwK-3?->D#rM-@>x7v&)lRzV+*@7?Z^-RI%Mhr=Ol{$#!m zfapp6^Q9T5LSktG10zSOKLs85`)0<{&>XQrCAFk+!aq|NI^SfCGT)Z z()3lU;g#49+5P9A)hIQ^=b)uR6AF92y-X46N{j?iEDn)Gn>b6Ao=|=xDr3Z!XP;Q( zQxlO|Z8H&iJe$#J1ZTQLL(*S)WkPad;hRLIhs31JVZiJ7J9i>Q8mu5c2QTN}Z41RO z_-^^|b#_BZhRti|`FVEObh7UfHli~{mT1|HB&T-H$ri{o7l$AvOM;4YxWh_kpRCd& z?@qO_b76ryssT%%%&^=(k?|NLl& z4)vZu)ea3L+ng=%1$EOX?Xd;nb_36x4wQ(8;^W53O3F$V_|C^Jv27}-RjasIx`>dn zG9LgNnOrXzK#H%IzrST#PX5hph&BMtt7vNa=cP?DQja&PP6;?fn*98Ha%91sDcfDM zW(^H8XoRsWCPjE2sB^<*?uHS7Ym6s=ZV(C;mX1d1S#GA)8kwvIjB@C(Rr*YcbP@rw z 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

co?%*q~=$GdT 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 Oqh5A=Y4>oKcm4?yuK+6m literal 0 HcmV?d00001 diff --git a/end-to-end-test/remote/screenshots/reference/oncoprint_reflects_user_selected_colors_element_chrome_1600x1000.png b/end-to-end-test/remote/screenshots/reference/oncoprint_reflects_user_selected_colors_element_chrome_1600x1000.png new file mode 100644 index 0000000000000000000000000000000000000000..dc0146005a4150302929a9b63092b0ce178a6498 GIT binary patch literal 134794 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 literal 0 HcmV?d00001 diff --git a/end-to-end-test/remote/screenshots/reference/oncoprint_uses_white_background_for_glyphs_when_option_toggled_element_chrome_1600x1000.png b/end-to-end-test/remote/screenshots/reference/oncoprint_uses_white_background_for_glyphs_when_option_toggled_element_chrome_1600x1000.png new file mode 100644 index 0000000000000000000000000000000000000000..2510b88de0946851cbe18666efbf82cd7ec1497f GIT binary patch literal 94042 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Ξh$=gbONQum z%3f1`mF7aiZg;~cquvY#2d4?I%a(B=& z;=~Q0cH;Yy(@C95+BHU5zw4AusO8CBMU){5X;9%J_80_BHlN0jt?S*fBeo`Phk-z@ zx(zh|;?Omq@^H^9sXVW znpcNAf`y`A#zEMcO!hobQMjb$Aia(WQ-({A(uz_l^SV-oQ2r6z*tZCNrK(gzxaq!- zA|^1roixqECVSGH z8RGtpb27k3ntx)svpG|Wtko%Jg;rnjs{Un|Nix1NuDOu;g+$7?l28J=iP7$XG}W#i ziw^)+p(Y8?UXRAp(@9!y+yL5b2WN!gSsP?Ri=@=y!|Sa)z5#kE9n^;szI|YrVXOD0 z)*nQQ%yY^Kt-0!33kY0l@1NZ{NgSk-GbtbmLq!^3}RRWzrf+6B(^d?|+ z;f>Y}-xn1Xf}k5(H}Hvir%rd>@O*s9)^w=VQq}uW>4Qs+%9x5j?v1O>qItn&8PR{OFlo6vs z?`A7{i$VA+LW_FRAXp}4_fQ_boq$43KV61Y3~zHmlSVN#7s|$g{IE)ASr_mRBx>wV z-_AwSfB2bR_hu_~Si0`~mwAi$aS_5z9Hi#q`o`Qy1^2BnwMsRmp^a;DUUFlCQ1Gs?VD`vYS!y#sQdtzs% zC4c(l`F1!BJg9HSulH}b0Ubzv)KoWkdv{P;*SeXCicVCH#yItc(hFGMXJ5ZQX0Q76 zgn|#uf^w!N_ZgtP7aUs7ZR}@@xNuLFJ)K(wx)H(=(RclI!v*{SuamAvB@{fD(UT$A zJjxet4I%iVqR<@>ehm_!W|L$w!Ql+w9^6GbZ&AxXBi#!b`Q$IAkLc%&6j6#Q_Zk36 zO=+Fe07y8*3zE=@&H3u;5^${AIZ{oB9E7)rEDv*gC`IL53gr(UJ%WZ5_G7gb>0A(u zsf8kA_b(oMs9hy*Uifrn*Ah~wY8CuVG=mO7OF1&Sj{ zjcL%qJQVsKQl^Sq^1(xdi>2_&0j8Mp*%r_tD7%RE90hii9Yh5a#zAhQ;ziqaVNg=a z#GuO0iS^crlrEQ!Jks6|92ehkAmufD7i;!giuWy5P+9BLw?PbzGH% zMSf27)sq%n_bfS}G(|i4c;Oa`a+jH10<&bqd@TAqI8(Ba8;J59XR%fiZn}Z zSQ8e#CEAS!KV z`JGmI;ml?-}U%kaEBpTKWW2*OS4!TZL;-*Dkg@eL?IBc*uOE|c8mstGV2hMrJiu3>yC_2Qdoqs{9|Tr9?8R#DUMb43-p}K@HTXG!CoSY7JySDV3@2+0Hya!m#MQicv!=hvD z-M8;7iu{ClCieFG{x?54S*5Szu3zTfj)BuZi=oEP;V>a#7{?M&VlXo`-AjfUFeiPJ zYNxJU&2)8Fu`q{eZ8T~Byn@u3Py~NFx+pGnV~fsp{WHTrd@D(Nq@E+}&SzYtih2N-Wemsa|P+&N+S1EdNR|VJ4Je+q}4249c$CRZW zBY`zkdfKdf`}XbC2>6~XnaR9)hq|3rYzw(!K0I&?P7M`k$9C;>DMy+wUVQ9=T^#>l zBg{-pf^l4!vvc;E=N~W3xIaH4BxG2?>^}aKXYM;|0$CA-+?;eiO7CTYHp; z(vsi+#ngxB0e#l6I~EqcK-)RL{T7K*k){P1rxlpn9HDo+@gO;QdHV^8X;CpMC@3g- z6YYFV!1!~?G!Zv-Kd0!IUHT|kn(c&R|JwX|tY<<=5SHk1UedV2D+zP04R;T;pd@7) z4y@&++*8NH!{gD_=!tzn@gouwC*0Pxvf4#qFo>@1#f&c*>*0~&G5hr&kE1|%XQ2su zWUKfXJ&II(W3F!d^Lt*Q(E|=7jQzmrM(*1;60kvQhvGBx?>QIgPoKrg=3Kq1rmd~L zYW3>#X=x*>#0(Cp;y&Y>gtwMWI=64HM|5SnaN#d>5NTs=ZGF=@+mPzsF?tH%3xjA2 z-CI+WV9x+C@l_;}E~<1|qr+{Ij1lVHr_UpFgeGoo$;m%Gl~y$z@QCDOOPXt)&&sFV5L^*2dVuA(EWgR>PO@E0pYH(aM!8)qD0drYqTR2dAz`dH;Hr zMVH3y)YQ~FbQsac-*DlPN%9SCY=Y^b2g@PcsPP8fI%|gUb1IPI-QABiud}9`?vNo% z`?mG?-{{S~KkB5-A@$z9%}Dz-d=02jnXp$WhOVxOP^n{3 z`I$njmex>PckhmY^Bg_-m?clj%g>)Xw>i^p%T32z62xsgckZK^9wmVy8(IL!z*m(% zvmrlh5$*Z?!op%5VmD_9+57OhDJdzB&MWxbfjT-mTPxoQviMNzCGX<9G~U2=Zr!q_ zt$$|wBR69p#dfOPO>D%t4jaz4S#w&IpVI@Q^Wedg*|;5TTDKn3R?qV?#kgp|`$e?D ziwX)F%0Qb(*W<#ei+8TO;cPH=nM06ntAW&SGz`_})oau+t~>>Y={UU@qIv9uE^Oym zBcqL&q~8}FfgKl7xtlO_$4siNqB#;GFw0i6ZrvSg*!7`9mw`W+PMQ==r^EXX9z2>2 zwi_j!X)l%Dqn0gO=GT8g*x>Se4JLUGT~RIK*s)3Nx9D@;pHr^wq^^!i#}D(}s6~rt z=$HYQQoWi@kGp>F>C*$9A2&%D{>TCT=_o@(Gaa4fEG(JE)_{QMxeZ#jjDgBijK0!r z+O!avg~X`0DBc`W)pl+KFGt*i;jm4(5l?-)UHkT(+O*MuzE=_N_-VOBQh#dCSql&J zuq5P3uGgwntDA($5@sGaa3EP0;)~Di>b+@Gy^rtItk3MrjH&9%s)AVEzjrU46Xuv8 zjju)-7?=(pz7k=<)pIt7((|3t9TSS7#jp4F-f=qra%lDH)i1BD-}WWU4zhP$1$W4$ z1bri)mlK(b#YVvKjeK60|=*Xc;Xroc!A85|Y(fw2G7+;z{sHFR2hj z#>Sci;6^oF9+`^YWf$nEa9BKPJ5I|i2Bx}!qU8Mg>ps-TqrqDo=FZI}llt=Z4nhi` z6^Ie*YMo*Q&ae+gxy;<{IB3u$#zTz%@<2pp|GlTJOo(9RYy`}C`7p~*dr68Im<^5C zPNH>!+z6Q0mPZywccTg1fA=;p!ZYk+cqgJiDuQ?smYK6zU*XP>y=rI<} z#TpR+-CTHMj>1E@h%4NvVM9_{L%jIdseR-pzUKA1T48$6_FnabO-6yi< zB;0JT*nY9xsI-{D5k{K^-4P=?_w75rB@xrVI4fgvNZz90-f_B%p?qFRy0Ek7Fp%-w z(p>BA-t_Vlqo{R*wimr=A2A3ebg~uk{MYCE^&$FNt`_@-9AUB;?l0~A#Xn$u&MbYD z^Q8$88oLXf!9H3FQ%lRpuMBjO^whFE=JwyPUAG_5izAnIkDP*TcuT^9B3kJ;TpD$$ z(0_?il>?N8f{4c9myJqvZsk!H6lN30tvb&0VNW0`owK>ng;Kirait(R4%qwGT($ef#ZezN5G%h#N!PJYA9HNp`SkR$ z3l_xTMLlYM{;tV)YgG#vH)2hUa4m66MuhICK3tk|xxb6^!=EKQ`1q)0jYn^Pc>Ma~ z*Vfy+WG#uiQ94dSLq%Wb`zne3^u9SUW+ZWxG!}q1I~v!}q?@6gU0AAjs{?f5%RgW8 z;zc%`GEKU&5$hAvBilC6p3Y%$qg|OM__bFn?a7Inl&@8^J&w|zbXDiHOP9vLBh99V z?!ARarpH^xGfU*%R)XT9Wk0mM3XG4$8ktGAB=U?{%V^7AX8U?{f?wI& zb9bTKTq$)xf~H@Aa$5|Lw}GScU4^wN?x*yqcxz z8r5#}%iF&%eAm5lCBCh4$Gz6K6))v~Ca0-a{-@QXjO{h5EFC?)Va1;duUu*4x?_9e z{ItlBVO6SFbqcBYala-@mYh6N_U1?JKHl2hs=$ReuKe{xE%(J$tDLy6QN8ldRjRnQ zSn=n7F3s)v|MrjF4{(6Gt~j}eAynp*Bt)2&>X~&mk@o*Cy+gyoI$_e_3|#i=drRG$ zGj$WXO|mJS1CrtIRIPlFJ6Dve-ubzSvhqGo+#@d6Rk}hhn6w^71C=AQWIxfpy@OVs z(={P4n0jl?%HKQj>XLeu+eerLV-J8hYRs5iTCzBI4RqTlo z>}r)bR`~rd(E@(lyc40ls-O5tn3F9AxtW3x=D=-r`S{1e1t>fXcl9%dKy{T9>hep- z2=7NsdK!n>CmNvP@*aBmrB4I6!CQ_4dU8z6ujcaTTC_iO+I>rxRsmLVz~PEf8OR-@ z#b2kJ9&aAgAY9As094Ozf2^tDU}*r(0B zWAgN5h@_=B?ehgpA2}lVAHd{?%Y>$T$z{H&+?_<{YTuMy%yUfm;-8dEI-hoU2U#?S zt-P8;>4U4=d;YzV$W}YHZ9A-$`?F<;O`TQI2#zDqSiXGuOQd;G7+8vko9GR@hRBa% z1Q=JhsGLYZMIyD4)SHCUgnV-EhC`_A2qh~Lk+EYp$tb=#za7>GRr*jK_#uMGq!_ip zD!0-{p>*}F@$oo?_NsZ}r#=9flQt5lPLe>86&3Gq#0Os{iU>CneBjlq9bkMTN3OjX z4u<`_v~=4Da*=Pp{T5iSwKpv^&XYVBpm9qk^1IrRMEU*u_bl6^TgQ&17?Ptf0jU#L zCI)Z}Izj}Yyiov2mDXP?r}s_S(CIT~&|r8d>SZ(3_MZc(5Y7BAh6AL5kkNS8VdhNZ z(W5uG{qcJQmNkQnF944YM4|->7XfxhG}WXn8672oKt?$nh%0@VH4L!iku&n(zdn`y z8e01J#&{@W*P!0yoFi`s!7vIRN0$=6zH@i)H;-DrVg+KcO323xuV~7=_ydc`SaqXVc_!Wj{W;vv>dj&mND=oEKJ%ag~Mq2`)1TU zQP(lmv#I2tF~{G#EkZ4anG&8?n^H1^wd0)!tE(DifB!h)?4Y=pjkAT~S zXNE^XZ2Hi~S3xW_@E@|dkG9=urh7_xhi}TVm}PtUqkpeFKvlFos(oC{Dpd|ltG6_8 zCH@+F@aF*=vtsDSS5`Suto;3-|9y1h|NL0i;y<<~cRnLZ&LGAS;RHjp5uD4w0LG)2QFO^UL+nOIH5@mv-2)GB+U7v6M==SmBl(?N$!L9_9M5nbM z#|TvW@QBn4C=(n;HI{$=4aJ$4%n+PKU`1YWmGDdw4&3VEz|VG}*kmz1Z~O)?PKL?1 z|AylcLu_CUpjJHkt&jJs%%f@H1>X={Zu;rm-0=a`YO5g7>EaT(f4?b~5JM&QbkR{( z{E-77o#kQs&6GJbZPV*TPdKDQenAf)GlFmCV}xVqM@z8I6zdRKQ^$l1-jn$clBeUI z!nwtgzhevet!+S@`16auKvkAlmZ7u0grgM5x&VF13}AsG#9}R-Ge5QdAgwze0k*d zJEOt^zy~@ujTMlTZkc_lDBCN1!oIg$L!fihChg}xI42OxMu{^42a|P0WnF}-ToMop zzGTsdA$1T7KcY9{H41r$>Dnf6D2T;162~yYm~+zi%Z*k{t2)o((C}4r$n5Tyfb>)S zF@UduyUfmc@cCKHnB7NKuJ29fEd!-DmB3XW?@h{*)l}o8R`@z|u15%J$3cwta-;E~ zAcZj=G>n>TcWD!y&Bf`e8 zCr4ixb)9f<2;gKzP(W_N5b2>UbFCJ54U}*)+9FO5T!r}>TVNpWjge64&C}!7>=6;( zHh>A@9d&OIgU-Erjq85wrH^=OAR@sLW*m9oH|t&r*x@Wr0HgCH@H`B?vc*8xv9E3~ zIZm53Y8RbJ7bS9QiTi&p-Mva7Ky~8xn_S`ku;b~c9pVAWb+|?}I$zFa?UfHC25Kn> zZ3Mun=w4i0m>t*LqwIG0-S8`&I=oIsQU$kxY%HBo4}O(z zPES(LYIU0LBko@WE}Y&Lm~ipymsxy?c&L~+X%Rp+FQK_0aLi`EpbRd%&-%Cr*j5h4 z%bCL#MUO{+^1D)6GODYo4VT(spE-W~ZF`Eb-hFSoj}u%+pjrUw7fpNFc>)_>Jz%X( z`r!asp5&Oiz_qsC1A_s`wdG7JTVkG{?gn*bnO(tki^fDMcc(9aO#UKiELeP%a#I38Mo`PwZ6Cox` znvQjfsfKs*9nj0=gv*f3Ihn~SGA>%+Dw;OLe7Wp|IL~P`VT=oL=?2z)L@K*r1=N;1 z4;V0!y7V>*%O)m1?G63*GHqu(vD$OxeolLmlW8b=KfkcBgW!UT%F4?H-JB#PfzwlZ z$V#FxdK7u+ka0^e_eoR?>?sM0Zvh&7x#Rd-T`D1hj!NBXL5St3TR_4nH*J+9QttY97qkT_v~ML1k6E6;6_8vcx1epf!fxPptBfzW825y zkyB5vj)+2@Acy|p{4QjC!j3@J8cOAz%drne!0q;! z%$C?E0p*kNTMa$>aZyRi9y#AVQv*goXAt4>%Rh@fCK=KgBN>B5I?$1%;NxM@t~HFJ zn}o->U3-`rews6VXoJzPL4%MOsd&ov2+x8JGm;-+CCban1ew)xd9-z)Bv_!m#gMad zdBw}jzPBIFM+7ibYMB)D#oM!&6DQrIi9yZk)yIONiZx`6P)7|76O?O$iMqXd5-s9x zyh*m?>5ey(rKV9BE6_dbCj^06v!aBo|BvtUT6VvkH`{*<06{Wu7g)H9F`bfhot$!+ z%q@q=CFaSoSCgxL|NXu_dxl6}yjOoq!=_Cm$S5YQJ%0Rnt!gXK^6aNJl7Bw#`fMs| zmk}=tb}ZC(l>rO)lRc*V$SoXZUMuVP{&!6tM_vylwwq*#G~o5)xl5wtmfLFl8MxO? zOQbF3I~pWyO|$;+dOY}4K!((6gq1=MbT?!OQZtnLgVbcTocBrm(Lcb5`sXaLWXpJm zZ6vK!+yuXPWFn?7nZAkfaQ_6@f_KEY=PjwYtM-KIYhX6NY3Hn&SaKbvVQh2juq=M>{cqseY)2`l)_ERf6cP7!5Xo09A z3gV2Q_)`1Huy}0x;G#hbrxs%uOpHtEPFvcmC~d?*yTBW0sG`#8<1xP7O29Umo@oN8 z>Nnu07z!%Ry@^;z4F8N>mbUWy{7Q6H{YKU8#mTeTP~ zalL>3b@s;~^qCQP`mKIZ0q664Bfg9I&cSh3N2iv1wZM&iYxi|5tlw9@cZdzkl> zc4|VBgb>r2(2Ub!7ee+JLz;@Bm?7beh<=Z|m6@D#u5*2_>-_%sy3V;~H1+B8dB0!p z*X#Mb@B4Y*Q?4BR^1;=-mZac)w_M8$MpVeDaL%Yzx1jnx3%|a&ONr2Bm%M}WH^dUY zv32rau0+zT*YU{z`?9XfTdxTVBcRr_iI*eSzq`Na;(m@IZPX#ozg>RcwaCA&5jEfF z^7Fr1BE#a4g6`a>?Hy)@Se#*lo~XWTV3dI6LAYkMmlFdfX@@T(BiL!`bP}fXG>rzz zn4$Qk3aH1i+~(sD)<0ic7ef&5)m{02p&(UFYrjIp{OG+CkcO*iqq|B;cCl#VaHNEO zp>_$B9HE{ZK2IMcd_ggz5sq&IJ-@Be!KLNl$SG^`-)@q#(NnAZ1DkF0AX*DC%?Nka zqLJ&n4_yxB_CWC&QkPu1R9E4C_Pte0rlnm>y%9Alq{ph7O;*#`+_z@7=F1}s-ckR1 zsK2vwSV@D?W{Eo3c0i~KK=GumD=e0?1*r?rN$T+;K9L!a?ZtFCbi?65H=Qoh; z)oJdJYY5tBAS6>9C6eA*91LFq{c1;#l4^~HZ2N^yFZw}=G;P@urq#PAat(lf=cN7(D#I`4iBB<5{P6v)u>kt;QZi9S*vfOpJc?ZIT`~ z+BCN-VklI5m+@eb-n*8COD|)+cUpUR5yKyh|=;ol6xds#BtQy=25 z2m-kAgqQvDSdVLl-Nw-w)Q=HKH5 zfh8B7f34Lx!#QHC?nsH#YG?rvgL>(FgZ%#M!7mWJT;pP2<=)fC z1jJJN&!QezZKVrAxevsdI^$V}BZW2!1}#-gC9Z@&;;in8suD+_9mqYV+>H2~4%Xsh zuv(gkG_;=Eh-twBaAS*HoZXE)LAY6f}SogU^wcNUc~~anZzxrLpdY*osSEZ|al}*Cl0Edtx;b z%PcbZ(4Bn=NR8~`5)$h#si|^X9OMI0G>AXp%K-kGzAJc>^=jjeVzwz!C(ur7 z^kC4c+>Ui04v8p8^l%(ot+Yq=kuTBT4i3h=X$aMaSOxdVaG1K_FllPh2J<-m zYKX4|G{l+utZZX6brk=D=ww?CMIK=ZBpih#@N;|n0823JCb`|jXhGD*@4WL)<^+iT zNVTV0_i75ywYfIo_>zi((_6+cpKC@=@WB@k_5*`^$DmbyIt5-NwIYQ@c~Ev5jh%2C z0rQ@u)m;r6;)=oTmv8NKT4bAJkiz zWj%j>Z?V8}fqN(w1Tvhb@9ZupjknfjZiWLJl6J@ZC-wY=oy$`Y5=!V~ERrLJDsk|r zQM(bX*egZL6{u{|FMAyCO`;FXG^bCo)FW$O4l?LxrfySB!H;Im;>w(2l(4@st(`?+ z@!d{52)gS=S~O#=c+`JegMyw;!AEg3`7)p5UZ>Y~z@bLQ>gL%b(#Yvtv|3PHW zE?v6J!ySb0_ym$1A*t{t=ou*e8<8`E)mqt4grO?);fF(!n#0vpsaf-HNl6Z0`75?Q zx3PgO-5J86EsC4c9odI9<-Iaq*{cfrovdmu)kKc5w}3tLrlSuT1E-@{|^D!t#QmH)XYal&X(D0_B=;NJcv zbBo&H#hpsiV=OYO`pU5Q--Q60K?riL+`HpHZ73B56D>iSKcGt&MM?igJ0+dW%9`!1 z?U9A_<*@$T#>Pi)2nY&Ba}wJ3C@=PffqF=GejZerivhzti8BEGg~gs1;K zeyU9{3ZE$nQA4=T{Evl&zDP7*o>WWV9@o3SU#riEy}G=%YSpR)#+h)eHK8s*$3~kR z7aplk2)5AF%4(FoP!M!S0T!GR>fq3`7e4J$jx2b%ZTIat7QP#rT#xb+dyecq=lSlO zrmOj!6FF9-$!xieGa63M7Jvs;W&4+dq}N~<)cf1zDYgA$3oN5wpJY1zgm ztgzRKu9N>Q|Gch$nwjI5|BXp~V07jTHLY84Gp0AJmVdIBDDmGW;<7d8^ZmVJ89C2h z{2Cj5V$i2EdNys>ytha8+UmU>lWqDn_AxftZ$Iv3-P?YA=_Z{Plc4D9+Qp%B&yFioZbwLH$>Dz2s+Kpcnr&1n`;U&}H%31i=665*mw&h(JiDamPp@#N z9>f_J{E4d78sxO#&*k6OBhW4Q<2^NIMbQr~ap^Fw;HUWKws_O}1wY0=6IN9#_%Z&O zKKsA$D{oft_PF8e@#QUNH_Q2T3g4S^o814<;{Co68)udtUi5+N%Kg)i?##qfi`nKi z88i3t_CAU^ox)0)f*H*gYPXW7cOCo8YDKc6Qky|k5l$f)j~_>0xPY+r7<*5I^?=}y zP-GkCB+U9a0J|;#8V+KJwG(S`XNyjr&I@;8+8KDVK5?5ow#yJUWO|TKbnEV2!nzzG z7*B=IvMj-Hj1TI0dtI?S7<>!}KCO@vs$5 zgqv#FI(6zSz)U77J-s&`|0QvG`=d$Y#!CRpLVLXJ=X|I`=;@AN_x!9aN^gUa$pZL` z3Y9B&=QRp1Z@qf9$65jKpWxRxP@yrsee2F0Ps}+vLEbA_l9@_+gP07A<}c!cM*V=& z*D3qiBV{Bh&;SNVT`o9kuE{#Yl5)m)x7(N+;c{_QoaOK&&)k8l@mu2IK$+YD@&Y|G9`SRs07&TF{AS&1;D^?socdp$2g!7y$r45GT2?+u3yjwEq;lm5`C)lCsW+-l) zq77a58W=q)>odr&6%r2%qd*^2*c_%Os7z&P3FM2LN$b(aOR>!&A67OQ^YkRztT;X9 zmK<4d@=Mw9WvJqiDZL)Unfl-~gQXAfe!GM7p5C&i5*c^v_)?}uloSr-+;`BR3ZBer zp{KiGGqB?c-Yw}#Nesp*9p%aI@xEG6wB(O5Ro}=3C6=~)26CBJsFaZ4PM<0;l`dO0D1;G-VlPl&V$Q2Sxc?=f+tBkai%UPwBJT!(p<5drtvmraX=4u93u8eR zrrf#E(*$s8K^F|$Kf6WF!FeY2WrL!nXB&OCAwUaD`G^Un1CA`7z}yP-!wZJehPBA@Q&v4#D^qivF@55zSl;Yy2|+ zw|e2O1(C{_2cD@c@qU{ut1Y}b=>#qwJo7z!;S|*&*T)fJxd-MO0SuBEwViClwvm*0 znpH|Js1kic6$#d@e8)wF8?{}>);W7XQgDm_2phw@l0B@RTMRqv)~okFtV&BuOZj3W zZ$gdyE=3Idp=Wq_JFbD*#L_4- zZ0vvn3NFb6rt!eRgRJq*aa@+;dPV)jyeCQYTn=oc&z?V5ZeH#xs@865O?)-`qH!{S zr$2d^7}(R;^}T3@!?HfXu(VtE?(YFMjpZtlS71VAkE<{=zp|)Zs(kcOG%tUIMH>N@ zA(J!&1Y7s*TT9R#rs|v~{9d`SIkoaLp$1?}T)lYl2MJ0b1yQgBOmY!zw)gtve*SG& zdbHzRI?%jsBw3;Gw90xF@u)njiP7puv)Fmk83{CD5gTxa;>IyqZp##vaks&PE8Ani zzY1ExKu~3ik^oYnYgVr=U-HvWKQ+L3+6~A%y0TjXwa=9pvaKPgB9b3I92l$*lkw_00+{nxJAZOliiKd96Z{EE545IV2 zGA$jsjB?gsdasq+v*|R59I?ulg}e&`F*QKGN&&=y>D~)f2L2T?#bfRH%Ab*W7|bjU zwJg?fQhrpqa?#V}*0EhEqf%RaqLYsdvbSHk1y>@*0qG+ntvSJ?2U%MmW5uT5V_P&r zPGe$+L8M0&Z8E}gO_c99ONP~)RR|awT3BqL1Evv)sKj=FA@xQ&ZHM*dGwOLlN;%?s z<_I_D7SQRd=MD@ZrCQ_J)eSF9Pli6Z(4{~8aEA>hP5LXptyGyZ$1>3Cva41Hemw@E z8B52$xGr=0$U(%m9a_Z_^wbt=#Ls7qR|q2xIzjlf0(S8{E#AT@$1@+dmUGLYm0w!u z^FJP5K(~k++HnpqypKeqN{;Z!z)fd`IfEIT<{Mm@=Tbl|pDPt_n^a7v-TUHD!FI+T*)z1O?Qx7gb^iP(SP?M}&&HMi zXVitWLyWB4EwSB3IRw)#n@r~C>7uXfl#i5GX3^Jqcg+w%7ETEJcl zZ%~)EHHMf3AD?a*UZNKY!p9ZB*W!2LH$k^o5E8!# z51oi+W<|}0?q$Z)r%HeZTL6zz=|ke-SSmNWCOF~~66;E#TDnxJBt}7;0G#l)1xZz0 zL=%h%&CS<$co6Y!Hv(pIu2C$i7N&aClM9emqZ_67)TvYZ1$GJ$t<5sy^roBu3{`SU0B)Jsh>u zC*=J?s7HYo-Tl-ft1M8{jyVs1mDTd8wUO?zZY}THb*-8>hG#w^GEzCrj^q-Kr*Qf0 z*Mt7k=*^;4dZDt9Mo98(i`{{_6*<$WQA{^-;8m>O!;8pdH03I3fVh&c+KysH8R35O zE}MiR7M}1X3s2NY%hvUB_CORdnzxY65VzMJubxuJnB%y@WQ2M`FnzE&Q_B~>{djg` zdmk33Wyg*rMle_w<%3pf6KJdAi!7j09w7{w$nk}!i#b0+RSb#wUIwA zUAgizcXRNrT5L~h=iG=AdGCV{6vk>$f&zlpqlt;Nsj2l@6{I$&HKJCcK95toEFnOB z50Wqlu=95VJ-BBXTexcSCiqYz@kqK$ zD=>C=zus7{j-rKr?XNjE5GeG;3Q0SmnHf1g&urNV8ghy#MH4V{5i5Qj{Olf54|Ezp zjFu`}wm#N395agEC9D$&z5$ioO$sB(PaiL@BkZQkfZcKyH-zyVJAw`-lv*%Y3VoOn zX{SDHvGKemOw6%o6yCFn-nBQ?NbKU`V)kxHg98V*TO#+Tnu$XRG^lm+dh=Jxy6@b% za|s$v@|ZGqe@FHe&p6-V$bO;>PD`?(Da58{ru2?_PCPJ9Tlqo`y_lUMP z!zVC%5%=@`Y15|BvB33iiHh2Qx_1w-0RAomY|+wnK$~xL;J^X(pkTP98WetN=nLf4%jF}UOK;MQxzEMsMV1bDy1ivh)Tcp+~4-bnCPsMDKj05s2=J` zuZKH=_g5*r5#A4dA_;?K_d)vCogJF90m0k!U9Y#E#q_frG6sO_n(dtzAxEQm!=HF8 z90`Mph}ZCtD1!p9uz7VEVq?>7%ots3ToQ0~%ZE2_6y293-c zGk4E6XT`}_x-U*LR4rY2XZEO;mE7QIsMggs=do4JLJANXH3xVqZL*m4913AB2|-*g z2s8=B03ZH68jO_v^K;E&pU@4k$=?3(x2T16K*WbB8fOK;h`*PCY_r#q+? zWz9~>D<2x-6i6(~jZDc7HZ&U0W5AOCwBoxU{s&xh6EPCqix)+X-We@X%C@X zk~WFfs2nR47KVBAKewB4H*PFbWH`qRmob{sKRUN7Wmn9|!&(r&#u0_XlA&*LglD9< z5d?91%&`g;D|VqzKn`o5v0YKCLscpcFe?~0GhZp|Olc^mHw-=aj}h|xo;%l^J2{3C zNjnfq;(na*G7G)JUc4$9M=WHy1%IMG4QEK09gd-}QrrzADweFa)S0<&{~pewv`Ge( zCoVYse1fkhX9j5BqPiv~UekzAe6zm`c&$$o;01c5&&m$$Nxy`Eraplz&64lm@7st3 zvZHx@81EclA?*sSx?$6%O-A&iB?k^1sKRwHpV<^*_1CyeAX%92*fn5l~#q^Q`S(nwdNCa{I$+3EXM;A-DEStZ|_)2M?@$Xl3zT*9b+} zU+1Qi~W1X|PX5#>945Z7ZS6x(BFCZ}&l70WiCO_Jbk=6`p@DFuh5H;RV3 zb?THTT+tP?9Q|t4sA0-dnVEFt9l75#A`e=)xfwtYIgMypR5nk&Y0lP27V>udWSOZ# zB|2g1)H}|6^Iw0KAcLa*!bM}X+!GQ|X={~8LG{p!7#IJ^iHB+df{Seg%% zbJ$5T?GZs5^CS^Kp(cj-EG{-K6A>f$=nd$SbTm_CDyUZ0JUT4^j*yP*2*J7M_Wk>@ zXd%F0wqZd|W5Hb!&~7^kRgw-FZN~b44qSCA8;{y&j%E_lnw9 zn}7%@NCp6xu@Hj@Nmms;o_|-Z&D6+pFbTlZt{lrWLrO%aSWJ~;FB?8Z_&HhvMKx24 z(ZG56`^N&UT*qpiBAmXyoC_F$+5--;k1AB?%+gYe06Kd--6eCDWKzGnJ?^g)`~Ik$ zGmMiQ2PdMsb+hI15{QiBEd_hpwcWMz`wAimLx1K_DXo{_j*7r$H{u~yYH}O-HL(AJi){f4N1Q;J?gu1P)J%o0iAx`ok#tn`*rrVb z8bMJpaZSWd1I&XTenD|bvF0-C_kGtY85^I6Yth+CY7T@vWi`%zVkDxK6+&_IjD0g* znlIY?@7Arut+8az#5a1kqD?>LULhQLiH!ycH2uSNkDOP>PoB)waQoMA7z4;3UX!cuEcYGGCKO*XxQ^U z^h>P2U_9!{4ic*d$K;%Hsv;#|ai0y(o3X6b=Jru*DC(K{><+i*NokKn>GOgi-SjIOn>#yLZy3MrU?CVn%%!^55daSF<`^#YvWZ3mK4n_y@>% z8qkwIIOCx}L;@a|f$DFIus3f3h=KF zAGQ*&NfQFdg7MtfP!`~4(ed&AOk0F9$XF~LBy15XoElr~fY7jbH5Pv&angCV9DzYL zPfI+cf`p&IwR1UH%V=kzSvF|&=W8-?fORPn6-Une)b5Kzc8@&B6F8bWhL&%}E}1$g zVGWi60uVs5wxSuG-_qd#*e_(1@@wXH1@}>IVNyPtXM9~P|exR)aOiICdguwmjX1mOKaI-xnDrR)a zV)8+z#V6rQRHlz z3b*D(0M=A<0|_{;M+E^yg`-_YHyD}vprv3AEUgGpL7)kqv8kh3uA(hC1`D68l>3o0 zzEx|b{h2-3z%vQERHD1c($rcXDqhYl;>jVvHA+&k6+cZe!^ z7rn)31cR2Zp511bmWX+@@PB$D-meARs>K^WhHYK*;bDu|lh8K|pxEH%QS>k7jDfT2 z3KD`+vJtlYxYkACU10=YX$ne@Ut(Y0L(cF2n|u^g{I{HG&m%V?a%shmEZco1olgP5 zcC!t1f8InP;%sYE?+Iimg z!jMIv%&7=M@1T%RVf=0khk?sJCi6PI_^mZltMsSi5PjO6$CiWVQtyFtg3X|GnKD}= zBmI!Q>UT3e-+9OoD%R2?PrefB- zsdn$@kuU-$5z0Tge{D4_aw|r|L)UN$unzzSR-mzjCuHE@7-54(MyJ>pF92Y((ToEK zqazPs{>OcS+GUVj$U@GWnk|v1oFIi|E`t8_pWucJ42o8zrloqO6+2C~kuH#@9f!a!9=at5>7~HfUw1!V0y&>4D9%{GK_+_ z--X4s(+kUYIt4A)8=wyt`%#hUJN$pa9i3Bz+vvsgw+~~9uXx~{0*fOr$u{N zrnrmjo=gs@iU<6M_3`!yxF3G@uJieZV;=RVx>yOgfE8y=PcR2bOVE8}k(JWM@_AYi zq)|sHmTI3t8uKVK6BS04XbvO2Q!sJxn#BNt3OACMIINthc#R*gKZ_mpswTWSN!Xt54Ndgm$EmY?{BN54>w`Pm%C>GCv!CWxJ0)%xLYa~H<;j%rh>=qiRJd%89HiwZI^ zxJV>fxPw;o&KWtC+C3Yak02pcx|%K51_boy2*$qAP_5M>S{?g;o*3!ZKr>#xg5VDqGOWveAFhCj4Aqu$fNuMcA3ACs+KD=Xi5CBvw z&}!pTLNcS|G+4(N=zkP2nAZ@ABFaMcCxIQrtiUm37LS$IjnUbj;#$urW|QiOfdMEm zCpoOReoB<&h)Cy#%oXq0vBQ({1@97az?1r5k41oj)FPNiIbtCKbX7ANFhKd8{J}Kz zM;uyMQEX*u_Glgz8Oq-EjAZ#P95#S?7?%zjG)PKM5qhZp=^Y+JdD;-t%ws~2eA~LX zD|5uFxLfExVd^KZ>4*~>Jq82lL9+%}a1$6!%@Vs+%ONCUkPE41ieWY}@f1Y{4~|Ax zhK`KPCR8BIw+{3_L@YozMQ7bsttufxMQ=n@j}!B1?9=~YzvPR*oe|>-g72xhi%~pA z4u(!cyV`Gq*-~yaXf@Q=QOuB6IZ7x?RA49@I2G)tJ9q9pk`bTys%kVFYcU<$%-6Xn zEuw1GmXfzat;W%5$~l8!OgauIe$99M@nEt+jElj z#n5{+t@Snx;$Z!B9;jB9WL)7fbc@!526Yam#k}|if1_=l&T#7Cm$UPEB&R>i?!?W! z%664PfNuFRuS|K8hVa=J+he1AZfH2R|L9tBHq__!qV+rl70Xr8g$J)ce(~p@d*mr5MWt|2OG$GAJw_C# zia9VUWX5M8LwnjX{8&M6jAK|JJ2OZNxq}v{E#K%Zk)KG@2|cfME=@R0#FKkh%NA|n zIo+pb+rwRR_@vSm+`em-)811|G}=-F2+j;E4pA z|B0mw#mZwPGR2P;o*NgfIf1@?%i3cNAypg`_foBikrF$^0zIH1430Ha`o;#dw#^zz$Rf^4-gHX4T&QSVqa7(8W77cVz{9hj=ClV zIzoDF0Lt7GiBa_5688IY=4&AnT)iK}P>Hv|bYTcbP<=>)MlrYzh6kdm5~3^!VHi_8 zf-^?scC^U&7@@FzOF@Ia~n6wk|mJ~5auR$MC#7(AHEzOeL7fGEeZB*77v)DR=rA~(Cl#6r)WAK1#} z%nd8Hl+@HqH?wo%7uLSmxNOYo+kx}%ocEhK@7KK>!?(?@YO^8gGruji1Bb6aGi-0z z`}@vEp6b{5gvZSA9o{{wBs40nS%$6*u1>K-EGIL_HJqMaoZYe{KMimM0aR# z{lVRLtsGYz8gp3vbN>9#99lz|1qP-G zu<{tmu*3pdsvt@RO85f*-&a$=1CAT!%G5EM*g5j%qK4an4zr7#1bUQt?|(Saa6j-P z=A+8W9%F~E(>N!S({f@6bjw^yBk(1& z{?>kRgH4Rq01@>^|D&mI0*ERtT~yC|38YZrw=}MN87LYZ-Vdk}8rS?Vgb`YbsCl%b zv$8VBYVMU5W(ejE1#d?7zbJ2?pkK=!K&HMLLns!7+$QjJS;lp*x20Eut;jf5jxq8i zhy8CL(f5!ukN9!iO5PPi#GK(@(Qa#?lylV#0QsUfmdc_$X^x#?PnWXfg<+VW|AdhLTU` z?4ebd^6P=&yANb8gNZ1ZHa#-TC@P)3bMTxw;R=Mw8OYg1TIx^?9bdInYiu9o(wmdF z;KMuo?YpMa%6!|EskvOs#R+CjW5dR5*zwKL&2pTe&Xa=^@Ea-i7g?_iKU7}Y{mB)Z zf$0fz5{EGLEFZaY<;%yK^-sXZqv_$qPs8JXU@hLmU*EQQ)i`#Bu^Vqh4#2>S%1s_#fF(gZCX~RZ zNdCb(5Cy2x(=dzY2_XxEsx$SE7h{`||72-wi$7tu`{Bu)l*?jn%VHD25p|S;zWCL= zYc>d({?xy*ANeW9_**iw<-;eW6Jw@7~BhoN6J6DU52ZnVD z9N4jA$1;nfZ;(|3h7AI|gAYj2xr_H1JTUNQP_HqxNZvp2JK5MYw~Z~}m@g+x7=+uO zj5jE^@$17dxEG(x0?z}uum)eS$${5B;a!42VR;SxCvM1m z@e)T7SxArGyB-^}CV>}%JJ;FFWx0;@E#>Jv84AWDr&k_WmRqOmkQB}0fw&4rvyTj0 z@q&YC?BltX)qmK(|BJSP7aDQ9Gv`{~d+=bWS@pH&?ms;^D{+tJT-u(HBIAk#A#O)c^ z`6N9u=N+uhtKM7p>#rk8Gz`JB@6lYlzjv-v#~3daoUu*V- zhsWWfmE0|d1g(ib0r_3$7mOvt)q2#ZK=~0p&Kh(7{(Ya{sYjnTld;C%4;||CvKjX) zoN=8qKgY*6i@$i$>-qENYyA9p5}R_!?jleM-M8#!Ch(0xjHxDA6Rn0+ih7*o){El4 z`b08b?xm;a+6@ABOk#wiU_(l>8avn0`1oQPk4{f_K@_;6bW^-^NW zWIEM2R@YOCqV(Mgaf9|zrrW)T4{aM)w&t;C%5bw4N<$fQG_JICf`db6I>Mps3H!73fyCqF{ijqOy$SWymPrLMb~yGuy=aHsd{Vd zyK;1V8O-K6i$U_!Va?@%o1;9`sCiGnH+FyKs1P!g-4}bwDTSNv0`p&R@|sljoQhY& zRj}@$+8)`TJ6(;B&vgppqx10T$){?5f<0(?R=JH@cJ#e2rVTgInq0^@A22p7kXZCcU*nn@N9S>$_#_EYs)F*e6 zi-Wmyf!kdPr{q328x*{LQse)xD}n#CAUU5?;>a&8+a21z@q#{S@6QHw5AEvk&Hn?e ChtnMZ literal 0 HcmV?d00001 diff --git a/end-to-end-test/remote/specs/core/resultsOncoprintColorConfig.spec.js b/end-to-end-test/remote/specs/core/resultsOncoprintColorConfig.spec.js new file mode 100644 index 00000000000..1382782526d --- /dev/null +++ b/end-to-end-test/remote/specs/core/resultsOncoprintColorConfig.spec.js @@ -0,0 +1,184 @@ +var assertScreenShotMatch = require('../../../shared/lib/testUtils') + .assertScreenShotMatch; +var assert = require('assert'); +var waitForOncoprint = require('../../../shared/specUtils').waitForOncoprint; +var goToUrlAndSetLocalStorage = require('../../../shared/specUtils') + .goToUrlAndSetLocalStorage; +var getNthOncoprintTrackOptionsElements = require('../../../shared/specUtils') + .getNthOncoprintTrackOptionsElements; +var { + checkOncoprintElement, + getElementByTestHandle, +} = require('../../../shared/specUtils.js'); + +const ONCOPRINT_TIMEOUT = 60000; +const CBIOPORTAL_URL = process.env.CBIOPORTAL_URL.replace(/\/$/, ''); + +describe('oncoprint colors', () => { + describe('clinical tracks color configuration', () => { + before(function() { + goToUrlAndSetLocalStorage( + `${CBIOPORTAL_URL}/results/oncoprint?Action=Submit&RPPA_SCORE_THRESHOLD=2.0&Z_SCORE_THRESHOLD=2.0&cancer_study_list=gbm_tcga&case_set_id=gbm_tcga_all&data_priority=0&gene_list=EGFR%250APTEN%250AIDH1%250ATP53&geneset_list=%20&genetic_profile_ids_PROFILE_COPY_NUMBER_ALTERATION=gbm_tcga_gistic&genetic_profile_ids_PROFILE_MRNA_EXPRESSION=gbm_tcga_mrna_median_all_sample_Zscores&genetic_profile_ids_PROFILE_MUTATION_EXTENDED=gbm_tcga_mutations&hide_unprofiled_samples=false&profileFilter=0&tab_index=tab_visualize&show_samples=false` + ); + waitForOncoprint(ONCOPRINT_TIMEOUT); + }); + + it('color configuration modal reflects user selected colors', () => { + // add "Mutation spectrum" track + const $tracksDropdown = $('#addTracksDropdown'); + $tracksDropdown.click(); + getElementByTestHandle('add-chart-option-mutation-spectrum') + .$('label') + .click(); + waitForOncoprint(ONCOPRINT_TIMEOUT); + $tracksDropdown.click(); + + var trackOptionsElts = getNthOncoprintTrackOptionsElements(5); + // open menu + $(trackOptionsElts.button_selector).click(); + $(trackOptionsElts.dropdown_selector).waitForDisplayed({ + timeout: 1000, + }); + // click "Edit Colors" + $(trackOptionsElts.dropdown_selector + ' li:nth-child(8)').click(); + $('[data-test="color-picker-icon"]').waitForDisplayed(); + + // select new colors for track values + $('[data-test="color-picker-icon"]').click(); + $('.circle-picker [title="#990099"]').click(); + waitForOncoprint(ONCOPRINT_TIMEOUT); + $('[data-test="color-picker-icon"]').click(); + $('.circle-picker').waitForDisplayed({ reverse: true }); + + $$('[data-test="color-picker-icon"]')[1].click(); + $('.circle-picker [title="#109618"]').click(); + waitForOncoprint(ONCOPRINT_TIMEOUT); + $$('[data-test="color-picker-icon"]')[1].click(); + $('.circle-picker').waitForDisplayed({ reverse: true }); + + $$('[data-test="color-picker-icon"]')[2].click(); + $('.circle-picker [title="#8b0707"]').click(); + waitForOncoprint(ONCOPRINT_TIMEOUT); + $$('[data-test="color-picker-icon"]')[2].click(); + $('.circle-picker').waitForDisplayed({ reverse: true }); + + assert.strictEqual( + $('[data-test="color-picker-icon"] rect').getAttribute('fill'), + '#990099' + ); + assert.strictEqual( + $$('[data-test="color-picker-icon"] rect')[1].getAttribute( + 'fill' + ), + '#109618' + ); + assert.strictEqual( + $$('[data-test="color-picker-icon"] rect')[2].getAttribute( + 'fill' + ), + '#8b0707' + ); + }); + + it('oncoprint reflects user selected colors', () => { + // close modal + $('.modal-header [class="close"]').click(); + var res = checkOncoprintElement(); + assertScreenShotMatch(res); + }); + + it('reset colors button is enabled when default colors not used', () => { + // check "Reset Colors" button in modal + var trackOptionsElts = getNthOncoprintTrackOptionsElements(5); + $(trackOptionsElts.button_selector).click(); + $(trackOptionsElts.dropdown_selector).waitForDisplayed({ + timeout: 1000, + }); + $(trackOptionsElts.dropdown_selector + ' li:nth-child(8)').click(); + getElementByTestHandle('resetColors').waitForExist(); + + assert.strictEqual( + getElementByTestHandle('resetColors').isEnabled(), + true + ); + }); + + it('color configuration modal reflects default colors', () => { + // click "Reset Colors" track + getElementByTestHandle('resetColors').click(); + waitForOncoprint(ONCOPRINT_TIMEOUT); + + assert.strictEqual( + $('[data-test="color-picker-icon"] rect').getAttribute('fill'), + '#3d6eb1' + ); + assert.strictEqual( + $$('[data-test="color-picker-icon"] rect')[1].getAttribute( + 'fill' + ), + '#8ebfdc' + ); + assert.strictEqual( + $$('[data-test="color-picker-icon"] rect')[2].getAttribute( + 'fill' + ), + '#dff1f8' + ); + }); + + it('oncoprint reflects default colors', () => { + // close modal + $('.modal-header [class="close"]').click(); + var res = checkOncoprintElement(); + assertScreenShotMatch(res); + }); + + it('reset colors button is disabled when default colors are used', () => { + // check "Reset Colors" button in modal + var trackOptionsElts = getNthOncoprintTrackOptionsElements(5); + $(trackOptionsElts.button_selector).click(); + $(trackOptionsElts.dropdown_selector).waitForDisplayed({ + timeout: 1000, + }); + $(trackOptionsElts.dropdown_selector + ' li:nth-child(8)').click(); + getElementByTestHandle('resetColors').waitForExist(); + + assert.strictEqual( + getElementByTestHandle('resetColors').isEnabled(), + false + ); + }); + }); + + describe('enable white background for glyphs', () => { + before(function() { + goToUrlAndSetLocalStorage( + `${CBIOPORTAL_URL}/results/oncoprint?Action=Submit&RPPA_SCORE_THRESHOLD=2.0&Z_SCORE_THRESHOLD=2.0&cancer_study_list=gbm_tcga&case_set_id=gbm_tcga_all&data_priority=0&gene_list=EGFR%250APTEN%250AIDH1%250ATP53&geneset_list=%20&genetic_profile_ids_PROFILE_COPY_NUMBER_ALTERATION=gbm_tcga_gistic&genetic_profile_ids_PROFILE_MRNA_EXPRESSION=gbm_tcga_mrna_median_all_sample_Zscores&genetic_profile_ids_PROFILE_MUTATION_EXTENDED=gbm_tcga_mutations&hide_unprofiled_samples=false&profileFilter=0&tab_index=tab_visualize&show_samples=false` + ); + waitForOncoprint(ONCOPRINT_TIMEOUT); + }); + it('oncoprint uses white background for glyphs when option toggled', () => { + // toggle on white backgrounds for glyphs + const $viewDropdown = $('#viewDropdownButton'); + $viewDropdown.click(); + waitForOncoprint(2000); + getElementByTestHandle('toggleWhiteBackgroundForGlyphs').click(); + $viewDropdown.click(); + + var res = checkOncoprintElement(); + assertScreenShotMatch(res); + }); + + it('oncoprint uses default background for glyphs when option not toggled', () => { + // toggle off white backgrounds for glyphs + const $viewDropdown = $('#viewDropdownButton'); + $viewDropdown.click(); + waitForOncoprint(2000); + getElementByTestHandle('toggleWhiteBackgroundForGlyphs').click(); + $viewDropdown.click(); + + var res = checkOncoprintElement(); + assertScreenShotMatch(res); + }); + }); +}); diff --git a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx index ecb4b8e0305..44384a5f962 100644 --- a/src/shared/components/oncoprint/ResultsViewOncoprint.tsx +++ b/src/shared/components/oncoprint/ResultsViewOncoprint.tsx @@ -2005,6 +2005,7 @@ export default class ResultsViewOncoprint extends React.Component<