extensions/net.sf.basedb.reggie/trunk/resources/analysis/view_variants.js

Code
Comments
Other
Rev Date Author Line
5730 18 Nov 19 nicklas 1 var ViewVariants = function()
5730 18 Nov 19 nicklas 2 {
5730 18 Nov 19 nicklas 3   var vgt = {};
5730 18 Nov 19 nicklas 4   var debug = 0;
5730 18 Nov 19 nicklas 5   
6387 15 Sep 21 nicklas 6   var AA = [
6387 15 Sep 21 nicklas 7     ['A', /Ala/g], // Alanine   GCA, GCC, GCG, GCT
6387 15 Sep 21 nicklas 8     ['B', /Asx/g], // Asparagine or Aspartic acid   AAC, AAT, GAC, GAT
6387 15 Sep 21 nicklas 9     ['C', /Cys/g], // Cysteine   TGC, TGT
6387 15 Sep 21 nicklas 10     ['D', /Asp/g], // Aspartic acid   GAC, GAT
6387 15 Sep 21 nicklas 11     ['E', /Glu/g], // Glutamic acid   GAA, GAG
6387 15 Sep 21 nicklas 12     ['F', /Phe/g], // Phenylalanine   TTC, TTT
6387 15 Sep 21 nicklas 13     ['G', /Gly/g], // Glycine   GGA, GGC, GGG, GGT
6387 15 Sep 21 nicklas 14     ['H', /His/g], // Histidine   CAC, CAT
6387 15 Sep 21 nicklas 15     ['I', /Ile/g], // Isoleucine   ATA, ATC, ATT
6387 15 Sep 21 nicklas 16     ['K', /Lys/g], // Lysine   AAA, AAG
6387 15 Sep 21 nicklas 17     ['L', /Leu/g], // Leucine   CTA, CTC, CTG, CTT, TTA, TTG
6387 15 Sep 21 nicklas 18     ['M', /Met/g], // Methionine   ATG
6387 15 Sep 21 nicklas 19     ['N', /Asn/g], // Asparagine   AAC, AAT
6387 15 Sep 21 nicklas 20     ['P', /Pro/g], // Proline   CCA, CCC, CCG, CCT
6387 15 Sep 21 nicklas 21     ['Q', /Gln/g], // Glutamine   CAA, CAG
6387 15 Sep 21 nicklas 22     ['R', /Arg/g], // Arginine   AGA, AGG, CGA, CGC, CGG, CGT
6387 15 Sep 21 nicklas 23     ['S', /Ser/g], // Serine   AGC, AGT, TCA, TCC, TCG, TCT
6387 15 Sep 21 nicklas 24     ['T', /Thr/g], // Threonine   ACA, ACC, ACG, ACT
6387 15 Sep 21 nicklas 25     ['V', /Val/g], // Valine   GTA, GTC, GTG, GTT
6387 15 Sep 21 nicklas 26     ['W', /Trp/g], // Tryptophan   TGG
6387 15 Sep 21 nicklas 27     ['Y', /Tyr/g], // Tyrosine   TAC, TAT
6387 15 Sep 21 nicklas 28     ['Z', /Glx/g], // Glutamine or Glutamic acid   CAA, CAG, GAA, GAG
6387 15 Sep 21 nicklas 29     ['*', /Ter/g]  // Stop codon
6387 15 Sep 21 nicklas 30   ]
6387 15 Sep 21 nicklas 31
6387 15 Sep 21 nicklas 32   
5730 18 Nov 19 nicklas 33   vgt.initPage = function()
5730 18 Nov 19 nicklas 34   {
5730 18 Nov 19 nicklas 35     Buttons.addClickHandler('close', App.closeWindow);
5730 18 Nov 19 nicklas 36     
5730 18 Nov 19 nicklas 37     var url = '../VariantCalling.servlet?ID='+App.getSessionId();
5730 18 Nov 19 nicklas 38     url += '&cmd=GetVcfStatistics';
5730 18 Nov 19 nicklas 39     url += '&fileId='+Data.int('page-data', 'file-id');
5730 18 Nov 19 nicklas 40     url += '&itemId='+Data.int('page-data', 'item-id');
5730 18 Nov 19 nicklas 41     
5730 18 Nov 19 nicklas 42     Wizard.showLoadingAnimation('Loading VCF file...');
5730 18 Nov 19 nicklas 43     Wizard.asyncJsonRequest(url, vgt.onFilesLoaded);
5730 18 Nov 19 nicklas 44   }
5730 18 Nov 19 nicklas 45   
5730 18 Nov 19 nicklas 46   vgt.onFilesLoaded = function(response)
5730 18 Nov 19 nicklas 47   {
5730 18 Nov 19 nicklas 48     var rba = response.rawbioassay;
5730 18 Nov 19 nicklas 49     var snpData = response.snpData;
6387 15 Sep 21 nicklas 50     var target = response.TargetedGenotype;
5730 18 Nov 19 nicklas 51     
6391 15 Sep 21 nicklas 52     var varSearchHome = Data.get('page-data', 'varsearch-home');
6391 15 Sep 21 nicklas 53     
5812 16 Jan 20 nicklas 54     var numIns = 0;
5812 16 Jan 20 nicklas 55     var numDel = 0;
5812 16 Jan 20 nicklas 56     var numSnv = 0;
6387 15 Sep 21 nicklas 57     var numAlt = 0;
5812 16 Jan 20 nicklas 58     
5730 18 Nov 19 nicklas 59     var html = '';
5730 18 Nov 19 nicklas 60     for (var snpNo = 0; snpNo < snpData.length; snpNo++)
5730 18 Nov 19 nicklas 61     {
6387 15 Sep 21 nicklas 62       var snp = snpData[snpNo].snp;
6387 15 Sep 21 nicklas 63       var gt = snpData[snpNo].gt || { 'GT': '', 'AD': '' };;
5730 18 Nov 19 nicklas 64       var info = snp.info;
5735 19 Nov 19 nicklas 65       var cosmicId = info['cosmic_ID'];
5805 09 Jan 20 nicklas 66       var dbSnpId = info['dbsnp_ID'];
5812 16 Jan 20 nicklas 67       var type = info['TYPE'];
6394 16 Sep 21 nicklas 68       var isAlt = gt.GT && gt.GT != '0/0';
6394 16 Sep 21 nicklas 69       var isNoData = !gt.GT;
6387 15 Sep 21 nicklas 70       if (isAlt) numAlt++;
5812 16 Jan 20 nicklas 71       if (type == 'SNV') numSnv++;
5812 16 Jan 20 nicklas 72       else if (type == 'Insertion') numIns++;
5812 16 Jan 20 nicklas 73       else if (type == 'Deletion') numDel++;
6394 16 Sep 21 nicklas 74       html += '<tr class="snp highlight'+(target && isAlt?' is-variant':'')+(isNoData?' no-data':'')+'">';
5730 18 Nov 19 nicklas 75       html += '<td>'+Strings.encodeTags(snp.chromosome+':'+snp.position)+'</td>';
5812 16 Jan 20 nicklas 76       html += '<td class="dottedleft ref">'+vgt.getRefAndAlt(snp.ref, snp.alt)+'</td>';
5812 16 Jan 20 nicklas 77       html += '<td class="dottedleft">'+Strings.encodeTags(type)+'</td>';
5812 16 Jan 20 nicklas 78       html += '<td class="dottedleft">'+vgt.getGenes(info['ncbiRefSeq'])+'</td>';
6387 15 Sep 21 nicklas 79       html += '<td class="dottedleft gt">'+(gt.GT||'./.')+'</td>';
6387 15 Sep 21 nicklas 80       html += '<td class="dottedleft ad">'+gt.AD+'</td>';
6387 15 Sep 21 nicklas 81       html += '<td class="dottedleft">'+vgt.getHGVSc(info['ANN.HGVS.c[0]'] || info['cosmic_CDS'])+'</td>';
6387 15 Sep 21 nicklas 82       html += '<td class="dottedleft">'+vgt.getHGVSp(info['ANN.HGVS.p[0]'] || info['cosmic_AA'])+'</td>';
5730 18 Nov 19 nicklas 83       html += '<td class="dottedleft">'+vgt.getCosmicLink(cosmicId)+'</td>';
5805 09 Jan 20 nicklas 84       html += '<td class="dottedleft">'+vgt.getDbSnpLink(dbSnpId)+'</td>';
6391 15 Sep 21 nicklas 85       html += '<td class="zoom">';
6391 15 Sep 21 nicklas 86       if (varSearchHome)
6391 15 Sep 21 nicklas 87       {
6391 15 Sep 21 nicklas 88         html += '<img src="'+varSearchHome+'/images/zoom.svg" class="link view-variant" data-line-no="'+snp.id+'" title="More information...">';
6391 15 Sep 21 nicklas 89       }
6391 15 Sep 21 nicklas 90       html += '</td>';
5730 18 Nov 19 nicklas 91       html += '</tr>';
5730 18 Nov 19 nicklas 92     }
5730 18 Nov 19 nicklas 93     Doc.element('snp-list').innerHTML = html;
5730 18 Nov 19 nicklas 94     Doc.show('snp-table', 'table');
6387 15 Sep 21 nicklas 95     
6391 15 Sep 21 nicklas 96     var zoom = document.getElementsByClassName('view-variant');
6391 15 Sep 21 nicklas 97     for (var zoomNo = 0; zoomNo < zoom.length; zoomNo++)
6391 15 Sep 21 nicklas 98     {
6391 15 Sep 21 nicklas 99       Events.addEventHandler(zoom[zoomNo], 'click', vgt.viewVariantInVarSearch);
6391 15 Sep 21 nicklas 100     }
6391 15 Sep 21 nicklas 101     
6387 15 Sep 21 nicklas 102     if (target)
6387 15 Sep 21 nicklas 103     {
6387 15 Sep 21 nicklas 104       Doc.element('targeted-genotype').innerHTML = Strings.encodeTags(target.description);
6387 15 Sep 21 nicklas 105     }
6387 15 Sep 21 nicklas 106     
6387 15 Sep 21 nicklas 107     var summary = '';
6387 15 Sep 21 nicklas 108     if (Data.get('page-data', 'mode')=='genotype')
6387 15 Sep 21 nicklas 109     {
6387 15 Sep 21 nicklas 110       summary = 'Found '+vgt.counted(numAlt, 'variant', 'variants')
6387 15 Sep 21 nicklas 111         + ' in '+vgt.counted(snpData.length, 'genotyped location', 'genotyped locations');
6387 15 Sep 21 nicklas 112     }
6387 15 Sep 21 nicklas 113     else
6387 15 Sep 21 nicklas 114     {
6387 15 Sep 21 nicklas 115       summary = snpData.length + ' passed filter ('
6387 15 Sep 21 nicklas 116         + numSnv + ' SNV; '
6387 15 Sep 21 nicklas 117         + vgt.counted(numIns, 'insertion', ' insertions')+'; '
6387 15 Sep 21 nicklas 118         + vgt.counted(numDel, 'deletion', ' deletions')+'); '
6387 15 Sep 21 nicklas 119         + vgt.counted(rba.VariantsRaw, 'raw variant', ' raw variants');      
6387 15 Sep 21 nicklas 120     }
6387 15 Sep 21 nicklas 121     Doc.element('snp-count').innerHTML = summary;
5730 18 Nov 19 nicklas 122   }
5730 18 Nov 19 nicklas 123   
6391 15 Sep 21 nicklas 124   vgt.viewVariantInVarSearch = function(event)
6391 15 Sep 21 nicklas 125   {
6391 15 Sep 21 nicklas 126     var url = Data.get('page-data', 'varsearch-home')+'/hit-details.jsp';
6391 15 Sep 21 nicklas 127     url += '?ID='+App.getSessionId();
6391 15 Sep 21 nicklas 128     url += '&rbaId='+Data.int('page-data', 'item-id');
6391 15 Sep 21 nicklas 129     url += '&fileId='+Data.int('page-data', 'file-id');
6391 15 Sep 21 nicklas 130     
6391 15 Sep 21 nicklas 131     url += '&lineNo='+Data.get(event.currentTarget, 'line-no');
6391 15 Sep 21 nicklas 132     url += '&idx='+(Data.get('page-data', 'mode')=='genotype'?'targeted':'filtered');
6391 15 Sep 21 nicklas 133
6391 15 Sep 21 nicklas 134     Dialogs.openPopup(url, 'VarSearchHit', 600, 400);
6391 15 Sep 21 nicklas 135   }
6391 15 Sep 21 nicklas 136   
5730 18 Nov 19 nicklas 137   vgt.getAnnValues = function(info, key)
5730 18 Nov 19 nicklas 138   {
5730 18 Nov 19 nicklas 139     var list = [];
5730 18 Nov 19 nicklas 140     var numAnnEntries = info['ANN#'];
5730 18 Nov 19 nicklas 141     for (var i = 0; i < numAnnEntries; i++)
5730 18 Nov 19 nicklas 142     {
5730 18 Nov 19 nicklas 143       var val = info['ANN.'+key+'['+i+']'];
5730 18 Nov 19 nicklas 144       if (val) list[list.length] = val;
5730 18 Nov 19 nicklas 145     }
5730 18 Nov 19 nicklas 146     
5730 18 Nov 19 nicklas 147     return Strings.encodeTags(list.join(', '));
5730 18 Nov 19 nicklas 148   }
5730 18 Nov 19 nicklas 149   
5812 16 Jan 20 nicklas 150   vgt.getGenes = function(genes)
5812 16 Jan 20 nicklas 151   {
5812 16 Jan 20 nicklas 152     if (!genes) return '';
5812 16 Jan 20 nicklas 153     return Strings.encodeTags(genes.split(',').join(', '));
5812 16 Jan 20 nicklas 154   }
5812 16 Jan 20 nicklas 155   
6387 15 Sep 21 nicklas 156   vgt.getHGVSc = function(hgvsc)
6387 15 Sep 21 nicklas 157   {
6387 15 Sep 21 nicklas 158     if (!hgvsc) return '';
6387 15 Sep 21 nicklas 159     return hgvsc.replace(/c\./g, '').split(',').join(', ');
6387 15 Sep 21 nicklas 160   }
6387 15 Sep 21 nicklas 161
6387 15 Sep 21 nicklas 162   vgt.getHGVSp = function(hgvsp)
6387 15 Sep 21 nicklas 163   {
6387 15 Sep 21 nicklas 164     if (!hgvsp) return '';
6387 15 Sep 21 nicklas 165     
6387 15 Sep 21 nicklas 166     hgvsp = hgvsp.replace(/p\./g, ''); // Remove 'p.' prefix
6387 15 Sep 21 nicklas 167     hgvsp = hgvsp.replace(/\?/g, ''); // Remove '?'
6387 15 Sep 21 nicklas 168     
6387 15 Sep 21 nicklas 169     for (var i = 0; i < AA.length; i++)
6387 15 Sep 21 nicklas 170     {
6387 15 Sep 21 nicklas 171       hgvsp = hgvsp.replace(AA[i][1], AA[i][0]);
6387 15 Sep 21 nicklas 172     }
6387 15 Sep 21 nicklas 173     
6387 15 Sep 21 nicklas 174     var all = hgvsp.split(',');
6387 15 Sep 21 nicklas 175     for (var i = 0; i < all.length; i++)
6387 15 Sep 21 nicklas 176     {
6387 15 Sep 21 nicklas 177       var aa = all[i];
6387 15 Sep 21 nicklas 178       if (aa=='') 
6387 15 Sep 21 nicklas 179       {
6387 15 Sep 21 nicklas 180         all.splice(i, 1); // Skip empty entries
6387 15 Sep 21 nicklas 181         i--;
6387 15 Sep 21 nicklas 182       }
6387 15 Sep 21 nicklas 183       else if (aa.length > 2 && aa.charAt(0)==aa.charAt(aa.length-1)) 
6387 15 Sep 21 nicklas 184       {
6387 15 Sep 21 nicklas 185         all[i] = aa.substring(0, aa.length-2)+'=';
6387 15 Sep 21 nicklas 186       }
6387 15 Sep 21 nicklas 187     }
6387 15 Sep 21 nicklas 188     return all.join(', ');
6387 15 Sep 21 nicklas 189   }
6387 15 Sep 21 nicklas 190
6387 15 Sep 21 nicklas 191   
5812 16 Jan 20 nicklas 192   vgt.getRefAndAlt = function(ref, alt)
5812 16 Jan 20 nicklas 193   {
5812 16 Jan 20 nicklas 194     if (ref.length > 6) ref = '<span title="'+ref+'">'+ref.substring(0, 5)+'...</span>';
5812 16 Jan 20 nicklas 195     if (alt.length > 6) alt = '<span title="'+alt+'">'+alt.substring(0, 5)+'...</span>';
5812 16 Jan 20 nicklas 196     return ref + ' › ' + alt;
5812 16 Jan 20 nicklas 197   }
5812 16 Jan 20 nicklas 198   
5730 18 Nov 19 nicklas 199   vgt.getCosmicLink = function(cosmicId)
5730 18 Nov 19 nicklas 200   {
5730 18 Nov 19 nicklas 201     if (!cosmicId) return '';
5730 18 Nov 19 nicklas 202
5730 18 Nov 19 nicklas 203     var tmp = cosmicId.split(',');
5730 18 Nov 19 nicklas 204     var links = [];
5730 18 Nov 19 nicklas 205     for (var i = 0; i < tmp.length; i++)
5730 18 Nov 19 nicklas 206     {
5730 18 Nov 19 nicklas 207       var link = '<a target="_blank" title="View in COSMIC (new window)"';
5730 18 Nov 19 nicklas 208       link += ' href="https://cancer.sanger.ac.uk/cosmic/search?q='+encodeURIComponent(tmp[i])+'">';
5730 18 Nov 19 nicklas 209       link += Strings.encodeTags(tmp[i])+'</a>';
5730 18 Nov 19 nicklas 210       
5730 18 Nov 19 nicklas 211       links[i] = link;
5730 18 Nov 19 nicklas 212     }
5730 18 Nov 19 nicklas 213     return links.join(', ');
5730 18 Nov 19 nicklas 214   }
5730 18 Nov 19 nicklas 215   
5805 09 Jan 20 nicklas 216   vgt.getDbSnpLink = function(rsId)
5805 09 Jan 20 nicklas 217   {
5805 09 Jan 20 nicklas 218     if (!rsId) return '';
5805 09 Jan 20 nicklas 219
5805 09 Jan 20 nicklas 220     var tmp = rsId.split(',');
5805 09 Jan 20 nicklas 221     var links = [];
5805 09 Jan 20 nicklas 222     for (var i = 0; i < tmp.length; i++)
5805 09 Jan 20 nicklas 223     {
5805 09 Jan 20 nicklas 224       var link = '<a target="_blank" title="View in dbSNP (new window)"';
5805 09 Jan 20 nicklas 225       link += ' href="https://www.ncbi.nlm.nih.gov/snp/'+encodeURIComponent(tmp[i])+'">';
5805 09 Jan 20 nicklas 226       link += Strings.encodeTags(tmp[i])+'</a>';
5805 09 Jan 20 nicklas 227       
5805 09 Jan 20 nicklas 228       links[i] = link;
5805 09 Jan 20 nicklas 229     }
5805 09 Jan 20 nicklas 230     return links.join(', ');
5805 09 Jan 20 nicklas 231   }
5805 09 Jan 20 nicklas 232   
6387 15 Sep 21 nicklas 233   vgt.counted = function(n, one, many)
6387 15 Sep 21 nicklas 234   {
6387 15 Sep 21 nicklas 235     return n+' '+(n == 1 ? one : many);
6387 15 Sep 21 nicklas 236   }
6387 15 Sep 21 nicklas 237   
5730 18 Nov 19 nicklas 238   return vgt;
5730 18 Nov 19 nicklas 239 }();
5730 18 Nov 19 nicklas 240
5730 18 Nov 19 nicklas 241 Doc.onLoad(ViewVariants.initPage);