behavior.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /**
  2. * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { OrderedSet } from '../../../mol-data/int';
  7. import { StructureQualityReport, StructureQualityReportProvider } from './prop';
  8. import { StructureQualityReportColorThemeProvider } from './color';
  9. import { Loci } from '../../../mol-model/loci';
  10. import { StructureElement } from '../../../mol-model/structure';
  11. import { ParamDefinition as PD } from '../../../mol-util/param-definition';
  12. import { PluginBehavior } from '../../../mol-plugin/behavior/behavior';
  13. export const PDBeStructureQualityReport = PluginBehavior.create<{ autoAttach: boolean, showTooltip: boolean }>({
  14. name: 'pdbe-structure-quality-report-prop',
  15. category: 'custom-props',
  16. display: {
  17. name: 'Structure Quality Report',
  18. description: 'Data from wwPDB Validation Report, obtained via PDBe.'
  19. },
  20. ctor: class extends PluginBehavior.Handler<{ autoAttach: boolean, showTooltip: boolean }> {
  21. private provider = StructureQualityReportProvider
  22. private labelPDBeValidation = {
  23. label: (loci: Loci): string | undefined => {
  24. if (!this.params.showTooltip) return void 0;
  25. switch (loci.kind) {
  26. case 'element-loci':
  27. if (loci.elements.length === 0) return void 0;
  28. const e = loci.elements[0];
  29. const u = e.unit;
  30. if (!u.model.customProperties.hasReference(StructureQualityReportProvider.descriptor)) return void 0;
  31. const se = StructureElement.Location.create(loci.structure, u, u.elements[OrderedSet.getAt(e.indices, 0)]);
  32. const issues = StructureQualityReport.getIssues(se);
  33. if (issues.length === 0) return 'Validation: No Issues';
  34. return `Validation: ${issues.join(', ')}`;
  35. default: return void 0;
  36. }
  37. }
  38. }
  39. register(): void {
  40. this.ctx.customModelProperties.register(this.provider, this.params.autoAttach);
  41. this.ctx.managers.lociLabels.addProvider(this.labelPDBeValidation);
  42. this.ctx.representation.structure.themes.colorThemeRegistry.add(StructureQualityReportColorThemeProvider);
  43. }
  44. update(p: { autoAttach: boolean, showTooltip: boolean }) {
  45. let updated = this.params.autoAttach !== p.autoAttach;
  46. this.params.autoAttach = p.autoAttach;
  47. this.params.showTooltip = p.showTooltip;
  48. this.ctx.customModelProperties.setDefaultAutoAttach(this.provider.descriptor.name, this.params.autoAttach);
  49. return updated;
  50. }
  51. unregister() {
  52. this.ctx.customModelProperties.unregister(StructureQualityReportProvider.descriptor.name);
  53. this.ctx.managers.lociLabels.removeProvider(this.labelPDBeValidation);
  54. this.ctx.representation.structure.themes.colorThemeRegistry.remove(StructureQualityReportColorThemeProvider);
  55. }
  56. },
  57. params: () => ({
  58. autoAttach: PD.Boolean(false),
  59. showTooltip: PD.Boolean(true)
  60. })
  61. });