Skip to content
Snippets Groups Projects
Commit b2c93cbe authored by Alexander Rose's avatar Alexander Rose
Browse files

add option to ignore issues types in geo quality coloring

parent 60540dad
No related branches found
No related tags found
No related merge requests found
...@@ -14,6 +14,7 @@ import { CustomProperty } from '../../common/custom-property'; ...@@ -14,6 +14,7 @@ import { CustomProperty } from '../../common/custom-property';
import { ValidationReportProvider, ValidationReport } from '../validation-report'; import { ValidationReportProvider, ValidationReport } from '../validation-report';
import { TableLegend } from '../../../mol-util/legend'; import { TableLegend } from '../../../mol-util/legend';
import { PolymerType } from '../../../mol-model/structure/model/types'; import { PolymerType } from '../../../mol-model/structure/model/types';
import { SetUtils } from '../../../mol-util/set';
const DefaultColor = Color(0x909090) const DefaultColor = Color(0x909090)
...@@ -23,13 +24,28 @@ const TwoIssuesColor = Color(0xf46d43) ...@@ -23,13 +24,28 @@ const TwoIssuesColor = Color(0xf46d43)
const ThreeOrMoreIssuesColor = Color(0xa50026) const ThreeOrMoreIssuesColor = Color(0xa50026)
const ColorLegend = TableLegend([ const ColorLegend = TableLegend([
['Data unavailable', DefaultColor],
['No issues', NoIssuesColor], ['No issues', NoIssuesColor],
['One issue', OneIssueColor], ['One issue', OneIssueColor],
['Two issues', TwoIssuesColor], ['Two issues', TwoIssuesColor],
['Three or more issues', ThreeOrMoreIssuesColor] ['Three or more issues', ThreeOrMoreIssuesColor],
]) ])
export function GeometryQualityColorTheme(ctx: ThemeDataContext, props: {}): ColorTheme<{}> { export function getGeometricQualityColorThemeParams(ctx: ThemeDataContext) {
const validationReport = ctx.structure && ValidationReportProvider.get(ctx.structure.models[0]).value
const options: [string, string][] = []
if (validationReport) {
const kinds = new Set<string>()
validationReport.geometryIssues.forEach(v => v.forEach(k => kinds.add(k)))
kinds.forEach(k => options.push([k, k]))
}
return {
ignore: PD.MultiSelect([] as string[], options)
}
}
export type GeometricQualityColorThemeParams = ReturnType<typeof getGeometricQualityColorThemeParams>
export function GeometryQualityColorTheme(ctx: ThemeDataContext, props: PD.Values<GeometricQualityColorThemeParams>): ColorTheme<GeometricQualityColorThemeParams> {
let color: LocationColor = () => DefaultColor let color: LocationColor = () => DefaultColor
const validationReport = ctx.structure && ValidationReportProvider.get(ctx.structure.models[0]) const validationReport = ctx.structure && ValidationReportProvider.get(ctx.structure.models[0])
...@@ -42,19 +58,26 @@ export function GeometryQualityColorTheme(ctx: ThemeDataContext, props: {}): Col ...@@ -42,19 +58,26 @@ export function GeometryQualityColorTheme(ctx: ThemeDataContext, props: {}): Col
const { geometryIssues, clashes, bondOutliers, angleOutliers } = value const { geometryIssues, clashes, bondOutliers, angleOutliers } = value
const residueIndex = model.atomicHierarchy.residueAtomSegments.index const residueIndex = model.atomicHierarchy.residueAtomSegments.index
const { polymerType } = model.atomicHierarchy.derived.residue const { polymerType } = model.atomicHierarchy.derived.residue
const ignore = new Set(props.ignore)
color = (location: Location): Color => { color = (location: Location): Color => {
if (StructureElement.Location.is(location) && location.unit.model === model) { if (StructureElement.Location.is(location) && location.unit.model === model) {
const { element } = location const { element } = location
const rI = residueIndex[element] const rI = residueIndex[element]
let value = geometryIssues.get(rI)?.size
if (value !== undefined && polymerType[rI] === PolymerType.NA) { const value = geometryIssues.get(rI)
value = 0 if (value === undefined) return DefaultColor
if (clashes.getVertexEdgeCount(element) > 0) value += 1
if (bondOutliers.index.has(element)) value += 1 let count = SetUtils.differenceSize(value, ignore)
if (angleOutliers.index.has(element)) value += 1
if (count > 0 && polymerType[rI] === PolymerType.NA) {
count = 0
if (!ignore.has('clash') && clashes.getVertexEdgeCount(element) > 0) count += 1
if (!ignore.has('mog-bond-outlier') && bondOutliers.index.has(element)) count += 1
if (!ignore.has('mog-angle-outlier') && angleOutliers.index.has(element)) count += 1
} }
switch (value) { switch (count) {
case undefined: return DefaultColor case undefined: return DefaultColor
case 0: return NoIssuesColor case 0: return NoIssuesColor
case 1: return OneIssueColor case 1: return OneIssueColor
...@@ -72,16 +95,16 @@ export function GeometryQualityColorTheme(ctx: ThemeDataContext, props: {}): Col ...@@ -72,16 +95,16 @@ export function GeometryQualityColorTheme(ctx: ThemeDataContext, props: {}): Col
color, color,
props, props,
contextHash, contextHash,
description: 'Assigns residue colors according to the number of geometry issues.', description: 'Assigns residue colors according to the number of (filtered) geometry issues.',
legend: ColorLegend legend: ColorLegend
} }
} }
export const GeometryQualityColorThemeProvider: ColorTheme.Provider<{}> = { export const GeometryQualityColorThemeProvider: ColorTheme.Provider<GeometricQualityColorThemeParams> = {
label: 'RCSB Geometry Quality', label: 'RCSB Geometry Quality',
factory: GeometryQualityColorTheme, factory: GeometryQualityColorTheme,
getParams: () => ({}), getParams: getGeometricQualityColorThemeParams,
defaultValues: PD.getDefaultValues({}), defaultValues: PD.getDefaultValues(getGeometricQualityColorThemeParams({})),
isApplicable: (ctx: ThemeDataContext) => ValidationReport.isApplicable(ctx.structure?.models[0]), isApplicable: (ctx: ThemeDataContext) => ValidationReport.isApplicable(ctx.structure?.models[0]),
ensureCustomProperties: (ctx: CustomProperty.Context, data: ThemeDataContext) => { ensureCustomProperties: (ctx: CustomProperty.Context, data: ThemeDataContext) => {
return data.structure ? ValidationReportProvider.attach(ctx, data.structure.models[0]) : Promise.resolve() return data.structure ? ValidationReportProvider.attach(ctx, data.structure.models[0]) : Promise.resolve()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment