ExternalAlignmentProvider.ts 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825
  1. import {
  2. AlignmentResponse, GroupReference,
  3. SequenceReference,
  4. } from "@rcsb/rcsb-api-tools/build/RcsbGraphQL/Types/Borrego/GqlTypes";
  5. import {
  6. AlignmentCollectConfig,
  7. AlignmentCollectorInterface
  8. } from "@rcsb/rcsb-saguaro-app/build/dist/RcsbCollectTools/AlignmentCollector/AlignmentCollectorInterface";
  9. import {RcsbRequestContextManager} from "@rcsb/rcsb-saguaro-app";
  10. import {
  11. RcsbModuleDataProviderInterface
  12. } from "@rcsb/rcsb-saguaro-app/build/dist/RcsbFvWeb/RcsbFvModule/RcsbFvModuleInterface";
  13. import {AlignmentReference} from "./AlignmentReference";
  14. import {
  15. LocationProviderInterface,
  16. RigidTransformType, TransformMatrixType,
  17. TransformProviderInterface
  18. } from "../../../RcsbFvStructure/StructureUtils/StructureLoaderInterface";
  19. import {
  20. InstanceSequenceInterface
  21. } from "@rcsb/rcsb-saguaro-app/build/dist/RcsbCollectTools/DataCollectors/MultipleInstanceSequencesCollector";
  22. import {Alignment, AlignmentRegion, StructureAlignmentResponse} from "./alignment-response";
  23. const alignment = {
  24. "info": {
  25. "uuid": "e6e216de-c650-4ad5-bd81-45e75dfbe180",
  26. "status": "COMPLETE"
  27. },
  28. "meta": {
  29. "alignment_mode": "pairwise",
  30. "alignment_method": "fatcat-rigid"
  31. },
  32. "results": [
  33. {
  34. "structures": [
  35. {
  36. "entry_id": "101M",
  37. "selection": {
  38. "asym_id": "A"
  39. }
  40. },
  41. {
  42. "entry_id": "1ASH",
  43. "selection": {
  44. "asym_id": "A"
  45. }
  46. }
  47. ],
  48. "structure_alignment": [
  49. {
  50. "regions": [
  51. [
  52. {
  53. "asym_id": "A",
  54. "beg_seq_id": 4,
  55. "beg_index": 0,
  56. "length": 47
  57. },
  58. {
  59. "asym_id": "A",
  60. "beg_seq_id": 52,
  61. "beg_index": 52,
  62. "length": 70
  63. },
  64. {
  65. "asym_id": "A",
  66. "beg_seq_id": 124,
  67. "beg_index": 128,
  68. "length": 22
  69. }
  70. ],
  71. [
  72. {
  73. "asym_id": "A",
  74. "beg_seq_id": 1,
  75. "beg_index": 0,
  76. "length": 17
  77. },
  78. {
  79. "asym_id": "A",
  80. "beg_seq_id": 22,
  81. "beg_index": 21,
  82. "length": 61
  83. },
  84. {
  85. "asym_id": "A",
  86. "beg_seq_id": 86,
  87. "beg_index": 86,
  88. "length": 14
  89. },
  90. {
  91. "asym_id": "A",
  92. "beg_seq_id": 101,
  93. "beg_index": 101,
  94. "length": 47
  95. }
  96. ]
  97. ],
  98. "transformations": [
  99. [
  100. 1,
  101. 0,
  102. 0,
  103. 0,
  104. 0,
  105. 1,
  106. 0,
  107. 0,
  108. 0,
  109. 0,
  110. 1,
  111. 0,
  112. 0,
  113. 0,
  114. 0,
  115. 1
  116. ],
  117. [
  118. -0.7671995717115603,
  119. -0.5623954843039239,
  120. 0.30840904072376607,
  121. 0,
  122. -0.6011420900233072,
  123. 0.4627787494512096,
  124. -0.6515090303739346,
  125. 0,
  126. 0.2236805864799372,
  127. -0.6852351043918645,
  128. -0.6931232552303105,
  129. 0,
  130. 37.48154540719762,
  131. 28.2044983569036,
  132. -7.345065372687518,
  133. 1
  134. ]
  135. ],
  136. "summary": {
  137. "scores": [
  138. {
  139. "value": 1.95,
  140. "type": "RMSD"
  141. },
  142. {
  143. "value": 330.13,
  144. "type": "similarity-score"
  145. }
  146. ],
  147. "n_aln_residue_pairs": 139
  148. }
  149. }
  150. ],
  151. "sequence_alignment": [
  152. {
  153. "regions": [
  154. {
  155. "asym_id": "A",
  156. "beg_seq_id": 4,
  157. "beg_index": 0,
  158. "length": 17
  159. },
  160. {
  161. "asym_id": "A",
  162. "beg_seq_id": 21,
  163. "beg_index": 21,
  164. "length": 62
  165. },
  166. {
  167. "asym_id": "A",
  168. "beg_seq_id": 83,
  169. "beg_index": 86,
  170. "length": 14
  171. },
  172. {
  173. "asym_id": "A",
  174. "beg_seq_id": 97,
  175. "beg_index": 101,
  176. "length": 49
  177. }
  178. ],
  179. "gaps": [
  180. {
  181. "beg_index": 17,
  182. "length": 4
  183. },
  184. {
  185. "beg_index": 83,
  186. "length": 3
  187. },
  188. {
  189. "beg_index": 100,
  190. "length": 1
  191. }
  192. ]
  193. },
  194. {
  195. "regions": [
  196. {
  197. "asym_id": "A",
  198. "beg_seq_id": 1,
  199. "beg_index": 0,
  200. "length": 51
  201. },
  202. {
  203. "asym_id": "A",
  204. "beg_seq_id": 52,
  205. "beg_index": 52,
  206. "length": 74
  207. },
  208. {
  209. "asym_id": "A",
  210. "beg_seq_id": 126,
  211. "beg_index": 128,
  212. "length": 22
  213. }
  214. ],
  215. "gaps": [
  216. {
  217. "beg_index": 51,
  218. "length": 1
  219. },
  220. {
  221. "beg_index": 126,
  222. "length": 2
  223. }
  224. ]
  225. }
  226. ],
  227. "summary": {
  228. "scores": [
  229. {
  230. "value": 0.15,
  231. "type": "sequence-identity"
  232. },
  233. {
  234. "value": 1.94,
  235. "type": "RMSD"
  236. },
  237. {
  238. "value": 0.79,
  239. "type": "TM-score"
  240. },
  241. {
  242. "value": 330.13,
  243. "type": "similarity-score"
  244. },
  245. {
  246. "value": 0.34,
  247. "type": "sequence-similarity"
  248. }
  249. ],
  250. "n_aln_residue_pairs": 139,
  251. "n_modeled_residues": [
  252. 154,
  253. 147
  254. ],
  255. "seq_aln_len": 150,
  256. "aln_coverage": [
  257. 90,
  258. 95
  259. ]
  260. }
  261. },
  262. {
  263. "structures": [
  264. {
  265. "entry_id": "101M",
  266. "selection": {
  267. "asym_id": "A"
  268. }
  269. },
  270. {
  271. "entry_id": "4HHB",
  272. "selection": {
  273. "asym_id": "A"
  274. }
  275. }
  276. ],
  277. "structure_alignment": [
  278. {
  279. "regions": [
  280. [
  281. {
  282. "asym_id": "A",
  283. "beg_seq_id": 2,
  284. "beg_index": 0,
  285. "length": 48
  286. },
  287. {
  288. "asym_id": "A",
  289. "beg_seq_id": 56,
  290. "beg_index": 54,
  291. "length": 93
  292. }
  293. ],
  294. [
  295. {
  296. "asym_id": "A",
  297. "beg_seq_id": 1,
  298. "beg_index": 0,
  299. "length": 141
  300. }
  301. ]
  302. ],
  303. "transformations": [
  304. [
  305. 1,
  306. 0,
  307. 0,
  308. 0,
  309. 0,
  310. 1,
  311. 0,
  312. 0,
  313. 0,
  314. 0,
  315. 1,
  316. 0,
  317. 0,
  318. 0,
  319. 0,
  320. 1
  321. ],
  322. [
  323. 0.5659010881349978,
  324. 0.8158255303919226,
  325. 0.11909938038614465,
  326. 0,
  327. 0.49060456462775587,
  328. -0.21711201635870375,
  329. -0.8439013766543271,
  330. 0,
  331. -0.6626183815847819,
  332. 0.5359954069890864,
  333. -0.5231116554547112,
  334. 0,
  335. 16.44633740010974,
  336. 7.329736404913569,
  337. 7.069768946221407,
  338. 1
  339. ]
  340. ],
  341. "summary": {
  342. "scores": [
  343. {
  344. "value": 1.41,
  345. "type": "RMSD"
  346. },
  347. {
  348. "value": 360.42,
  349. "type": "similarity-score"
  350. }
  351. ],
  352. "n_aln_residue_pairs": 141
  353. }
  354. }
  355. ],
  356. "sequence_alignment": [
  357. {
  358. "regions": [
  359. {
  360. "asym_id": "A",
  361. "beg_seq_id": 2,
  362. "beg_index": 0,
  363. "length": 147
  364. }
  365. ]
  366. },
  367. {
  368. "regions": [
  369. {
  370. "asym_id": "A",
  371. "beg_seq_id": 1,
  372. "beg_index": 0,
  373. "length": 48
  374. },
  375. {
  376. "asym_id": "A",
  377. "beg_seq_id": 49,
  378. "beg_index": 54,
  379. "length": 93
  380. }
  381. ],
  382. "gaps": [
  383. {
  384. "beg_index": 48,
  385. "length": 6
  386. }
  387. ]
  388. }
  389. ],
  390. "summary": {
  391. "scores": [
  392. {
  393. "value": 1.63,
  394. "type": "RMSD"
  395. },
  396. {
  397. "value": 360.42,
  398. "type": "similarity-score"
  399. },
  400. {
  401. "value": 0.26,
  402. "type": "sequence-identity"
  403. },
  404. {
  405. "value": 0.83,
  406. "type": "TM-score"
  407. },
  408. {
  409. "value": 0.4,
  410. "type": "sequence-similarity"
  411. }
  412. ],
  413. "n_aln_residue_pairs": 141,
  414. "n_modeled_residues": [
  415. 154,
  416. 141
  417. ],
  418. "seq_aln_len": 147,
  419. "aln_coverage": [
  420. 92,
  421. 100
  422. ]
  423. }
  424. },
  425. {
  426. "structures": [
  427. {
  428. "entry_id": "101M",
  429. "selection": {
  430. "asym_id": "A"
  431. }
  432. },
  433. {
  434. "entry_id": "3IA3",
  435. "selection": {
  436. "asym_id": "A"
  437. }
  438. }
  439. ],
  440. "structure_alignment": [
  441. {
  442. "regions": [
  443. [
  444. {
  445. "asym_id": "A",
  446. "beg_seq_id": 6,
  447. "beg_index": 0,
  448. "length": 2
  449. },
  450. {
  451. "asym_id": "A",
  452. "beg_seq_id": 9,
  453. "beg_index": 3,
  454. "length": 10
  455. },
  456. {
  457. "asym_id": "A",
  458. "beg_seq_id": 70,
  459. "beg_index": 64,
  460. "length": 7
  461. },
  462. {
  463. "asym_id": "A",
  464. "beg_seq_id": 90,
  465. "beg_index": 84,
  466. "length": 64
  467. }
  468. ],
  469. [
  470. {
  471. "asym_id": "A",
  472. "beg_seq_id": 2,
  473. "beg_index": 0,
  474. "length": 2
  475. },
  476. {
  477. "asym_id": "A",
  478. "beg_seq_id": 5,
  479. "beg_index": 3,
  480. "length": 28
  481. },
  482. {
  483. "asym_id": "A",
  484. "beg_seq_id": 37,
  485. "beg_index": 99,
  486. "length": 23
  487. },
  488. {
  489. "asym_id": "A",
  490. "beg_seq_id": 62,
  491. "beg_index": 124,
  492. "length": 30
  493. }
  494. ]
  495. ],
  496. "transformations": [
  497. [
  498. 1,
  499. 0,
  500. 0,
  501. 0,
  502. 0,
  503. 1,
  504. 0,
  505. 0,
  506. 0,
  507. 0,
  508. 1,
  509. 0,
  510. 0,
  511. 0,
  512. 0,
  513. 1
  514. ],
  515. [
  516. 0.5053504853280419,
  517. -0.8551690322642134,
  518. -0.11535516128462073,
  519. 0,
  520. 0.8381805444620154,
  521. 0.45468307113605794,
  522. 0.3011920976845868,
  523. 0,
  524. -0.20512011569826996,
  525. -0.248896024633924,
  526. 0.946560355739325,
  527. 0,
  528. 54.00745824109328,
  529. 20.631415015987336,
  530. 1.2186542597577539,
  531. 1
  532. ]
  533. ],
  534. "summary": {
  535. "scores": [
  536. {
  537. "value": 10.35,
  538. "type": "RMSD"
  539. },
  540. {
  541. "value": 163.43,
  542. "type": "similarity-score"
  543. }
  544. ],
  545. "n_aln_residue_pairs": 83
  546. }
  547. }
  548. ],
  549. "sequence_alignment": [
  550. {
  551. "regions": [
  552. {
  553. "asym_id": "A",
  554. "beg_seq_id": 6,
  555. "beg_index": 0,
  556. "length": 95
  557. },
  558. {
  559. "asym_id": "A",
  560. "beg_seq_id": 101,
  561. "beg_index": 99,
  562. "length": 23
  563. },
  564. {
  565. "asym_id": "A",
  566. "beg_seq_id": 124,
  567. "beg_index": 124,
  568. "length": 30
  569. }
  570. ],
  571. "gaps": [
  572. {
  573. "beg_index": 95,
  574. "length": 4
  575. },
  576. {
  577. "beg_index": 122,
  578. "length": 2
  579. }
  580. ]
  581. },
  582. {
  583. "regions": [
  584. {
  585. "asym_id": "A",
  586. "beg_seq_id": 2,
  587. "beg_index": 0,
  588. "length": 13
  589. },
  590. {
  591. "asym_id": "A",
  592. "beg_seq_id": 15,
  593. "beg_index": 64,
  594. "length": 7
  595. },
  596. {
  597. "asym_id": "A",
  598. "beg_seq_id": 22,
  599. "beg_index": 84,
  600. "length": 70
  601. }
  602. ],
  603. "gaps": [
  604. {
  605. "beg_index": 13,
  606. "length": 51
  607. },
  608. {
  609. "beg_index": 71,
  610. "length": 13
  611. }
  612. ]
  613. }
  614. ],
  615. "summary": {
  616. "scores": [
  617. {
  618. "value": 0.38,
  619. "type": "TM-score"
  620. },
  621. {
  622. "value": 4.06,
  623. "type": "RMSD"
  624. },
  625. {
  626. "value": 163.43,
  627. "type": "similarity-score"
  628. },
  629. {
  630. "value": 0.13,
  631. "type": "sequence-identity"
  632. },
  633. {
  634. "value": 0.29,
  635. "type": "sequence-similarity"
  636. }
  637. ],
  638. "n_aln_residue_pairs": 83,
  639. "n_modeled_residues": [
  640. 154,
  641. 90
  642. ],
  643. "seq_aln_len": 154,
  644. "aln_coverage": [
  645. 54,
  646. 92
  647. ]
  648. }
  649. },
  650. {
  651. "structures": [
  652. {
  653. "entry_id": "101M",
  654. "selection": {
  655. "asym_id": "A"
  656. }
  657. },
  658. {
  659. "entry_id": "3IA3",
  660. "selection": {
  661. "asym_id": "B"
  662. }
  663. }
  664. ],
  665. "structure_alignment": [
  666. {
  667. "regions": [
  668. [
  669. {
  670. "asym_id": "A",
  671. "beg_seq_id": 1,
  672. "beg_index": 0,
  673. "length": 18
  674. },
  675. {
  676. "asym_id": "A",
  677. "beg_seq_id": 22,
  678. "beg_index": 22,
  679. "length": 30
  680. },
  681. {
  682. "asym_id": "A",
  683. "beg_seq_id": 58,
  684. "beg_index": 58,
  685. "length": 85
  686. }
  687. ],
  688. [
  689. {
  690. "asym_id": "B",
  691. "beg_seq_id": 6,
  692. "beg_index": 0,
  693. "length": 4
  694. },
  695. {
  696. "asym_id": "B",
  697. "beg_seq_id": 11,
  698. "beg_index": 5,
  699. "length": 129
  700. }
  701. ]
  702. ],
  703. "transformations": [
  704. [
  705. 1,
  706. 0,
  707. 0,
  708. 0,
  709. 0,
  710. 1,
  711. 0,
  712. 0,
  713. 0,
  714. 0,
  715. 1,
  716. 0,
  717. 0,
  718. 0,
  719. 0,
  720. 1
  721. ],
  722. [
  723. -0.42302765123934255,
  724. -0.016759653799444912,
  725. 0.9059617653584768,
  726. 0,
  727. 0.36791779101822186,
  728. 0.910522894182729,
  729. 0.18863869757125365,
  730. 0,
  731. -0.8280604478775673,
  732. 0.41311883662407556,
  733. -0.3790101865216464,
  734. 0,
  735. 80.69972926533072,
  736. -0.278244322992661,
  737. 6.001546353485595,
  738. 1
  739. ]
  740. ],
  741. "summary": {
  742. "scores": [
  743. {
  744. "value": 278.41,
  745. "type": "similarity-score"
  746. },
  747. {
  748. "value": 2.79,
  749. "type": "RMSD"
  750. }
  751. ],
  752. "n_aln_residue_pairs": 133
  753. }
  754. }
  755. ],
  756. "sequence_alignment": [
  757. {
  758. "regions": [
  759. {
  760. "asym_id": "A",
  761. "beg_seq_id": 1,
  762. "beg_index": 0,
  763. "length": 4
  764. },
  765. {
  766. "asym_id": "A",
  767. "beg_seq_id": 5,
  768. "beg_index": 5,
  769. "length": 138
  770. }
  771. ],
  772. "gaps": [
  773. {
  774. "beg_index": 4,
  775. "length": 1
  776. }
  777. ]
  778. },
  779. {
  780. "regions": [
  781. {
  782. "asym_id": "B",
  783. "beg_seq_id": 6,
  784. "beg_index": 0,
  785. "length": 19
  786. },
  787. {
  788. "asym_id": "B",
  789. "beg_seq_id": 25,
  790. "beg_index": 22,
  791. "length": 30
  792. },
  793. {
  794. "asym_id": "B",
  795. "beg_seq_id": 55,
  796. "beg_index": 58,
  797. "length": 85
  798. }
  799. ],
  800. "gaps": [
  801. {
  802. "beg_index": 19,
  803. "length": 3
  804. },
  805. {
  806. "beg_index": 52,
  807. "length": 6
  808. }
  809. ]
  810. }
  811. ],
  812. "summary": {
  813. "scores": [
  814. {
  815. "value": 278.41,
  816. "type": "similarity-score"
  817. },
  818. {
  819. "value": 0.35,
  820. "type": "sequence-similarity"
  821. },
  822. {
  823. "value": 3.03,
  824. "type": "RMSD"
  825. },
  826. {
  827. "value": 0.66,
  828. "type": "TM-score"
  829. },
  830. {
  831. "value": 0.2,
  832. "type": "sequence-identity"
  833. }
  834. ],
  835. "n_aln_residue_pairs": 133,
  836. "n_modeled_residues": [
  837. 154,
  838. 135
  839. ],
  840. "seq_aln_len": 143,
  841. "aln_coverage": [
  842. 86,
  843. 99
  844. ]
  845. }
  846. }
  847. ]
  848. };
  849. const flexAlignment = {
  850. "info": {
  851. "uuid": "c74f1b38-ad36-4c24-88ea-c947eba2b965",
  852. "status": "COMPLETE"
  853. },
  854. "meta": {
  855. "alignment_mode": "pairwise",
  856. "alignment_method": "fatcat-flexible"
  857. },
  858. "results": [
  859. {
  860. "structures": [
  861. {
  862. "entry_id": "1SR6",
  863. "selection": {
  864. "asym_id": "A"
  865. }
  866. },
  867. {
  868. "entry_id": "1KWO",
  869. "selection": {
  870. "asym_id": "A"
  871. }
  872. }
  873. ],
  874. "structure_alignment": [
  875. {
  876. "regions": [
  877. [
  878. {
  879. "asym_id": "A",
  880. "beg_seq_id": 6,
  881. "beg_index": 0,
  882. "length": 18
  883. },
  884. {
  885. "asym_id": "A",
  886. "beg_seq_id": 26,
  887. "beg_index": 20,
  888. "length": 11
  889. },
  890. {
  891. "asym_id": "A",
  892. "beg_seq_id": 38,
  893. "beg_index": 32,
  894. "length": 163
  895. },
  896. {
  897. "asym_id": "A",
  898. "beg_seq_id": 213,
  899. "beg_index": 198,
  900. "length": 194
  901. },
  902. {
  903. "asym_id": "A",
  904. "beg_seq_id": 410,
  905. "beg_index": 395,
  906. "length": 153
  907. },
  908. {
  909. "asym_id": "A",
  910. "beg_seq_id": 566,
  911. "beg_index": 551,
  912. "length": 3
  913. },
  914. {
  915. "asym_id": "A",
  916. "beg_seq_id": 572,
  917. "beg_index": 557,
  918. "length": 54
  919. },
  920. {
  921. "asym_id": "A",
  922. "beg_seq_id": 643,
  923. "beg_index": 612,
  924. "length": 51
  925. }
  926. ],
  927. [
  928. {
  929. "asym_id": "A",
  930. "beg_seq_id": 6,
  931. "beg_index": 0,
  932. "length": 18
  933. },
  934. {
  935. "asym_id": "A",
  936. "beg_seq_id": 27,
  937. "beg_index": 20,
  938. "length": 174
  939. },
  940. {
  941. "asym_id": "A",
  942. "beg_seq_id": 213,
  943. "beg_index": 198,
  944. "length": 194
  945. },
  946. {
  947. "asym_id": "A",
  948. "beg_seq_id": 410,
  949. "beg_index": 395,
  950. "length": 153
  951. },
  952. {
  953. "asym_id": "A",
  954. "beg_seq_id": 569,
  955. "beg_index": 551,
  956. "length": 56
  957. },
  958. {
  959. "asym_id": "A",
  960. "beg_seq_id": 642,
  961. "beg_index": 610,
  962. "length": 52
  963. }
  964. ]
  965. ],
  966. "transformations": [
  967. [
  968. 1,
  969. 0,
  970. 0,
  971. 0,
  972. 0,
  973. 1,
  974. 0,
  975. 0,
  976. 0,
  977. 0,
  978. 1,
  979. 0,
  980. 0,
  981. 0,
  982. 0,
  983. 1
  984. ],
  985. [
  986. 0.5748680038797991,
  987. -0.6350218438618033,
  988. -0.5160174763839023,
  989. 0,
  990. 0.4813145452568598,
  991. 0.7724272890898242,
  992. -0.4143578062418128,
  993. 0,
  994. 0.6617122385443976,
  995. -0.010165672024066708,
  996. 0.7496889838278681,
  997. 0,
  998. -3.505312472354479,
  999. -5.385563704760273,
  1000. 52.46070687230462,
  1001. 1
  1002. ]
  1003. ],
  1004. "summary": {
  1005. "scores": [
  1006. {
  1007. "value": 1772.68,
  1008. "type": "similarity-score"
  1009. },
  1010. {
  1011. "value": 2.63,
  1012. "type": "RMSD"
  1013. }
  1014. ],
  1015. "n_aln_residue_pairs": 647
  1016. }
  1017. },
  1018. {
  1019. "regions": [
  1020. [
  1021. {
  1022. "asym_id": "A",
  1023. "beg_seq_id": 699,
  1024. "beg_index": 668,
  1025. "length": 3
  1026. },
  1027. {
  1028. "asym_id": "A",
  1029. "beg_seq_id": 707,
  1030. "beg_index": 676,
  1031. "length": 20
  1032. },
  1033. {
  1034. "asym_id": "A",
  1035. "beg_seq_id": 734,
  1036. "beg_index": 700,
  1037. "length": 102
  1038. }
  1039. ],
  1040. [
  1041. {
  1042. "asym_id": "A",
  1043. "beg_seq_id": 704,
  1044. "beg_index": 668,
  1045. "length": 23
  1046. },
  1047. {
  1048. "asym_id": "A",
  1049. "beg_seq_id": 734,
  1050. "beg_index": 700,
  1051. "length": 102
  1052. }
  1053. ]
  1054. ],
  1055. "transformations": [
  1056. [
  1057. 1,
  1058. 0,
  1059. 0,
  1060. 0,
  1061. 0,
  1062. 1,
  1063. 0,
  1064. 0,
  1065. 0,
  1066. 0,
  1067. 1,
  1068. 0,
  1069. 0,
  1070. 0,
  1071. 0,
  1072. 1
  1073. ],
  1074. [
  1075. 0.03983531379027039,
  1076. -0.9969211935123139,
  1077. -0.06753726157621881,
  1078. 0,
  1079. 0.5428660722665761,
  1080. 0.07833822385293923,
  1081. -0.8361576108996602,
  1082. 0,
  1083. 0.8388739925382667,
  1084. -0.0033550871152113193,
  1085. 0.5443153204102911,
  1086. 0,
  1087. 10.707819252191578,
  1088. 1.4313621373339025,
  1089. 38.51048821786332,
  1090. 1
  1091. ]
  1092. ],
  1093. "summary": {
  1094. "scores": [
  1095. {
  1096. "value": 2.01,
  1097. "type": "RMSD"
  1098. },
  1099. {
  1100. "value": 328.8,
  1101. "type": "similarity-score"
  1102. }
  1103. ],
  1104. "n_aln_residue_pairs": 125
  1105. }
  1106. }
  1107. ],
  1108. "sequence_alignment": [
  1109. {
  1110. "regions": [
  1111. {
  1112. "asym_id": "A",
  1113. "beg_seq_id": 6,
  1114. "beg_index": 0,
  1115. "length": 195
  1116. },
  1117. {
  1118. "asym_id": "A",
  1119. "beg_seq_id": 213,
  1120. "beg_index": 198,
  1121. "length": 414
  1122. },
  1123. {
  1124. "asym_id": "A",
  1125. "beg_seq_id": 643,
  1126. "beg_index": 612,
  1127. "length": 88
  1128. },
  1129. {
  1130. "asym_id": "A",
  1131. "beg_seq_id": 734,
  1132. "beg_index": 700,
  1133. "length": 102
  1134. }
  1135. ],
  1136. "gaps": [
  1137. {
  1138. "beg_index": 195,
  1139. "length": 3
  1140. }
  1141. ]
  1142. },
  1143. {
  1144. "regions": [
  1145. {
  1146. "asym_id": "A",
  1147. "beg_seq_id": 6,
  1148. "beg_index": 0,
  1149. "length": 18
  1150. },
  1151. {
  1152. "asym_id": "A",
  1153. "beg_seq_id": 27,
  1154. "beg_index": 20,
  1155. "length": 11
  1156. },
  1157. {
  1158. "asym_id": "A",
  1159. "beg_seq_id": 38,
  1160. "beg_index": 32,
  1161. "length": 163
  1162. },
  1163. {
  1164. "asym_id": "A",
  1165. "beg_seq_id": 210,
  1166. "beg_index": 195,
  1167. "length": 197
  1168. },
  1169. {
  1170. "asym_id": "A",
  1171. "beg_seq_id": 410,
  1172. "beg_index": 395,
  1173. "length": 153
  1174. },
  1175. {
  1176. "asym_id": "A",
  1177. "beg_seq_id": 569,
  1178. "beg_index": 551,
  1179. "length": 3
  1180. },
  1181. {
  1182. "asym_id": "A",
  1183. "beg_seq_id": 572,
  1184. "beg_index": 557,
  1185. "length": 53
  1186. },
  1187. {
  1188. "asym_id": "A",
  1189. "beg_seq_id": 642,
  1190. "beg_index": 610,
  1191. "length": 1
  1192. },
  1193. {
  1194. "asym_id": "A",
  1195. "beg_seq_id": 643,
  1196. "beg_index": 612,
  1197. "length": 55
  1198. },
  1199. {
  1200. "asym_id": "A",
  1201. "beg_seq_id": 704,
  1202. "beg_index": 668,
  1203. "length": 3
  1204. },
  1205. {
  1206. "asym_id": "A",
  1207. "beg_seq_id": 707,
  1208. "beg_index": 676,
  1209. "length": 20
  1210. },
  1211. {
  1212. "asym_id": "A",
  1213. "beg_seq_id": 734,
  1214. "beg_index": 700,
  1215. "length": 102
  1216. }
  1217. ],
  1218. "gaps": [
  1219. {
  1220. "beg_index": 18,
  1221. "length": 2
  1222. },
  1223. {
  1224. "beg_index": 31,
  1225. "length": 1
  1226. },
  1227. {
  1228. "beg_index": 392,
  1229. "length": 3
  1230. },
  1231. {
  1232. "beg_index": 548,
  1233. "length": 3
  1234. },
  1235. {
  1236. "beg_index": 554,
  1237. "length": 3
  1238. },
  1239. {
  1240. "beg_index": 611,
  1241. "length": 1
  1242. },
  1243. {
  1244. "beg_index": 667,
  1245. "length": 1
  1246. },
  1247. {
  1248. "beg_index": 671,
  1249. "length": 5
  1250. },
  1251. {
  1252. "beg_index": 696,
  1253. "length": 4
  1254. }
  1255. ]
  1256. }
  1257. ],
  1258. "summary": {
  1259. "scores": [
  1260. {
  1261. "value": 2.48,
  1262. "type": "RMSD"
  1263. },
  1264. {
  1265. "value": 0.6,
  1266. "type": "TM-score"
  1267. },
  1268. {
  1269. "value": 2076.04,
  1270. "type": "similarity-score"
  1271. },
  1272. {
  1273. "value": 0.98,
  1274. "type": "sequence-identity"
  1275. },
  1276. {
  1277. "value": 0.98,
  1278. "type": "sequence-similarity"
  1279. }
  1280. ],
  1281. "n_aln_residue_pairs": 772,
  1282. "n_modeled_residues": [
  1283. 801,
  1284. 780
  1285. ],
  1286. "seq_aln_len": 802,
  1287. "aln_coverage": [
  1288. 96,
  1289. 99
  1290. ]
  1291. }
  1292. }
  1293. ]
  1294. };
  1295. const alignmentExample = {
  1296. "info": {
  1297. "uuid": "538d54e2-039c-44c8-bd5f-bb26af9c45bb",
  1298. "status": "COMPLETE"
  1299. },
  1300. "meta": {
  1301. "alignment_mode": "pairwise",
  1302. "alignment_method": "fatcat-rigid"
  1303. },
  1304. "results": [
  1305. {
  1306. "structures": [
  1307. {
  1308. "url": "https://alphafold.ebi.ac.uk/files/AF-P41235-F1-model_v2.cif",
  1309. "format": "mmcif",
  1310. "is_binary": false,
  1311. "name": "AF-P41235-F1",
  1312. "selection": {
  1313. "asym_id": "A"
  1314. }
  1315. },
  1316. {
  1317. "entry_id": "3CBB",
  1318. "selection": {
  1319. "asym_id": "C"
  1320. }
  1321. }
  1322. ],
  1323. "structure_alignment": [
  1324. {
  1325. "regions": [
  1326. [
  1327. {
  1328. "asym_id": "A",
  1329. "beg_seq_id": 58,
  1330. "beg_index": 0,
  1331. "length": 76
  1332. }
  1333. ],
  1334. [
  1335. {
  1336. "asym_id": "C",
  1337. "beg_seq_id": 1,
  1338. "beg_index": 0,
  1339. "length": 76
  1340. }
  1341. ]
  1342. ],
  1343. "transformations": [
  1344. [
  1345. 1,
  1346. 0,
  1347. 0,
  1348. 0,
  1349. 0,
  1350. 1,
  1351. 0,
  1352. 0,
  1353. 0,
  1354. 0,
  1355. 1,
  1356. 0,
  1357. 0,
  1358. 0,
  1359. 0,
  1360. 1
  1361. ],
  1362. [
  1363. 0.663932900191227,
  1364. -0.6410962059424273,
  1365. 0.3849529305900804,
  1366. 0,
  1367. -0.6205267418674186,
  1368. -0.18505769796524382,
  1369. 0.7620368829992492,
  1370. 0,
  1371. -0.4173004513190375,
  1372. -0.7448149455737514,
  1373. -0.5206832340097945,
  1374. 0,
  1375. 2.241812113864647,
  1376. 17.198483576583477,
  1377. -52.357664887014344,
  1378. 1
  1379. ]
  1380. ],
  1381. "summary": {
  1382. "scores": [
  1383. {
  1384. "value": 214.71,
  1385. "type": "similarity-score"
  1386. },
  1387. {
  1388. "value": 0.47,
  1389. "type": "RMSD"
  1390. }
  1391. ],
  1392. "n_aln_residue_pairs": 76
  1393. }
  1394. }
  1395. ],
  1396. "sequence_alignment": [
  1397. {
  1398. "sequence": "MRLSKTLVDMDMADYSAALDPAYTTLEFENVQVLTMGNDTSPSEGTNLNAPNSLGVSALCAICGDRATGKHYGASSCDGCKGFFRRSVRKNHMYSCRFSRQCVVDKDKRNQCRYCRLKKCFRAGMKKEAVQNERDRISTRRSSYEDSSLPSINALLQAEVLSRQITSPVSGINGDIRAKKIASIADVCESMKEQLLVLVEWAKYIPAFCELPLDDQVALLRAHAGEHLLLGATKRSMVFKDVLLLGNDYIVPRHCPELAEMSRVSIRILDELVLPFQELQIDDNEYAYLKAIIFFDPDAKGLSDPGKIKRLRSQVQVSLEDYINDRQYDSRGRFGELLLLLPTLQSITWQMIEQIQFIKLFGMAKIDNLLQEMLLGGSPSDAPHAHHPLHPHLMQEHMGTNVIVANTMPTHLSNGQMCEWPRPRGQAATPETPQPSPPGGSGSEPYKLLPGAVATIVKPLSAIPQPTITKQEVI",
  1399. "regions": [
  1400. {
  1401. "asym_id": "A",
  1402. "beg_seq_id": 58,
  1403. "beg_index": 0,
  1404. "length": 76
  1405. }
  1406. ]
  1407. },
  1408. {
  1409. "sequence": "ALCAICGDRATGKHYGASSCDGCKGFFRRSVRKNHMYSCRFSRQCVVDKDKRNQCRYCRLKKCFRAGMKKEAVQNERD",
  1410. "regions": [
  1411. {
  1412. "asym_id": "C",
  1413. "beg_seq_id": 1,
  1414. "beg_index": 0,
  1415. "length": 76
  1416. }
  1417. ]
  1418. }
  1419. ],
  1420. "summary": {
  1421. "scores": [
  1422. {
  1423. "value": 1,
  1424. "type": "sequence-identity"
  1425. },
  1426. {
  1427. "value": 214.71,
  1428. "type": "similarity-score"
  1429. },
  1430. {
  1431. "value": 1,
  1432. "type": "sequence-similarity"
  1433. },
  1434. {
  1435. "value": 0.49,
  1436. "type": "RMSD"
  1437. },
  1438. {
  1439. "value": 0.16,
  1440. "type": "TM-score"
  1441. }
  1442. ],
  1443. "n_aln_residue_pairs": 76,
  1444. "n_modeled_residues": [
  1445. 474,
  1446. 76
  1447. ],
  1448. "seq_aln_len": 76,
  1449. "aln_coverage": [
  1450. 16,
  1451. 100
  1452. ]
  1453. }
  1454. },
  1455. {
  1456. "structures": [
  1457. {
  1458. "url": "https://alphafold.ebi.ac.uk/files/AF-P41235-F1-model_v2.cif",
  1459. "format": "mmcif",
  1460. "is_binary": false,
  1461. "name": "AF-P41235-F1",
  1462. "selection": {
  1463. "asym_id": "A"
  1464. }
  1465. },
  1466. {
  1467. "entry_id": "1PZL",
  1468. "selection": {
  1469. "asym_id": "A"
  1470. }
  1471. }
  1472. ],
  1473. "structure_alignment": [
  1474. {
  1475. "regions": [
  1476. [
  1477. {
  1478. "asym_id": "A",
  1479. "beg_seq_id": 146,
  1480. "beg_index": 0,
  1481. "length": 21
  1482. },
  1483. {
  1484. "asym_id": "A",
  1485. "beg_seq_id": 173,
  1486. "beg_index": 27,
  1487. "length": 206
  1488. }
  1489. ],
  1490. [
  1491. {
  1492. "asym_id": "A",
  1493. "beg_seq_id": 5,
  1494. "beg_index": 0,
  1495. "length": 21
  1496. },
  1497. {
  1498. "asym_id": "A",
  1499. "beg_seq_id": 32,
  1500. "beg_index": 27,
  1501. "length": 206
  1502. }
  1503. ]
  1504. ],
  1505. "transformations": [
  1506. [
  1507. 1,
  1508. 0,
  1509. 0,
  1510. 0,
  1511. 0,
  1512. 1,
  1513. 0,
  1514. 0,
  1515. 0,
  1516. 0,
  1517. 1,
  1518. 0,
  1519. 0,
  1520. 0,
  1521. 0,
  1522. 1
  1523. ],
  1524. [
  1525. -0.010053370832324049,
  1526. -0.2331468555903751,
  1527. -0.9723895687754106,
  1528. 0,
  1529. -0.5818706004499447,
  1530. -0.7894818469306177,
  1531. 0.19530749524542618,
  1532. 0,
  1533. -0.813219241082581,
  1534. 0.5677684009306454,
  1535. -0.12772434708280683,
  1536. 0,
  1537. 26.741147368855113,
  1538. 9.829205405298664,
  1539. 85.1383381307709,
  1540. 1
  1541. ]
  1542. ],
  1543. "summary": {
  1544. "scores": [
  1545. {
  1546. "value": 0.85,
  1547. "type": "RMSD"
  1548. },
  1549. {
  1550. "value": 638.55,
  1551. "type": "similarity-score"
  1552. }
  1553. ],
  1554. "n_aln_residue_pairs": 227
  1555. }
  1556. }
  1557. ],
  1558. "sequence_alignment": [
  1559. {
  1560. "sequence": "MRLSKTLVDMDMADYSAALDPAYTTLEFENVQVLTMGNDTSPSEGTNLNAPNSLGVSALCAICGDRATGKHYGASSCDGCKGFFRRSVRKNHMYSCRFSRQCVVDKDKRNQCRYCRLKKCFRAGMKKEAVQNERDRISTRRSSYEDSSLPSINALLQAEVLSRQITSPVSGINGDIRAKKIASIADVCESMKEQLLVLVEWAKYIPAFCELPLDDQVALLRAHAGEHLLLGATKRSMVFKDVLLLGNDYIVPRHCPELAEMSRVSIRILDELVLPFQELQIDDNEYAYLKAIIFFDPDAKGLSDPGKIKRLRSQVQVSLEDYINDRQYDSRGRFGELLLLLPTLQSITWQMIEQIQFIKLFGMAKIDNLLQEMLLGGSPSDAPHAHHPLHPHLMQEHMGTNVIVANTMPTHLSNGQMCEWPRPRGQAATPETPQPSPPGGSGSEPYKLLPGAVATIVKPLSAIPQPTITKQEVI",
  1561. "regions": [
  1562. {
  1563. "asym_id": "A",
  1564. "beg_seq_id": 146,
  1565. "beg_index": 0,
  1566. "length": 233
  1567. }
  1568. ]
  1569. },
  1570. {
  1571. "sequence": "SSYELASLPSINALLQAEVLSRQITSPVSGINGDIRAKKIASIADVCESMKEQLLVLVEWAKYIPAFCELPLDDQVALLRAHAGEHLLLGATKRSMVFKDVLLLGNDYIVPRHCPELAEMSRVSIRILDELVLPFQELQIDDNEYAYLKAIIFFDPDAKGLSDPGKIKRLRSQVQVSLEDYINDRQYDSRGRFGELLLLLPTLQSITWQMIEQIQFIKLFGMAKIDNLLQEMLLGGS",
  1572. "regions": [
  1573. {
  1574. "asym_id": "A",
  1575. "beg_seq_id": 5,
  1576. "beg_index": 0,
  1577. "length": 21
  1578. },
  1579. {
  1580. "asym_id": "A",
  1581. "beg_seq_id": 32,
  1582. "beg_index": 27,
  1583. "length": 206
  1584. }
  1585. ],
  1586. "gaps": [
  1587. {
  1588. "beg_index": 21,
  1589. "length": 6
  1590. }
  1591. ]
  1592. }
  1593. ],
  1594. "summary": {
  1595. "scores": [
  1596. {
  1597. "value": 1.1,
  1598. "type": "RMSD"
  1599. },
  1600. {
  1601. "value": 0.47,
  1602. "type": "TM-score"
  1603. },
  1604. {
  1605. "value": 638.55,
  1606. "type": "similarity-score"
  1607. },
  1608. {
  1609. "value": 1,
  1610. "type": "sequence-similarity"
  1611. },
  1612. {
  1613. "value": 0.99,
  1614. "type": "sequence-identity"
  1615. }
  1616. ],
  1617. "n_aln_residue_pairs": 227,
  1618. "n_modeled_residues": [
  1619. 474,
  1620. 227
  1621. ],
  1622. "seq_aln_len": 233,
  1623. "aln_coverage": [
  1624. 48,
  1625. 100
  1626. ]
  1627. }
  1628. }
  1629. ]
  1630. };
  1631. class RcsbStructuralAlignmentProvider implements AlignmentCollectorInterface {
  1632. private alignmentResponse: AlignmentResponse | undefined = undefined;
  1633. private readonly alignment: StructureAlignmentResponse;
  1634. constructor(alignment: StructureAlignmentResponse) {
  1635. this.alignment = alignment;
  1636. }
  1637. async collect(requestConfig: AlignmentCollectConfig, filter?: Array<string>): Promise<AlignmentResponse> {
  1638. return new Promise(async (resolve)=>{
  1639. resolve(await this.data());
  1640. });
  1641. }
  1642. async getTargets(): Promise<string[]> {
  1643. return new Promise(async (resolve)=>{
  1644. resolve((await this.data()).target_alignment?.map(ta=>ta?.target_id ?? "NA") ?? [])
  1645. })
  1646. }
  1647. async getAlignmentLength(): Promise<number> {
  1648. return new Promise(async (resolve)=>{
  1649. const ends = (await this.data() ).target_alignment?.map(ta=>ta?.aligned_regions?.[ta?.aligned_regions?.length-1]?.query_end);
  1650. resolve(Math.max(...(ends as number[])))
  1651. })
  1652. }
  1653. async getAlignment(): Promise<AlignmentResponse> {
  1654. return new Promise(async (resolve)=>{
  1655. resolve(this.data());
  1656. });
  1657. }
  1658. private async data(): Promise<AlignmentResponse> {
  1659. if(this.alignmentResponse)
  1660. return this.alignmentResponse;
  1661. return new Promise((resolve)=>{
  1662. alignmentTransform(this.alignment).then(ar=>{
  1663. this.alignmentResponse = ar;
  1664. resolve(ar);
  1665. })
  1666. });
  1667. }
  1668. }
  1669. class RcsbStructuralTransformProvider implements TransformProviderInterface {
  1670. private readonly alignment: StructureAlignmentResponse;
  1671. constructor(alignment: StructureAlignmentResponse) {
  1672. this.alignment = alignment;
  1673. }
  1674. get(entryId: string, asymId?: string): RigidTransformType[] {
  1675. const res = this.alignment.results?.find(res=>{
  1676. const r = res.structures[1];
  1677. return ("entry_id" in r && r.entry_id == entryId && r.selection && "asym_id" in r.selection && r.selection.asym_id == asymId)
  1678. });
  1679. if(res?.structure_alignment.length == 1) {
  1680. return [{
  1681. transform: res.structure_alignment[0].transformations[1] as TransformMatrixType
  1682. }];
  1683. }else if(res?.structure_alignment.length && res?.structure_alignment.length > 1){
  1684. return res.structure_alignment.map(sa=>({
  1685. transform: sa.transformations[1] as TransformMatrixType,
  1686. regions: sa.regions?.[1].map(r=>[r.beg_seq_id,r.beg_seq_id+r.length-1])
  1687. }));
  1688. }else{
  1689. return [{
  1690. transform: [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
  1691. }];
  1692. }
  1693. }
  1694. }
  1695. class RcsbStructureLocationProvider implements LocationProviderInterface {
  1696. private readonly alignment: StructureAlignmentResponse;
  1697. constructor(alignment: StructureAlignmentResponse) {
  1698. this.alignment = alignment;
  1699. }
  1700. get(entryId:string): string|undefined {
  1701. for(const res of this.alignment.results ?? []){
  1702. if("url" in res.structures[0] && res.structures[0].url && res.structures[0].name == entryId ){
  1703. return res.structures[0].url;
  1704. }
  1705. if("url" in res.structures[1] && res.structures[1].url && res.structures[1].name == entryId ){
  1706. return res.structures[1].url;
  1707. }
  1708. }
  1709. return undefined;
  1710. }
  1711. }
  1712. async function alignmentTransform(alignment: StructureAlignmentResponse): Promise<AlignmentResponse> {
  1713. if(!alignment.results)
  1714. return {};
  1715. const alignmentRef = await mergeAlignments(alignment.results);
  1716. const out: AlignmentResponse = alignmentRef.buildAlignments();
  1717. const seqs = await getSequences(alignment.results);
  1718. out.target_alignment?.forEach(ta=>{
  1719. const seq = seqs.find(s=>s.rcsbId===ta?.target_id)?.sequence
  1720. if(seq && ta)
  1721. ta.target_sequence = seq;
  1722. });
  1723. return out;
  1724. }
  1725. async function mergeAlignments(results: Alignment[]): Promise<AlignmentReference> {
  1726. const result = results[0];
  1727. if(!result)
  1728. throw "Results not available";
  1729. const seqs = await getSequences([result]);
  1730. const alignmentRef = new AlignmentReference( getInstanceId(result, 0), seqs[0].sequence.length)
  1731. results.forEach(result=>{
  1732. if(result.sequence_alignment)
  1733. alignmentRef.addAlignment(getInstanceId(result), transformToGapedDomain(result.sequence_alignment[0].regions), transformToGapedDomain(result.sequence_alignment[1].regions));
  1734. else if(result.structure_alignment && result.structure_alignment[0].regions && result.structure_alignment[1].regions)
  1735. alignmentRef.addAlignment(getInstanceId(result), transformToGapedDomain(result.structure_alignment[0].regions.flat()), transformToGapedDomain(result.structure_alignment[1].regions.flat()));
  1736. });
  1737. return alignmentRef;
  1738. }
  1739. function getInstanceId(result: Alignment, index: 0|1 = 1): string {
  1740. const res = result.structures[index];
  1741. if("entry_id" in res && res.entry_id && res.selection && "asym_id" in res.selection)
  1742. return`${res.entry_id}.${res.selection.asym_id}`;
  1743. else if("name" in res && res.selection &&"asym_id" in res.selection)
  1744. return `${res.name}.${res.selection.asym_id}`;
  1745. throw new Error("Missing entry_id and name from result");
  1746. }
  1747. function transformToGapedDomain(regions: AlignmentRegion[]): (number|undefined)[] {
  1748. const out: (number|undefined)[] = [];
  1749. let prevRegionEnd = 0;
  1750. regions.forEach(region=>{
  1751. const beg = region.beg_index+1;
  1752. const end = region.beg_index+region.length;
  1753. if(beg > (prevRegionEnd+1)){
  1754. const nGaps = beg - (prevRegionEnd+1);
  1755. out.push(...Array(nGaps).fill(undefined));
  1756. }
  1757. prevRegionEnd = end;
  1758. const seqBeg = region.beg_seq_id;
  1759. const seqEnd = region.beg_seq_id+region.length-1;
  1760. for(let i=seqBeg;i<=seqEnd;i++){
  1761. out.push(i);
  1762. }
  1763. });
  1764. return out;
  1765. }
  1766. async function getSequences(results: Alignment[]): Promise<InstanceSequenceInterface[]> {
  1767. const out: InstanceSequenceInterface[] = [];
  1768. const missingIds: string[] = [];
  1769. const res = results[0];
  1770. if(res.sequence_alignment?.[0].sequence) {
  1771. out.push( {
  1772. rcsbId: getInstanceId(res,0),
  1773. sequence: res.sequence_alignment[0].sequence
  1774. })
  1775. }else{
  1776. missingIds.push( getInstanceId(res, 0) )
  1777. }
  1778. results.forEach(res=>{
  1779. if(res.sequence_alignment?.[1].sequence) {
  1780. out.push( {
  1781. rcsbId: getInstanceId(res,1),
  1782. sequence: res.sequence_alignment[1].sequence
  1783. })
  1784. }else{
  1785. missingIds.push( getInstanceId(res) )
  1786. }
  1787. });
  1788. return out.concat(await RcsbRequestContextManager.getInstanceSequences(missingIds));
  1789. }
  1790. const structuralAlignment: StructureAlignmentResponse = alignmentExample as StructureAlignmentResponse;
  1791. export const dataProvider: RcsbModuleDataProviderInterface = {
  1792. alignments: {
  1793. collector: new RcsbStructuralAlignmentProvider(structuralAlignment),
  1794. context:{
  1795. queryId: "structural-alignment",
  1796. group: GroupReference.MatchingUniprotAccession,
  1797. to: SequenceReference.PdbInstance
  1798. }
  1799. }
  1800. };
  1801. export const transformProvider = new RcsbStructuralTransformProvider(structuralAlignment);
  1802. export const structureLocationProvider = new RcsbStructureLocationProvider(structuralAlignment);