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

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