@datagrok/bio 2.27.2 → 2.27.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +50 -0
- package/dist/682.js +1 -1
- package/dist/682.js.map +1 -1
- package/dist/705.js +1 -1
- package/dist/705.js.map +1 -1
- package/dist/909.js +2 -0
- package/dist/909.js.map +1 -0
- package/dist/immunum_bg.wasm +0 -0
- package/dist/package-test.js +3 -3
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +3 -3
- package/dist/package.js.map +1 -1
- package/package.json +3 -1
- package/src/package-api.ts +15 -1
- package/src/package-test.ts +1 -0
- package/src/package.g.ts +12 -1
- package/src/package.ts +22 -4
- package/src/tests/antibody-numbering-tests.ts +190 -0
- package/src/utils/annotations/numbering-ui.ts +34 -90
- package/src/utils/antibody-numbering/immunum-client.ts +45 -0
- package/src/utils/antibody-numbering/immunum-glue.js +275 -0
- package/src/utils/antibody-numbering/immunum.worker.ts +159 -0
- package/src/utils/antibody-numbering/number-antibody.ts +105 -0
- package/src/utils/antibody-numbering/types.ts +48 -0
- package/test-console-output-1.log +588 -533
- package/test-record-1.mp4 +0 -0
- package/webpack.config.js +13 -0
- package/dist/282.js +0 -2
- package/dist/282.js.map +0 -1
- package/dist/287.js +0 -2
- package/dist/287.js.map +0 -1
- package/dist/422.js +0 -2
- package/dist/422.js.map +0 -1
- package/dist/767.js +0 -2
- package/dist/767.js.map +0 -1
- package/src/utils/antibody-numbering (WIP)/alignment.ts +0 -578
- package/src/utils/antibody-numbering (WIP)/annotator.ts +0 -120
- package/src/utils/antibody-numbering (WIP)/data/blosum62.ts +0 -55
- package/src/utils/antibody-numbering (WIP)/data/consensus-aho.ts +0 -155
- package/src/utils/antibody-numbering (WIP)/data/consensus-imgt.ts +0 -162
- package/src/utils/antibody-numbering (WIP)/data/consensus-kabat.ts +0 -157
- package/src/utils/antibody-numbering (WIP)/data/consensus-martin.ts +0 -152
- package/src/utils/antibody-numbering (WIP)/data/consensus.ts +0 -36
- package/src/utils/antibody-numbering (WIP)/data/regions.ts +0 -63
- package/src/utils/antibody-numbering (WIP)/index.ts +0 -31
- package/src/utils/antibody-numbering (WIP)/testdata.ts +0 -5356
- package/src/utils/antibody-numbering (WIP)/types.ts +0 -69
- /package/dist/{8473fcbfb6e85ca6c852.wasm → wasmCluster.wasm} +0 -0
- /package/dist/{9a8fbf37666e32487835.wasm → wasmDbscan.wasm} +0 -0
package/test-record-1.mp4
CHANGED
|
Binary file
|
package/webpack.config.js
CHANGED
|
@@ -18,12 +18,25 @@ module.exports = {
|
|
|
18
18
|
import: './src/package-test.ts',
|
|
19
19
|
},
|
|
20
20
|
},
|
|
21
|
+
experiments: {
|
|
22
|
+
asyncWebAssembly: true,
|
|
23
|
+
topLevelAwait: true,
|
|
24
|
+
},
|
|
21
25
|
resolve: {
|
|
22
26
|
fallback: {'url': false},
|
|
23
27
|
extensions: ['.ts', '.tsx', '.wasm', '.mjs', '.js', '.json'],
|
|
24
28
|
},
|
|
25
29
|
module: {
|
|
26
30
|
rules: [
|
|
31
|
+
{
|
|
32
|
+
test: /\.wasm$/i,
|
|
33
|
+
type: 'javascript/auto',
|
|
34
|
+
loader: 'file-loader',
|
|
35
|
+
options: {
|
|
36
|
+
publicPath: 'dist/',
|
|
37
|
+
name: '[name].[ext]',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
27
40
|
{test: /\.js$/, enforce: 'pre', use: ['source-map-loader'], exclude: /node_modules/},
|
|
28
41
|
{test: /\.ts(x?)$/, use: 'ts-loader', exclude: /node_modules/},
|
|
29
42
|
{test: /\.css$/, use: ['style-loader', 'css-loader']},
|
package/dist/282.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkbio=self.webpackChunkbio||[]).push([[282],{1282(e,t,a){a.d(t,{showNumberingSchemeDialog:()=>p});var n,i,o=a(4328),s=a(7389),l=a(6082),r=a(2003),g=a(4517);!function(e){e.IMGT="IMGT",e.Kabat="Kabat",e.Chothia="Chothia",e.AHo="AHo"}(n||(n={})),function(e){e.Heavy="Heavy",e.Light_Kappa="Light_Kappa",e.Light_Lambda="Light_Lambda"}(i||(i={}));i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Heavy,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Kappa,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda,i.Light_Lambda;n.IMGT,n.Kabat,n.Chothia,n.AHo;var h=a(3736);function p(){const e=o.shell.tv?.dataFrame;if(!e)return void o.shell.warning("No table open");const t=e.columns.bySemTypeAll(l.SEMTYPE.MACROMOLECULE);if(0===t.length)return void o.shell.warning("No macromolecule columns found");const i=function(){const e=[],t=l.Func.find({meta:{role:"antibodyNumbering"}});if(0===t.length)throw o.shell.error("No antibody numbering engines found. Make sure that Proteomics plugin is installed and up to date."),new Error("No external antibody numbering engines found. Make sure that Proteomics plugin is installed and up to date.");for(const a of t){const t=a.package?.name??"",n=a.friendlyName||a.name;e.push({label:n,key:t?`${t}:${a.name}`:a.name,func:a})}return e.push({label:"Built-in (TypeScript)",key:"__builtin__",func:null}),e}(),p=i.map(e=>e.label),m=Object.values(n),L=s.input.table("Table",{value:e}),d=s.input.column("Sequence",{table:e,value:t[0],filter:e=>e.semType===l.SEMTYPE.MACROMOLECULE}),f=s.input.choice("Scheme",{value:n.IMGT,items:m}),_=s.input.choice("Engine",{value:p[0],items:p}),b=s.dialog({title:"Apply Antibody Numbering"}).add(s.inputs([L,d,f,_])).onOK(async()=>{const t=d.value,n=f.value,s=_.value,p=i.find(e=>e.label===s)??i[i.length-1],m=l.TaskBarProgressIndicator.create(`Applying ${n} numbering...`);try{let i;i=p.func?await p.func.apply({df:e,seqCol:t,scheme:n.toLowerCase()}):await async function(e,t){const{numberSequences:n,extractSequence:i}=await a.e(767).then(a.bind(a,6767)),o=t.toLowerCase(),s=[];for(let t=0;t<e.length;t++){const a=e.get(t);s.push(i(a??""))}return function(e){const t=e.length,a=l.Column.fromType(l.COLUMN_TYPE.STRING,"position_names",t),n=l.Column.fromType(l.COLUMN_TYPE.STRING,"chain_type",t),i=l.Column.fromType(l.COLUMN_TYPE.STRING,"annotations_json",t),o=l.Column.fromType(l.COLUMN_TYPE.STRING,"numbering_detail",t),s=l.Column.fromType(l.COLUMN_TYPE.STRING,"numbering_map",t);for(let l=0;l<t;l++){const t=e[l];t.error&&t.percentIdentity<.3?(a.set(l,""),n.set(l,""),i.set(l,"[]"),o.set(l,""),s.set(l,"")):(a.set(l,t.positionNames),n.set(l,t.chainType),i.set(l,JSON.stringify(t.annotations)),o.set(l,JSON.stringify(t.numberingDetail)),s.set(l,JSON.stringify(t.numberingMap)))}return l.DataFrame.fromColumns([a,n,i,o,s])}(n(s,o))}(t,n),function(e,t,a,n,i,s){if(!a||0===a.rowCount)return void o.shell.warning("No numbering results returned");const p=a.getCol("position_names"),m=a.getCol("chain_type"),L=a.getCol("annotations_json"),d=a.col("numbering_map");if(d)for(let e=0;e<a.rowCount;e++){const a=d.get(e);if(a)try{const n=JSON.parse(a),i=u(t.get(e)??""),o={};for(const[e,t]of Object.entries(n))t<i.length&&(o[e]=i[t]);d.set(e,JSON.stringify(o))}catch{}}let f=-1,_=-1;for(let e=0;e<a.rowCount;e++){const t=p.get(e);if(!t||0===t.length)continue;const a=L.get(e);let n=0;if(a)try{n=JSON.parse(a).length}catch{}n>_&&(_=n,f=e)}const b=f>=0?m.get(f)??"":"",y=f>=0?L.get(f)??"[]":"[]";if(f<0)return void o.shell.warning(`${s} could not number the sequences. Check that they are valid antibody variable region sequences.`);t.setTag(r.gp.numberingScheme,n);try{const e=JSON.parse(y),a=(0,h.Ln)(t).filter(e=>e.category!==g.eI.Structure);(0,h.fh)(t,[...a,...e])}catch(e){console.warn("Failed to set annotation definitions on original column:",e)}if(d)try{const n=(0,h.Lz)(e,t);for(let e=0;e<a.rowCount;e++){const t=d.get(e),a=L.get(e);if(!t||!a)continue;const i=JSON.parse(t),o=JSON.parse(a),s=[];for(const e of o){if(null==e.start||null==e.end)continue;const t=i[e.start],a=i[e.end];null!=t&&null!=a&&s.push({annotationId:e.id,positionIndex:t,endPositionIndex:a,positionName:e.start,matchedMonomers:""})}const l=(0,h.JG)(n,e)??[];(0,h.z5)(n,e,(0,h.bq)(l,s,!0,!1))}}catch(e){console.warn("Failed to store per-row region data on original column:",e)}const v=function(e,t,a){const n=a.col("numbering_map");if(!n)return null;const i=new Set,o=[],s=[],g=[];for(let e=0;e<a.rowCount;e++){const a=n.get(e),l=t.get(e)??"";if(a)try{const e=JSON.parse(a);o.push(e);for(const t of Object.keys(e))i.add(t);const t=Object.values(e),n=Math.min(...t),r=Math.max(...t);s.push(n),g.push(Math.max(0,l.length-r-1))}catch{o.push(null),s.push(0),g.push(0)}else o.push(null),s.push(0),g.push(0)}if(0===i.size)return null;const h=Math.max(0,...s),p=Math.max(0,...g),u=Array.from(i).slice().sort((e,t)=>{const[a,n]=c(e),[i,o]=c(t);return a!==i?a-i:n.localeCompare(o)}),m=[];for(let e=h;e>0;e--)m.push(`N-${e}`);const L=[];for(let e=1;e<=p;e++)L.push(`C+${e}`);const d=[...m,...u,...L],f=d.length,_=h,b=new Map;for(let e=0;e<u.length;e++)b.set(u[e],_+e);const y=e.columns.getUnusedName(`${t.name} (aligned)`),v=l.Column.fromType(l.COLUMN_TYPE.STRING,y,e.rowCount);for(let a=0;a<e.rowCount;a++){const e=a<o.length?o[a]:null,n=t.get(a)??"";if(!e){v.set(a,"-".repeat(f));continue}const i=new Array(f).fill("-");for(const[t,a]of Object.entries(e)){const e=b.get(t);null!=e&&a<n.length&&(i[e]=n[a])}const l=s[a],r=Object.values(e),h=Math.min(...r);for(let e=0;e<l;e++)i[_-l+e]=n[h-l+e];const p=g[a],c=Math.max(...r),m=_+u.length;for(let e=0;e<p;e++)i[m+e]=n[c+1+e];v.set(a,i.join(""))}return v.semType=l.SEMTYPE.MACROMOLECULE,v.setTag(r.gp.aligned,"SEQ.MSA"),v.setTag(r.gp.alphabet,r.YI.PT),v.meta.units=r.Hi.FASTA,v.setTag(l.Tags.CellRenderer,"sequence"),v.setTag(r.gp.positionNames,d.join(", ")),{alignedCol:v,unifiedPositions:d,preOffset:_}}(e,t,a);if(v&&(e.columns.insert(v.alignedCol,e.columns.toList().indexOf(t)+1),o.shell.tv?.dataFrame===e&&o.shell.tv.grid.scrollToCell(t,0),v.alignedCol.setTag(r.gp.numberingScheme,n),i))try{const e=JSON.parse(y),t=(0,h.Ln)(v.alignedCol).filter(e=>e.category!==g.eI.Structure);(0,h.fh)(v.alignedCol,[...t,...e])}catch(e){console.warn("Failed to set column-level annotations on aligned column:",e)}e.fireValuesChanged(),o.shell.info(`Numbering applied: ${n}, chain type: ${b}`)}(e,t,i,n,!0,p.label)}catch(e){o.shell.error(`Numbering failed: ${e.message??e}`),console.error(e)}finally{m.close()}});b.show()}function u(e){const t=[];for(let a=0;a<e.length;a++)"-"!==e[a]&&"."!==e[a]&&t.push(a);return t}function c(e){const t=e.match(/^(\d+)([A-Z]?)$/);return t?[parseInt(t[1],10),t[2]]:[1/0,e]}}}]);
|
|
2
|
-
//# sourceMappingURL=282.js.map
|
package/dist/282.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"282.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/numbering-schemes.js","webpack://bio/./src/utils/annotations/numbering-ui.ts"],"sourcesContent":["/** Static antibody numbering scheme region definitions.\n *\n * Contains FR/CDR boundaries for IMGT, Kabat, Chothia, and AHo schemes.\n * These are the canonical position ranges used after a numbering tool\n * (e.g. ANARCI) has assigned scheme-specific position names.\n */\nexport var NumberingScheme;\n(function (NumberingScheme) {\n NumberingScheme[\"IMGT\"] = \"IMGT\";\n NumberingScheme[\"Kabat\"] = \"Kabat\";\n NumberingScheme[\"Chothia\"] = \"Chothia\";\n NumberingScheme[\"AHo\"] = \"AHo\";\n})(NumberingScheme || (NumberingScheme = {}));\nexport var ChainType;\n(function (ChainType) {\n ChainType[\"Heavy\"] = \"Heavy\";\n ChainType[\"Light_Kappa\"] = \"Light_Kappa\";\n ChainType[\"Light_Lambda\"] = \"Light_Lambda\";\n})(ChainType || (ChainType = {}));\n/** IMGT region boundaries — the reference numbering scheme.\n * @see https://www.imgt.org/IMGTScientificChart/Numbering/IMGTIGVLsuperfamily.html\n */\nexport const IMGT_REGIONS = {\n [ChainType.Heavy]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '26', chainType: ChainType.Heavy },\n { name: 'CDR1', type: 'CDR', startPosition: '27', endPosition: '38', chainType: ChainType.Heavy },\n { name: 'FR2', type: 'FR', startPosition: '39', endPosition: '55', chainType: ChainType.Heavy },\n { name: 'CDR2', type: 'CDR', startPosition: '56', endPosition: '65', chainType: ChainType.Heavy },\n { name: 'FR3', type: 'FR', startPosition: '66', endPosition: '104', chainType: ChainType.Heavy },\n { name: 'CDR3', type: 'CDR', startPosition: '105', endPosition: '117', chainType: ChainType.Heavy },\n { name: 'FR4', type: 'FR', startPosition: '118', endPosition: '128', chainType: ChainType.Heavy },\n ],\n [ChainType.Light_Kappa]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '26', chainType: ChainType.Light_Kappa },\n { name: 'CDR1', type: 'CDR', startPosition: '27', endPosition: '38', chainType: ChainType.Light_Kappa },\n { name: 'FR2', type: 'FR', startPosition: '39', endPosition: '55', chainType: ChainType.Light_Kappa },\n { name: 'CDR2', type: 'CDR', startPosition: '56', endPosition: '65', chainType: ChainType.Light_Kappa },\n { name: 'FR3', type: 'FR', startPosition: '66', endPosition: '104', chainType: ChainType.Light_Kappa },\n { name: 'CDR3', type: 'CDR', startPosition: '105', endPosition: '117', chainType: ChainType.Light_Kappa },\n { name: 'FR4', type: 'FR', startPosition: '118', endPosition: '127', chainType: ChainType.Light_Kappa },\n ],\n [ChainType.Light_Lambda]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '26', chainType: ChainType.Light_Lambda },\n { name: 'CDR1', type: 'CDR', startPosition: '27', endPosition: '38', chainType: ChainType.Light_Lambda },\n { name: 'FR2', type: 'FR', startPosition: '39', endPosition: '55', chainType: ChainType.Light_Lambda },\n { name: 'CDR2', type: 'CDR', startPosition: '56', endPosition: '65', chainType: ChainType.Light_Lambda },\n { name: 'FR3', type: 'FR', startPosition: '66', endPosition: '104', chainType: ChainType.Light_Lambda },\n { name: 'CDR3', type: 'CDR', startPosition: '105', endPosition: '117', chainType: ChainType.Light_Lambda },\n { name: 'FR4', type: 'FR', startPosition: '118', endPosition: '127', chainType: ChainType.Light_Lambda },\n ],\n};\n/** Kabat region boundaries (differ mainly in CDR definitions). */\nexport const KABAT_REGIONS = {\n [ChainType.Heavy]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '30', chainType: ChainType.Heavy },\n { name: 'CDR1', type: 'CDR', startPosition: '31', endPosition: '35', chainType: ChainType.Heavy },\n { name: 'FR2', type: 'FR', startPosition: '36', endPosition: '49', chainType: ChainType.Heavy },\n { name: 'CDR2', type: 'CDR', startPosition: '50', endPosition: '65', chainType: ChainType.Heavy },\n { name: 'FR3', type: 'FR', startPosition: '66', endPosition: '94', chainType: ChainType.Heavy },\n { name: 'CDR3', type: 'CDR', startPosition: '95', endPosition: '102', chainType: ChainType.Heavy },\n { name: 'FR4', type: 'FR', startPosition: '103', endPosition: '113', chainType: ChainType.Heavy },\n ],\n [ChainType.Light_Kappa]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '23', chainType: ChainType.Light_Kappa },\n { name: 'CDR1', type: 'CDR', startPosition: '24', endPosition: '34', chainType: ChainType.Light_Kappa },\n { name: 'FR2', type: 'FR', startPosition: '35', endPosition: '49', chainType: ChainType.Light_Kappa },\n { name: 'CDR2', type: 'CDR', startPosition: '50', endPosition: '56', chainType: ChainType.Light_Kappa },\n { name: 'FR3', type: 'FR', startPosition: '57', endPosition: '88', chainType: ChainType.Light_Kappa },\n { name: 'CDR3', type: 'CDR', startPosition: '89', endPosition: '97', chainType: ChainType.Light_Kappa },\n { name: 'FR4', type: 'FR', startPosition: '98', endPosition: '107', chainType: ChainType.Light_Kappa },\n ],\n [ChainType.Light_Lambda]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '23', chainType: ChainType.Light_Lambda },\n { name: 'CDR1', type: 'CDR', startPosition: '24', endPosition: '34', chainType: ChainType.Light_Lambda },\n { name: 'FR2', type: 'FR', startPosition: '35', endPosition: '49', chainType: ChainType.Light_Lambda },\n { name: 'CDR2', type: 'CDR', startPosition: '50', endPosition: '56', chainType: ChainType.Light_Lambda },\n { name: 'FR3', type: 'FR', startPosition: '57', endPosition: '88', chainType: ChainType.Light_Lambda },\n { name: 'CDR3', type: 'CDR', startPosition: '89', endPosition: '97', chainType: ChainType.Light_Lambda },\n { name: 'FR4', type: 'FR', startPosition: '98', endPosition: '107', chainType: ChainType.Light_Lambda },\n ],\n};\n/** Chothia region boundaries. */\nexport const CHOTHIA_REGIONS = {\n [ChainType.Heavy]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '25', chainType: ChainType.Heavy },\n { name: 'CDR1', type: 'CDR', startPosition: '26', endPosition: '32', chainType: ChainType.Heavy },\n { name: 'FR2', type: 'FR', startPosition: '33', endPosition: '51', chainType: ChainType.Heavy },\n { name: 'CDR2', type: 'CDR', startPosition: '52', endPosition: '56', chainType: ChainType.Heavy },\n { name: 'FR3', type: 'FR', startPosition: '57', endPosition: '94', chainType: ChainType.Heavy },\n { name: 'CDR3', type: 'CDR', startPosition: '95', endPosition: '102', chainType: ChainType.Heavy },\n { name: 'FR4', type: 'FR', startPosition: '103', endPosition: '113', chainType: ChainType.Heavy },\n ],\n [ChainType.Light_Kappa]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '25', chainType: ChainType.Light_Kappa },\n { name: 'CDR1', type: 'CDR', startPosition: '26', endPosition: '32', chainType: ChainType.Light_Kappa },\n { name: 'FR2', type: 'FR', startPosition: '33', endPosition: '49', chainType: ChainType.Light_Kappa },\n { name: 'CDR2', type: 'CDR', startPosition: '50', endPosition: '52', chainType: ChainType.Light_Kappa },\n { name: 'FR3', type: 'FR', startPosition: '53', endPosition: '90', chainType: ChainType.Light_Kappa },\n { name: 'CDR3', type: 'CDR', startPosition: '91', endPosition: '96', chainType: ChainType.Light_Kappa },\n { name: 'FR4', type: 'FR', startPosition: '97', endPosition: '107', chainType: ChainType.Light_Kappa },\n ],\n [ChainType.Light_Lambda]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '25', chainType: ChainType.Light_Lambda },\n { name: 'CDR1', type: 'CDR', startPosition: '26', endPosition: '32', chainType: ChainType.Light_Lambda },\n { name: 'FR2', type: 'FR', startPosition: '33', endPosition: '49', chainType: ChainType.Light_Lambda },\n { name: 'CDR2', type: 'CDR', startPosition: '50', endPosition: '52', chainType: ChainType.Light_Lambda },\n { name: 'FR3', type: 'FR', startPosition: '53', endPosition: '90', chainType: ChainType.Light_Lambda },\n { name: 'CDR3', type: 'CDR', startPosition: '91', endPosition: '96', chainType: ChainType.Light_Lambda },\n { name: 'FR4', type: 'FR', startPosition: '97', endPosition: '107', chainType: ChainType.Light_Lambda },\n ],\n};\n/** AHo region boundaries. */\nexport const AHO_REGIONS = {\n [ChainType.Heavy]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '24', chainType: ChainType.Heavy },\n { name: 'CDR1', type: 'CDR', startPosition: '25', endPosition: '40', chainType: ChainType.Heavy },\n { name: 'FR2', type: 'FR', startPosition: '41', endPosition: '55', chainType: ChainType.Heavy },\n { name: 'CDR2', type: 'CDR', startPosition: '56', endPosition: '78', chainType: ChainType.Heavy },\n { name: 'FR3', type: 'FR', startPosition: '79', endPosition: '108', chainType: ChainType.Heavy },\n { name: 'CDR3', type: 'CDR', startPosition: '109', endPosition: '138', chainType: ChainType.Heavy },\n { name: 'FR4', type: 'FR', startPosition: '139', endPosition: '149', chainType: ChainType.Heavy },\n ],\n [ChainType.Light_Kappa]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '24', chainType: ChainType.Light_Kappa },\n { name: 'CDR1', type: 'CDR', startPosition: '25', endPosition: '40', chainType: ChainType.Light_Kappa },\n { name: 'FR2', type: 'FR', startPosition: '41', endPosition: '55', chainType: ChainType.Light_Kappa },\n { name: 'CDR2', type: 'CDR', startPosition: '56', endPosition: '78', chainType: ChainType.Light_Kappa },\n { name: 'FR3', type: 'FR', startPosition: '79', endPosition: '108', chainType: ChainType.Light_Kappa },\n { name: 'CDR3', type: 'CDR', startPosition: '109', endPosition: '138', chainType: ChainType.Light_Kappa },\n { name: 'FR4', type: 'FR', startPosition: '139', endPosition: '149', chainType: ChainType.Light_Kappa },\n ],\n [ChainType.Light_Lambda]: [\n { name: 'FR1', type: 'FR', startPosition: '1', endPosition: '24', chainType: ChainType.Light_Lambda },\n { name: 'CDR1', type: 'CDR', startPosition: '25', endPosition: '40', chainType: ChainType.Light_Lambda },\n { name: 'FR2', type: 'FR', startPosition: '41', endPosition: '55', chainType: ChainType.Light_Lambda },\n { name: 'CDR2', type: 'CDR', startPosition: '56', endPosition: '78', chainType: ChainType.Light_Lambda },\n { name: 'FR3', type: 'FR', startPosition: '79', endPosition: '108', chainType: ChainType.Light_Lambda },\n { name: 'CDR3', type: 'CDR', startPosition: '109', endPosition: '138', chainType: ChainType.Light_Lambda },\n { name: 'FR4', type: 'FR', startPosition: '139', endPosition: '149', chainType: ChainType.Light_Lambda },\n ],\n};\n/** Lookup table: scheme → chain type → region defs */\nexport const SCHEME_REGIONS = {\n [NumberingScheme.IMGT]: IMGT_REGIONS,\n [NumberingScheme.Kabat]: KABAT_REGIONS,\n [NumberingScheme.Chothia]: CHOTHIA_REGIONS,\n [NumberingScheme.AHo]: AHO_REGIONS,\n};\n//# sourceMappingURL=numbering-schemes.js.map","/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {TAGS as bioTAGS, ALIGNMENT, ALPHABET, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';\nimport {\n SeqAnnotation, SeqAnnotationHit, AnnotationCategory,\n} from '@datagrok-libraries/bio/src/utils/macromolecule/annotations';\nimport {NumberingScheme} from '@datagrok-libraries/bio/src/utils/macromolecule/numbering-schemes';\nimport {\n setColumnAnnotations, getColumnAnnotations,\n getOrCreateAnnotationColumn, getRowAnnotations, setRowAnnotations, mergeRowHits,\n} from './annotation-manager';\nimport {_package} from '../../package';\nimport type {NumberingResult, Scheme} from '../antibody-numbering (WIP)';\nimport {VdRegionsViewer} from '../../viewers/vd-regions-viewer';\nimport { VdRegion, VdRegionType } from '@datagrok-libraries/bio/src/viewers/vd-regions';\n\nconst BUILTIN_ENGINE_KEY = '__builtin__';\nconst BUILTIN_ENGINE_LABEL = 'Built-in (TypeScript)';\n\n/** An engine entry: either a dynamically discovered DG.Func or the built-in TS engine. */\ninterface NumberingEngine {\n /** Display label for the dropdown */\n label: string;\n /** Unique key — nqName for DG.Func engines, BUILTIN_ENGINE_KEY for built-in */\n key: string;\n /** The DG.Func to call, or null for the built-in engine */\n func: DG.Func | null;\n}\n\n/** Discovers all registered antibody numbering engines + the built-in TS engine.\n * Dynamic engines (meta.role = 'antibodyNumbering') come first; built-in is last. */\nfunction discoverEngines(): NumberingEngine[] {\n const engines: NumberingEngine[] = [];\n\n const funcs = DG.Func.find({meta: {role: 'antibodyNumbering'}});\n if (funcs.length === 0) {\n grok.shell.error('No antibody numbering engines found. Make sure that Proteomics plugin is installed and up to date.');\n throw new Error('No external antibody numbering engines found. Make sure that Proteomics plugin is installed and up to date.');\n }\n for (const f of funcs) {\n const pkgName = f.package?.name ?? '';\n const label = f.friendlyName || f.name;\n engines.push({\n label: label,\n key: pkgName ? `${pkgName}:${f.name}` : f.name,\n func: f,\n });\n }\n\n // Built-in TS engine is always last\n engines.push({label: BUILTIN_ENGINE_LABEL, key: BUILTIN_ENGINE_KEY, func: null});\n return engines;\n}\n\n/** Converts TS NumberingResult[] to a DG.DataFrame matching the expected output shape.\n * Columns: position_names, chain_type, annotations_json, numbering_detail, numbering_map. */\nexport function numberingResultsToDataFrame(results: NumberingResult[]): DG.DataFrame {\n const n = results.length;\n const posNames = DG.Column.fromType(DG.COLUMN_TYPE.STRING, 'position_names', n);\n const chainTypes = DG.Column.fromType(DG.COLUMN_TYPE.STRING, 'chain_type', n);\n const annotJson = DG.Column.fromType(DG.COLUMN_TYPE.STRING, 'annotations_json', n);\n const numDetail = DG.Column.fromType(DG.COLUMN_TYPE.STRING, 'numbering_detail', n);\n const numMap = DG.Column.fromType(DG.COLUMN_TYPE.STRING, 'numbering_map', n);\n\n for (let i = 0; i < n; i++) {\n const r = results[i];\n if (r.error && r.percentIdentity < 0.3) {\n posNames.set(i, '');\n chainTypes.set(i, '');\n annotJson.set(i, '[]');\n numDetail.set(i, '');\n numMap.set(i, '');\n } else {\n posNames.set(i, r.positionNames);\n chainTypes.set(i, r.chainType);\n annotJson.set(i, JSON.stringify(r.annotations));\n numDetail.set(i, JSON.stringify(r.numberingDetail));\n numMap.set(i, JSON.stringify(r.numberingMap));\n }\n }\n\n return DG.DataFrame.fromColumns([posNames, chainTypes, annotJson, numDetail, numMap]);\n}\n\n/** Runs the built-in TS numbering engine on all rows of a sequence column. */\nasync function runBuiltinNumbering(\n seqCol: DG.Column<string>, schemeName: string,\n): Promise<DG.DataFrame> {\n const {numberSequences, extractSequence} = await import('../antibody-numbering (WIP)');\n const scheme = schemeName.toLowerCase() as Scheme;\n\n const sequences: string[] = [];\n for (let i = 0; i < seqCol.length; i++) {\n const raw = seqCol.get(i);\n sequences.push(extractSequence(raw ?? ''));\n }\n\n const results = numberSequences(sequences, scheme);\n return numberingResultsToDataFrame(results);\n}\n\nexport function showNumberingSchemeDialog(): void {\n const df = grok.shell.tv?.dataFrame;\n if (!df) {\n grok.shell.warning('No table open');\n return;\n }\n\n const seqCols = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n if (seqCols.length === 0) {\n grok.shell.warning('No macromolecule columns found');\n return;\n }\n\n const engines = discoverEngines();\n const engineLabels = engines.map((e) => e.label);\n const schemeChoices = Object.values(NumberingScheme);\n\n const tableInput = ui.input.table('Table', {value: df});\n const seqInput = ui.input.column('Sequence', {\n table: df, value: seqCols[0],\n filter: (col: DG.Column) => col.semType === DG.SEMTYPE.MACROMOLECULE,\n });\n const schemeInput = ui.input.choice('Scheme', {value: NumberingScheme.IMGT, items: schemeChoices});\n const engineInput = ui.input.choice('Engine', {\n value: engineLabels[0], items: engineLabels,\n });\n // const populateRegions = ui.input.bool('Populate FR/CDR regions', {value: true});\n // const openVdRegions = ui.input.bool('Open VD Regions viewer', {value: true});\n\n const dialog = ui.dialog({title: 'Apply Antibody Numbering'})\n .add(ui.inputs([tableInput, seqInput, schemeInput, engineInput]))\n .onOK(async () => {\n const seqCol = seqInput.value!;\n const schemeName = schemeInput.value!;\n const selectedLabel = engineInput.value!;\n const engine = engines.find((e) => e.label === selectedLabel) ?? engines[engines.length - 1];\n const pi = DG.TaskBarProgressIndicator.create(`Applying ${schemeName} numbering...`);\n try {\n let result: DG.DataFrame;\n if (engine.func)\n result = await engine.func.apply({df: df, seqCol: seqCol, scheme: schemeName.toLowerCase()});\n else\n result = await runBuiltinNumbering(seqCol, schemeName);\n\n applyNumberingResults(df, seqCol, result, schemeName, true, engine.label);\n\n // // Open VD Regions viewer\n // if (openVdRegions.value && grok.shell.tv) {\n // try {\n // await grok.shell.tv.dataFrame.plot.fromType('VdRegions', {});\n // } catch (err) {\n // console.warn('Could not open VD Regions viewer:', err);\n // }\n // }\n } catch (err: any) {\n grok.shell.error(`Numbering failed: ${err.message ?? err}`);\n console.error(err);\n } finally {\n pi.close();\n }\n });\n\n dialog.show();\n}\n\n/** Builds a map from ungapped character index to gapped character index.\n * Used when the source column is already aligned (MSA) — numbering engines strip gaps,\n * so their output indices refer to the ungapped sequence, not the gapped original. */\nfunction buildUngappedToGappedMap(gappedSeq: string): number[] {\n const map: number[] = [];\n for (let g = 0; g < gappedSeq.length; g++) {\n if (gappedSeq[g] !== '-' && gappedSeq[g] !== '.')\n map.push(g);\n }\n return map;\n}\n\n/** Parses a position code into [numericPart, insertionLetter] for sorting.\n * E.g. \"27\" → [27, \"\"], \"111A\" → [111, \"A\"], \"27B\" → [27, \"B\"]. */\nfunction parsePositionCode(code: string): [number, string] {\n const match = code.match(/^(\\d+)([A-Z]?)$/);\n if (!match) return [Infinity, code];\n return [parseInt(match[1], 10), match[2]];\n}\n\n/** Sorts position codes in scheme order: numeric ascending, then insertion letter. */\nfunction sortPositionCodes(codes: string[]): string[] {\n return codes.slice().sort((a, b) => {\n const [numA, insA] = parsePositionCode(a);\n const [numB, insB] = parsePositionCode(b);\n if (numA !== numB) return numA - numB;\n return insA.localeCompare(insB);\n });\n}\n\n/** Builds unified position list from all rows and creates an aligned sequence column.\n * Includes flanking residues (before/after the numbered region) padded with gaps.\n * Layout: [pre-region gaps+residues] [scheme-aligned region] [post-region residues+gaps]\n * @returns aligned column, full position list (including flanking), and the pre-region offset. */\nfunction createAlignedColumn(\n df: DG.DataFrame, seqCol: DG.Column<string>, result: DG.DataFrame,\n): {alignedCol: DG.Column<string>; unifiedPositions: string[]; preOffset: number} | null {\n const numberingMapCol = result.col('numbering_map');\n if (!numberingMapCol) return null;\n\n // Pass 1: collect all scheme position codes and per-row flanking lengths\n const allCodes = new Set<string>();\n const rowMaps: (Record<string, number> | null)[] = [];\n const rowPreLens: number[] = []; // chars before first numbered position\n const rowPostLens: number[] = []; // chars after last numbered position\n\n for (let i = 0; i < result.rowCount; i++) {\n const mapStr = numberingMapCol.get(i);\n const rawSeq = seqCol.get(i) ?? '';\n if (!mapStr) {\n rowMaps.push(null);\n rowPreLens.push(0);\n rowPostLens.push(0);\n continue;\n }\n try {\n const posToCharIdx: Record<string, number> = JSON.parse(mapStr);\n rowMaps.push(posToCharIdx);\n for (const code of Object.keys(posToCharIdx))\n allCodes.add(code);\n\n // Find min/max char indices that were numbered\n const charIndices = Object.values(posToCharIdx);\n const minChar = Math.min(...charIndices);\n const maxChar = Math.max(...charIndices);\n rowPreLens.push(minChar); // chars before first numbered\n rowPostLens.push(Math.max(0, rawSeq.length - maxChar - 1)); // chars after last numbered\n } catch {\n rowMaps.push(null);\n rowPreLens.push(0);\n rowPostLens.push(0);\n }\n }\n\n if (allCodes.size === 0) return null;\n\n const maxPreLen = Math.max(0, ...rowPreLens);\n const maxPostLen = Math.max(0, ...rowPostLens);\n\n // Build position names: [pre-flanking] + [scheme positions] + [post-flanking]\n const schemePositions = sortPositionCodes(Array.from(allCodes));\n const preNames: string[] = [];\n for (let p = maxPreLen; p > 0; p--)\n preNames.push(`N-${p}`);\n const postNames: string[] = [];\n for (let p = 1; p <= maxPostLen; p++)\n postNames.push(`C+${p}`);\n\n const unifiedPositions = [...preNames, ...schemePositions, ...postNames];\n const totalLen = unifiedPositions.length;\n const preOffset = maxPreLen; // scheme region starts at this index in the aligned string\n\n // Map scheme position codes → index in the full unified list\n const posToUnifiedIdx = new Map<string, number>();\n for (let s = 0; s < schemePositions.length; s++)\n posToUnifiedIdx.set(schemePositions[s], preOffset + s);\n\n // Pass 2: build aligned sequences\n const colName = df.columns.getUnusedName(`${seqCol.name} (aligned)`);\n const alignedCol = DG.Column.fromType(DG.COLUMN_TYPE.STRING, colName, df.rowCount);\n\n for (let i = 0; i < df.rowCount; i++) {\n const map = i < rowMaps.length ? rowMaps[i] : null;\n const rawSeq = seqCol.get(i) ?? '';\n\n if (!map) {\n alignedCol.set(i, '-'.repeat(totalLen));\n continue;\n }\n\n const aligned = new Array<string>(totalLen).fill('-');\n\n // Place scheme-numbered residues\n for (const [posCode, charIdx] of Object.entries(map)) {\n const uIdx = posToUnifiedIdx.get(posCode);\n if (uIdx != null && charIdx < rawSeq.length)\n aligned[uIdx] = rawSeq[charIdx];\n }\n\n // Place pre-region flanking residues (right-aligned within the pre-region block)\n const preLen = rowPreLens[i];\n const charIndices = Object.values(map);\n const minChar = Math.min(...charIndices);\n for (let p = 0; p < preLen; p++)\n aligned[preOffset - preLen + p] = rawSeq[minChar - preLen + p];\n\n // Place post-region flanking residues (left-aligned within the post-region block)\n const postLen = rowPostLens[i];\n const maxChar = Math.max(...charIndices);\n const postStart = preOffset + schemePositions.length;\n for (let p = 0; p < postLen; p++)\n aligned[postStart + p] = rawSeq[maxChar + 1 + p];\n\n alignedCol.set(i, aligned.join(''));\n }\n\n // Set macromolecule tags on the aligned column\n alignedCol.semType = DG.SEMTYPE.MACROMOLECULE;\n alignedCol.setTag(bioTAGS.aligned, ALIGNMENT.SEQ_MSA);\n alignedCol.setTag(bioTAGS.alphabet, ALPHABET.PT);\n alignedCol.meta.units = NOTATION.FASTA;\n alignedCol.setTag(DG.Tags.CellRenderer, 'sequence');\n alignedCol.setTag(bioTAGS.positionNames, unifiedPositions.join(', '));\n\n return {alignedCol, unifiedPositions, preOffset};\n}\n\n/** Applies numbering results (from either engine) to the sequence column and dataframe.\n *\n * Annotation strategy:\n * - Original column: row-level region spans only (char indices from numbering_map).\n * No column-level position names (they differ per row).\n * - Aligned column: column-level annotations only (all rows share unified positions).\n * Position names tag set to the unified list. */\nfunction applyNumberingResults(\n df: DG.DataFrame, seqCol: DG.Column<string>, result: DG.DataFrame,\n schemeName: string, populateRegions: boolean, engineLabel: string,\n): void {\n if (!result || result.rowCount === 0) {\n grok.shell.warning('No numbering results returned');\n return;\n }\n\n const posNamesCol = result.getCol('position_names');\n const chainTypeCol = result.getCol('chain_type');\n const annotJsonCol = result.getCol('annotations_json');\n const numberingMapCol = result.col('numbering_map');\n\n // If the source column is already aligned (MSA), remap numbering_map indices\n // from ungapped to gapped, since numbering engines strip gaps before processing.\n const isAligned = true; // always treat as aligned to handle remapping\n if (isAligned && numberingMapCol) {\n for (let i = 0; i < result.rowCount; i++) {\n const mapStr = numberingMapCol.get(i);\n if (!mapStr) continue;\n try {\n const posToCharIdx: Record<string, number> = JSON.parse(mapStr);\n const rawSeq = seqCol.get(i) ?? '';\n const ungapToGap = buildUngappedToGappedMap(rawSeq);\n const remapped: Record<string, number> = {};\n for (const [posCode, ungappedIdx] of Object.entries(posToCharIdx)) {\n if (ungappedIdx < ungapToGap.length)\n remapped[posCode] = ungapToGap[ungappedIdx];\n }\n numberingMapCol.set(i, JSON.stringify(remapped));\n } catch { /* skip */ }\n }\n }\n\n // Pick the row with the most annotations for column-level representative data\n let bestRowIdx = -1;\n let bestAnnotCount = -1;\n\n for (let i = 0; i < result.rowCount; i++) {\n const pn = posNamesCol.get(i);\n if (!pn || pn.length === 0) continue;\n const aj = annotJsonCol.get(i);\n let count = 0;\n if (aj)\n try { count = JSON.parse(aj).length; } catch { /* skip */ }\n if (count > bestAnnotCount) {\n bestAnnotCount = count;\n bestRowIdx = i;\n }\n }\n\n const chainType = bestRowIdx >= 0 ? (chainTypeCol.get(bestRowIdx) ?? '') : '';\n const annotationsJson = bestRowIdx >= 0 ? (annotJsonCol.get(bestRowIdx) ?? '[]') : '[]';\n\n if (bestRowIdx < 0) {\n grok.shell.warning(`${engineLabel} could not number the sequences. Check that they are valid antibody variable region sequences.`);\n return;\n }\n\n // Mark scheme on original column (no position names — they differ per row)\n seqCol.setTag(bioTAGS.numberingScheme, schemeName);\n\n // --- Original column: column-level annotation definitions (needed for renderer\n // to resolve annotation IDs → colors/names) + row-level region spans ---\n if (populateRegions) {\n try {\n const regionAnnotations: SeqAnnotation[] = JSON.parse(annotationsJson);\n const existing = getColumnAnnotations(seqCol).filter((a) => a.category !== AnnotationCategory.Structure);\n setColumnAnnotations(seqCol, [...existing, ...regionAnnotations]);\n } catch (err) {\n console.warn('Failed to set annotation definitions on original column:', err);\n }\n }\n\n if (populateRegions && numberingMapCol) {\n try {\n const annotCol = getOrCreateAnnotationColumn(df, seqCol);\n for (let i = 0; i < result.rowCount; i++) {\n const mapStr = numberingMapCol.get(i);\n const rowAnnotJson = annotJsonCol.get(i);\n if (!mapStr || !rowAnnotJson) continue;\n const posToCharIdx: Record<string, number> = JSON.parse(mapStr);\n const rowRegions: SeqAnnotation[] = JSON.parse(rowAnnotJson);\n\n const regionHits: SeqAnnotationHit[] = [];\n for (const region of rowRegions) {\n if (region.start == null || region.end == null) continue;\n const startCharIdx = posToCharIdx[region.start];\n const endCharIdx = posToCharIdx[region.end];\n if (startCharIdx == null || endCharIdx == null) continue;\n regionHits.push({\n annotationId: region.id,\n positionIndex: startCharIdx,\n endPositionIndex: endCharIdx,\n positionName: region.start,\n matchedMonomers: '',\n });\n }\n\n const existingHits = getRowAnnotations(annotCol, i) ?? [];\n setRowAnnotations(annotCol, i, mergeRowHits(existingHits, regionHits, true, false));\n }\n } catch (err) {\n console.warn('Failed to store per-row region data on original column:', err);\n }\n }\n\n // --- Aligned column: column-level annotations only ---\n const alignment = createAlignedColumn(df, seqCol, result);\n if (alignment) {\n df.columns.insert(alignment.alignedCol, df.columns.toList().indexOf(seqCol) + 1);\n if (grok.shell.tv?.dataFrame === df)\n grok.shell.tv.grid.scrollToCell(seqCol, 0);\n\n alignment.alignedCol.setTag(bioTAGS.numberingScheme, schemeName);\n\n if (populateRegions) {\n try {\n const regionAnnotations: SeqAnnotation[] = JSON.parse(annotationsJson);\n const existing = getColumnAnnotations(alignment.alignedCol).filter((a) => a.category !== AnnotationCategory.Structure);\n setColumnAnnotations(alignment.alignedCol, [...existing, ...regionAnnotations]);\n // chunk for vd regions viewer if that becomes a desired feature in the future\n // if (grok.shell.tv?.dataFrame === df) {\n // (async () => {\n // const vdRegionsViewer: VdRegionsViewer = await grok.shell.tv.dataFrame.plot.fromType('VdRegions',) as VdRegionsViewer;\n // vdRegionsViewer.chains = [chainType];\n // vdRegionsViewer.setData(regionAnnotations.map((a, i) => ({\n // type: a.name?.toLowerCase().startsWith('cdr') ? VdRegionType.CDR : VdRegionType.FR,\n // name: a.name,\n // chain: chainType,\n // order: i,\n // sequenceColumnName: alignment.alignedCol.name,\n // positionStartName: a.start ?? '',\n // positionEndName: a.end ?? '',\n // } satisfies VdRegion)));\n // grok.shell.tv.addViewer(vdRegionsViewer);\n // })();\n // }\n } catch (err) {\n console.warn('Failed to set column-level annotations on aligned column:', err);\n }\n }\n }\n\n df.fireValuesChanged();\n\n grok.shell.info(`Numbering applied: ${schemeName}, chain type: ${chainType}`);\n}\n"],"names":["NumberingScheme","ChainType","Heavy","Light_Kappa","Light_Lambda","IMGT","Kabat","Chothia","AHo","showNumberingSchemeDialog","df","tv","dataFrame","warning","seqCols","columns","bySemTypeAll","MACROMOLECULE","length","engines","funcs","find","meta","role","error","Error","f","pkgName","package","name","label","friendlyName","push","key","func","discoverEngines","engineLabels","map","e","schemeChoices","Object","values","tableInput","table","value","seqInput","column","filter","col","semType","schemeInput","choice","items","engineInput","dialog","title","add","onOK","async","seqCol","schemeName","selectedLabel","engine","pi","create","result","apply","scheme","toLowerCase","numberSequences","extractSequence","sequences","i","raw","get","results","n","posNames","fromType","STRING","chainTypes","annotJson","numDetail","numMap","r","percentIdentity","set","positionNames","chainType","JSON","stringify","annotations","numberingDetail","numberingMap","fromColumns","numberingResultsToDataFrame","runBuiltinNumbering","populateRegions","engineLabel","rowCount","posNamesCol","getCol","chainTypeCol","annotJsonCol","numberingMapCol","mapStr","posToCharIdx","parse","ungapToGap","buildUngappedToGappedMap","remapped","posCode","ungappedIdx","entries","bestRowIdx","bestAnnotCount","pn","aj","count","annotationsJson","setTag","numberingScheme","regionAnnotations","existing","a","category","Structure","err","console","warn","annotCol","rowAnnotJson","rowRegions","regionHits","region","start","end","startCharIdx","endCharIdx","annotationId","id","positionIndex","endPositionIndex","positionName","matchedMonomers","existingHits","alignment","allCodes","Set","rowMaps","rowPreLens","rowPostLens","rawSeq","code","keys","charIndices","minChar","Math","min","maxChar","max","size","maxPreLen","maxPostLen","schemePositions","Array","from","slice","sort","b","numA","insA","parsePositionCode","numB","insB","localeCompare","preNames","p","postNames","unifiedPositions","totalLen","preOffset","posToUnifiedIdx","Map","s","colName","getUnusedName","alignedCol","repeat","aligned","fill","charIdx","uIdx","preLen","postLen","postStart","join","alphabet","PT","units","FASTA","CellRenderer","createAlignedColumn","insert","toList","indexOf","grid","scrollToCell","fireValuesChanged","info","applyNumberingResults","message","close","show","gappedSeq","g","match","parseInt","Infinity"],"sourceRoot":""}
|
package/dist/287.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkbio=self.webpackChunkbio||[]).push([[287],{9287(e,o,t){t.d(o,{showAnnotationManagerDialog:()=>d});var n=t(4328),i=t(7389),l=t(6082),a=t(4517),r=t(3736);const s={[a.eI.Structure]:"Structure (FR/CDR)",[a.eI.Liability]:"Liability",[a.eI.PTM]:"Post-translational Modification",[a.eI.Custom]:"Custom"},c={[a.Hq.High]:"High",[a.Hq.Medium]:"Medium",[a.Hq.Low]:"Low",[a.Hq.Info]:"Info"};function d(){const e=n.shell.tv?.dataFrame;if(!e)return void n.shell.warning("No table open");const o=e.columns.bySemTypeAll(l.SEMTYPE.MACROMOLECULE);if(0===o.length)return void n.shell.warning("No macromolecule columns found");let t=o[0];const a=i.input.column("Sequence Column",{table:e,value:t,filter:e=>e.semType===l.SEMTYPE.MACROMOLECULE,onValueChanged:e=>{t=e,u()}}),d=i.divV([],{style:{maxHeight:"380px",overflowY:"auto",paddingRight:"8px"}});function u(){d.innerHTML="";const o=(0,r.Ln)(t);if(0!==o.length)for(const n of o){const o=s[n.category]??n.category,a=n.severity?` [${c[n.severity]??n.severity}]`:"",p=n.start&&n.end?` (${n.start}-${n.end})`:"",g=n.sourceScheme?` ${n.sourceScheme}`:"",h=i.iconFA("trash",()=>{const o=(0,r.Ln)(t).filter(e=>e.id!==n.id);(0,r.fh)(t,o),e.fireValuesChanged(),u()},"Delete");h.style.cursor="pointer",h.style.color="#999",h.style.marginLeft="8px";const f=n.color??"#ccc";let m=f;const y=i.div([],{style:{width:"12px",height:"12px",borderRadius:"2px",backgroundColor:m,display:"inline-block",marginRight:"6px",flexShrink:"0",cursor:"pointer"}});i.colorPicker(l.Color.fromHtml(n.color??"#ccc"),e=>{m=l.Color.toHtml(e)},y,()=>{const o=(0,r.Ln)(t).map(e=>e.id===n.id?{...e,color:m}:e);(0,r.fh)(t,o),e.fireValuesChanged(),u()},()=>{m=f,y.style.backgroundColor=m});const x=i.divH([y,i.divText(`${n.name}${p}${g}${a}`,{style:{flex:"1",fontSize:"12px",padding:"4px"}}),i.divText(o,{style:{color:"#888",fontSize:"11px",marginRight:"8px"}}),h],{style:{alignItems:"center",padding:"4px 0",borderBottom:"1px solid #eee"}});d.append(x)}else d.append(i.divText("No annotations on this column.",{style:{color:"#888",padding:"8px"}}))}u();const p=i.button("Clear All",()=>{(0,r.OW)(e,t),e.fireValuesChanged(),u(),n.shell.info("All annotations cleared")});i.dialog({title:"Manage Annotations"}).add(i.inputs([a])).add(i.h3("Annotations")).add(d).add(i.divH([p],{style:{marginTop:"8px"}})).onOK(()=>{}).show()}}}]);
|
|
2
|
-
//# sourceMappingURL=287.js.map
|
package/dist/287.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"287.js","mappings":"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","sources":["webpack://bio/./src/utils/annotations/annotation-manager-ui.ts"],"sourcesContent":["/* eslint-disable max-len */\nimport * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {\n SeqAnnotation, AnnotationCategory, LiabilitySeverity,\n} from '@datagrok-libraries/bio/src/utils/macromolecule/annotations';\nimport {getColumnAnnotations, setColumnAnnotations, clearAnnotations} from './annotation-manager';\n\nconst categoryLabels: Record<string, string> = {\n [AnnotationCategory.Structure]: 'Structure (FR/CDR)',\n [AnnotationCategory.Liability]: 'Liability',\n [AnnotationCategory.PTM]: 'Post-translational Modification',\n [AnnotationCategory.Custom]: 'Custom',\n};\n\nconst severityLabels: Record<string, string> = {\n [LiabilitySeverity.High]: 'High',\n [LiabilitySeverity.Medium]: 'Medium',\n [LiabilitySeverity.Low]: 'Low',\n [LiabilitySeverity.Info]: 'Info',\n};\n\nexport function showAnnotationManagerDialog(): void {\n const df = grok.shell.tv?.dataFrame;\n if (!df) {\n grok.shell.warning('No table open');\n return;\n }\n\n const seqCols = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n if (seqCols.length === 0) {\n grok.shell.warning('No macromolecule columns found');\n return;\n }\n\n let selectedCol = seqCols[0];\n const colInput = ui.input.column('Sequence Column', {\n table: df, value: selectedCol,\n filter: (col: DG.Column) => col.semType === DG.SEMTYPE.MACROMOLECULE,\n onValueChanged: (col) => { selectedCol = col!; refreshList(); },\n });\n\n const listDiv = ui.divV([], {style: {maxHeight: '380px', overflowY: 'auto', paddingRight: '8px'}});\n\n function refreshList(): void {\n listDiv.innerHTML = '';\n const annotations = getColumnAnnotations(selectedCol);\n if (annotations.length === 0) {\n listDiv.append(ui.divText('No annotations on this column.', {style: {color: '#888', padding: '8px'}}));\n return;\n }\n\n for (const annot of annotations) {\n const catLabel = categoryLabels[annot.category] ?? annot.category;\n const sevLabel = annot.severity ? ` [${severityLabels[annot.severity] ?? annot.severity}]` : '';\n const rangeLabel = annot.start && annot.end ? ` (${annot.start}-${annot.end})` : '';\n const schemeLabel = annot.sourceScheme ? ` ${annot.sourceScheme}` : '';\n\n const removeBtn = ui.iconFA('trash', () => {\n const updated = getColumnAnnotations(selectedCol).filter((a) => a.id !== annot.id);\n setColumnAnnotations(selectedCol, updated);\n df.fireValuesChanged();\n refreshList();\n }, 'Delete');\n removeBtn.style.cursor = 'pointer';\n removeBtn.style.color = '#999';\n removeBtn.style.marginLeft = '8px';\n const originalColor = annot.color ?? '#ccc';\n let currentColor = originalColor;\n const colorSwatch = ui.div([], {style: {\n width: '12px', height: '12px', borderRadius: '2px',\n backgroundColor: currentColor, display: 'inline-block', marginRight: '6px',\n flexShrink: '0', cursor: 'pointer',\n }});\n\n ui.colorPicker(DG.Color.fromHtml(annot.color ?? '#ccc'), (newColor) => {\n currentColor = DG.Color.toHtml(newColor);\n }, colorSwatch, () => {\n const updated = getColumnAnnotations(selectedCol).map((a) => a.id === annot.id ? {...a, color: currentColor} : a);\n setColumnAnnotations(selectedCol, updated);\n df.fireValuesChanged();\n refreshList();\n }, () => {\n currentColor = originalColor;\n colorSwatch.style.backgroundColor = currentColor;\n });\n\n const row = ui.divH([\n colorSwatch,\n ui.divText(`${annot.name}${rangeLabel}${schemeLabel}${sevLabel}`, {style: {flex: '1', fontSize: '12px', padding: '4px'}}),\n ui.divText(catLabel, {style: {color: '#888', fontSize: '11px', marginRight: '8px'}}),\n removeBtn,\n ], {style: {alignItems: 'center', padding: '4px 0', borderBottom: '1px solid #eee'}});\n\n listDiv.append(row);\n }\n }\n\n refreshList();\n\n const clearBtn = ui.button('Clear All', () => {\n clearAnnotations(df, selectedCol);\n df.fireValuesChanged();\n refreshList();\n grok.shell.info('All annotations cleared');\n });\n\n const dialog = ui.dialog({title: 'Manage Annotations'})\n .add(ui.inputs([colInput]))\n .add(ui.h3('Annotations'))\n .add(listDiv)\n .add(ui.divH([clearBtn], {style: {marginTop: '8px'}}))\n .onOK(() => {});\n\n dialog.show();\n}\n"],"names":["categoryLabels","Structure","Liability","PTM","Custom","severityLabels","High","Medium","Low","Info","showAnnotationManagerDialog","df","tv","dataFrame","warning","seqCols","columns","bySemTypeAll","MACROMOLECULE","length","selectedCol","colInput","column","table","value","filter","col","semType","onValueChanged","refreshList","listDiv","style","maxHeight","overflowY","paddingRight","innerHTML","annotations","annot","catLabel","category","sevLabel","severity","rangeLabel","start","end","schemeLabel","sourceScheme","removeBtn","updated","a","id","fireValuesChanged","cursor","color","marginLeft","originalColor","currentColor","colorSwatch","width","height","borderRadius","backgroundColor","display","marginRight","flexShrink","fromHtml","newColor","toHtml","map","row","name","flex","fontSize","padding","alignItems","borderBottom","append","clearBtn","info","title","add","marginTop","onOK","show"],"sourceRoot":""}
|
package/dist/422.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkbio=self.webpackChunkbio||[]).push([[422],{9422(e,t,i){i.d(t,{showLiabilityScannerDialog:()=>c});var n=i(4328),a=i(7389),o=i(6082),l=i(9462),r=i(4517),d=i(3736);const s=[{id:"deamid-ng",name:"Deamidation (NG)",pattern:/NG/g,length:2,severity:r.Hq.High,ruleCategory:"deamidation",color:r.D5.liability.deamidation,enabled:!0},{id:"deamid-ns",name:"Deamidation (NS)",pattern:/NS/g,length:2,severity:r.Hq.Medium,ruleCategory:"deamidation",color:r.D5.liability.deamidation,enabled:!0},{id:"deamid-na",name:"Deamidation (NA)",pattern:/NA/g,length:2,severity:r.Hq.Low,ruleCategory:"deamidation",color:r.D5.liability.deamidation,enabled:!0},{id:"deamid-nd",name:"Deamidation (ND)",pattern:/ND/g,length:2,severity:r.Hq.Low,ruleCategory:"deamidation",color:r.D5.liability.deamidation,enabled:!0},{id:"deamid-nt",name:"Deamidation (NT)",pattern:/NT/g,length:2,severity:r.Hq.Low,ruleCategory:"deamidation",color:r.D5.liability.deamidation,enabled:!0},{id:"isom-dg",name:"Isomerization (DG)",pattern:/DG/g,length:2,severity:r.Hq.High,ruleCategory:"isomerization",color:r.D5.liability.isomerization,enabled:!0},{id:"isom-ds",name:"Isomerization (DS)",pattern:/DS/g,length:2,severity:r.Hq.Medium,ruleCategory:"isomerization",color:r.D5.liability.isomerization,enabled:!0},{id:"oxid-m",name:"Oxidation (Met)",pattern:/M/g,length:1,severity:r.Hq.Medium,ruleCategory:"oxidation",color:r.D5.liability.oxidation,enabled:!0},{id:"oxid-w",name:"Oxidation (Trp)",pattern:/W/g,length:1,severity:r.Hq.Low,ruleCategory:"oxidation",color:r.D5.liability.oxidation,enabled:!0},{id:"glyco-nxst",name:"N-glycosylation",pattern:/N[^P][ST]/g,length:3,severity:r.Hq.High,ruleCategory:"glycosylation",color:r.D5.liability.glycosylation,enabled:!0},{id:"free-cys",name:"Free Cysteine",pattern:/C/g,length:1,severity:r.Hq.Info,ruleCategory:"freeCysteine",color:r.D5.liability.freeCysteine,enabled:!1}];function u(e,t){const i=e.getSplitted(t),n=new Array(i.length);for(let e=0;e<i.length;e++)n[e]=i.getOriginal(e);return n.join("")}const g={[r.Hq.High]:"High",[r.Hq.Medium]:"Medium",[r.Hq.Low]:"Low",[r.Hq.Info]:"Info"};function c(){const e=n.shell.tv?.dataFrame;if(!e)return void n.shell.warning("No table open");const t=e.columns.bySemTypeAll(o.SEMTYPE.MACROMOLECULE);if(0===t.length)return void n.shell.warning("No macromolecule columns found");const i=s.map(e=>({...e,pattern:new RegExp(e.pattern.source,"g")})),c=a.input.table("Table",{value:e}),m=a.input.column("Sequence",{table:e,value:t[0],filter:e=>e.semType===o.SEMTYPE.MACROMOLECULE}),y=[],p=a.divV([]);for(const e of i){const t=a.input.bool(e.name,{value:e.enabled,tooltipText:`Severity: ${g[e.severity]??e.severity}`});y.push({rule:e,input:t}),p.append(t.root)}const h=a.input.bool("Highlight in cell renderer",{value:!0}),b=a.input.bool("Create annotation column",{value:!0}),f=a.input.bool("Create summary count column",{value:!1}),v=a.dialog({title:"Scan Sequence Liabilities"}).add(a.inputs([c,m])).add(a.h3("Rules")).add(p).add(a.h3("Output")).add(a.inputs([h,b,f])).onOK(()=>{try{const t=m.value,a=l._package.seqHelper.getSeqHandler(t);for(const{rule:e,input:t}of y)e.enabled=t.value;const o=function(e,t,i){const n=i.filter(e=>e.enabled),a=t.posList,o=new Map,l=new Array(e.length);let d=0;for(let i=0;i<e.length;i++){const e=u(t,i),r=[];for(const t of n){let i;for(t.pattern.lastIndex=0;null!==(i=t.pattern.exec(e));)r.push({annotationId:t.id,positionIndex:i.index,positionName:i.index<a.length?a[i.index]:void 0,matchedMonomers:i[0]}),o.set(t.id,(o.get(t.id)??0)+1),d++}l[i]=r}return{annotations:n.filter(e=>o.has(e.id)).map(e=>({id:e.id,name:e.name,description:`${e.ruleCategory} liability pattern (${o.get(e.id)} hits)`,start:null,end:null,visualType:1===e.length?r.ao.Point:r.ao.Motif,category:r.eI.Liability,color:e.color,severity:e.severity,motifPattern:e.pattern.source,autoGenerated:!0})),rowData:l,totalHits:d}}(t,a,i);(b.value||h.value)&&function(e,t,i){const n=(0,d.Ln)(t).filter(e=>e.category!==r.eI.Liability);(0,d.fh)(t,[...n,...i.annotations]);const a=(0,d.Lz)(e,t);for(let e=0;e<i.rowData.length;e++){const t=(0,d.JG)(a,e)??[];(0,d.z5)(a,e,(0,d.bq)(t,i.rowData[e],!1,!0))}}(e,t,o),f.value&&function(e,t,i){const n=`${t.name}_liability_count`,a=i.rowData.map(e=>e.length),o=e.columns.addNewInt(n);for(let e=0;e<a.length;e++)o.set(e,a[e])}(e,t,o),n.shell.info(`Liability scan: ${o.totalHits} hits found across ${o.annotations.length} rules`),e.fireValuesChanged()}catch(e){n.shell.error(`Liability scan failed: ${e.message??e}`),console.error(e)}});v.show()}}}]);
|
|
2
|
-
//# sourceMappingURL=422.js.map
|
package/dist/422.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"422.js","mappings":"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","sources":["webpack://bio/./src/utils/annotations/liability-scanner.ts","webpack://bio/./src/utils/annotations/liability-scanner-ui.ts"],"sourcesContent":["/* eslint-disable max-len */\nimport * as DG from 'datagrok-api/dg';\n\nimport {ISeqHandler} from '@datagrok-libraries/bio/src/utils/macromolecule/seq-handler';\nimport {\n SeqAnnotation, SeqAnnotationHit, RowAnnotationData,\n AnnotationVisualType, AnnotationCategory, LiabilitySeverity,\n ANNOTATION_COLORS,\n} from '@datagrok-libraries/bio/src/utils/macromolecule/annotations';\nimport {\n getOrCreateAnnotationColumn, setColumnAnnotations, setRowAnnotations,\n getColumnAnnotations, getRowAnnotations, mergeRowHits,\n} from './annotation-manager';\n\n/** A single liability scanning rule. */\nexport interface LiabilityRule {\n id: string;\n name: string;\n pattern: RegExp;\n length: number;\n severity: LiabilitySeverity;\n /** Sub-category for grouping (e.g. \"deamidation\", \"oxidation\") */\n ruleCategory: string;\n color: string;\n enabled: boolean;\n}\n\n/** Built-in liability rules for antibody engineering. */\nexport const BUILTIN_LIABILITY_RULES: LiabilityRule[] = [\n {id: 'deamid-ng', name: 'Deamidation (NG)', pattern: /NG/g, length: 2, severity: LiabilitySeverity.High, ruleCategory: 'deamidation', color: ANNOTATION_COLORS.liability.deamidation, enabled: true},\n {id: 'deamid-ns', name: 'Deamidation (NS)', pattern: /NS/g, length: 2, severity: LiabilitySeverity.Medium, ruleCategory: 'deamidation', color: ANNOTATION_COLORS.liability.deamidation, enabled: true},\n {id: 'deamid-na', name: 'Deamidation (NA)', pattern: /NA/g, length: 2, severity: LiabilitySeverity.Low, ruleCategory: 'deamidation', color: ANNOTATION_COLORS.liability.deamidation, enabled: true},\n {id: 'deamid-nd', name: 'Deamidation (ND)', pattern: /ND/g, length: 2, severity: LiabilitySeverity.Low, ruleCategory: 'deamidation', color: ANNOTATION_COLORS.liability.deamidation, enabled: true},\n {id: 'deamid-nt', name: 'Deamidation (NT)', pattern: /NT/g, length: 2, severity: LiabilitySeverity.Low, ruleCategory: 'deamidation', color: ANNOTATION_COLORS.liability.deamidation, enabled: true},\n {id: 'isom-dg', name: 'Isomerization (DG)', pattern: /DG/g, length: 2, severity: LiabilitySeverity.High, ruleCategory: 'isomerization', color: ANNOTATION_COLORS.liability.isomerization, enabled: true},\n {id: 'isom-ds', name: 'Isomerization (DS)', pattern: /DS/g, length: 2, severity: LiabilitySeverity.Medium, ruleCategory: 'isomerization', color: ANNOTATION_COLORS.liability.isomerization, enabled: true},\n {id: 'oxid-m', name: 'Oxidation (Met)', pattern: /M/g, length: 1, severity: LiabilitySeverity.Medium, ruleCategory: 'oxidation', color: ANNOTATION_COLORS.liability.oxidation, enabled: true},\n {id: 'oxid-w', name: 'Oxidation (Trp)', pattern: /W/g, length: 1, severity: LiabilitySeverity.Low, ruleCategory: 'oxidation', color: ANNOTATION_COLORS.liability.oxidation, enabled: true},\n {id: 'glyco-nxst', name: 'N-glycosylation', pattern: /N[^P][ST]/g, length: 3, severity: LiabilitySeverity.High, ruleCategory: 'glycosylation', color: ANNOTATION_COLORS.liability.glycosylation, enabled: true},\n {id: 'free-cys', name: 'Free Cysteine', pattern: /C/g, length: 1, severity: LiabilitySeverity.Info, ruleCategory: 'freeCysteine', color: ANNOTATION_COLORS.liability.freeCysteine, enabled: false},\n];\n\n/** Extracts a canonical single-letter string from a sequence handler for a given row. */\nfunction getCanonicalString(sh: ISeqHandler, rowIdx: number): string {\n const splitted = sh.getSplitted(rowIdx);\n const chars: string[] = new Array(splitted.length);\n for (let i = 0; i < splitted.length; i++)\n chars[i] = splitted.getOriginal(i);\n return chars.join('');\n}\n\nexport interface ScanLiabilitiesResult {\n annotations: SeqAnnotation[];\n rowData: RowAnnotationData[];\n totalHits: number;\n}\n\n/** Scans all rows of a macromolecule column for liability motifs.\n * Returns column-level SeqAnnotation entries + per-row SeqAnnotationHit arrays. */\nexport function scanLiabilities(\n col: DG.Column<string>,\n sh: ISeqHandler,\n rules: LiabilityRule[],\n): ScanLiabilitiesResult {\n const enabledRules = rules.filter((r) => r.enabled);\n const posList = sh.posList;\n\n // Track which rules had hits\n const ruleHitCounts = new Map<string, number>();\n\n const rowData: RowAnnotationData[] = new Array(col.length);\n let totalHits = 0;\n\n for (let rowIdx = 0; rowIdx < col.length; rowIdx++) {\n const seq = getCanonicalString(sh, rowIdx);\n const hits: SeqAnnotationHit[] = [];\n\n for (const rule of enabledRules) {\n // Reset regex lastIndex for global patterns\n rule.pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = rule.pattern.exec(seq)) !== null) {\n hits.push({\n annotationId: rule.id,\n positionIndex: match.index,\n positionName: match.index < posList.length ? posList[match.index] : undefined,\n matchedMonomers: match[0],\n });\n ruleHitCounts.set(rule.id, (ruleHitCounts.get(rule.id) ?? 0) + 1);\n totalHits++;\n }\n }\n rowData[rowIdx] = hits;\n }\n\n // Build column-level annotations only for rules that had hits\n const annotations: SeqAnnotation[] = enabledRules\n .filter((r) => ruleHitCounts.has(r.id))\n .map((r) => ({\n id: r.id,\n name: r.name,\n description: `${r.ruleCategory} liability pattern (${ruleHitCounts.get(r.id)} hits)`,\n start: null,\n end: null,\n visualType: r.length === 1 ? AnnotationVisualType.Point : AnnotationVisualType.Motif,\n category: AnnotationCategory.Liability,\n color: r.color,\n severity: r.severity,\n motifPattern: r.pattern.source,\n autoGenerated: true,\n }));\n\n return {annotations, rowData, totalHits};\n}\n\n/** Applies liability scan results to the DataFrame (writes tags + companion column). */\nexport function applyLiabilityScanResults(\n df: DG.DataFrame,\n seqCol: DG.Column<string>,\n result: ScanLiabilitiesResult,\n): void {\n // Merge with existing annotations, removing old liability entries\n const existing = getColumnAnnotations(seqCol)\n .filter((a) => a.category !== AnnotationCategory.Liability);\n setColumnAnnotations(seqCol, [...existing, ...result.annotations]);\n\n // Write per-row data to hidden companion column, preserving region hits from numbering\n const annotCol = getOrCreateAnnotationColumn(df, seqCol);\n for (let i = 0; i < result.rowData.length; i++) {\n const existingHits = getRowAnnotations(annotCol, i) ?? [];\n setRowAnnotations(annotCol, i, mergeRowHits(existingHits, result.rowData[i], false, true));\n }\n}\n\n/** Creates a liability summary count column (total hits per row). */\nexport function createLiabilitySummaryColumn(\n df: DG.DataFrame,\n seqCol: DG.Column<string>,\n result: ScanLiabilitiesResult,\n): DG.Column<number> {\n const colName = `${seqCol.name}_liability_count`;\n const counts = result.rowData.map((hits) => hits.length);\n const col = df.columns.addNewInt(colName);\n for (let i = 0; i < counts.length; i++)\n col.set(i, counts[i]);\n return col;\n}\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {_package} from '../../package';\nimport {\n BUILTIN_LIABILITY_RULES, LiabilityRule, scanLiabilities,\n applyLiabilityScanResults, createLiabilitySummaryColumn,\n} from './liability-scanner';\nimport {LiabilitySeverity} from '@datagrok-libraries/bio/src/utils/macromolecule/annotations';\n\nconst severityLabels: Record<string, string> = {\n [LiabilitySeverity.High]: 'High',\n [LiabilitySeverity.Medium]: 'Medium',\n [LiabilitySeverity.Low]: 'Low',\n [LiabilitySeverity.Info]: 'Info',\n};\n\nexport function showLiabilityScannerDialog(): void {\n const df = grok.shell.tv?.dataFrame;\n if (!df) {\n grok.shell.warning('No table open');\n return;\n }\n\n const seqCols = df.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);\n if (seqCols.length === 0) {\n grok.shell.warning('No macromolecule columns found');\n return;\n }\n\n const rules = BUILTIN_LIABILITY_RULES.map((r) => ({...r, pattern: new RegExp(r.pattern.source, 'g')}));\n\n const tableInput = ui.input.table('Table', {value: df});\n const seqInput = ui.input.column('Sequence', {\n table: df, value: seqCols[0],\n filter: (col: DG.Column) => col.semType === DG.SEMTYPE.MACROMOLECULE,\n });\n\n // Rule checkboxes\n const ruleChecks: {rule: LiabilityRule; input: DG.InputBase<boolean>}[] = [];\n const rulesDiv = ui.divV([]);\n for (const rule of rules) {\n const check = ui.input.bool(rule.name, {\n value: rule.enabled,\n tooltipText: `Severity: ${severityLabels[rule.severity] ?? rule.severity}`,\n });\n ruleChecks.push({rule, input: check});\n rulesDiv.append(check.root);\n }\n\n const highlightInput = ui.input.bool('Highlight in cell renderer', {value: true});\n const annotColInput = ui.input.bool('Create annotation column', {value: true});\n const summaryInput = ui.input.bool('Create summary count column', {value: false});\n\n const dialog = ui.dialog({title: 'Scan Sequence Liabilities'})\n .add(ui.inputs([tableInput, seqInput]))\n .add(ui.h3('Rules'))\n .add(rulesDiv)\n .add(ui.h3('Output'))\n .add(ui.inputs([highlightInput, annotColInput, summaryInput]))\n .onOK(() => {\n try {\n const seqCol = seqInput.value!;\n const sh = _package.seqHelper.getSeqHandler(seqCol);\n\n // Apply checkbox state\n for (const {rule, input} of ruleChecks)\n rule.enabled = input.value;\n\n const result = scanLiabilities(seqCol, sh, rules);\n\n if (annotColInput.value || highlightInput.value)\n applyLiabilityScanResults(df, seqCol, result);\n\n if (summaryInput.value)\n createLiabilitySummaryColumn(df, seqCol, result);\n\n grok.shell.info(`Liability scan: ${result.totalHits} hits found across ${result.annotations.length} rules`);\n df.fireValuesChanged();\n } catch (err: any) {\n grok.shell.error(`Liability scan failed: ${err.message ?? err}`);\n console.error(err);\n }\n });\n\n dialog.show();\n}\n"],"names":["BUILTIN_LIABILITY_RULES","id","name","pattern","length","severity","High","ruleCategory","color","liability","deamidation","enabled","Medium","Low","isomerization","oxidation","glycosylation","Info","freeCysteine","getCanonicalString","sh","rowIdx","splitted","getSplitted","chars","Array","i","getOriginal","join","severityLabels","showLiabilityScannerDialog","df","tv","dataFrame","warning","seqCols","columns","bySemTypeAll","MACROMOLECULE","rules","map","r","RegExp","source","tableInput","table","value","seqInput","column","filter","col","semType","ruleChecks","rulesDiv","rule","check","bool","tooltipText","push","input","append","root","highlightInput","annotColInput","summaryInput","dialog","title","add","onOK","seqCol","_package","seqHelper","getSeqHandler","result","enabledRules","posList","ruleHitCounts","Map","rowData","totalHits","seq","hits","match","lastIndex","exec","annotationId","positionIndex","index","positionName","undefined","matchedMonomers","set","get","annotations","has","description","start","end","visualType","Point","Motif","category","Liability","motifPattern","autoGenerated","scanLiabilities","existing","a","annotCol","existingHits","applyLiabilityScanResults","colName","counts","addNewInt","createLiabilitySummaryColumn","info","fireValuesChanged","err","error","message","console","show"],"sourceRoot":""}
|
package/dist/767.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkbio=self.webpackChunkbio||[]).push([[767],{6767(S,T,A){A.d(T,{extractSequence:()=>C,numberSequences:()=>g});const V=[[1,["Q","E","D"]],[2,["V","Q"]],[3,["Q","K","H","S","T"]],[4,["L","V"]],[5,["V","Q","L","E","K","T"]],[6,["E","Q","A"]],[7,["S","P","W"]],[8,["G","E"]],[9,["G","A","P","S"]],[10,[]],[11,["G","E","D","V"]],[12,["L","V"]],[13,["V","K","L"]],[14,["K","Q","R"]],[15,["P","A"]],[16,["G","S","T"]],[17,["G","A","E","Q","R","S","D"]],[18,["S","T"]],[19,["L","V"]],[20,["R","K","S","T"]],[21,["L","I","V","M"]],[22,["S","T"]],[23,["C"]],[24,["A","K","T","V","S"]],[25,["A","V","T","G","I"]],[26,["S","T","Y"]],[27,[]],[28,[]],[29,[]],[30,[]],[31,[]],[32,[]],[33,[]],[34,[]],[35,[]],[36,[]],[37,[]],[38,[]],[39,[]],[40,[]],[41,["W"]],[42,["V","I","F"]],[43,["R","K"]],[44,["Q"]],[45,["A","P","R","S","T","M","V"]],[46,["P","A","H"]],[47,["G","E","S","A"]],[48,["K","Q","R","N"]],[49,["G","A","R","S"]],[50,["L"]],[51,["E","Q"]],[52,["W","Y"]],[53,["I","V","K","M"]],[54,["A","G","S"]],[55,["A","G","S","D","E","N","T","V","I","L","K","R","Q","P","F","W","Y","M","H","C"]],[56,[]],[57,[]],[58,[]],[59,[]],[60,[]],[61,[]],[62,[]],[63,[]],[64,[]],[65,[]],[66,["Y","N","K","D","E","F","G","H","R","S","T"]],[67,["Y","F"]],[68,["A","N","S","P","T","V","G"]],[69,["D","E","Q","A","S","P"]],[70,["S","K","A","W"]],[71,["F","V","L","A"]],[72,["K","Q","R","E"]],[73,[]],[74,["G","S","D","N"]],[75,["R","K","Q"]],[76,["F","V","A","L","I"]],[77,["T","S","I"]],[78,["I","L","M","V","F"]],[79,["S","T","N"]],[80,["R","V","A","K","L","P","T"]],[81,["D","N","E"]],[82,["N","T","K","D","E","S","R"]],[83,["S","A","P","D","N"]],[84,["K","S","T","A","E","I","R","Q","N","L"]],[85,["N","S","D","K","T"]],[86,["T","Q","S","I","M"]],[87,["L","A","V","F"]],[88,["Y","S","F","H","T","V"]],[89,["L","M"]],[90,["Q","E","K","D","T"]],[91,["L","M","I","V","W"]],[92,["A","C","D","G","H","K","L","N","R","S","T"]],[93,["A","G","H","K","N","R","S","T"]],[94,["L","M","P","V"]],[95,["R","T","K"]],[96,["A","S","T","V","P"]],[97,["E","A","D","G","S","V"]],[98,["D"]],[99,["T","S"]],[100,["A","G"]],[101,["V","T","I","L","M"]],[102,["Y"]],[103,["Y","F"]],[104,["C"]],[105,[]],[106,[]],[107,[]],[108,[]],[109,[]],[110,[]],[111,[]],[112,[]],[113,[]],[114,[]],[115,[]],[116,[]],[117,[]],[118,["W"]],[119,["G"]],[120,["Q","P","R","K","A","T"]],[121,["G"]],[122,["T","V","A","I"]],[123,["L","T","M","S","Q","P"]],[124,["V","L","I"]],[125,["T","I","V"]],[126,["V"]],[127,["S","T"]],[128,["S","A"]]],t=[[1,["D","E","Q","N","A"]],[2,["I","V","L"]],[3,["V","Q","L","E","K"]],[4,["M","L","V","I"]],[5,["T","S"]],[6,["Q"]],[7,["S","T","A","I"]],[8,["P","Q","T","A","H"]],[9,["S","G","L","A","D","K","F","P","V"]],[10,["S","T","F","I"]],[11,["L","M","N","Q","V"]],[12,["T","S","A","P","Y"]],[13,["V","L","A","T","M"]],[14,["T","S","A"]],[15,["A","P","I","V","L"]],[16,["G"]],[17,["E","Q","D","G","T"]],[18,["K","R","P","T","Q","S"]],[19,["V","A","I"]],[20,["T","S"]],[21,["M","L","I","F"]],[22,["S","T","N"]],[23,["C"]],[24,["K","R","Q","S"]],[25,["S","A","T","C"]],[26,["S","T","G"]],[27,[]],[28,[]],[29,[]],[30,[]],[31,[]],[32,[]],[33,[]],[34,[]],[35,[]],[36,[]],[37,[]],[38,[]],[39,["L","M","I","V","F"]],[40,["T","A","N","H","E","G","Q","Y","S","D"]],[41,["W"]],[42,["Y","L","F"]],[43,["Q","L","R"]],[44,["Q","H","E"]],[45,["K","R"]],[46,["P","Q","S","T"]],[47,["G","E","D","H","N"]],[48,["Q","K","S","T","G","E","R"]],[49,["P","A","S","T","V"]],[50,["P","I","V"]],[51,["K","R","Q","E","I","T"]],[52,["L","R","T","P","V","A"]],[53,["L","W"]],[54,["I","V","M"]],[55,["Y","K","H","S","F"]],[56,[]],[57,[]],[58,[]],[59,[]],[60,[]],[61,[]],[62,[]],[63,[]],[64,[]],[65,[]],[66,["T","S","K","N","I","D","R","Y","Q","F"]],[67,["R","L","S"]],[68,["E","A","D","Q","F","R","Y","H","I","K","P","G","V"]],[69,["S","T","D","P","A","E"]],[70,["G"]],[71,["V","I"]],[72,["P","S","A"]],[73,[]],[74,["D","S","A","V","K","G"]],[75,["R"]],[76,["F"]],[77,["T","S","I","K","R"]],[78,["G","S","A"]],[79,["S","G","R"]],[80,["G","R"]],[81,["S","Y"]],[82,["G","R","A"]],[83,["A","F","P","S","Y"]],[84,["A","D","E","G","Q","R","V"]],[85,["T","R","S","Q"]],[86,["D","E","Q","S","H","Y","A"]],[87,["F","Y"]],[88,["T","S"]],[89,["L","F"]],[90,["T","K","N","S","R"]],[91,["I","V"]],[92,["N","S","H","T","D"]],[93,["S","R","P","N","G","D","T"]],[94,["V","L","M"]],[95,["Q","E","K"]],[96,["A","P","E","S","T","Q","C","Y"]],[97,["E","D"]],[98,["D"]],[99,["L","F","V","T","A","I","S","M"]],[100,["A","G"]],[101,["V","T","S","E","D","L","I","M"]],[102,["Y","F"]],[103,["Y","F","H"]],[104,["C"]],[105,[]],[106,[]],[107,[]],[108,[]],[109,[]],[110,[]],[111,[]],[112,[]],[113,[]],[114,[]],[115,[]],[116,[]],[117,[]],[118,["F"]],[119,["G"]],[120,["A","Q","S","G","P"]],[121,["G"]],[122,["T"]],[123,["K","R","E"]],[124,["L","V"]],[125,["E","V","D"]],[126,["L","I","V"]],[127,["K","R"]]],R=[[1,["Q","S"]],[2,["S","Y","P","A","L","F"]],[3,["A","V","E"]],[4,["L","V"]],[5,["T"]],[6,["Q"]],[7,["P","E","S"]],[8,["A","P","S","R"]],[9,["S","A"]],[10,[]],[11,["V","L","A"]],[12,["S","T"]],[13,["G","V","A","T","K","E","F"]],[14,["S","A","T"]],[15,["P","L"]],[16,["G"]],[17,["Q","E","K","A"]],[18,["S","T","K","R"]],[19,["I","A","V"]],[20,["T","R","S","K"]],[21,["I","L"]],[22,["S","T"]],[23,["C"]],[24,["T","G","Q","S","A","N","R"]],[25,["G","S","L","R"]],[26,["T","N","D","S"]],[27,[]],[28,[]],[29,[]],[30,[]],[31,[]],[32,[]],[33,[]],[34,[]],[35,[]],[36,[]],[37,[]],[38,[]],[39,["V","A","I"]],[40,["S","H","Q","C","N","Y","E"]],[41,["W"]],[42,["Y","F","V"]],[43,["Q"]],[44,["Q","H","E"]],[45,["H","K","R","L","F","V","Q"]],[46,["P","A","S"]],[47,["G","D","L"]],[48,["K","Q","T","R","H","S","A","M"]],[49,["A","S","L","P","G"]],[50,["P","F"]],[51,["K","V","S","R","T","I"]],[52,["L","V","G","Y","T"]],[53,["I","V","M","L"]],[54,["I","V","L","M"]],[55,["F","Y","G","S","E"]],[56,[]],[57,[]],[58,[]],[59,[]],[60,[]],[61,[]],[62,[]],[63,[]],[64,[]],[65,[]],[66,["N","D","K","Q","E","S","H"]],[67,["R","T"]],[68,["P","A","G"]],[69,["S","P","D"]],[70,["G"]],[71,["I","V"]],[72,["S","P"]],[73,[]],[74,["N","E","A","D"]],[75,["R"]],[76,["F"]],[77,["S"]],[78,["G"]],[79,["S"]],[80,["K","N","P","L","I","S"]],[81,["F","S","I"]],[82,["G","A","S"]],[83,["A","I","L","S","T","W"]],[84,["A","D","E","G","S","T"]],[85,["N","T","D","S","A"]],[86,["T","K","S","R"]],[87,["A","R"]],[88,["S","T","A","Y"]],[89,["L"]],[90,["T","G","A","S"]],[91,["I","V"]],[92,["S","T"]],[93,["G","R","S","N"]],[94,["L","V","T","A","I"]],[95,["Q","E","R"]],[96,["A","S","P","T"]],[97,["E","G","M","D"]],[98,["D"]],[99,["E"]],[100,["A","G"]],[101,["D","I","E"]],[102,["Y"]],[103,["Y","F","I"]],[104,["C"]],[105,[]],[106,[]],[107,[]],[108,[]],[109,[]],[110,[]],[111,[]],[112,[]],[113,[]],[114,[]],[115,[]],[116,[]],[117,[]],[118,["F"]],[119,["G"]],[120,["G","T","S"]],[121,["G"]],[122,["T"]],[123,["K","T","R","Q"]],[124,["V","L"]],[125,["T"]],[126,["V"]],[127,["L","K"]]],n=[[1,["W"]],[2,["G"]],[3,["Q","P","R","K","A","T"]],[4,["G"]],[5,["T","V","A","I"]],[6,["L","T","M","S","Q","P"]],[7,["V","L","I"]],[8,["T","I","V"]],[9,["V"]],[10,["S","T"]]],e=[[1,["F"]],[2,["G"]],[3,["A","Q","S","G","P"]],[4,["G"]],[5,["T"]],[6,["K","R","E"]],[7,["L","V"]],[8,["E","V","D"]],[9,["L","I","V"]],[10,["K","R"]]],G=[[1,["F"]],[2,["G"]],[3,["G","T","S"]],[4,["G"]],[5,["T"]],[6,["K","T","R","Q"]],[7,["V","L"]],[8,["T"]],[9,["V"]],[10,["L","K"]]],L=[[1,["Q","E","D"]],[2,["V","Q"]],[3,["Q","K","H","S","T"]],[4,["L","V"]],[5,["V","Q","L","E","K","T"]],[6,["E","Q","A"]],[7,["S","P","W"]],[8,["G","E"]],[9,["G","A","P","S"]],[10,["G","E","D","V"]],[11,["L","V"]],[12,["V","K","L"]],[13,["K","Q","R"]],[14,["P","A"]],[15,["G","S","T"]],[16,["G","A","E","Q","R","S","D"]],[17,["S","T"]],[18,["L","V"]],[19,["R","K","S","T"]],[20,["L","I","V","M"]],[21,["S","T"]],[22,["C"]],[23,["A","K","T","V","S"]],[24,["A","V","T","G","I"]],[25,["S","T","Y"]],[26,["G","E"]],[27,["F","Y","G","D","S"]],[28,["T","S","I","N","D","A"]],[29,["F","I","L","S","V"]],[30,["S","T","D","G","N","R"]],[31,[]],[32,[]],[33,[]],[34,[]],[35,[]],[36,["W"]],[37,["V","I","F"]],[38,["R","K"]],[39,["Q"]],[40,["A","P","R","S","T","M","V"]],[41,["P","A","H"]],[42,["G","E","S","A"]],[43,["K","Q","R","N"]],[44,["G","A","R","S"]],[45,["L"]],[46,["E","Q"]],[47,["W","Y"]],[48,["I","V","K","M"]],[49,["A","G","S"]],[50,[]],[51,["I","V","T","M"]],[52,["S","N","Y","D","K","I","H","G","W","R","T"]],[53,["A","D","Y","W","G","H","I","T","S","N","R"]],[54,["A","D","F","G","K","N","T","S"]],[55,["A","D","E","G","S","T","W","Y"]],[56,["A","D","D","G","N","S","T","W","Y"]],[57,["T","A","I","K","N","P","S"]],[58,["Y","N","K","D","E","F","G","H","R","S","T"]],[59,["Y","F"]],[60,["A","N","S","P","T","V","G"]],[61,["D","E","Q","A","S","P"]],[62,["S","K","A","W"]],[63,["F","V","L","A"]],[64,["K","Q","R","E"]],[65,["G","S","D","N"]],[66,["R","K","Q"]],[67,["F","V","A","L","I"]],[68,["T","S","I"]],[69,["I","L","M","V","F"]],[70,["S","T","N"]],[71,["R","V","A","K","L","P","T"]],[72,["D","N","E"]],[73,["N","T","K","D","E","S","R"]],[74,["S","A","P","D","N"]],[75,["K","S","T","A","E","I","R","Q","N","L"]],[76,["N","S","D","K","T"]],[77,["T","Q","S","I","M"]],[78,["L","A","V","F"]],[79,["Y","S","F","H","T","V"]],[80,["L","M"]],[81,["Q","E","K","D","T"]],[82,["L","M","I","V","W"]],[83,["R","T","K"]],[84,["A","S","T","V","P"]],[85,["E","A","D","G","S","V"]],[86,["D"]],[87,["T","S"]],[88,["A","G"]],[89,["V","T","I","L","M"]],[90,["Y"]],[91,["Y","F"]],[92,["C"]],[93,["A","T","V"]],[94,["R","K","S","T","A","G"]],[95,[]],[96,[]],[97,[]],[98,[]],[99,[]],[100,[]],[101,[]],[102,["Y","V","I","L","F","P","H","S"]],[103,["W"]],[104,["G"]],[105,["Q","P","R","K","A","T"]],[106,["G"]],[107,["T","V","A","I"]],[108,["L","T","M","S","Q","P"]],[109,["V","L","I"]],[110,["T","I","V"]],[111,["V"]],[112,["S","T"]],[113,["S","A"]]],K=[[1,["D","E","Q","N","A"]],[2,["I","V","L"]],[3,["V","Q","L","E","K"]],[4,["M","L","V","I"]],[5,["T","S"]],[6,["Q"]],[7,["S","T","A","I"]],[8,["P","Q","T","A","H"]],[9,["S","G","L","A","D","K","F","P","V"]],[10,["S","T","F","I"]],[11,["L","M","N","Q","V"]],[12,["T","S","A","P","Y"]],[13,["V","L","A","T","M"]],[14,["T","S","A"]],[15,["A","P","I","V","L"]],[16,["G"]],[17,["E","Q","D","G","T"]],[18,["K","R","P","T","Q","S"]],[19,["V","A","I"]],[20,["T","S"]],[21,["M","L","I","F"]],[22,["S","T","N"]],[23,["C"]],[24,["K","R","Q","S"]],[25,["S","A","T","C"]],[26,["S","T","G"]],[27,[]],[28,["N","V","D","S","I","E","Y","T","G"]],[29,["Q","S","G","I","R","V","N","H","T","D"]],[30,["K","S","H","I","R","Y","N","D","V","G","T","A"]],[31,["N","S","T","K","G","V","R","I","D","Y"]],[32,["Y","W","F","D","R","N","S","K","H","A","G"]],[33,["L","M","I","V","F"]],[34,["T","A","N","H","E","G","Q","Y","S","D"]],[35,["W"]],[36,["Y","L","F"]],[37,["Q","L","R"]],[38,["Q","H","E"]],[39,["K","R"]],[40,["P","Q","S","T"]],[41,["G","E","D","H","N"]],[42,["Q","K","S","T","G","E","R"]],[43,["P","A","S","T","V"]],[44,["P","I","V"]],[45,["K","R","Q","E","I","T"]],[46,["L","R","T","P","V","A"]],[47,["L","W"]],[48,["I","V","M"]],[49,["Y","K","H","S","F"]],[50,[]],[51,["A","V","T","S","M","G","I"]],[52,["S","K","T","N"]],[53,["T","S","K","N","I","D","R","Y","Q","F"]],[54,["R","L","S"]],[55,["E","A","D","Q","F","R","Y","H","I","K","P","G","V"]],[56,["S","T","D","P","A","E"]],[57,["G"]],[58,["V","I"]],[59,["P","S","A"]],[60,["D","S","A","V","K","G"]],[61,["R"]],[62,["F"]],[63,["T","S","I","K","R"]],[64,["G","S","A"]],[65,["S","G","R"]],[66,["G","R"]],[67,["S","Y"]],[68,["G","R","A"]],[69,["T","R","S","Q"]],[70,["D","E","Q","S","H","Y","A"]],[71,["F","Y"]],[72,["T","S"]],[73,["L","F"]],[74,["T","K","N","S","R"]],[75,["I","V"]],[76,["N","S","H","T","D"]],[77,["S","R","P","N","G","D","T"]],[78,["V","L","M"]],[79,["Q","E","K"]],[80,["A","P","E","S","T","Q","C","Y"]],[81,["E","D"]],[82,["D"]],[83,["L","F","V","T","A","I","S","M"]],[84,["A","G"]],[85,["V","T","S","E","D","L","I","M"]],[86,["Y","F"]],[87,["Y","F","H"]],[88,["C"]],[89,["Q","W","F","L","H","M","G","A","K","S","V"]],[90,["N","Q","H","G"]],[91,["D","Y","G","F","I","S","W","R","T","A","N","H"]],[92,[]],[93,[]],[94,[]],[95,[]],[96,["L","Y","W","F","P","R","A","S","I","V","E","H","T"]],[97,["T","S","F"]],[98,["F"]],[99,["G"]],[100,["A","Q","S","G","P"]],[101,["G"]],[102,["T"]],[103,["K","R","E"]],[104,["L","V"]],[105,["E","V","D"]],[106,["L","I","V"]],[107,["K","R"]]],I=[[1,["Q","S"]],[2,["S","Y","P","A","L","F"]],[3,["A","V","E"]],[4,["L","V"]],[5,["T"]],[6,["Q"]],[7,["P","E","S"]],[8,["A","P","S","R"]],[9,["S","A"]],[10,[]],[11,["V","L","A"]],[12,["S","T"]],[13,["G","V","A","T","K","E","F"]],[14,["S","A","T"]],[15,["P","L"]],[16,["G"]],[17,["Q","E","K","A"]],[18,["S","T","K","R"]],[19,["I","A","V"]],[20,["T","R","S","K"]],[21,["I","L"]],[22,["S","T"]],[23,["C"]],[24,["T","G","Q","S","A","N","R"]],[25,["G","S","L","R"]],[26,["T","N","D","S"]],[27,[]],[28,["G","I","L","T","V","H"]],[29,["T","G","S","R","A"]],[30,["Y","S","D","G","N","T","R","F"]],[31,["N","K","D","R","Y"]],[32,["F","S","L","A","Y","T","D","N","G"]],[33,["V","A","I"]],[34,["S","H","Q","C","N","Y","E"]],[35,["W"]],[36,["Y","F","V"]],[37,["Q"]],[38,["Q","H","E"]],[39,["H","K","R","L","F","V","Q"]],[40,["P","A","S"]],[41,["G","D","L"]],[42,["K","Q","T","R","H","S","A","M"]],[43,["A","S","L","P","G"]],[44,["P","F"]],[45,["K","V","S","R","T","I"]],[46,["L","V","G","Y","T"]],[47,["I","V","M","L"]],[48,["I","V","L","M"]],[49,["F","Y","G","S","E"]],[50,[]],[51,["V","D","N","T","K"]],[52,["T","S","Q","N","D","K"]],[53,["N","D","K","Q","E","S","H"]],[54,["R","T"]],[55,["P","A","G"]],[56,["S","P","D"]],[57,["G"]],[58,["I","V"]],[59,["S","P"]],[60,["N","E","A","D"]],[61,["R"]],[62,["F"]],[63,["S"]],[64,["G"]],[65,["S"]],[66,["K","N","P","L","I","S"]],[67,["F","S","I"]],[68,["G","A","S"]],[69,["N","T","D","S","A"]],[70,["T","K","S","R"]],[71,["A","R"]],[72,["S","T","A","Y"]],[73,["L"]],[74,["T","G","A","S"]],[75,["I","V"]],[76,["S","T"]],[77,["G","R","S","N"]],[78,["L","V","T","A","I"]],[79,["Q","E","R"]],[80,["A","S","P","T"]],[81,["E","G","M","D"]],[82,["D"]],[83,["E"]],[84,["A","G"]],[85,["D","I","E"]],[86,["Y"]],[87,["Y","F","I"]],[88,["C"]],[89,["A","Q","C","H","G","S"]],[90,["A","V","L","S","T","M"]],[91,["Y","W","L","R","G"]],[92,["T","D","A","Y","E","R","G"]],[93,[]],[94,[]],[95,[]],[96,["L","V","W","R","P","Y","S","F","A"]],[97,["L","V","I"]],[98,["F"]],[99,["G"]],[100,["G","T","S"]],[101,["G"]],[102,["T"]],[103,["K","T","R","Q"]],[104,["V","L"]],[105,["T"]],[106,["V"]],[107,["L","K"]]],Q=[[1,["Q","E","D"]],[2,["V","Q"]],[3,["Q","K","H","S","T"]],[4,["L","V"]],[5,["V","Q","L","E","K","T"]],[6,["E","Q","A"]],[7,["S","P","W"]],[8,["G","E"]],[9,["G","A","P","S"]],[10,["G","E","D","V"]],[11,["L","V"]],[12,["V","K","L"]],[13,["K","Q","R"]],[14,["P","A"]],[15,["G","S","T"]],[16,["G","A","E","Q","R","S","D"]],[17,["S","T"]],[18,["L","V"]],[19,["R","K","S","T"]],[20,["L","I","V","M"]],[21,["S","T"]],[22,["C"]],[23,["A","K","T","V","S"]],[24,["A","V","T","G","I"]],[25,["S","T","Y"]],[26,[]],[27,[]],[28,[]],[29,[]],[30,[]],[31,[]],[32,[]],[33,["A","G","W","Y","D","L","S","T","V","F"]],[34,["M","I","W","V","L"]],[35,["A","G","H","N","S","T","Y"]],[36,["W"]],[37,["V","I","F"]],[38,["R","K"]],[39,["Q"]],[40,["A","P","R","S","T","M","V"]],[41,["P","A","H"]],[42,["G","E","S"]],[43,["K","Q","R","N"]],[44,["G","A","R","S"]],[45,["L"]],[46,["E","Q"]],[47,["W","Y","F","L"]],[48,["I","V","K","M"]],[49,["A","G","S"]],[50,["A","G","S","D","E","N","T","V","I","L","K","R","Q","P","F","W","Y","M","H","C"]],[51,["A","G","S","D","E","N","T","V","I","L","K","R","Q","P","F","W","Y","M","H","C"]],[52,[]],[53,[]],[54,["S","I","T","D","G","R","N","L","A","Y","F","E"]],[55,["G","S","R","D","W","A","Y","F","V","N","T","E","L","H"]],[56,["S","E","D","I","R","G","Y","T","V","N","A","H","K"]],[57,["T","A","I","K","N","P","S"]],[58,["Y","N","K","D","E","F","G","H","R","S","T"]],[59,["Y","F"]],[60,["A","N","S","P","T","V","G"]],[61,["D","E","Q","A","S","P"]],[62,["S","K","A","W"]],[63,["F","V","L","A"]],[64,["K","Q","R","E"]],[65,["G","S","D","N"]],[66,["R","K","Q"]],[67,["F","V","A","L","I"]],[68,["T","S","I"]],[69,["I","L","M","V","F"]],[70,["S","T","N"]],[71,["R","V","A","K","L","P","T"]],[72,["D","N","E"]],[73,["N","S","D","K","T"]],[74,["T","Q","S","I","M"]],[75,["L","A","V","F"]],[76,["Y","S","F","H","T","V"]],[77,["L","M"]],[78,["Q","E","K","D","T"]],[79,["L","M","I","V","W"]],[80,["S","N","D","T","R","A","H","K"]],[81,["S","N","R","T","A","K","G"]],[82,["L","M","V","P"]],[83,["R","T","K"]],[84,["A","S","T","V","P"]],[85,["E","A","D","G","S","V"]],[86,["D"]],[87,["T","S"]],[88,["A","G"]],[89,["V","T","I","L","M"]],[90,["Y"]],[91,["Y","F"]],[92,["C"]],[93,["A","T","V"]],[94,["R","K","S","T","A","G"]],[95,[]],[96,[]],[97,[]],[98,[]],[99,[]],[100,[]],[101,[]],[102,["Y","V","I","L","F","P","H","S"]],[103,["W"]],[104,["G"]],[105,["Q","P","R","K","A","T"]],[106,["G"]],[107,["T","V","A","I"]],[108,["L","T","M","S","Q","P"]],[109,["V","L","I"]],[110,["T","I","V"]],[111,["V"]],[112,["S","T"]],[113,["S","A"]]],o=[[1,["D","E","Q","N","A"]],[2,["I","V","L"]],[3,["V","Q","L","E","K"]],[4,["M","L","V","I"]],[5,["T","S"]],[6,["Q"]],[7,["S","T","A","I"]],[8,["P","Q","T","A","H"]],[9,["S","G","L","A","D","K","F","P","V"]],[10,["S","T","F","I"]],[11,["L","M","N","Q","V"]],[12,["T","S","A","P","Y"]],[13,["V","L","A","T","M"]],[14,["T","S","A"]],[15,["A","P","I","V","L"]],[16,["G"]],[17,["E","Q","D","G","T"]],[18,["K","R","P","T","Q","S"]],[19,["V","A","I"]],[20,["T","S"]],[21,["M","L","I","F"]],[22,["S","T","N"]],[23,["C"]],[24,["K","R","Q","S"]],[25,["S","A","T","C"]],[26,["S","T","G"]],[27,["Q","G","E","S","K","H"]],[28,["S","N","D","E","R","T","G"]],[29,[]],[30,[]],[31,[]],[32,[]],[33,["L","M","I","V","F"]],[34,["T","A","N","H","E","G","Q","Y","S","D"]],[35,["W"]],[36,["Y","L","F"]],[37,["Q","L","R"]],[38,["Q","H","E"]],[39,["K","R"]],[40,["P","Q","S","T"]],[41,["G","E","D","H","N"]],[42,["Q","K","S","T","G","E","R"]],[43,["P","A","S","T","V"]],[44,["P","I","V"]],[45,["K","R","Q","E","I","T"]],[46,["L","R","T","P","V","A"]],[47,["L","W"]],[48,["I","V","M"]],[49,["Y","K","H","S","F"]],[50,["W","G","L","K","N","A","D","Y","S","E","T","R","Q","F","V"]],[51,["A","V","T","S","M","G","I"]],[52,["S","K","T","N"]],[53,["T","S","K","N","I","D","R","Y","Q","F"]],[54,["R","L","S"]],[55,["E","A","D","Q","F","R","Y","H","I","K","P","G","V"]],[56,["S","T","D","P","A","E"]],[57,["G"]],[58,["V","I"]],[59,["P","S","A"]],[60,["D","S","A","V","K","G"]],[61,["R"]],[62,["F"]],[63,["T","S","I","K","R"]],[64,["G","S","A"]],[65,["S","G","R"]],[66,["G","R"]],[67,["S","Y"]],[68,["G","R","A"]],[69,["T","R","S","Q"]],[70,["D","E","Q","S","H","Y","A"]],[71,["F","Y"]],[72,["T","S"]],[73,["L","F"]],[74,["T","K","N","S","R"]],[75,["I","V"]],[76,["N","S","H","T","D"]],[77,["S","R","P","N","G","D","T"]],[78,["V","L","M"]],[79,["Q","E","K"]],[80,["A","P","E","S","T","Q","C","Y"]],[81,["E","D"]],[82,["D"]],[83,["L","F","V","T","A","I","S","M"]],[84,["A","G"]],[85,["V","T","S","E","D","L","I","M"]],[86,["Y","F"]],[87,["Y","F","H"]],[88,["C"]],[89,["Q","W","F","L","H","M","G","A","K","S","V"]],[90,["N","Q","H","G"]],[91,["D","Y","G","F","I","S","W","R","T","A","N","H"]],[92,[]],[93,[]],[94,[]],[95,[]],[96,["L","Y","W","F","P","R","A","S","I","V","E","H","T"]],[97,["T","V","I","A","S","F","L"]],[98,["F"]],[99,["G"]],[100,["A","Q","S","G","P"]],[101,["G"]],[102,["T"]],[103,["K","R","E"]],[104,["L","V"]],[105,["E","V","D"]],[106,["L","I","V"]],[107,["K","R"]]],D=[[1,["Q","S"]],[2,["S","Y","P","A","L","F"]],[3,["A","V","E"]],[4,["L","V"]],[5,["T"]],[6,["Q"]],[7,["P","E","S"]],[8,["A","P","S","R"]],[9,["S","A"]],[10,[]],[11,["V","L","A"]],[12,["S","T"]],[13,["G","V","A","T","K","E","F"]],[14,["S","A","T"]],[15,["P","L"]],[16,["G"]],[17,["Q","E","K","A"]],[18,["S","T","K","R"]],[19,["I","A","V"]],[20,["T","R","S","K"]],[21,["I","L"]],[22,["S","T"]],[23,["C"]],[24,["T","G","Q","S","A","N","R"]],[25,["G","S","L","R"]],[26,["T","N","D","S"]],[27,["Q","T","N","S","K","A","R"]],[28,["S","I","L","N","G","Q"]],[29,["S","D","G","N","A","R","H"]],[30,[]],[31,["N","K","D","R","Y"]],[32,["F","S","L","A","Y","T","D","G","N"]],[33,["V","A","I"]],[34,["S","H","Q","C","N","Y","E"]],[35,["W"]],[36,["Y","F","V"]],[37,["Q"]],[38,["Q","H","E"]],[39,["H","K","R","L","F","V","Q"]],[40,["P","A","S"]],[41,["G","D","L"]],[42,["K","Q","T","R","H","S","A","M"]],[43,["A","S","L","P","G"]],[44,["P","F"]],[45,["K","V","S","R","T","I"]],[46,["L","V","G","Y","T"]],[47,["I","V","M","L"]],[48,["I","V","L","M"]],[49,["F","Y","G","S","E"]],[50,["D","A","N","E","Q","Y","G","V","R","L","K"]],[51,["V","D","N","T","K"]],[52,["T","S","Q","N","D","K"]],[53,["N","D","K","Q","E","S","H"]],[54,["R","T"]],[55,["P","A","G"]],[56,["S","P","D"]],[57,["G"]],[58,["I","V"]],[59,["S","P"]],[60,["N","E","A","D"]],[61,["R"]],[62,["F"]],[63,["S"]],[64,["G"]],[65,["S"]],[66,["K","N","P","L","I","S"]],[67,["S","D","I"]],[68,["G","A"]],[69,["N","T","D","S","A"]],[70,["T","K","S","R"]],[71,["A","R"]],[72,["S","T","A","Y"]],[73,["L"]],[74,["T","G","A","S"]],[75,["I","V"]],[76,["S","T"]],[77,["G","R","S","N"]],[78,["L","V","T","A","I"]],[79,["Q","E","R"]],[80,["A","S","P","T"]],[81,["E","G","M","D"]],[82,["D"]],[83,["E"]],[84,["A","G"]],[85,["D","I","E"]],[86,["Y"]],[87,["Y","F","I"]],[88,["C"]],[89,["A","Q","C","H","G","S"]],[90,["A","V","L","S","T","M"]],[91,["Y","W","L","R","G"]],[92,[]],[93,[]],[94,[]],[95,[]],[96,["L","V","W","R","P","Y","S","F","A"]],[97,["L","T","V","I","A","F","S"]],[98,["F"]],[99,["G"]],[100,["G","T","S"]],[101,["G"]],[102,["T"]],[103,["K","T","R","Q"]],[104,["V","L"]],[105,["T"]],[106,["V"]],[107,["L","K"]]],E=[[1,["Q","E","D"]],[2,["V","Q"]],[3,["Q","K","H","S","T"]],[4,["L","V"]],[5,["V","Q","L","E","K","T"]],[6,["E","Q","A"]],[7,["S","P","W"]],[8,[]],[9,["G","E"]],[10,["G","A","P","S"]],[11,["G","E","D","V"]],[12,["L","V"]],[13,["V","K","L"]],[14,["K","Q","R"]],[15,["P","A"]],[16,["G","S","T"]],[17,["G","A","E","Q","R","S","D"]],[18,["S","T"]],[19,["L","V"]],[20,["R","K","S","T"]],[21,["L","I","V","M"]],[22,["S","T"]],[23,["C"]],[24,["A","K","T","V","S"]],[25,["A","V","T","G","I"]],[26,["S","T","Y"]],[27,[]],[28,[]],[29,[]],[30,[]],[31,[]],[32,[]],[33,[]],[34,[]],[35,[]],[36,[]],[37,[]],[38,[]],[39,[]],[40,[]],[41,[]],[42,[]],[43,["W"]],[44,["V","I","F"]],[45,["R","K"]],[46,["Q"]],[47,["A","P","R","S","T","M","V"]],[48,["P","A","H"]],[49,["G","E","S","A"]],[50,["K","Q","R","N"]],[51,["G","A","R","S"]],[52,["L"]],[53,["E","Q"]],[54,["W","Y"]],[55,["I","V","K","M"]],[56,["A","G","S"]],[57,[]],[58,[]],[59,[]],[60,[]],[61,[]],[62,[]],[63,[]],[64,[]],[65,[]],[66,[]],[67,[]],[68,[]],[69,[]],[70,["Y"]],[71,["A","N","S","P","T","V","G"]],[72,["D","E","Q","A","S","P"]],[73,["S","K","A","W"]],[74,["F","V","L","A"]],[75,["K","Q","R","E"]],[76,["G","S","D","N"]],[77,["R","K","Q"]],[78,["F","V","A","L","I"]],[79,["T","S","I"]],[80,["I","L","M","V","F"]],[81,["S","T","N"]],[82,["R","V","A","K","L","P","T"]],[83,["D","N","E"]],[84,["N","T","K","D","E","S","R"]],[85,["S","A","P","D","N"]],[86,["K","S","T","A","E","I","R","Q","N","L"]],[87,["N","S","D","K","T"]],[88,["T","Q","S","I","M"]],[89,["L","A","V","F"]],[90,["Y","S","F","H","T","V"]],[91,["L","M"]],[92,["Q","E","K","D","T"]],[93,["L","M","I","V","W"]],[94,["A","C","D","G","H","K","L","N","R","S","T"]],[95,["A","G","H","K","N","R","S","T"]],[96,["L","M","P","V"]],[97,["R","T","K"]],[98,["A","S","T","V","P"]],[99,["E","A","D","G","S","V"]],[100,["D"]],[101,["T","S"]],[102,["A","G"]],[103,["V","T","I","L","M"]],[104,["Y"]],[105,["Y","F"]],[106,["C"]],[107,["A","G","S","D","E","N","T","V","I","L","K","R","Q","P","F","W","Y","M","H","C"]],[108,["A","G","S","D","E","N","T","V","I","L","K","R","Q","P","F","W","Y","M","H","C"]],[109,[]],[110,[]],[111,[]],[112,[]],[113,[]],[114,[]],[115,[]],[116,[]],[117,[]],[118,[]],[119,[]],[120,[]],[121,[]],[122,[]],[123,[]],[124,[]],[125,[]],[126,[]],[127,[]],[128,[]],[129,[]],[130,[]],[131,[]],[132,[]],[133,[]],[134,[]],[135,[]],[136,[]],[137,[]],[138,[]],[139,["W"]],[140,["G"]],[141,["Q","P","R","K","A","T"]],[142,["G"]],[143,["T","V","A","I"]],[144,["L","T","M","S","Q","P"]],[145,["V","L","I"]],[146,["T","I","V"]],[147,["V"]],[148,["S","T"]],[149,["S","A"]]],r=[[1,["D","E","Q","N","A"]],[2,["I","V","L"]],[3,["V","Q","L","E","K"]],[4,["M","L","V","I"]],[5,["T","S"]],[6,["Q"]],[7,["S","T","A","I"]],[8,["P","Q","T","A","H"]],[9,["S","G","L","A","D","K","F","P","V"]],[10,["S","T","F","I"]],[11,["L","M","N","Q","V"]],[12,["T","S","A","P","Y"]],[13,["V","L","A","T","M"]],[14,["T","S","A"]],[15,["A","P","I","V","L"]],[16,["G"]],[17,["E","Q","D","G","T"]],[18,["K","R","P","T","Q","S"]],[19,["V","A","I"]],[20,["T","S"]],[21,["M","L","I","F"]],[22,["S","T","N"]],[23,["C"]],[24,["K","R","Q","S"]],[25,["S","A","T","C"]],[26,["S","T","G"]],[27,[]],[28,[]],[29,[]],[30,[]],[31,[]],[32,[]],[33,[]],[34,[]],[35,[]],[36,[]],[37,[]],[38,[]],[39,[]],[40,[]],[41,["L","M","I","V","F"]],[42,["T","A","N","H","E","G","Q","Y","S","D"]],[43,["W"]],[44,["Y","L","F"]],[45,["Q","L","R"]],[46,["Q","H","E"]],[47,["K","R"]],[48,["P","Q","S","T"]],[49,["G","E","D","H","N"]],[50,["Q","K","S","T","G","E","R"]],[51,["P","A","S","T","V"]],[52,["P","I","V"]],[53,["K","R","Q","E","I","T"]],[54,["L","R","T","P","V","A"]],[55,["L","W"]],[56,["I","V","M"]],[57,["Y","K","H","S","F"]],[58,[]],[59,[]],[60,[]],[61,[]],[62,[]],[63,[]],[64,[]],[65,[]],[66,[]],[67,[]],[68,[]],[69,[]],[70,["R","L","S"]],[71,["E","A","D","Q","F","R","Y","H","I","K","P","G","V"]],[72,["S","T","D","P","A","E"]],[73,["G"]],[74,["V","I"]],[75,["P","S","A"]],[76,["D","S","A","V","K","G"]],[77,["R"]],[78,["F"]],[79,["T","S","I","K","R"]],[80,["G","S","A"]],[81,["S","G","R"]],[82,["G","R"]],[83,["S","Y"]],[84,["G","R","A"]],[85,["A","F","P","S","Y"]],[86,["A","D","E","G","Q","R","V"]],[87,["T","R","S","Q"]],[88,["D","E","Q","S","H","Y","A"]],[89,["F","Y"]],[90,["T","S"]],[91,["L","F"]],[92,["T","K","N","S","R"]],[93,["I","V"]],[94,["N","S","H","T","D"]],[95,["S","R","P","N","G","D","T"]],[96,["V","L","M"]],[97,["Q","E","K"]],[98,["A","P","E","S","T","Q","C","Y"]],[99,["E","D"]],[100,["D"]],[101,["L","F","V","T","A","I","S","M"]],[102,["A","G"]],[103,["V","T","S","E","D","L","I","M"]],[104,["Y","F"]],[105,["Y","F","H"]],[106,["C"]],[107,[]],[108,[]],[109,[]],[110,[]],[111,[]],[112,[]],[113,[]],[114,[]],[115,[]],[116,[]],[117,[]],[118,[]],[119,[]],[120,[]],[121,[]],[122,[]],[123,[]],[124,[]],[125,[]],[126,[]],[127,[]],[128,[]],[129,[]],[130,[]],[131,[]],[132,[]],[133,[]],[134,[]],[135,[]],[136,[]],[137,[]],[138,[]],[139,["F"]],[140,["G"]],[141,["A","Q","S","G","P"]],[142,["G"]],[143,["T"]],[144,["K","R","E"]],[145,["L","V"]],[146,["E","V","D"]],[147,["L","I","V"]],[148,["K","R"]],[149,["R","G"]]],F=[[1,["Q","S"]],[2,["S","Y","P","A","L","F"]],[3,["A","V","E"]],[4,["L","V"]],[5,["T"]],[6,["Q"]],[7,["P","E","S"]],[8,[]],[9,["A","P","S","R"]],[10,["S","A"]],[11,["V","L","A"]],[12,["S","T"]],[13,["G","V","A","T","K","E","F"]],[14,["S","A","T"]],[15,["P","L"]],[16,["G"]],[17,["Q","E","K","A"]],[18,["S","T","K","R"]],[19,["I","A","V"]],[20,["T","R","S","K"]],[21,["I","L"]],[22,["S","T"]],[23,["C"]],[24,["T","G","Q","S","A","N","R"]],[25,["G","S","L","R"]],[26,["T","N","D","S"]],[27,[]],[28,[]],[29,[]],[30,[]],[31,[]],[32,[]],[33,[]],[34,[]],[35,[]],[36,[]],[37,[]],[38,[]],[39,[]],[40,[]],[41,["V","A","I"]],[42,["S","H","Q","C","N","Y","E"]],[43,["W"]],[44,["Y","F","V"]],[45,["Q"]],[46,["Q","H","E"]],[47,["H","K","R","L","F","V","Q"]],[48,["P","A","S"]],[49,["G","D","L"]],[50,["K","Q","T","R","H","S","A","M"]],[51,["A","S","L","P","G"]],[52,["P","F"]],[53,["K","V","S","R","T","I"]],[54,["L","V","G","Y","T"]],[55,["I","V","M","L"]],[56,["I","V","L","M"]],[57,["F","Y","G","S","E"]],[58,[]],[59,[]],[60,[]],[61,[]],[62,[]],[63,[]],[64,[]],[65,[]],[66,[]],[67,[]],[68,[]],[69,["N","D","K","Q","E","S","H"]],[70,["R","T"]],[71,["P","A","G"]],[72,["S","P","D"]],[73,["G"]],[74,["I","V"]],[75,["S","P"]],[76,["N","E","A","D"]],[77,["R"]],[78,["F"]],[79,["S"]],[80,["G"]],[81,["S"]],[82,["K","N","P","L","I","S"]],[83,["F","S","I"]],[84,["G","A","S"]],[85,["A","I","L","S","T","W"]],[86,["A","D","E","G","S","T"]],[87,["N","T","D","S","A"]],[88,["T","K","S","R"]],[89,["A","R"]],[90,["S","T","A","Y"]],[91,["L"]],[92,["T","G","A","S"]],[93,["I","V"]],[94,["S","T"]],[95,["G","R","S","N"]],[96,["L","V","T","A","I"]],[97,["Q","E","R"]],[98,["A","S","P","T"]],[99,["E","G","M","D"]],[100,["D"]],[101,["E"]],[102,["A","G"]],[103,["D","I","E"]],[104,["Y"]],[105,["Y","F","I"]],[106,["C"]],[107,[]],[108,[]],[109,[]],[110,[]],[111,[]],[112,[]],[113,[]],[114,[]],[115,[]],[116,[]],[117,[]],[118,[]],[119,[]],[120,[]],[121,[]],[122,[]],[123,[]],[124,[]],[125,[]],[126,[]],[127,[]],[128,[]],[129,[]],[130,[]],[131,[]],[132,[]],[133,[]],[134,[]],[135,[]],[136,[]],[137,[]],[138,[]],[139,["F"]],[140,["G"]],[141,["G","T","S"]],[142,["G"]],[143,["T"]],[144,["K","T","R","Q"]],[145,["V","L"]],[146,["T"]],[147,["V"]],[148,["L","K"]],[149,["R","G"]]];function P(S,T){return{imgt_H:V,imgt_K:t,imgt_L:R,kabat_H:L,kabat_K:K,kabat_L:I,chothia_H:Q,chothia_K:o,chothia_L:D,aho_H:E,aho_K:r,aho_L:F}[`${S}_${T}`]??V}function i(S){return{H:n,K:e,L:G}[S]}const N=[[4,-1,-2,-2,0,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-3,-2,0],[-1,5,0,-2,-3,1,0,-2,0,-3,-2,2,-1,-3,-2,-1,-1,-3,-2,-3],[-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3],[-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3],[0,-3,-3,-3,9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1],[-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2],[-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2],[0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3],[-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3],[-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3],[-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1],[-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2],[-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1],[-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1],[-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2],[1,-1,1,0,-1,0,0,0,-1,-2,-2,0,-1,-2,-1,4,1,-3,-2,-2],[0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0],[-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3],[-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1],[0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4]],s=new Map;for(let S=0;S<20;S++)s.set("ARNDCQEGHILKMFPSTWYV"[S],S);function Y(S,T){const A=s.get(S),V=s.get(T);return void 0===A||void 0===V?-4:N[A][V]}function c(S,T){if(0===T.length)return 1;if(T.includes(S))return 6;let A=-10;for(const V of T){const T=1*Y(S,V);T>A&&(A=T)}return A}function M(S,T){const A=S.length,V=T.length,t=-1e9,R=Array.from({length:A+1},()=>new Float64Array(V+1)),n=Array.from({length:A+1},()=>new Float64Array(V+1)),e=Array.from({length:A+1},()=>new Float64Array(V+1)),G=Array.from({length:A+1},()=>new Uint8Array(V+1)),L=Array.from({length:A+1},()=>new Uint8Array(V+1)),K=Array.from({length:A+1},()=>new Uint8Array(V+1));R[0][0]=0,n[0][0]=t,e[0][0]=t;for(let S=1;S<=V;S++){const A=0===T[S-1][1].length;R[0][S]=t,n[0][S]=t,e[0][S]=A?e[0][S-1]:e[0][S-1]+-.6,1===S&&(e[0][S]=A?0:-3),K[0][S]=2}for(let S=1;S<=A;S++)R[S][0]=t,e[S][0]=t,n[S][0]=n[S-1][0]+-.6,1===S&&(n[S][0]=-3),L[S][0]=1;for(let t=1;t<=A;t++){const A=S[t-1];for(let S=1;S<=V;S++){const[,V]=T[S-1],I=0===V.length,Q=c(A,V),o=R[t-1][S-1]+Q,D=n[t-1][S-1]+Q,E=e[t-1][S-1]+Q;o>=D&&o>=E?(R[t][S]=o,G[t][S]=0):D>=E?(R[t][S]=D,G[t][S]=1):(R[t][S]=E,G[t][S]=2);const r=I?-6:-10,F=I?0:-2,P=R[t-1][S]+r,i=n[t-1][S]+F;P>=i?(n[t][S]=P,L[t][S]=0):(n[t][S]=i,L[t][S]=1);const N=I?0:-10,s=I?0:-2,Y=R[t][S-1]+N,M=e[t][S-1]+s;Y>=M?(e[t][S]=Y,K[t][S]=0):(e[t][S]=M,K[t][S]=2)}}let I=t,Q=A,o=V,D="M";for(let S=0;S<=A;S++)for(const[T,A]of[["M",R],["X",n],["Y",e]])A[S][V]>I&&(I=A[S][V],D=T,Q=S,o=V);for(let S=0;S<V;S++){let t=0;for(let A=S;A<V;A++)T[A][1].length>0&&t++;const G=3*t;for(const[T,V]of[["M",R],["X",n],["Y",e]])V[A][S]-G>I&&(I=V[A][S]-G,D=T,Q=A,o=S)}const E=[];let r=Q,F=o,P=D;for(let S=A;S>Q;S--)E.push([S-1,-1]);for(;r>0||F>0;)if("M"===P){if(0===r&&0===F)break;if(0===r||0===F){r>0?(E.push([r-1,-1]),r--,P="X"):(F--,P="Y");continue}E.push([r-1,F-1]);const S=G[r][F];r--,F--,P=0===S?"M":1===S?"X":"Y"}else if("X"===P){if(0===r)break;E.push([r-1,-1]);const S=L[r][F];r--,P=0===S?"M":"X"}else{if(0===F)break;const S=K[r][F];F--,P=0===S?"M":"Y"}for(;r>0;)E.push([r-1,-1]),r--;E.reverse();const i=new Array(A).fill("-");let N=0;const s=T.filter(S=>S[1].length>0).length,Y=new Set;for(const[S,A]of E)if(A>=0&&S>=0){const[V]=T[A];i[S]=String(V),Y.add(A),T[A][1].length>0&&N++}let M=-1,H=-1;for(const[S,T]of E)T>=0&&S>=0&&(-1===M&&(M=S),H=S);const a=new Map;for(let S=0;S<A;S++){if("-"!==i[S])continue;if(S<M||S>H)continue;let T="";for(let A=S-1;A>=0;A--)if("-"!==i[A]){T=i[A];break}if(T){const A=T.replace(/[A-Z]$/,""),V=(a.get(A)??0)+1;a.set(A,V);const t=String.fromCharCode(64+V);i[S]=A+t}}return{positionCodes:i,matchedPositions:N,totalProfilePositions:s}}function H(S,T,A){const V=new Map;for(const[S,T]of A)T.length>0&&V.set(S,T);let t=0,R=0;for(let A=0;A<S.length;A++){const n=T[A];if("-"===n)continue;const e=parseInt(n,10);if(isNaN(e))continue;const G=V.get(e);G&&0!==G.length&&(R++,G.includes(S[A])&&t++)}return R>0?t/R:0}function a(S,T,A){const V=new Map;for(let A=0;A<S.length;A++){const t=T[A];if("-"===t)continue;const R=parseInt(t,10);isNaN(R)||V.set(R,S[A])}const t=[];for(const[S,T]of A)1===T.length&&"C"===T[0]&&t.push(S);for(const S of t){const T=V.get(S);if(T&&"C"!==T)return`Expected conserved Cys at position ${S}, found ${T}`}return""}function f(S,T){const A=i(T),V=A.length;if(S.length<V)return-1;let t=-1/0,R=-1;for(let T=Math.max(0,Math.floor(.3*S.length));T<=S.length-V;T++){let n=0;for(let t=0;t<V;t++){const V=S[T+t];A[t][1].includes(V)?n+=3:n-=1}n>t&&(t=n,R=T)}return t>=1.5*V?R:-1}const l={Heavy:[["FR1",1,26],["CDR1",27,38],["FR2",39,55],["CDR2",56,65],["FR3",66,104],["CDR3",105,117],["FR4",118,128]],Light:[["FR1",1,26],["CDR1",27,38],["FR2",39,55],["CDR2",56,65],["FR3",66,104],["CDR3",105,117],["FR4",118,127]]},u={imgt:l,kabat:{Heavy:[["FR1",1,30],["CDR1",31,35],["FR2",36,49],["CDR2",50,65],["FR3",66,94],["CDR3",95,102],["FR4",103,113]],Light:[["FR1",1,23],["CDR1",24,34],["FR2",35,49],["CDR2",50,56],["FR3",57,88],["CDR3",89,97],["FR4",98,107]]},chothia:{Heavy:[["FR1",1,25],["CDR1",26,32],["FR2",33,51],["CDR2",52,56],["FR3",57,94],["CDR3",95,102],["FR4",103,113]],Light:[["FR1",1,25],["CDR1",26,32],["FR2",33,49],["CDR2",50,52],["FR3",53,90],["CDR3",91,96],["FR4",97,107]]},aho:{Heavy:[["FR1",1,24],["CDR1",25,40],["FR2",41,55],["CDR2",56,78],["FR3",79,108],["CDR3",109,138],["FR4",139,149]],Light:[["FR1",1,24],["CDR1",25,40],["FR2",41,55],["CDR2",56,78],["FR3",79,108],["CDR3",109,138],["FR4",139,149]]}},h=new Set("ACDEFGHIKLMNPQRSTVWY");function C(S){if(!S)return"";const T=S.trim().replace(/[-.\s]/g,"");return Array.from(T.toUpperCase()).filter(S=>h.has(S)).join("")}function g(S,T="imgt",A=["H","K","L"]){return S.map(S=>function(S,T="imgt",A=["H","K","L"]){const V=C(S);if(!V)return W("Empty or invalid sequence");if(V.length<10)return W("Sequence too short (minimum 10 residues)");const t=function(S,T,A=["H","K","L"]){if(!S||S.length<10)return{numbering:[],percentIdentity:0,chainType:"H",error:"Sequence too short"};const V=new Map;for(const T of A){const A=f(S,T);A>=0&&V.set(T,A)}const t=V.get("H")??-1,R=V.get("K")??-1,n=V.get("L")??-1,e=Math.max(R,n),G=R>=n?"K":"L",L=new Map;if(t>=0&&e>=0&&Math.abs(t-e)>80&&e<t){const S=i(G).length;L.set("H",e+S)}const K=t>=0&&e>=0&&Math.abs(t-e)>80;let I=null,Q=-1,o=null,D=-1;for(const t of A){const A=P(T,t);let R=S,n=0;const e=V.get(t)??-1,G=i(t).length;if(e>=0){const T=Math.min(S.length,e+G+5);R=S.substring(0,T)}const K=L.get(t);if(void 0!==K&&K>0&&K<R.length-80)n=K,R=R.substring(K);else if(R.length>180){const S=[0],T=A.slice(0,5).map(S=>S[1]).flat();for(let A=1;A<Math.min(30,R.length-80);A++)if(T.includes(R[A])){S.push(A);break}let V=-1,t=0;for(const T of S){const S=R.substring(T),n=H(S,M(S,A).positionCodes,A);n>V&&(V=n,t=T)}t>0&&(n=t,R=R.substring(n))}const E=M(R,A),r=H(R,E.positionCodes,A),F=new Array(S.length).fill("-");for(let S=0;S<R.length;S++)F[n+S]=E.positionCodes[S];if("kabat"===T&&"H"===t){const S=[];for(let T=0;T<F.length;T++){if("-"===F[T])continue;const A=parseInt(F[T],10);!isNaN(A)&&A>=31&&A<=35&&S.push(T)}if(S.length>5)for(let T=0;T<S.length;T++)F[S[T]]=T<5?String(31+T):"35"+String.fromCharCode(64+T-4)}const N=a(R,E.positionCodes,A),s={numbering:F,percentIdentity:r,chainType:t,error:r<.3?"Low sequence identity; may not be an antibody variable region":N||""};"H"===t&&(o=s,D=r),r>Q&&(Q=r,I=s)}return K&&I&&"H"!==I.chainType&&o&&D>.9&&Q-D<.05&&(I=o),I}(V,T,A);if(t.error&&t.percentIdentity<.3)return W(t.error);const R="H"===t.chainType?"Heavy":"Light",n=[],e=[],G={};for(let S=0;S<V.length;S++){const T=t.numbering[S];"-"!==T&&(e.push(T),n.push({position:T,aa:V[S]}),G[T]=S)}const L=function(S,T){return u[S]?.[T]??l.Heavy}(T,R),K=L.map(([S,A,V])=>({id:`${T}-${R}-${S}`.toLowerCase(),name:S,description:`${S} (${T.toUpperCase()} ${A}-${V})`,start:String(A),end:String(V),visualType:"region",category:"structure",sourceScheme:T.toUpperCase(),autoGenerated:!0}));return{positionNames:e.join(", "),chainType:R,chainTypeCode:t.chainType,annotations:K,numberingDetail:n,numberingMap:G,percentIdentity:t.percentIdentity,error:t.error,numbering:t.numbering}}(S,T,A))}function W(S){return{positionNames:"",chainType:"Heavy",chainTypeCode:"",annotations:[],numberingDetail:[],numberingMap:{},percentIdentity:0,error:S,numbering:[]}}}}]);
|
|
2
|
-
//# sourceMappingURL=767.js.map
|