index.html 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  6. <link rel="icon" href="./favicon.ico" type="image/x-icon">
  7. <title>RCSB PDB Mol* Viewer</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. }
  14. #viewer {
  15. position: absolute;
  16. left: 5%;
  17. top: 100px;
  18. min-width: 90%;
  19. height: 85%;
  20. }
  21. .msp-layout-expanded {
  22. z-index: 10;
  23. }
  24. #menu {
  25. position: absolute;
  26. left: 5%;
  27. top: 20px;
  28. }
  29. #menu > select {
  30. width: 200px;
  31. }
  32. </style>
  33. <link rel="stylesheet" type="text/css" href="rcsb-molstar.css" />
  34. <script type="text/javascript" src="./rcsb-molstar.js"></script>
  35. </head>
  36. <body>
  37. <div id="viewer"></div>
  38. <script>
  39. function getQueryParam(id) {
  40. const a = new RegExp(id + '=([^&#=]*)', 'i')
  41. const m = a.exec(window.location.search)
  42. return m ? decodeURIComponent(m[1]) : undefined
  43. }
  44. const isEmbedded = getQueryParam('embedded') === '1';
  45. const pdbId = getQueryParam('pdbId')
  46. const url = getQueryParam('url')
  47. const _config = getQueryParam('config')
  48. const config = _config && JSON.parse(_config)
  49. const _loadPdbIds = getQueryParam('loadPdbIds')
  50. const loadPdbIds = _loadPdbIds && JSON.parse(_loadPdbIds)
  51. // create an instance of the plugin
  52. const viewer = new rcsbMolstar.Viewer('viewer', {
  53. showImportControls: !pdbId,
  54. showExportControls: true,
  55. showSessionControls: !pdbId,
  56. layoutShowLog: !pdbId,
  57. layoutShowControls: !isEmbedded,
  58. showMembraneOrientationPreset: true,
  59. detachedFromSierra: true // needed when running without sierra
  60. })
  61. // load pdbId or url
  62. if (pdbId) viewer.loadPdbId(pdbId, config)
  63. else if (loadPdbIds) viewer.loadPdbIds(loadPdbIds);
  64. else if (url) viewer.loadUrl(url, config)
  65. </script>
  66. <div id="menu">
  67. <h2> RCSB PDB Mol* Viewer - Test Page</h2>
  68. <label for="examples">Examples</label>
  69. <select id="examples" onchange="loadExample(parseInt(this.value))">
  70. <option value=''></option>
  71. </select>
  72. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  73. Clear
  74. <button style="padding: 3px;" onclick="viewer.clear()">all</button>
  75. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  76. <button style="padding: 3px;" onclick="superposed()">Superposed</button>
  77. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  78. <button style="padding: 3px;" onclick="motifs1()">Motifs 1</button>
  79. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  80. <button style="padding: 3px;" onclick="motifs2()">Motifs 2</button>
  81. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  82. <button style="padding: 3px;" onclick="motifsAlphaFold()">Motifs AF</button>
  83. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  84. <button style="padding: 3px" onclick="propset()">Propset</button>
  85. </div>
  86. <script>
  87. function loadExample(index) {
  88. const e = examples[index];
  89. // let URL, if specified, take precedence over ID
  90. if (e.url) return viewer.loadStructureFromUrl(e.url, e.format ?? 'mmcif', e.isBinary ?? false, e.config)
  91. if (e.id) return viewer.loadPdbId(e.id, e.config)
  92. }
  93. const examples = [
  94. {
  95. id: '1CRN',
  96. info: 'small: only polymer',
  97. config: {
  98. props: {
  99. kind: 'validation'
  100. }
  101. }
  102. },
  103. {
  104. id: '3CUP',
  105. info: 'small',
  106. config: {
  107. props: {
  108. kind: 'density'
  109. }
  110. }
  111. },
  112. // {
  113. // id: '6JI7',
  114. // info: 'small: NMR structure with RCI'
  115. // },
  116. {
  117. id: '3PQR',
  118. info: 'medium: polymer, carbs, ligands',
  119. config: {
  120. props: {
  121. kind: 'feature',
  122. assemblyId: '2',
  123. target: {
  124. labelCompId: 'RET'
  125. }
  126. }
  127. }
  128. },
  129. {
  130. id: '1NMR',
  131. info: 'medium: nmr models',
  132. config: {
  133. props: {
  134. kind: 'standard',
  135. modelIndex: 2
  136. }
  137. }
  138. },
  139. {
  140. id: '4HHB',
  141. info: 'medium: classic, lots of validation geometry problems',
  142. config: {
  143. props: {
  144. kind: 'standard',
  145. assemblyId: '1'
  146. }
  147. }
  148. },
  149. {
  150. id: '1A6D',
  151. info: 'medium: dihedral symmetry (D8)',
  152. config: {
  153. props: {
  154. kind: 'symmetry',
  155. assemblyId: '1',
  156. symmetryIndex: 1
  157. }
  158. }
  159. },
  160. // {
  161. // id: '1LTI',
  162. // info: 'medium: local symmetry (C5)'
  163. // },
  164. // {
  165. // id: '1QO1',
  166. // info: 'medium: C-alpha only, local symmetries (C10, C3)'
  167. // },
  168. // {
  169. // id: '6V9Q',
  170. // info: 'medium: local symmetries (H, C2)'
  171. // },
  172. // {
  173. // id: '6R6B',
  174. // info: 'medium: local symmetries (H x2)'
  175. // },
  176. // {
  177. // id: '2VTU',
  178. // info: 'medium: octahedral symmetry (O)'
  179. // },
  180. // {
  181. // id: '4NWP',
  182. // info: 'medium: tetrahedral symmetry (T)'
  183. // },
  184. // {
  185. // id: '1RB8',
  186. // info: 'medium-large: small virus capsid, icosahedral symmetry (I)'
  187. // },
  188. // {
  189. // id: '6QVK',
  190. // info: 'large: The cryo-EM structure of bacteriophage phi29 prohead (C5)'
  191. // },
  192. // {
  193. // id: '5Y6P',
  194. // info: 'large: Structure of the phycobilisome from the red alga Griffithsia pacifica'
  195. // },
  196. // {
  197. // id: '6O2S',
  198. // info: 'large: Deacetylated Microtubules (H)'
  199. // },
  200. // {
  201. // id: '5MQ7',
  202. // info: 'large: Structure of AaLS-13'
  203. // },
  204. // {
  205. // id: '5IV5',
  206. // info: 'large: Cryo-electron microscopy structure of the hexagonal pre-attachment T4 baseplate-tail tube complex'
  207. // },
  208. // {
  209. // id: '3JC8',
  210. // info: 'large: Architectural model of the type IVa pilus machine in a piliated state'
  211. // },
  212. // {
  213. // id: '4V99',
  214. // info: 'large: The Crystallographic Structure of Panicum Mosaic Virus'
  215. // },
  216. // {
  217. // id: '3J3Q',
  218. // info: 'large: Atomic-level structure of the entire HIV-1 capsid'
  219. // },
  220. // {
  221. // id: '6NCL',
  222. // info: 'large: Near-atomic structure of icosahedrally averaged PBCV-1 capsid'
  223. // },
  224. // {
  225. // id: '6EKC',
  226. // info: 'large: Crystal structure of the BSD2 homolog of Arabidopsis thaliana bound to the octameric assembly of RbcL from Thermosynechococcus elongatus'
  227. // },
  228. // {
  229. // id: '1M4X',
  230. // info: 'large: PBCV-1 virus capsid, quasi-atomic model'
  231. // },
  232. // {
  233. // id: '4V5A',
  234. // info: 'large: Structure of the Ribosome Recycling Factor bound to the Thermus thermophilus 70S ribosome with mRNA, ASL-Phe and tRNA-fMet'
  235. // },
  236. // {
  237. // id: '4UDF',
  238. // info: 'large: STRUCTURAL BASIS OF HUMAN PARECHOVIRUS NEUTRALIZATION BY HUMAN MONOCLONAL ANTIBODIES'
  239. // },
  240. // {
  241. // id: '6J5K',
  242. // info: 'Cryo-EM structure of the mammalian ATP synthase tetramer bound with inhibitory protein IF1'
  243. // },
  244. // {
  245. // id: '6RVV',
  246. // info: 'Structure of left-handed protein cage consisting of 24 eleven-membered ring proteins held together by gold (I) bridges.'
  247. // },
  248. // {
  249. // id: '6EK5',
  250. // info: 'Near-atomic resolution structure of a plant geminivirus determined by electron cryo-microscopy'
  251. // },
  252. // {
  253. // id: '4V93',
  254. // info: 'Fitted coordinates for Lumbricus terrestris hemoglobin cryo-EM complex'
  255. // },
  256. // {
  257. // id: '5VLZ',
  258. // info: 'Backbone model for phage Qbeta capsid'
  259. // },
  260. // {
  261. // id: '5XTI',
  262. // info: 'Cryo-EM architecture of human respiratory chain megacomplex-I2III2IV2'
  263. // },
  264. // {
  265. // id: '6BY7',
  266. // info: 'Folding DNA into a lipid-conjugated nano-barrel for controlled reconstitution of membrane proteins'
  267. // },
  268. // {
  269. // id: '6C50',
  270. // info: 'Cross-alpha Amyloid-like Structure alphaAmS'
  271. // },
  272. // {
  273. // id: '6K3I',
  274. // info: 'Salmonella hook in curved state - 66 subunit models'
  275. // },
  276. // {
  277. // id: '1UNO',
  278. // info: 'Crystal structure of a d,l-alternating peptide. Double-starnded helix from beta-sheets.'
  279. // },
  280. // {
  281. // id: '1GRM',
  282. // info: 'REFINEMENT OF THE SPATIAL STRUCTURE OF THE GRAMICIDIN A TRANSMEMBRANE ION-CHANNEL. Single-starnded helix from beta-sheet. NMR structure.'
  283. // },
  284. {
  285. id: '1B5F',
  286. info: 'oligosaccharide: NATIVE CARDOSIN A FROM CYNARA CARDUNCULUS L.',
  287. config: {
  288. props: {
  289. kind: 'feature',
  290. target: {
  291. labelAsymId: 'E'
  292. }
  293. }
  294. }
  295. },
  296. {
  297. id: '1BRR',
  298. info: 'membrane: X-RAY STRUCTURE OF THE BACTERIORHODOPSIN TRIMER/LIPID COMPLEX with ANVIL membrane prediction',
  299. config: {
  300. props: {
  301. kind: 'membrane'
  302. }
  303. }
  304. },
  305. {
  306. id: '3SN6',
  307. info: 'membrane: Crystal structure of the beta2 adrenergic receptor-Gs protein complex with ANVIL membrane prediction',
  308. config: {
  309. props: {
  310. kind: 'membrane'
  311. }
  312. }
  313. },
  314. {
  315. id: '1SQX',
  316. info: 'membrane + assembly: Crystal Structure Analysis of Bovine Bc1 with Stigmatellin A',
  317. config: {
  318. props: {
  319. kind: 'membrane',
  320. assemblyId: '1'
  321. }
  322. }
  323. },
  324. {
  325. id: '5XES',
  326. // this will fail membrane calculation due to tiny size but should still show default representation
  327. info: 'failing membrane: TK9 NMR structure in SDS micelle',
  328. config: {
  329. props: {
  330. kind: 'membrane',
  331. assemblyId: '1'
  332. }
  333. }
  334. },
  335. {
  336. id: '6WJC',
  337. info: 'ligand validation: Muscarinic acetylcholine receptor 1 - muscarinic toxin 7 complex: Focus + Density',
  338. config: {
  339. props: {
  340. kind: 'feature-density',
  341. target: {
  342. labelAsymId: 'D',
  343. authSeqId: 502
  344. },
  345. // radius: 0,
  346. // hiddenChannels: ['fo-fc(+ve)', 'fo-fc(-ve)']
  347. }
  348. }
  349. },
  350. {
  351. id: '5RL9',
  352. info: 'ligand focus on wrong assembly: Crystal Structure of SARS-CoV-2 helicase in complex with Z1703168683',
  353. config: {
  354. props: {
  355. kind: 'feature',
  356. assemblyId: '1',
  357. // UR7 is not present in assembly 1
  358. target: {
  359. labelCompId: 'UR7'
  360. }
  361. }
  362. }
  363. },
  364. {
  365. id: '5VL5',
  366. info: 'motif selection with operator: Coordination Chemistry within a Protein Host: Regulation of the Secondary Coordination Sphere',
  367. config: {
  368. props: {
  369. kind: 'motif',
  370. assemblyId: '1',
  371. targets: [
  372. { labelAsymId: 'A', labelSeqId: 61, operatorName: 'ASM_1' },
  373. { labelAsymId: 'A', labelSeqId: 69, operatorName: 'ASM_1' },
  374. { labelAsymId: 'A', labelSeqId: 87, operatorName: 'ASM_4' }
  375. ],
  376. }
  377. }
  378. },
  379. {
  380. id: '5VL5',
  381. info: 'motif selection with strucmotif-expression: Coordination Chemistry within a Protein Host: Regulation of the Secondary Coordination Sphere',
  382. config: {
  383. props: {
  384. kind: 'motif',
  385. assemblyId: '1',
  386. targets: [
  387. { labelAsymId: 'A', labelSeqId: 61, structOperId: '1' },
  388. { labelAsymId: 'A', labelSeqId: 69, structOperId: '1' },
  389. { labelAsymId: 'A', labelSeqId: 87, structOperId: '4' }
  390. ],
  391. }
  392. }
  393. },
  394. {
  395. id: '2BFU',
  396. info: 'motif selection with strucmotif-expression: X-ray structure of CPMV top component',
  397. config: {
  398. props: {
  399. kind: 'motif',
  400. assemblyId: '6',
  401. targets: [
  402. { labelAsymId: 'A', labelSeqId: 46, structOperId: 'X0x5' },
  403. { labelAsymId: 'A', labelSeqId: 49, structOperId: 'X0x5' },
  404. { labelAsymId: 'A', labelSeqId: 145, structOperId: 'X0x5' }
  405. ],
  406. }
  407. }
  408. },
  409. {
  410. id: '1G2F',
  411. info: 'motif selection with strucmotif-expression & chain: STRUCTURE OF A CYS2HIS2 ZINC FINGER/TATA BOX COMPLEX (TATAZF;CLONE #6)',
  412. config: {
  413. props: {
  414. kind: 'motif',
  415. targets: [
  416. { labelAsymId: 'F', labelSeqId: 7 },
  417. { labelAsymId: 'F', labelSeqId: 25 },
  418. { labelAsymId: 'F', labelSeqId: 29 }
  419. ],
  420. }
  421. }
  422. },
  423. {
  424. id: 'AF-Q8W3K0-F1',
  425. url: 'https://alphafold.ebi.ac.uk/files/AF-Q8W3K0-F1-model_v1.cif',
  426. info: 'confidence coloring: Probable disease resistance protein At1g58602'
  427. }
  428. ];
  429. const examplesSelect = document.getElementById('examples');
  430. for (let i = 0, il = examples.length; i < il; ++i) {
  431. const e = examples[i]
  432. const option = document.createElement('option')
  433. Object.assign(option, { text: '[' + e.id + '] ' + e.info, value: i })
  434. examplesSelect.appendChild(option)
  435. }
  436. //
  437. function superposed() {
  438. viewer.clear()
  439. .then(function() {
  440. return viewer.loadPdbId('3pqr', { props: { kind: 'standard', assemblyId: '1' } })
  441. })
  442. .then(function() {
  443. return viewer.loadPdbId('1u19', { props: { kind: 'standard', assemblyId: '1' }, matrix: [
  444. -0.67160917400372, 0.28222298510688404, 0.6850488398834855, 0,
  445. 0.13262098666685063, 0.9554691407700946, -0.26361033961856695, 0,
  446. -0.7289399153866256, -0.08619120567473626, -0.6791305379047228, 0,
  447. -7.602670654900173, -30.317901981509067, 24.605855585357773, 1
  448. ] })
  449. })
  450. .then(function() {
  451. viewer.resetCamera(0)
  452. });
  453. }
  454. function motifs1() {
  455. viewer.clear()
  456. .then(function() {
  457. return viewer.loadPdbIds([
  458. {
  459. pdbId: '4CHA',
  460. config: {
  461. props: {
  462. kind: 'motif',
  463. label: '4CHA',
  464. targets: [
  465. { labelAsymId: 'B', structOperId: '1', labelSeqId: 42 },
  466. { labelAsymId: 'B', structOperId: '1', labelSeqId: 87 },
  467. { labelAsymId: 'C', structOperId: '1', labelSeqId: 47 }
  468. ]
  469. }
  470. }
  471. }, {
  472. pdbId: '3RU4',
  473. props: {
  474. kind: 'motif',
  475. assemblyId: '1',
  476. label: '3RU4 #2: 0.26 Å',
  477. targets: [
  478. { labelAsymId: 'D', structOperId: '2', labelSeqId: 42 },
  479. { labelAsymId: 'D', structOperId: '2', labelSeqId: 87 },
  480. { labelAsymId: 'E', structOperId: '2', labelSeqId: 46 }
  481. ]
  482. },
  483. matrix: [-0.049396686, -0.99700946, -0.059431925, 0.0, -0.7568329, 0.076193266, -0.6491522, 0.0, 0.6517392, 0.012914069, -0.7583332, 0.0, 20.371853, 11.498471, 45.705563, 1.0]
  484. }
  485. ]);
  486. });
  487. }
  488. function motifs2() {
  489. viewer.clear()
  490. .then(function() {
  491. return viewer.loadPdbIds([{
  492. pdbId: '1M4X',
  493. config: {
  494. props: {
  495. label: '1M4X',
  496. kind: 'motif',
  497. // assemblyId: '7', // library should be able to infer assemblyId of the query
  498. targets: [
  499. { labelAsymId: 'C', labelSeqId: 161, structOperId: 'Px81' },
  500. { labelAsymId: 'C', labelSeqId: 165, structOperId: 'Px81' },
  501. { labelAsymId: 'C', labelSeqId: 170, structOperId: 'Px81' }
  502. ],
  503. // color: 13203230
  504. }
  505. }
  506. }, {
  507. pdbId: '6KIN',
  508. config: {
  509. props: {
  510. label: '6KIN @ 1.88 RMSD',
  511. kind: 'motif',
  512. assemblyId: '1',
  513. targets: [
  514. { labelAsymId: 'B', labelSeqId: 160 },
  515. { labelAsymId: 'B', labelSeqId: 163 },
  516. { labelAsymId: 'B', labelSeqId: 167 }
  517. ],
  518. // color: 13203230
  519. },
  520. matrix: [
  521. -0.8175763932146345, -0.5719837107806522, 0.0663586909134339, 0,
  522. -0.4927708198934652, 0.7546183669143351, 0.43327593907008527, 0,
  523. -0.29790226638894773, 0.32153655300313416, -0.8988150448024284, 0,
  524. 340.5134831570596, -107.81055538151446, 774.3972821273203, 1.0
  525. ]
  526. }
  527. }]);
  528. })
  529. .then(function() {
  530. viewer.resetCamera(0)
  531. });
  532. }
  533. function motifsAlphaFold() {
  534. viewer.clear()
  535. .then(function() {
  536. return viewer.loadPdbId('1LAP', {
  537. props: {
  538. label: '1LAP',
  539. kind: 'motif',
  540. targets: [
  541. {label_asym_id: 'A', label_seq_id: 332, struct_oper_id: '1'},
  542. {label_asym_id: 'A', label_seq_id: 334, struct_oper_id: '1'},
  543. {label_asym_id: 'A', label_seq_id: 255, struct_oper_id: '1'},
  544. {label_asym_id: 'A', label_seq_id: 273, struct_oper_id: '1'},
  545. {label_asym_id: 'A', label_seq_id: 250, struct_oper_id: '1'}
  546. ],
  547. }
  548. });
  549. })
  550. .then(function() {
  551. const url = 'https://alphafold.ebi.ac.uk/files/AF-F1Q6S1-F1-model_v1.cif';
  552. const label = 'AF-F1Q6S1-F1 @ 0.23 RMSD';
  553. const targets = [
  554. // AF target must be devoid of struct_oper_id
  555. { label_asym_id: 'A', label_seq_id: 260 },
  556. { label_asym_id: 'A', label_seq_id: 265 },
  557. { label_asym_id: 'A', label_seq_id: 283 },
  558. { label_asym_id: 'A', label_seq_id: 342 },
  559. { label_asym_id: 'A', label_seq_id: 344 }
  560. ];
  561. const mat = [-0.471, 0.856, 0.215, 0, 0.405, -0.007, 0.914, 0, 0.784, 0.518, -0.343, 0, 54.981, 65.575, 12.287, 1];
  562. return viewer.loadStructureFromUrl(url, 'mmcif', false, { props: { kind: 'motif', label, targets } }, mat);
  563. })
  564. .then(function() {
  565. viewer.resetCamera(0)
  566. });
  567. }
  568. function propset() {
  569. viewer.clear()
  570. .then(function () {
  571. return viewer.loadPdbIds([{
  572. pdbId: '4HHB',
  573. config: {
  574. props: {
  575. kind: 'prop-set',
  576. representation: [{
  577. name: 'color',
  578. targets: [{
  579. labelAsymId: 'A',
  580. labelSeqRange: { beg: 4, end: 141 }
  581. }],
  582. value: 13203230
  583. }],
  584. targets: [{
  585. labelAsymId: 'A',
  586. labelSeqRange: { beg: 4, end: 141 }
  587. }]
  588. }
  589. }
  590. }, {
  591. pdbId: '1OJ6',
  592. config: {
  593. props: {
  594. kind: 'prop-set',
  595. representation: [{
  596. name: 'color',
  597. targets: [{
  598. labelAsymId: 'A',
  599. labelSeqRange: { beg: 3, end: 44 }
  600. }, {
  601. labelAsymId: 'A',
  602. labelSeqRange: { beg: 48, end: 49 }
  603. }, {
  604. labelAsymId: 'A',
  605. labelSeqRange: { beg: 54, end: 95 }
  606. }, {
  607. labelAsymId: 'A',
  608. labelSeqRange: { beg: 98, end: 149 }
  609. }],
  610. value: 4947916
  611. }],
  612. targets: [{
  613. labelAsymId: 'A',
  614. labelSeqRange: { beg: 3, end: 44 }
  615. }, {
  616. labelAsymId: 'A',
  617. labelSeqRange: { beg: 48, end: 49 }
  618. }, {
  619. labelAsymId: 'A',
  620. labelSeqRange: { beg: 54, end: 95 }
  621. }, {
  622. labelAsymId: 'A',
  623. labelSeqRange: { beg: 98, end: 149 }
  624. }]
  625. },
  626. matrix: [
  627. -0.6263111483773867, -0.38259812283613237, -0.6792297268380318, 0.0,
  628. 0.3014888059527303, 0.6846150421427817, -0.6636314820418288, 0.0,
  629. 0.7189150473480135, -0.6204199549290021, -0.313432982027257, 0.0,
  630. -30.829713890311414, 24.04442469172666, 55.437150645037654, 1.0
  631. ]
  632. }
  633. }]);
  634. })
  635. .then(function () {
  636. viewer.resetCamera(0)
  637. });
  638. }
  639. </script>
  640. </body>
  641. </html>