index.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. import {RcsbFv3DCustom} from "../../RcsbFv3D/RcsbFv3DCustom";
  2. import {RcsbFvStructureConfigInterface} from "../../RcsbFvStructure/RcsbFvStructure";
  3. import {
  4. BlockSelectorManager,
  5. CustomViewInterface,
  6. FeatureBlockInterface, FeatureViewInterface
  7. } from "../../RcsbFvSequence/SequenceViews/CustomView/CustomView";
  8. import * as React from "react";
  9. import {
  10. RcsbFv,
  11. RcsbFvDisplayTypes,
  12. RcsbFvRowConfigInterface,
  13. RcsbFvTrackDataElementInterface
  14. } from "@rcsb/rcsb-saguaro";
  15. import {
  16. RcsbFvSelectorManager,
  17. RegionSelectionInterface
  18. } from "../../RcsbFvState/RcsbFvSelectorManager";
  19. import {
  20. StructureViewerPublicInterface, SaguaroRegionList
  21. } from "../../RcsbFvStructure/StructureViewerInterface";
  22. import {
  23. LoadMethod,
  24. LoadMolstarInterface
  25. } from "../../RcsbFvStructure/StructureViewers/MolstarViewer/MolstarActionManager";
  26. import {ViewerProps} from "@rcsb/rcsb-molstar/build/src/viewer";
  27. import {RcsbFvStateManager} from "../../RcsbFvState/RcsbFvStateManager";
  28. const rowConfigChainA: Array<RcsbFvRowConfigInterface> = [
  29. {
  30. trackId: "sequenceTrack",
  31. trackHeight: 20,
  32. trackColor: "#F9F9F9",
  33. displayType: RcsbFvDisplayTypes.SEQUENCE,
  34. nonEmptyDisplay: true,
  35. rowTitle: "CHAIN A",
  36. trackData: [
  37. {
  38. begin: 1,
  39. value: "CGVPAIQPVLSGLSRIVNGEEAVPGSWPWQVSLQDKTGFHFCGGSLINENWVVTAAHCGVTTSDVVVAGEFDQGSSSEKIQKLKIAKVFKNSKYNSLTINNDITLLKLSTAASFSQTVSAVCLPSASDDFAAGTTCVTTGWGLTRYTNANTPDRLQQASLPLLSNTNCKKYWGTKIKDAMICAGASGVSSCMGDSGGPLVCKKNGAWTLVGIVSWGSSTCSTSTPGVYARVTALVNWVQQTLAAN"
  40. }
  41. ]
  42. },{
  43. trackId: "blockTrack",
  44. trackHeight: 20,
  45. trackColor: "#F9F9F9",
  46. displayType: RcsbFvDisplayTypes.BLOCK,
  47. displayColor: "#76ae91",
  48. rowTitle: "FEATURE",
  49. trackData: [{
  50. begin: 20,
  51. end: 25
  52. },{
  53. begin: 150,
  54. end: 160
  55. }]
  56. }
  57. ];
  58. const rowConfigChainB: Array<RcsbFvRowConfigInterface> = [
  59. {
  60. trackId: "sequenceTrack",
  61. trackHeight: 20,
  62. trackColor: "#F9F9F9",
  63. displayType: RcsbFvDisplayTypes.SEQUENCE,
  64. nonEmptyDisplay: true,
  65. rowTitle: "CHAIN B",
  66. trackData: [
  67. {
  68. begin: 1,
  69. value: "TEFGSELKSFPEVVGKTVDQAREYFTLHYPQYDVYFLPEGSPVTLDLRYNRVRVFYNPGTNVVNHVPHVG"
  70. }
  71. ]
  72. },{
  73. trackId: "blockTrack",
  74. trackHeight: 20,
  75. trackColor: "#F9F9F9",
  76. displayType: RcsbFvDisplayTypes.BLOCK,
  77. displayColor: "#f17070",
  78. rowTitle: "FEATURE",
  79. trackData: [{
  80. begin: 20,
  81. end: 50
  82. }]
  83. }
  84. ];
  85. const fvConfigChainA: FeatureViewInterface<LoadMolstarInterface> = {
  86. boardId:"1acb.A_board",
  87. boardConfig: {
  88. range: {
  89. min: 1,
  90. max: 245
  91. },
  92. rowTitleWidth: 190,
  93. includeAxis: true
  94. },
  95. rowConfig: rowConfigChainA,
  96. sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
  97. stateManager.selectionState.clearSelection("select", {modelId:"1acb_board", labelAsymId:"A"});
  98. plugin.clearSelection("select", {modelId: "1acb_board", labelAsymId: "A"})
  99. if(sequenceRegion.length > 0) {
  100. const regions = sequenceRegion.map(r => ({
  101. modelId: "1acb_board",
  102. labelAsymId: "A",
  103. region: {begin: r.begin, end: r.end ?? r.begin, source: "sequence"} as RegionSelectionInterface
  104. }));
  105. stateManager.selectionState.addSelectionFromMultipleRegions(regions, "select");
  106. plugin.select(regions.map(r => ({
  107. ...r,
  108. begin: r.region.begin,
  109. end: r.region.end
  110. })), "select", "add");
  111. }else{
  112. plugin.resetCamera();
  113. }
  114. },
  115. sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, d: RcsbFvTrackDataElementInterface) => {
  116. if(d!=null)
  117. plugin.cameraFocus("1acb_board", "A", d.begin, d.end ?? d.begin);
  118. },
  119. sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
  120. if(elements == null || elements.length == 0)
  121. plugin.clearSelection("hover");
  122. else
  123. plugin.select(elements.map(e=>({
  124. modelId: "1acb_board",
  125. labelAsymId: "A",
  126. begin: e.begin,
  127. end: e.end ?? e.begin
  128. })), "hover", "set");
  129. },
  130. structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
  131. const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1acb_board", "A", "select");
  132. if(sel == null) {
  133. pfv.clearSelection("select");
  134. plugin.resetCamera();
  135. }else {
  136. pfv.setSelection({elements: sel.regions, mode: "select"});
  137. }
  138. },
  139. structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
  140. const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1acb_board", "A", "hover");
  141. if(sel == null)
  142. pfv.clearSelection("hover");
  143. else
  144. pfv.setSelection({elements:sel.regions, mode:"hover"});
  145. }
  146. }
  147. const fvConfigChainB: FeatureViewInterface<LoadMolstarInterface> = {
  148. boardId:"1acb.B_board",
  149. boardConfig: {
  150. range: {
  151. min: 1,
  152. max: 70
  153. },
  154. rowTitleWidth: 190,
  155. includeAxis: true
  156. },
  157. rowConfig: rowConfigChainB,
  158. sequenceSelectionChangeCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, sequenceRegion: Array<RcsbFvTrackDataElementInterface>) => {
  159. stateManager.selectionState.clearSelection("select", {modelId:"1acb_board", labelAsymId:"B"});
  160. plugin.clearSelection("select", {modelId: "1acb_board", labelAsymId: "B"})
  161. if(sequenceRegion.length > 0) {
  162. const regions = sequenceRegion.map(r => ({
  163. modelId: "1acb_board",
  164. labelAsymId: "B",
  165. region: {begin: r.begin, end: r.end ?? r.begin, source: "sequence"} as RegionSelectionInterface
  166. }));
  167. stateManager.selectionState.addSelectionFromMultipleRegions(regions, "select");
  168. plugin.select(regions.map(r => ({
  169. ...r,
  170. begin: r.region.begin,
  171. end: r.region.end
  172. })), "select", "add");
  173. }else{
  174. plugin.resetCamera();
  175. }
  176. },
  177. sequenceElementClickCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, d: RcsbFvTrackDataElementInterface) => {
  178. if(d!=null)
  179. plugin.cameraFocus("1acb_board", "B", d.begin, d.end ?? d.begin);
  180. },
  181. sequenceHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, stateManager: RcsbFvStateManager, elements: Array<RcsbFvTrackDataElementInterface>) => {
  182. if(elements == null || elements.length == 0)
  183. plugin.clearSelection("hover");
  184. else
  185. plugin.select(elements.map(e=>({
  186. modelId: "1acb_board",
  187. labelAsymId: "B",
  188. begin: e.begin,
  189. end: e.end ?? e.begin
  190. })), "hover", "set");
  191. },
  192. structureSelectionCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
  193. const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1acb_board", "B", "select");
  194. if(sel == null) {
  195. pfv.clearSelection("select");
  196. plugin.resetCamera();
  197. }else {
  198. pfv.setSelection({elements: sel.regions, mode: "select"});
  199. }
  200. },
  201. structureHoverCallback: (plugin: StructureViewerPublicInterface<LoadMolstarInterface>, pfv: RcsbFv, stateManager: RcsbFvStateManager) => {
  202. const sel: SaguaroRegionList | undefined = stateManager.selectionState.getSelectionWithCondition("1acb_board", "B", "hover");
  203. if(sel == null)
  204. pfv.clearSelection("hover");
  205. else
  206. pfv.setSelection({elements:sel.regions, mode:"hover"});
  207. }
  208. }
  209. const blockChainA: FeatureBlockInterface<LoadMolstarInterface> = {
  210. blockId:"chainA",
  211. featureViewConfig: [fvConfigChainA]
  212. };
  213. const blockChainB: FeatureBlockInterface<LoadMolstarInterface> = {
  214. blockId:"chainB",
  215. featureViewConfig: [fvConfigChainB]
  216. };
  217. const blockSelectorElement: (blockSelectorManager: BlockSelectorManager) => JSX.Element = (blockSelectorManager: BlockSelectorManager) => {
  218. return (
  219. <div>
  220. <select onChange={(e)=>{
  221. blockSelectorManager.setActiveBlock(e.target.value)
  222. }}>
  223. <option value={"chainA"}>Chain A</option>
  224. <option value={"chainB"}>Chain B</option>
  225. </select>
  226. </div>
  227. );
  228. }
  229. const customConfig: CustomViewInterface<LoadMolstarInterface> = {
  230. blockConfig:[blockChainA, blockChainB],
  231. blockSelectorElement: blockSelectorElement
  232. }
  233. const sequenceConfig = {
  234. title: "Multiple chains example",
  235. subtitle: "PDB entry with two chains",
  236. config: customConfig
  237. };
  238. const molstarConfig: RcsbFvStructureConfigInterface<LoadMolstarInterface,{viewerProps:Partial<ViewerProps>}> = {
  239. loadConfig: {
  240. loadMethod: LoadMethod.loadPdbIds,
  241. loadParams: [{
  242. pdbId: "1acb",
  243. id:"1acb_board"
  244. }]
  245. },
  246. structureViewerConfig: {
  247. viewerProps:{
  248. showImportControls: true,
  249. showSessionControls: false
  250. }
  251. },
  252. };
  253. document.addEventListener("DOMContentLoaded", function(event) {
  254. const panel3d = new RcsbFv3DCustom({
  255. elementId: "pfv",
  256. structurePanelConfig: molstarConfig,
  257. sequencePanelConfig: sequenceConfig,
  258. cssConfig:{
  259. structurePanel:{
  260. minWidth:800,
  261. minHeight:800
  262. },
  263. sequencePanel:{
  264. minWidth:800
  265. }
  266. },
  267. });
  268. panel3d.render();
  269. });