index.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import {RcsbFv3DAssembly} from "../../RcsbFv3D/RcsbFv3DAssembly";
  2. import {
  3. AlignmentResponse,
  4. AnnotationFeatures,
  5. Type
  6. } from "@rcsb/rcsb-api-tools/build/RcsbGraphQL/Types/Borrego/GqlTypes";
  7. import {RcsbFvDisplayTypes, RcsbFvRowConfigInterface} from "@rcsb/rcsb-saguaro";
  8. import {PolymerEntityInstanceInterface} from "@rcsb/rcsb-saguaro-app/build/dist/RcsbCollectTools/DataCollectors/PolymerEntityInstancesCollector";
  9. document.addEventListener("DOMContentLoaded", function(event) {
  10. function getJsonFromUrl() {
  11. const url = location.search;
  12. var query = url.substring(1);
  13. var result: any = {};
  14. query.split("&").forEach(function(part) {
  15. var item = part.split("=");
  16. result[item[0]] = decodeURIComponent(item[1]);
  17. });
  18. return result;
  19. }
  20. const args: {pdbId:string} = getJsonFromUrl().pdbId ? getJsonFromUrl() : {pdbId:"1A6D"};
  21. const defaultAsymId = "A"
  22. const config = {
  23. entryId: args.pdbId,
  24. title: "Title " + args.pdbId,
  25. subtitle: "Subtitle for " + args.pdbId,
  26. asymId: defaultAsymId
  27. };
  28. const panel3d = new RcsbFv3DAssembly({
  29. elementId: "null",
  30. config: config,
  31. instanceSequenceConfig:{
  32. dropdownTitle: "Chain",
  33. module: "interface",
  34. defaultValue: defaultAsymId,
  35. onChangeCallback: (context, module)=>{
  36. console.log(context);
  37. }
  38. },
  39. additionalConfig: {
  40. boardConfig: {
  41. elementClickCallBack: (e) => {
  42. console.log(`Element clicked ${e?.type}`)
  43. }
  44. },
  45. externalTrackBuilder:externalTrackBuilder()
  46. },
  47. useOperatorsFlag: true
  48. });
  49. panel3d.render();
  50. });
  51. function externalTrackBuilder(){
  52. let myComputedTrack: RcsbFvRowConfigInterface = {
  53. trackId: "blockTrack",
  54. trackHeight: 20,
  55. trackColor: "#F9F9F9",
  56. titleFlagColor: "#48a1b3",
  57. displayType: RcsbFvDisplayTypes.BLOCK,
  58. displayColor: "#56e0f5",
  59. rowTitle: "COMPUTED",
  60. trackData: []
  61. };
  62. return {
  63. processAlignmentAndFeatures(data: { annotations?: Array<AnnotationFeatures>; alignments?: AlignmentResponse }): Promise<void> {
  64. return new Promise<void>(resolve => {
  65. myComputedTrack.trackData = [];
  66. data.annotations?.forEach(a=>{
  67. a.features?.forEach(f=>{
  68. if(f!=null && f.type === Type.Site){
  69. if(f.feature_positions)
  70. myComputedTrack.trackData?.push( ...f.feature_positions?.map(p=>({
  71. begin:p?.beg_seq_id ?? 0,
  72. end:p?.end_seq_id ?? undefined
  73. })))
  74. }
  75. })
  76. });
  77. resolve(void 0);
  78. })
  79. },
  80. addTo(tracks: { alignmentTracks?: Array<RcsbFvRowConfigInterface>; annotationTracks?: Array<RcsbFvRowConfigInterface>; rcsbContext?: Partial<PolymerEntityInstanceInterface>; }): Promise<void> {
  81. return new Promise<void>(resolve => {
  82. if (tracks.rcsbContext?.asymId === "A" && myComputedTrack?.trackData && myComputedTrack.trackData.length > 0) {
  83. tracks.annotationTracks?.push(myComputedTrack);
  84. }
  85. resolve(void 0);
  86. })
  87. },
  88. filterFeatures(data: {annotations: Array<AnnotationFeatures>; rcsbContext:Partial<PolymerEntityInstanceInterface>}): Promise<Array<AnnotationFeatures>> {
  89. return new Promise<Array<AnnotationFeatures>>(resolve => {
  90. resolve(data.annotations);
  91. })
  92. }
  93. }
  94. }