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

Code
Comments
Other
Rev Date Author Line
4620 16 Nov 17 nicklas 1 var ViewGenotypes = function()
4620 16 Nov 17 nicklas 2 {
4620 16 Nov 17 nicklas 3   var vgt = {};
4620 16 Nov 17 nicklas 4   var debug = 0;
4620 16 Nov 17 nicklas 5   
4620 16 Nov 17 nicklas 6   vgt.initPage = function()
4620 16 Nov 17 nicklas 7   {
4620 16 Nov 17 nicklas 8     Buttons.addClickHandler('close', App.closeWindow);
4620 16 Nov 17 nicklas 9     
4642 28 Nov 17 nicklas 10     var url = '../Genotype.servlet?ID='+App.getSessionId();
4620 16 Nov 17 nicklas 11     url += '&cmd=GetVcfStatistics';
4648 15 Dec 17 nicklas 12     url += '&fileId='+Data.int('page-data', 'file-id');
4648 15 Dec 17 nicklas 13     url += '&fileId2='+Data.int('page-data', 'file-id2');
4648 15 Dec 17 nicklas 14     url += '&itemId='+Data.int('page-data', 'item-id');
4648 15 Dec 17 nicklas 15     url += '&itemId2='+Data.int('page-data', 'item-id2');
4620 16 Nov 17 nicklas 16     
4620 16 Nov 17 nicklas 17     Wizard.showLoadingAnimation('Loading VCF file...');
4620 16 Nov 17 nicklas 18     Wizard.asyncJsonRequest(url, vgt.onFilesLoaded);
4620 16 Nov 17 nicklas 19   }
4620 16 Nov 17 nicklas 20   
4620 16 Nov 17 nicklas 21   vgt.onFilesLoaded = function(response)
4620 16 Nov 17 nicklas 22   {
6450 21 Oct 21 nicklas 23     var alignment1 = response.alignment1 || {};
6450 21 Oct 21 nicklas 24     var alignment2 = response.alignment2 || {};
6450 21 Oct 21 nicklas 25     var vcfData1 = response.vcfData1;
6450 21 Oct 21 nicklas 26     var vcfData2 = response.vcfData2;
4620 16 Nov 17 nicklas 27     var snpData = response.snpData;
4671 07 Feb 18 nicklas 28     var compareData = response.compareData;
4671 07 Feb 18 nicklas 29     var compareMode = compareData != null;
4648 15 Dec 17 nicklas 30         
4648 15 Dec 17 nicklas 31     var html = '';
4648 15 Dec 17 nicklas 32     html += '<tr class="bottomborder topborder">';
4620 16 Nov 17 nicklas 33     html += '<th>Id</th>';
4620 16 Nov 17 nicklas 34     html += '<th>Ref</th>';
4620 16 Nov 17 nicklas 35     html += '<th>Alt</th>';
4648 15 Dec 17 nicklas 36     html += '<th class="dottedleft"></th>';
4648 15 Dec 17 nicklas 37     
6450 21 Oct 21 nicklas 38     html += vgt.createHeaders(vcfData1);
4648 15 Dec 17 nicklas 39     if (compareMode) 
4648 15 Dec 17 nicklas 40     {
4648 15 Dec 17 nicklas 41       html += '<th class="dottedleft"><input type="checkbox" id="hideMatches" title="Show only mismatches"></th>';
6450 21 Oct 21 nicklas 42       html += vgt.createHeaders(vcfData2);
4648 15 Dec 17 nicklas 43     }
4648 15 Dec 17 nicklas 44     
4620 16 Nov 17 nicklas 45     html += '</tr>';
4620 16 Nov 17 nicklas 46     for (var snpNo = 0; snpNo < snpData.length; snpNo++)
4620 16 Nov 17 nicklas 47     {
4620 16 Nov 17 nicklas 48       var e = snpData[snpNo];
4620 16 Nov 17 nicklas 49       var snp = e.snp;
6450 21 Oct 21 nicklas 50       var gt1 = e.gt1;
4648 15 Dec 17 nicklas 51       var gt2 = e.gt2;
4620 16 Nov 17 nicklas 52       
6450 21 Oct 21 nicklas 53       var mismatch = compareMode && gt2 && gt1 && gt1.genoType != gt2.genoType;
4648 15 Dec 17 nicklas 54       
4648 15 Dec 17 nicklas 55       html += '<tr class="snp highlight '+(mismatch?'mismatch':'match')+'">';
4648 15 Dec 17 nicklas 56       html += '<td title="'+Strings.encodeTags(snp.chromosome+':'+snp.position)+'">'+Strings.encodeTags(snp.id)+'</td>';
4620 16 Nov 17 nicklas 57       html += '<td>'+Strings.encodeTags(snp.ref)+'</td>';
4620 16 Nov 17 nicklas 58       html += '<td>'+Strings.encodeTags(snp.alt)+'</td>';
6450 21 Oct 21 nicklas 59       html += vgt.gtToHtml(gt1, vcfData1, 'gt1');
4648 15 Dec 17 nicklas 60       if (compareMode) html += vgt.gtToHtml(gt2, vcfData2, 'gt2');
4620 16 Nov 17 nicklas 61       html += '</tr>';
4620 16 Nov 17 nicklas 62     }
4648 15 Dec 17 nicklas 63     Doc.element('snp-list').innerHTML = html;
4620 16 Nov 17 nicklas 64
7203 25 May 23 nicklas 65     Doc.element('pipeline').innerHTML = Strings.encodeTags(alignment1.PIPELINE);
6450 21 Oct 21 nicklas 66     Doc.element('gtCount').innerHTML = vgt.getGtCount(vcfData1, alignment1.QC_GENOTYPE_VERIFIED);
6450 21 Oct 21 nicklas 67     Doc.element('avgGQ').innerHTML = vgt.getAvgGQ(vcfData1);
6450 21 Oct 21 nicklas 68     Doc.element('alignedPairs').innerHTML = vgt.getAlignedPairs(alignment1);
6450 21 Oct 21 nicklas 69     Doc.element('gtComment').innerHTML = Strings.encodeTags(alignment1.QC_GENOTYPE_COMMENT);
4648 15 Dec 17 nicklas 70     if (compareMode)
4648 15 Dec 17 nicklas 71     {
7203 25 May 23 nicklas 72       Doc.element('pipeline2').innerHTML = Strings.encodeTags(alignment2.PIPELINE);
4713 22 Mar 18 nicklas 73       Doc.element('gtCount2').innerHTML = vgt.getGtCount(vcfData2, alignment2.QC_GENOTYPE_VERIFIED);
4648 15 Dec 17 nicklas 74       Doc.element('avgGQ2').innerHTML = vgt.getAvgGQ(vcfData2);
4649 20 Dec 17 nicklas 75       Doc.element('alignedPairs2').innerHTML = vgt.getAlignedPairs(alignment2);
4713 22 Mar 18 nicklas 76       Doc.element('gtComment2').innerHTML = Strings.encodeTags(alignment2.QC_GENOTYPE_COMMENT);
4648 15 Dec 17 nicklas 77       
6450 21 Oct 21 nicklas 78       Doc.element('libPlate').innerHTML = Strings.encodeTags(vgt.getLibPlate(alignment1.lib));
4648 15 Dec 17 nicklas 79       Doc.element('libPlate2').innerHTML = Strings.encodeTags(vgt.getLibPlate(alignment2.lib));
4648 15 Dec 17 nicklas 80
6450 21 Oct 21 nicklas 81       Doc.element('qiacube').innerHTML = vgt.getQiacube(alignment1);
4648 15 Dec 17 nicklas 82       Doc.element('qiacube2').innerHTML = vgt.getQiacube(alignment2);
4648 15 Dec 17 nicklas 83
6450 21 Oct 21 nicklas 84       Doc.element('partitionDate').innerHTML = Reggie.reformatDate(alignment1.PARTITION_DATE);
4648 15 Dec 17 nicklas 85       Doc.element('partitionDate2').innerHTML = Reggie.reformatDate(alignment2.PARTITION_DATE);
4648 15 Dec 17 nicklas 86
6450 21 Oct 21 nicklas 87       Doc.element('pat').innerHTML = Strings.encodeTags(alignment1.patientName);
4648 15 Dec 17 nicklas 88       Doc.element('pat2').innerHTML = Strings.encodeTags(alignment2.patientName);
4648 15 Dec 17 nicklas 89       
4678 12 Feb 18 nicklas 90       Doc.element('mismatches-total').innerHTML = compareData.mismatches;
4678 12 Feb 18 nicklas 91       Doc.element('mismatches-high').innerHTML = compareData.mismatchesHighGQ;
4678 12 Feb 18 nicklas 92       Doc.element('mismatches-homhom').innerHTML = compareData.homHomMismatches;
4678 12 Feb 18 nicklas 93       Doc.element('mismatches-hethom').innerHTML = compareData.hetHomMismatches;
4678 12 Feb 18 nicklas 94       Doc.element('mismatches-homhet').innerHTML = compareData.homHetMismatches;
4671 07 Feb 18 nicklas 95
4648 15 Dec 17 nicklas 96       Events.addEventHandler('hideMatches', 'change', vgt.showOrHideMatches);
4648 15 Dec 17 nicklas 97     }
4648 15 Dec 17 nicklas 98     
4648 15 Dec 17 nicklas 99     Doc.show('sample-summary', 'table');
4648 15 Dec 17 nicklas 100   }
4648 15 Dec 17 nicklas 101   
4648 15 Dec 17 nicklas 102   
6450 21 Oct 21 nicklas 103   vgt.createHeaders = function(vcfData)
6450 21 Oct 21 nicklas 104   {
6450 21 Oct 21 nicklas 105     var tmp = '<th title="Genotype">GT</th>';
6450 21 Oct 21 nicklas 106     
6450 21 Oct 21 nicklas 107     var GQ_header = vcfData.formatHeaders.GQ;
6450 21 Oct 21 nicklas 108     var GQ_tooltip = 'Genotype Quality';
6450 21 Oct 21 nicklas 109     if (GQ_header)
6450 21 Oct 21 nicklas 110     {
6450 21 Oct 21 nicklas 111       vcfData.gqIsGenCallScore = GQ_header.indexOf('GenCall') > 0;
6450 21 Oct 21 nicklas 112       GQ_tooltip = GQ_header.replace(/.*Description=\"(.*)\".*/, "$1");
6450 21 Oct 21 nicklas 113     }    
6450 21 Oct 21 nicklas 114     
6450 21 Oct 21 nicklas 115     tmp += '<th title="'+Strings.encodeTags(GQ_tooltip)+'">GQ</th>';
6450 21 Oct 21 nicklas 116     if (vcfData.formatHeaders.BAF || vcfData.formatHeaders.AF)
6450 21 Oct 21 nicklas 117     {
6450 21 Oct 21 nicklas 118       tmp += '<th title="Allele frequency for the alternate allele">AF</th>';
6450 21 Oct 21 nicklas 119     }
6450 21 Oct 21 nicklas 120     else
6450 21 Oct 21 nicklas 121     {
6450 21 Oct 21 nicklas 122       tmp += '<th title="Allelic depths for the ref and alt alleles in the order listed">AD</th>';
6450 21 Oct 21 nicklas 123     }
6450 21 Oct 21 nicklas 124     return tmp;
6450 21 Oct 21 nicklas 125   }
6450 21 Oct 21 nicklas 126   
4648 15 Dec 17 nicklas 127   vgt.gtToHtml = function(gt, vcfData, cls)
4648 15 Dec 17 nicklas 128   {
4648 15 Dec 17 nicklas 129     var html = '';
4648 15 Dec 17 nicklas 130     if (gt)
4648 15 Dec 17 nicklas 131     {
6513 07 Dec 21 nicklas 132       if (gt.isLowQuality) cls += ' lowgq';
4648 15 Dec 17 nicklas 133       html += '<td class="dottedleft '+cls+'">'+Strings.encodeTags(gt.genoType)+'</td>';
4648 15 Dec 17 nicklas 134       html += '<td class="'+cls+'">'+Strings.encodeTags(gt.GT)+'</td>';
6513 07 Dec 21 nicklas 135       html += '<td class="'+cls+'">'+(vcfData.gqIsGenCallScore ? Reggie.formatNumber(gt.GQ, '', 2, 2) : gt.GQ)+'</td>';
6450 21 Oct 21 nicklas 136       html += '<td class="'+cls+'">'+Strings.encodeTags(gt.AD || Reggie.formatNumber(gt.AF, '', 2, 2))+'</td>';
4648 15 Dec 17 nicklas 137     }
4648 15 Dec 17 nicklas 138     else
4648 15 Dec 17 nicklas 139     {
4648 15 Dec 17 nicklas 140       html += '<td colspan="4" class="dottedleft">-</td>';
4648 15 Dec 17 nicklas 141     }
4648 15 Dec 17 nicklas 142     return html;
4648 15 Dec 17 nicklas 143   }
4648 15 Dec 17 nicklas 144   
4713 22 Mar 18 nicklas 145   vgt.getGtCount = function(vcfData, verified)
4648 15 Dec 17 nicklas 146   {
4671 07 Feb 18 nicklas 147     var hetPercentage = vcfData.gtCount ? Reggie.formatNumber(100*vcfData.hetCount/vcfData.gtCount, '%', -1) : '-';
4648 15 Dec 17 nicklas 148     var gtCount = '';
4713 22 Mar 18 nicklas 149     var icon = '';
4648 15 Dec 17 nicklas 150     gtCount += vcfData.gtCount;
4671 07 Feb 18 nicklas 151     gtCount += ' (' + hetPercentage + ' HET';
4648 15 Dec 17 nicklas 152     if (vcfData.badCount) gtCount += ', ' + vcfData.badCount + ' BAD';
4713 22 Mar 18 nicklas 153     if (verified)
4713 22 Mar 18 nicklas 154     {
4713 22 Mar 18 nicklas 155       gtCount += ', Verified by ' + verified;
4713 22 Mar 18 nicklas 156       icon = ' <img src="../images/score-complete.png">';
4713 22 Mar 18 nicklas 157     }
4713 22 Mar 18 nicklas 158     gtCount += ')'+icon;
4648 15 Dec 17 nicklas 159     return gtCount;
4648 15 Dec 17 nicklas 160   }
4648 15 Dec 17 nicklas 161   
4648 15 Dec 17 nicklas 162   vgt.getAvgGQ = function(vcfData)
4648 15 Dec 17 nicklas 163   {
4620 16 Nov 17 nicklas 164     var avgGq = (vcfData.sumHomGQ+vcfData.sumHetGQ) / vcfData.gtCount;
6513 07 Dec 21 nicklas 165     var html = '';
6513 07 Dec 21 nicklas 166     if (vcfData.qualityModel=='HAPLOTYPECALLER')
6450 21 Oct 21 nicklas 167     {
6513 07 Dec 21 nicklas 168       html += Numbers.formatNumber(avgGq, 0)
6513 07 Dec 21 nicklas 169       html += ' (' + vcfData.highGQCount + ' with GQ=99, '+vcfData.lowGQCount + ' with GQ&lt;50)';
6450 21 Oct 21 nicklas 170     }
6513 07 Dec 21 nicklas 171     else if (vcfData.qualityModel=='GENCALL')
6513 07 Dec 21 nicklas 172     {
6513 07 Dec 21 nicklas 173       html += Numbers.formatNumber(avgGq, 2)
6513 07 Dec 21 nicklas 174       html += ' (' + vcfData.highGQCount + ' with GQ&gt=0.9, '+vcfData.lowGQCount + ' with GQ&lt;0.2)';
6513 07 Dec 21 nicklas 175     }
4648 15 Dec 17 nicklas 176     return html;
4648 15 Dec 17 nicklas 177   }
4620 16 Nov 17 nicklas 178
4648 15 Dec 17 nicklas 179   vgt.getLibPlate = function(lib)
4648 15 Dec 17 nicklas 180   {
6450 21 Oct 21 nicklas 181     if (!lib) return '';
4648 15 Dec 17 nicklas 182     var well = lib.bioWell;
4648 15 Dec 17 nicklas 183     var libPlate = well ? well.bioPlate : null;
4648 15 Dec 17 nicklas 184     return libPlate ? libPlate.name + ' ' + well.location : '';
4620 16 Nov 17 nicklas 185   }
4620 16 Nov 17 nicklas 186   
4648 15 Dec 17 nicklas 187   vgt.getQiacube = function(alignment)
4648 15 Dec 17 nicklas 188   {
6450 21 Oct 21 nicklas 189     if (!alignment || !alignment.QIACUBE_DATE) return '';
4671 07 Feb 18 nicklas 190     var html = '<span title="Date, #Run number, @Position">'+Reggie.reformatDate(alignment.QIACUBE_DATE);
4671 07 Feb 18 nicklas 191     html += ', #' + alignment.QIACUBE_RUN_NO;
4671 07 Feb 18 nicklas 192     html += ', @' + alignment.QIACUBE_POSITION+'</span>';
4648 15 Dec 17 nicklas 193     return html;
4648 15 Dec 17 nicklas 194   }
4648 15 Dec 17 nicklas 195   
4649 20 Dec 17 nicklas 196   vgt.getAlignedPairs = function(alignment)
4649 20 Dec 17 nicklas 197   {
6450 21 Oct 21 nicklas 198     if (!alignment || !alignment.ALIGNED_PAIRS) return '';
6450 21 Oct 21 nicklas 199     var html = Reggie.formatNumber(alignment.ALIGNED_PAIRS/1000000, 'M', 2);
4649 20 Dec 17 nicklas 200     if (alignment.FRACTION_DUPLICATION != null)
4649 20 Dec 17 nicklas 201     {
4649 20 Dec 17 nicklas 202       html += ' (' + Reggie.formatNumber(100*alignment.FRACTION_DUPLICATION, '%', -1) + ' dup)';
4649 20 Dec 17 nicklas 203     }
4649 20 Dec 17 nicklas 204     return html;
4649 20 Dec 17 nicklas 205   }
4649 20 Dec 17 nicklas 206   
4648 15 Dec 17 nicklas 207   vgt.showOrHideMatches = function()
4648 15 Dec 17 nicklas 208   {
4648 15 Dec 17 nicklas 209     Doc.addOrRemoveClass('snp-list', 'hidematches');
4648 15 Dec 17 nicklas 210   }
4648 15 Dec 17 nicklas 211   
4620 16 Nov 17 nicklas 212   return vgt;
4620 16 Nov 17 nicklas 213 }();
4620 16 Nov 17 nicklas 214
4620 16 Nov 17 nicklas 215 Doc.onLoad(ViewGenotypes.initPage);