4620 |
16 Nov 17 |
nicklas |
var ViewGenotypes = function() |
4620 |
16 Nov 17 |
nicklas |
2 |
{ |
4620 |
16 Nov 17 |
nicklas |
var vgt = {}; |
4620 |
16 Nov 17 |
nicklas |
var debug = 0; |
4620 |
16 Nov 17 |
nicklas |
5 |
|
4620 |
16 Nov 17 |
nicklas |
vgt.initPage = function() |
4620 |
16 Nov 17 |
nicklas |
7 |
{ |
4620 |
16 Nov 17 |
nicklas |
Buttons.addClickHandler('close', App.closeWindow); |
4620 |
16 Nov 17 |
nicklas |
9 |
|
4642 |
28 Nov 17 |
nicklas |
var url = '../Genotype.servlet?ID='+App.getSessionId(); |
4620 |
16 Nov 17 |
nicklas |
url += '&cmd=GetVcfStatistics'; |
4648 |
15 Dec 17 |
nicklas |
url += '&fileId='+Data.int('page-data', 'file-id'); |
4648 |
15 Dec 17 |
nicklas |
url += '&fileId2='+Data.int('page-data', 'file-id2'); |
4648 |
15 Dec 17 |
nicklas |
url += '&itemId='+Data.int('page-data', 'item-id'); |
4648 |
15 Dec 17 |
nicklas |
url += '&itemId2='+Data.int('page-data', 'item-id2'); |
4620 |
16 Nov 17 |
nicklas |
16 |
|
4620 |
16 Nov 17 |
nicklas |
Wizard.showLoadingAnimation('Loading VCF file...'); |
4620 |
16 Nov 17 |
nicklas |
Wizard.asyncJsonRequest(url, vgt.onFilesLoaded); |
4620 |
16 Nov 17 |
nicklas |
19 |
} |
4620 |
16 Nov 17 |
nicklas |
20 |
|
4620 |
16 Nov 17 |
nicklas |
vgt.onFilesLoaded = function(response) |
4620 |
16 Nov 17 |
nicklas |
22 |
{ |
6450 |
21 Oct 21 |
nicklas |
var alignment1 = response.alignment1 || {}; |
6450 |
21 Oct 21 |
nicklas |
var alignment2 = response.alignment2 || {}; |
6450 |
21 Oct 21 |
nicklas |
var vcfData1 = response.vcfData1; |
6450 |
21 Oct 21 |
nicklas |
var vcfData2 = response.vcfData2; |
4620 |
16 Nov 17 |
nicklas |
var snpData = response.snpData; |
4671 |
07 Feb 18 |
nicklas |
var compareData = response.compareData; |
4671 |
07 Feb 18 |
nicklas |
var compareMode = compareData != null; |
4648 |
15 Dec 17 |
nicklas |
30 |
|
4648 |
15 Dec 17 |
nicklas |
var html = ''; |
4648 |
15 Dec 17 |
nicklas |
html += '<tr class="bottomborder topborder">'; |
4620 |
16 Nov 17 |
nicklas |
html += '<th>Id</th>'; |
4620 |
16 Nov 17 |
nicklas |
html += '<th>Ref</th>'; |
4620 |
16 Nov 17 |
nicklas |
html += '<th>Alt</th>'; |
4648 |
15 Dec 17 |
nicklas |
html += '<th class="dottedleft"></th>'; |
4648 |
15 Dec 17 |
nicklas |
37 |
|
6450 |
21 Oct 21 |
nicklas |
html += vgt.createHeaders(vcfData1); |
4648 |
15 Dec 17 |
nicklas |
if (compareMode) |
4648 |
15 Dec 17 |
nicklas |
40 |
{ |
4648 |
15 Dec 17 |
nicklas |
html += '<th class="dottedleft"><input type="checkbox" id="hideMatches" title="Show only mismatches"></th>'; |
6450 |
21 Oct 21 |
nicklas |
html += vgt.createHeaders(vcfData2); |
4648 |
15 Dec 17 |
nicklas |
43 |
} |
4648 |
15 Dec 17 |
nicklas |
44 |
|
4620 |
16 Nov 17 |
nicklas |
html += '</tr>'; |
4620 |
16 Nov 17 |
nicklas |
for (var snpNo = 0; snpNo < snpData.length; snpNo++) |
4620 |
16 Nov 17 |
nicklas |
47 |
{ |
4620 |
16 Nov 17 |
nicklas |
var e = snpData[snpNo]; |
4620 |
16 Nov 17 |
nicklas |
var snp = e.snp; |
6450 |
21 Oct 21 |
nicklas |
var gt1 = e.gt1; |
4648 |
15 Dec 17 |
nicklas |
var gt2 = e.gt2; |
4620 |
16 Nov 17 |
nicklas |
52 |
|
6450 |
21 Oct 21 |
nicklas |
var mismatch = compareMode && gt2 && gt1 && gt1.genoType != gt2.genoType; |
4648 |
15 Dec 17 |
nicklas |
54 |
|
4648 |
15 Dec 17 |
nicklas |
html += '<tr class="snp highlight '+(mismatch?'mismatch':'match')+'">'; |
4648 |
15 Dec 17 |
nicklas |
html += '<td title="'+Strings.encodeTags(snp.chromosome+':'+snp.position)+'">'+Strings.encodeTags(snp.id)+'</td>'; |
4620 |
16 Nov 17 |
nicklas |
html += '<td>'+Strings.encodeTags(snp.ref)+'</td>'; |
4620 |
16 Nov 17 |
nicklas |
html += '<td>'+Strings.encodeTags(snp.alt)+'</td>'; |
6450 |
21 Oct 21 |
nicklas |
html += vgt.gtToHtml(gt1, vcfData1, 'gt1'); |
4648 |
15 Dec 17 |
nicklas |
if (compareMode) html += vgt.gtToHtml(gt2, vcfData2, 'gt2'); |
4620 |
16 Nov 17 |
nicklas |
html += '</tr>'; |
4620 |
16 Nov 17 |
nicklas |
62 |
} |
4648 |
15 Dec 17 |
nicklas |
Doc.element('snp-list').innerHTML = html; |
4620 |
16 Nov 17 |
nicklas |
64 |
|
7203 |
25 May 23 |
nicklas |
Doc.element('pipeline').innerHTML = Strings.encodeTags(alignment1.PIPELINE); |
6450 |
21 Oct 21 |
nicklas |
Doc.element('gtCount').innerHTML = vgt.getGtCount(vcfData1, alignment1.QC_GENOTYPE_VERIFIED); |
6450 |
21 Oct 21 |
nicklas |
Doc.element('avgGQ').innerHTML = vgt.getAvgGQ(vcfData1); |
6450 |
21 Oct 21 |
nicklas |
Doc.element('alignedPairs').innerHTML = vgt.getAlignedPairs(alignment1); |
6450 |
21 Oct 21 |
nicklas |
Doc.element('gtComment').innerHTML = Strings.encodeTags(alignment1.QC_GENOTYPE_COMMENT); |
4648 |
15 Dec 17 |
nicklas |
if (compareMode) |
4648 |
15 Dec 17 |
nicklas |
71 |
{ |
7203 |
25 May 23 |
nicklas |
Doc.element('pipeline2').innerHTML = Strings.encodeTags(alignment2.PIPELINE); |
4713 |
22 Mar 18 |
nicklas |
Doc.element('gtCount2').innerHTML = vgt.getGtCount(vcfData2, alignment2.QC_GENOTYPE_VERIFIED); |
4648 |
15 Dec 17 |
nicklas |
Doc.element('avgGQ2').innerHTML = vgt.getAvgGQ(vcfData2); |
4649 |
20 Dec 17 |
nicklas |
Doc.element('alignedPairs2').innerHTML = vgt.getAlignedPairs(alignment2); |
4713 |
22 Mar 18 |
nicklas |
Doc.element('gtComment2').innerHTML = Strings.encodeTags(alignment2.QC_GENOTYPE_COMMENT); |
4648 |
15 Dec 17 |
nicklas |
77 |
|
6450 |
21 Oct 21 |
nicklas |
Doc.element('libPlate').innerHTML = Strings.encodeTags(vgt.getLibPlate(alignment1.lib)); |
4648 |
15 Dec 17 |
nicklas |
Doc.element('libPlate2').innerHTML = Strings.encodeTags(vgt.getLibPlate(alignment2.lib)); |
4648 |
15 Dec 17 |
nicklas |
80 |
|
6450 |
21 Oct 21 |
nicklas |
Doc.element('qiacube').innerHTML = vgt.getQiacube(alignment1); |
4648 |
15 Dec 17 |
nicklas |
Doc.element('qiacube2').innerHTML = vgt.getQiacube(alignment2); |
4648 |
15 Dec 17 |
nicklas |
83 |
|
6450 |
21 Oct 21 |
nicklas |
Doc.element('partitionDate').innerHTML = Reggie.reformatDate(alignment1.PARTITION_DATE); |
4648 |
15 Dec 17 |
nicklas |
Doc.element('partitionDate2').innerHTML = Reggie.reformatDate(alignment2.PARTITION_DATE); |
4648 |
15 Dec 17 |
nicklas |
86 |
|
6450 |
21 Oct 21 |
nicklas |
Doc.element('pat').innerHTML = Strings.encodeTags(alignment1.patientName); |
4648 |
15 Dec 17 |
nicklas |
Doc.element('pat2').innerHTML = Strings.encodeTags(alignment2.patientName); |
4648 |
15 Dec 17 |
nicklas |
89 |
|
4678 |
12 Feb 18 |
nicklas |
Doc.element('mismatches-total').innerHTML = compareData.mismatches; |
4678 |
12 Feb 18 |
nicklas |
Doc.element('mismatches-high').innerHTML = compareData.mismatchesHighGQ; |
4678 |
12 Feb 18 |
nicklas |
Doc.element('mismatches-homhom').innerHTML = compareData.homHomMismatches; |
4678 |
12 Feb 18 |
nicklas |
Doc.element('mismatches-hethom').innerHTML = compareData.hetHomMismatches; |
4678 |
12 Feb 18 |
nicklas |
Doc.element('mismatches-homhet').innerHTML = compareData.homHetMismatches; |
4671 |
07 Feb 18 |
nicklas |
95 |
|
4648 |
15 Dec 17 |
nicklas |
Events.addEventHandler('hideMatches', 'change', vgt.showOrHideMatches); |
4648 |
15 Dec 17 |
nicklas |
97 |
} |
4648 |
15 Dec 17 |
nicklas |
98 |
|
4648 |
15 Dec 17 |
nicklas |
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 |
vgt.createHeaders = function(vcfData) |
6450 |
21 Oct 21 |
nicklas |
104 |
{ |
6450 |
21 Oct 21 |
nicklas |
var tmp = '<th title="Genotype">GT</th>'; |
6450 |
21 Oct 21 |
nicklas |
106 |
|
6450 |
21 Oct 21 |
nicklas |
var GQ_header = vcfData.formatHeaders.GQ; |
6450 |
21 Oct 21 |
nicklas |
var GQ_tooltip = 'Genotype Quality'; |
6450 |
21 Oct 21 |
nicklas |
if (GQ_header) |
6450 |
21 Oct 21 |
nicklas |
110 |
{ |
6450 |
21 Oct 21 |
nicklas |
vcfData.gqIsGenCallScore = GQ_header.indexOf('GenCall') > 0; |
6450 |
21 Oct 21 |
nicklas |
GQ_tooltip = GQ_header.replace(/.*Description=\"(.*)\".*/, "$1"); |
6450 |
21 Oct 21 |
nicklas |
113 |
} |
6450 |
21 Oct 21 |
nicklas |
114 |
|
6450 |
21 Oct 21 |
nicklas |
tmp += '<th title="'+Strings.encodeTags(GQ_tooltip)+'">GQ</th>'; |
6450 |
21 Oct 21 |
nicklas |
if (vcfData.formatHeaders.BAF || vcfData.formatHeaders.AF) |
6450 |
21 Oct 21 |
nicklas |
117 |
{ |
6450 |
21 Oct 21 |
nicklas |
tmp += '<th title="Allele frequency for the alternate allele">AF</th>'; |
6450 |
21 Oct 21 |
nicklas |
119 |
} |
6450 |
21 Oct 21 |
nicklas |
else |
6450 |
21 Oct 21 |
nicklas |
121 |
{ |
6450 |
21 Oct 21 |
nicklas |
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 |
return tmp; |
6450 |
21 Oct 21 |
nicklas |
125 |
} |
6450 |
21 Oct 21 |
nicklas |
126 |
|
4648 |
15 Dec 17 |
nicklas |
vgt.gtToHtml = function(gt, vcfData, cls) |
4648 |
15 Dec 17 |
nicklas |
128 |
{ |
4648 |
15 Dec 17 |
nicklas |
var html = ''; |
4648 |
15 Dec 17 |
nicklas |
if (gt) |
4648 |
15 Dec 17 |
nicklas |
131 |
{ |
6513 |
07 Dec 21 |
nicklas |
if (gt.isLowQuality) cls += ' lowgq'; |
4648 |
15 Dec 17 |
nicklas |
html += '<td class="dottedleft '+cls+'">'+Strings.encodeTags(gt.genoType)+'</td>'; |
4648 |
15 Dec 17 |
nicklas |
html += '<td class="'+cls+'">'+Strings.encodeTags(gt.GT)+'</td>'; |
6513 |
07 Dec 21 |
nicklas |
html += '<td class="'+cls+'">'+(vcfData.gqIsGenCallScore ? Reggie.formatNumber(gt.GQ, '', 2, 2) : gt.GQ)+'</td>'; |
6450 |
21 Oct 21 |
nicklas |
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 |
else |
4648 |
15 Dec 17 |
nicklas |
139 |
{ |
4648 |
15 Dec 17 |
nicklas |
html += '<td colspan="4" class="dottedleft">-</td>'; |
4648 |
15 Dec 17 |
nicklas |
141 |
} |
4648 |
15 Dec 17 |
nicklas |
return html; |
4648 |
15 Dec 17 |
nicklas |
143 |
} |
4648 |
15 Dec 17 |
nicklas |
144 |
|
4713 |
22 Mar 18 |
nicklas |
vgt.getGtCount = function(vcfData, verified) |
4648 |
15 Dec 17 |
nicklas |
146 |
{ |
4671 |
07 Feb 18 |
nicklas |
var hetPercentage = vcfData.gtCount ? Reggie.formatNumber(100*vcfData.hetCount/vcfData.gtCount, '%', -1) : '-'; |
4648 |
15 Dec 17 |
nicklas |
var gtCount = ''; |
4713 |
22 Mar 18 |
nicklas |
var icon = ''; |
4648 |
15 Dec 17 |
nicklas |
gtCount += vcfData.gtCount; |
4671 |
07 Feb 18 |
nicklas |
gtCount += ' (' + hetPercentage + ' HET'; |
4648 |
15 Dec 17 |
nicklas |
if (vcfData.badCount) gtCount += ', ' + vcfData.badCount + ' BAD'; |
4713 |
22 Mar 18 |
nicklas |
if (verified) |
4713 |
22 Mar 18 |
nicklas |
154 |
{ |
4713 |
22 Mar 18 |
nicklas |
gtCount += ', Verified by ' + verified; |
4713 |
22 Mar 18 |
nicklas |
icon = ' <img src="../images/score-complete.png">'; |
4713 |
22 Mar 18 |
nicklas |
157 |
} |
4713 |
22 Mar 18 |
nicklas |
gtCount += ')'+icon; |
4648 |
15 Dec 17 |
nicklas |
return gtCount; |
4648 |
15 Dec 17 |
nicklas |
160 |
} |
4648 |
15 Dec 17 |
nicklas |
161 |
|
4648 |
15 Dec 17 |
nicklas |
vgt.getAvgGQ = function(vcfData) |
4648 |
15 Dec 17 |
nicklas |
163 |
{ |
4620 |
16 Nov 17 |
nicklas |
var avgGq = (vcfData.sumHomGQ+vcfData.sumHetGQ) / vcfData.gtCount; |
6513 |
07 Dec 21 |
nicklas |
var html = ''; |
6513 |
07 Dec 21 |
nicklas |
if (vcfData.qualityModel=='HAPLOTYPECALLER') |
6450 |
21 Oct 21 |
nicklas |
167 |
{ |
6513 |
07 Dec 21 |
nicklas |
html += Numbers.formatNumber(avgGq, 0) |
6513 |
07 Dec 21 |
nicklas |
html += ' (' + vcfData.highGQCount + ' with GQ=99, '+vcfData.lowGQCount + ' with GQ<50)'; |
6450 |
21 Oct 21 |
nicklas |
170 |
} |
6513 |
07 Dec 21 |
nicklas |
else if (vcfData.qualityModel=='GENCALL') |
6513 |
07 Dec 21 |
nicklas |
172 |
{ |
6513 |
07 Dec 21 |
nicklas |
html += Numbers.formatNumber(avgGq, 2) |
6513 |
07 Dec 21 |
nicklas |
html += ' (' + vcfData.highGQCount + ' with GQ>=0.9, '+vcfData.lowGQCount + ' with GQ<0.2)'; |
6513 |
07 Dec 21 |
nicklas |
175 |
} |
4648 |
15 Dec 17 |
nicklas |
return html; |
4648 |
15 Dec 17 |
nicklas |
177 |
} |
4620 |
16 Nov 17 |
nicklas |
178 |
|
4648 |
15 Dec 17 |
nicklas |
vgt.getLibPlate = function(lib) |
4648 |
15 Dec 17 |
nicklas |
180 |
{ |
6450 |
21 Oct 21 |
nicklas |
if (!lib) return ''; |
4648 |
15 Dec 17 |
nicklas |
var well = lib.bioWell; |
4648 |
15 Dec 17 |
nicklas |
var libPlate = well ? well.bioPlate : null; |
4648 |
15 Dec 17 |
nicklas |
return libPlate ? libPlate.name + ' ' + well.location : ''; |
4620 |
16 Nov 17 |
nicklas |
185 |
} |
4620 |
16 Nov 17 |
nicklas |
186 |
|
4648 |
15 Dec 17 |
nicklas |
vgt.getQiacube = function(alignment) |
4648 |
15 Dec 17 |
nicklas |
188 |
{ |
6450 |
21 Oct 21 |
nicklas |
if (!alignment || !alignment.QIACUBE_DATE) return ''; |
4671 |
07 Feb 18 |
nicklas |
var html = '<span title="Date, #Run number, @Position">'+Reggie.reformatDate(alignment.QIACUBE_DATE); |
4671 |
07 Feb 18 |
nicklas |
html += ', #' + alignment.QIACUBE_RUN_NO; |
4671 |
07 Feb 18 |
nicklas |
html += ', @' + alignment.QIACUBE_POSITION+'</span>'; |
4648 |
15 Dec 17 |
nicklas |
return html; |
4648 |
15 Dec 17 |
nicklas |
194 |
} |
4648 |
15 Dec 17 |
nicklas |
195 |
|
4649 |
20 Dec 17 |
nicklas |
vgt.getAlignedPairs = function(alignment) |
4649 |
20 Dec 17 |
nicklas |
197 |
{ |
6450 |
21 Oct 21 |
nicklas |
if (!alignment || !alignment.ALIGNED_PAIRS) return ''; |
6450 |
21 Oct 21 |
nicklas |
var html = Reggie.formatNumber(alignment.ALIGNED_PAIRS/1000000, 'M', 2); |
4649 |
20 Dec 17 |
nicklas |
if (alignment.FRACTION_DUPLICATION != null) |
4649 |
20 Dec 17 |
nicklas |
201 |
{ |
4649 |
20 Dec 17 |
nicklas |
html += ' (' + Reggie.formatNumber(100*alignment.FRACTION_DUPLICATION, '%', -1) + ' dup)'; |
4649 |
20 Dec 17 |
nicklas |
203 |
} |
4649 |
20 Dec 17 |
nicklas |
return html; |
4649 |
20 Dec 17 |
nicklas |
205 |
} |
4649 |
20 Dec 17 |
nicklas |
206 |
|
4648 |
15 Dec 17 |
nicklas |
vgt.showOrHideMatches = function() |
4648 |
15 Dec 17 |
nicklas |
208 |
{ |
4648 |
15 Dec 17 |
nicklas |
Doc.addOrRemoveClass('snp-list', 'hidematches'); |
4648 |
15 Dec 17 |
nicklas |
210 |
} |
4648 |
15 Dec 17 |
nicklas |
211 |
|
4620 |
16 Nov 17 |
nicklas |
return vgt; |
4620 |
16 Nov 17 |
nicklas |
213 |
}(); |
4620 |
16 Nov 17 |
nicklas |
214 |
|
4620 |
16 Nov 17 |
nicklas |
Doc.onLoad(ViewGenotypes.initPage); |