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

Code
Comments
Other
Rev Date Author Line
4642 28 Nov 17 nicklas 1 var GenoType = function()
4642 28 Nov 17 nicklas 2 {
4642 28 Nov 17 nicklas 3   var gt = {};
4642 28 Nov 17 nicklas 4   var debug = 0;
5547 07 Aug 19 nicklas 5   var selectionIsValid = false;
4642 28 Nov 17 nicklas 6   var subtypeAlignedSequences = null;
5547 07 Aug 19 nicklas 7   var annotationTypePipeline = null;
4648 15 Dec 17 nicklas 8   var alignedSequences;
5547 07 Aug 19 nicklas 9   var manuallySelected = [];
4642 28 Nov 17 nicklas 10   
4642 28 Nov 17 nicklas 11   // Page initialization
4642 28 Nov 17 nicklas 12   gt.initPage = function()
4642 28 Nov 17 nicklas 13   {
4642 28 Nov 17 nicklas 14     
4642 28 Nov 17 nicklas 15     // Step 1
4642 28 Nov 17 nicklas 16     Buttons.addClickHandler('btnSelectAlignedSequences', gt.selectAlignedSequences);
4642 28 Nov 17 nicklas 17     Events.addEventHandler('alignedSequences', 'base-selected', gt.setAlignedSequenceCallback);
5547 07 Aug 19 nicklas 18     Events.addEventHandler('alignedSequences', 'change', gt.alignedSequencesOnChange);
4642 28 Nov 17 nicklas 19     Events.addEventHandler('step-1', 'wizard-validate', gt.validateStep1);
4642 28 Nov 17 nicklas 20
4646 14 Dec 17 nicklas 21     // Step 2
4646 14 Dec 17 nicklas 22     Events.addEventHandler('step-2', 'wizard-initialize', gt.initializeStep2);
4646 14 Dec 17 nicklas 23     
4642 28 Nov 17 nicklas 24     // Navigation
4642 28 Nov 17 nicklas 25     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
4642 28 Nov 17 nicklas 26     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
4642 28 Nov 17 nicklas 27     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
4642 28 Nov 17 nicklas 28     Buttons.addClickHandler('goregister', Wizard.goRegister);
4642 28 Nov 17 nicklas 29       
4642 28 Nov 17 nicklas 30     // Final registration
4642 28 Nov 17 nicklas 31     Events.addEventHandler('wizard', 'wizard-submit', gt.submit);
4642 28 Nov 17 nicklas 32
4642 28 Nov 17 nicklas 33     Wizard.showLoadingAnimation('Loading bioassays...');
4642 28 Nov 17 nicklas 34     var url = '../Genotype.servlet?ID='+App.getSessionId();
4642 28 Nov 17 nicklas 35     url += '&cmd=GetAlignedSequencesForGenotypeQc';
4642 28 Nov 17 nicklas 36     Wizard.asyncJsonRequest(url, gt.initializeStep1);
4642 28 Nov 17 nicklas 37   }
4642 28 Nov 17 nicklas 38   
4642 28 Nov 17 nicklas 39   // --- Step 1 -----------------------------------
4642 28 Nov 17 nicklas 40   gt.initializeStep1 = function(response)
4642 28 Nov 17 nicklas 41   {
4642 28 Nov 17 nicklas 42     var alignedSequences = response.alignedSequences;
4642 28 Nov 17 nicklas 43     var frm = document.forms['reggie'];  
4642 28 Nov 17 nicklas 44
7202 25 May 23 nicklas 45     var msg = response.existingTumorsCount + ' tumors';
7202 25 May 23 nicklas 46     if (response.existingNormalsCount) msg += ' and '+response.existingNormalsCount+' normals';
6591 21 Feb 22 nicklas 47     Doc.element('alreadyChecked').innerHTML = msg;
4646 14 Dec 17 nicklas 48     
4642 28 Nov 17 nicklas 49     if (alignedSequences != null && alignedSequences.length > 0)
4642 28 Nov 17 nicklas 50     {
4642 28 Nov 17 nicklas 51       var firstPlate = null;
4925 13 Aug 18 nicklas 52       var numNoPatient = 0;
4642 28 Nov 17 nicklas 53       for (var asNo=0; asNo < alignedSequences.length; asNo++)
4642 28 Nov 17 nicklas 54       {
4642 28 Nov 17 nicklas 55         var seq = alignedSequences[asNo];
4642 28 Nov 17 nicklas 56         var lib = seq.lib;
7214 29 May 23 nicklas 57         var libPlate = seq.bioWell ? seq.bioWell.bioPlate : null;
4642 28 Nov 17 nicklas 58         if (firstPlate == null && libPlate != null) firstPlate = libPlate.name;
5547 07 Aug 19 nicklas 59
5547 07 Aug 19 nicklas 60         if (!seq.patient) numNoPatient++;
4642 28 Nov 17 nicklas 61         
5547 07 Aug 19 nicklas 62         var option = gt.createListOption(asNo+1, seq, seq.DO_NOT_USE == null && libPlate != null && libPlate.name==firstPlate);
4642 28 Nov 17 nicklas 63         frm.alignedSequences.options[frm.alignedSequences.length] = option;
4642 28 Nov 17 nicklas 64       }
4925 13 Aug 18 nicklas 65       
4925 13 Aug 18 nicklas 66       if (numNoPatient > 0)
4925 13 Aug 18 nicklas 67       {
4925 13 Aug 18 nicklas 68         Wizard.showGoNextConfirmation(true, 'Some alignments have no patient information and will be excluded from the genotype check.');
4925 13 Aug 18 nicklas 69       }
5547 07 Aug 19 nicklas 70       Events.sendChangeEvent('alignedSequences');
4642 28 Nov 17 nicklas 71     }
4642 28 Nov 17 nicklas 72     else
4642 28 Nov 17 nicklas 73     {
4649 20 Dec 17 nicklas 74       Wizard.setInputStatus('alignedSequences', 'invalid', 'No new alignments available for processing');
4642 28 Nov 17 nicklas 75     }
4642 28 Nov 17 nicklas 76     
4642 28 Nov 17 nicklas 77     Doc.show('step-1');
4646 14 Dec 17 nicklas 78     Doc.show('gonext');
4642 28 Nov 17 nicklas 79
4642 28 Nov 17 nicklas 80     frm.alignedSequences.focus();
4642 28 Nov 17 nicklas 81   }
4642 28 Nov 17 nicklas 82   
4642 28 Nov 17 nicklas 83   gt.validateStep1 = function(event)
4642 28 Nov 17 nicklas 84   {
5547 07 Aug 19 nicklas 85     if (!selectionIsValid) event.preventDefault();
4642 28 Nov 17 nicklas 86   }
4642 28 Nov 17 nicklas 87   
4642 28 Nov 17 nicklas 88   gt.selectAlignedSequences = function()
4642 28 Nov 17 nicklas 89   {
4642 28 Nov 17 nicklas 90     var frm = document.forms['reggie'];
4642 28 Nov 17 nicklas 91     if (frm.alignedSequences.disabled) return;
4642 28 Nov 17 nicklas 92     
4642 28 Nov 17 nicklas 93     if (subtypeAlignedSequences == null)
4642 28 Nov 17 nicklas 94     {
4642 28 Nov 17 nicklas 95       subtypeAlignedSequences = Reggie.getSubtypeInfo('ALIGNED_SEQUENCES');
4642 28 Nov 17 nicklas 96     }
5547 07 Aug 19 nicklas 97     if (annotationTypePipeline == null)
5547 07 Aug 19 nicklas 98     {
5547 07 Aug 19 nicklas 99       annotationTypePipeline = Reggie.getAnnotationTypeInfo('PIPELINE');
5547 07 Aug 19 nicklas 100     }
4642 28 Nov 17 nicklas 101     
5547 07 Aug 19 nicklas 102     // Reset list
5547 07 Aug 19 nicklas 103     manuallySelected = [];
4642 28 Nov 17 nicklas 104     var url = '&resetTemporary=1';
4642 28 Nov 17 nicklas 105     url += '&tmpfilter:INT:itemSubtype='+subtypeAlignedSequences.id;
5547 07 Aug 19 nicklas 106     url += '&tmpfilter:STRING:'+encodeURIComponent('#')+annotationTypePipeline.id+'='+encodeURIComponent('RNAseq/Hisat/StringTie');
4642 28 Nov 17 nicklas 107     Dialogs.selectItem('DERIVEDBIOASSAY', 'alignedSequences', 1, url);
4642 28 Nov 17 nicklas 108   }
4642 28 Nov 17 nicklas 109
4642 28 Nov 17 nicklas 110   gt.setAlignedSequenceCallback = function(event)
4642 28 Nov 17 nicklas 111   {
4642 28 Nov 17 nicklas 112     var ms = event.detail;
4642 28 Nov 17 nicklas 113     
5547 07 Aug 19 nicklas 114     var opt = Reggie.getListOption('alignedSequences', ms.id);
5547 07 Aug 19 nicklas 115     if (opt)
4642 28 Nov 17 nicklas 116     {
5547 07 Aug 19 nicklas 117       opt.selected = true;
5547 07 Aug 19 nicklas 118     }
5547 07 Aug 19 nicklas 119     else
5547 07 Aug 19 nicklas 120     {
5547 07 Aug 19 nicklas 121       manuallySelected[manuallySelected.length] = ms.id;
5547 07 Aug 19 nicklas 122     }
5547 07 Aug 19 nicklas 123     
5547 07 Aug 19 nicklas 124     if (ms.remaining == 0 && manuallySelected.length > 0)
5547 07 Aug 19 nicklas 125     {
5547 07 Aug 19 nicklas 126       var url = '../Genotype.servlet?ID='+App.getSessionId();
5547 07 Aug 19 nicklas 127       url += '&cmd=GetAlignedSequencesForGenotypeQc';
5547 07 Aug 19 nicklas 128       url += '&items='+manuallySelected.join(',');
5547 07 Aug 19 nicklas 129       Wizard.showLoadingAnimation('Loading bioassays...');
5547 07 Aug 19 nicklas 130       Wizard.asyncJsonRequest(url, gt.manuallySelected);
5547 07 Aug 19 nicklas 131     }
5547 07 Aug 19 nicklas 132     else
5547 07 Aug 19 nicklas 133     {
5547 07 Aug 19 nicklas 134       Events.sendChangeEvent('alignedSequences');
5547 07 Aug 19 nicklas 135     }
5547 07 Aug 19 nicklas 136
5547 07 Aug 19 nicklas 137   }
5547 07 Aug 19 nicklas 138   gt.manuallySelected = function(response)
5547 07 Aug 19 nicklas 139   {
5547 07 Aug 19 nicklas 140     var alignedSequences = response.alignedSequences;
5547 07 Aug 19 nicklas 141     var frm = document.forms['reggie'];  
5547 07 Aug 19 nicklas 142
5547 07 Aug 19 nicklas 143     if (alignedSequences != null && alignedSequences.length > 0)
5547 07 Aug 19 nicklas 144     {
5547 07 Aug 19 nicklas 145       var offset = frm.alignedSequences.length+1;
5547 07 Aug 19 nicklas 146       for (var asNo=0; asNo < alignedSequences.length; asNo++)
4642 28 Nov 17 nicklas 147       {
5547 07 Aug 19 nicklas 148         var as = alignedSequences[asNo];
5547 07 Aug 19 nicklas 149         var option = gt.createListOption(asNo+offset, as, as.DO_NOT_USE == null);
5547 07 Aug 19 nicklas 150         frm.alignedSequences.options[frm.alignedSequences.length] = option;
4642 28 Nov 17 nicklas 151       }
5547 07 Aug 19 nicklas 152       Events.sendChangeEvent('alignedSequences');
4642 28 Nov 17 nicklas 153     }
5547 07 Aug 19 nicklas 154   }
4642 28 Nov 17 nicklas 155
5547 07 Aug 19 nicklas 156   gt.createListOption = function(index, alignedItem, selected)
5547 07 Aug 19 nicklas 157   {
5547 07 Aug 19 nicklas 158     var lib = alignedItem.lib;
5547 07 Aug 19 nicklas 159     var isYellow = lib.specimen && lib.specimen.YellowLabel != null;
7211 29 May 23 nicklas 160     var libPlate = alignedItem.bioWell ? alignedItem.bioWell.bioPlate : null;
5547 07 Aug 19 nicklas 161     
5547 07 Aug 19 nicklas 162     var tooltip = null;
5547 07 Aug 19 nicklas 163     
5547 07 Aug 19 nicklas 164     var name = (index) + ': ';
5547 07 Aug 19 nicklas 165     if (libPlate) name += libPlate.name + ' - ';
5547 07 Aug 19 nicklas 166     name += alignedItem.name;
5547 07 Aug 19 nicklas 167     if (!alignedItem.patient) name += ' (no patient data)';
5547 07 Aug 19 nicklas 168     
5547 07 Aug 19 nicklas 169     var option = new Option(name, alignedItem.id, false, selected && alignedItem.patient);
5547 07 Aug 19 nicklas 170     if (isYellow) option.className = 'yellow';
5547 07 Aug 19 nicklas 171     if (tooltip) option.title = tooltip;
5547 07 Aug 19 nicklas 172     if (!alignedItem.patient) option.disabled = true;
5547 07 Aug 19 nicklas 173     option.alignedSequences = alignedItem;
7211 29 May 23 nicklas 174     return option;  
5547 07 Aug 19 nicklas 175   }
5547 07 Aug 19 nicklas 176
5547 07 Aug 19 nicklas 177   
5547 07 Aug 19 nicklas 178   gt.alignedSequencesOnChange = function()
5547 07 Aug 19 nicklas 179   {
5547 07 Aug 19 nicklas 180     var frm = document.forms['reggie'];
5547 07 Aug 19 nicklas 181     
5547 07 Aug 19 nicklas 182     selectionIsValid = false;
5547 07 Aug 19 nicklas 183     var numSelected = 0;
5547 07 Aug 19 nicklas 184     var numDoNotUse = 0;
5547 07 Aug 19 nicklas 185     var invalidPipeline = null;
4642 28 Nov 17 nicklas 186     Wizard.setInputStatus('alignedSequences');
5547 07 Aug 19 nicklas 187     Wizard.hideGoNextConfirmation();
5547 07 Aug 19 nicklas 188
5547 07 Aug 19 nicklas 189     for (var asNo = 0; asNo < frm.alignedSequences.length; asNo++)
5547 07 Aug 19 nicklas 190     {
5547 07 Aug 19 nicklas 191       if (frm.alignedSequences[asNo].selected) 
5547 07 Aug 19 nicklas 192       {
5547 07 Aug 19 nicklas 193         numSelected++;
5547 07 Aug 19 nicklas 194         var as = frm.alignedSequences[asNo].alignedSequences;
5547 07 Aug 19 nicklas 195         if (as.DO_NOT_USE) numDoNotUse++;
5547 07 Aug 19 nicklas 196         if (as.pipeline && as.pipeline != 'RNAseq/Hisat/StringTie')
5547 07 Aug 19 nicklas 197         {
5547 07 Aug 19 nicklas 198           invalidPipeline = Strings.encodeTags(as.name+' ('+as.pipeline)+') is not intended for the RNAseq/Hisat/StringTie pipeline.';
5547 07 Aug 19 nicklas 199         }
5547 07 Aug 19 nicklas 200       }
5547 07 Aug 19 nicklas 201     }
5547 07 Aug 19 nicklas 202     
5547 07 Aug 19 nicklas 203     if (numSelected == 0)
5547 07 Aug 19 nicklas 204     {
5547 07 Aug 19 nicklas 205       Wizard.setInputStatus('alignedSequences', 'invalid', 'Select at least one item');
5547 07 Aug 19 nicklas 206       return;
5547 07 Aug 19 nicklas 207     }
5547 07 Aug 19 nicklas 208     if (invalidPipeline) 
5547 07 Aug 19 nicklas 209     {
5547 07 Aug 19 nicklas 210       Wizard.setInputStatus('alignedSequences', 'invalid', invalidPipeline);
5547 07 Aug 19 nicklas 211       return;
5547 07 Aug 19 nicklas 212     }
5547 07 Aug 19 nicklas 213     selectionIsValid = true;
5547 07 Aug 19 nicklas 214     if (numDoNotUse > 0)
5547 07 Aug 19 nicklas 215     {
5547 07 Aug 19 nicklas 216       Wizard.setInputStatus('alignedSequences', 'warning', numDoNotUse + ' selected items marked as DoNotUse');
5547 07 Aug 19 nicklas 217       Wizard.showGoNextConfirmation(true, 'Confirm ' + numDoNotUse + ' items marked as DoNotUse');
5547 07 Aug 19 nicklas 218     }
5547 07 Aug 19 nicklas 219     else
5547 07 Aug 19 nicklas 220     {
5547 07 Aug 19 nicklas 221       Wizard.setInputStatus('alignedSequences', 'valid');
5547 07 Aug 19 nicklas 222     }
4642 28 Nov 17 nicklas 223   }
4642 28 Nov 17 nicklas 224
4646 14 Dec 17 nicklas 225   gt.initializeStep2 = function()
4642 28 Nov 17 nicklas 226   {
4642 28 Nov 17 nicklas 227     var frm = document.forms['reggie'];
4646 14 Dec 17 nicklas 228     
4642 28 Nov 17 nicklas 229     var submitInfo = {};
4642 28 Nov 17 nicklas 230     var alignedSequences = [];
4642 28 Nov 17 nicklas 231     submitInfo.alignedSequences = alignedSequences;
4642 28 Nov 17 nicklas 232       
4642 28 Nov 17 nicklas 233     for (var asNo = 0; asNo < frm.alignedSequences.length; asNo++)
4642 28 Nov 17 nicklas 234     {
4642 28 Nov 17 nicklas 235       if (frm.alignedSequences[asNo].selected) 
4642 28 Nov 17 nicklas 236       {
4642 28 Nov 17 nicklas 237         var as = {};
4642 28 Nov 17 nicklas 238         as.id = frm.alignedSequences[asNo].alignedSequences.id;
4642 28 Nov 17 nicklas 239         alignedSequences[alignedSequences.length] = as;
4642 28 Nov 17 nicklas 240       }
4642 28 Nov 17 nicklas 241     }
4642 28 Nov 17 nicklas 242
4642 28 Nov 17 nicklas 243     var url = '../Genotype.servlet?ID='+App.getSessionId();
4642 28 Nov 17 nicklas 244     url += '&cmd=GenotypeQcCheck';
4646 14 Dec 17 nicklas 245     Wizard.showLoadingAnimation('Comparing genotypes...', 'genotypes-progress');
4646 14 Dec 17 nicklas 246     Wizard.asyncJsonRequest(url, gt.checkCompleted, 'POST', JSON.stringify(submitInfo));
4646 14 Dec 17 nicklas 247   }
4646 14 Dec 17 nicklas 248   
4646 14 Dec 17 nicklas 249   gt.checkCompleted = function(response)
4646 14 Dec 17 nicklas 250   {
4648 15 Dec 17 nicklas 251     alignedSequences = response.alignedSequences;
4646 14 Dec 17 nicklas 252     
4646 14 Dec 17 nicklas 253     var html = '<table id="compareTable">';
4646 14 Dec 17 nicklas 254     html += '<thead class="bg-filled-100">';
4646 14 Dec 17 nicklas 255     html += '<tr>';
4728 04 Apr 18 nicklas 256     html += '<th colspan="3">Comparisons</th>';
4648 15 Dec 17 nicklas 257     html += '<th class="dottedleft"></th>';
4649 20 Dec 17 nicklas 258     html += '<th colspan="2">ALIGNED_PAIRS</th>';
4646 14 Dec 17 nicklas 259     html += '<th  class="dottedleft" colspan="3">Genotypes</th>';
4646 14 Dec 17 nicklas 260     html += '<th class="dottedleft" colspan="2"></th>';
4728 04 Apr 18 nicklas 261     html += '<th class="dottedleft" colspan="4"></th>';
4646 14 Dec 17 nicklas 262     html += '<th class="dottedleft" colspan="2">Actions</th>';
4646 14 Dec 17 nicklas 263     html += '<th class="dottedleft"></th>';
4646 14 Dec 17 nicklas 264     html += '</tr>';
4646 14 Dec 17 nicklas 265     html += '<tr>';
4728 04 Apr 18 nicklas 266     html += '<th>Total</th>';
4728 04 Apr 18 nicklas 267     html += '<th>Same PAT</th>';
4728 04 Apr 18 nicklas 268     html += '<th>Skipped</th>';
4648 15 Dec 17 nicklas 269     html += '<th class="dottedleft">Libplate</th>';
4648 15 Dec 17 nicklas 270     html += '<th>(millions)</th>';
4649 20 Dec 17 nicklas 271     html += '<th>Dup.</th>';
4646 14 Dec 17 nicklas 272     html += '<th class="dottedleft">Total</th>';
4646 14 Dec 17 nicklas 273     html += '<th>HET</th>';
4646 14 Dec 17 nicklas 274     html += '<th class="icon-col"></th>';
4728 04 Apr 18 nicklas 275     html += '<th class="dottedleft">Alignment</th>';
4728 04 Apr 18 nicklas 276     html += '<th class="icon-col"></th>';
4728 04 Apr 18 nicklas 277     html += '<th class="dottedleft icon-col"></th>';
4728 04 Apr 18 nicklas 278     html += '<th colspan="2">Warnings and messages</th>';
4728 04 Apr 18 nicklas 279     html += '<th class="icon-col"></th>';
6670 07 Apr 22 nicklas 280     html += '<th class="dottedleft"><span id="disable" data-prefix="disable" class="interactable link" title="Toggle selection â€“ use CTRL, ALT or SHIFT to clear">Disable</span></th>';
6670 07 Apr 22 nicklas 281     html += '<th><span id="flagrna" data-prefix="flag" class="interactable link" title="Toggle selection â€“ use CTRL, ALT or SHIFT to clear">Flag</span></th>';
4646 14 Dec 17 nicklas 282     html += '<th class="dottedleft">Comment</th>';
4646 14 Dec 17 nicklas 283     html += '</tr>';
4646 14 Dec 17 nicklas 284     html += '</thead>';
4646 14 Dec 17 nicklas 285     
4728 04 Apr 18 nicklas 286     var htmlNoMessages = '';
4728 04 Apr 18 nicklas 287     var htmlNoWarnings = '';
7214 29 May 23 nicklas 288     var htmlLowWarnings = '';
4646 14 Dec 17 nicklas 289     
4648 15 Dec 17 nicklas 290     for (var aNo = 0; aNo < alignedSequences.length; aNo++)
4646 14 Dec 17 nicklas 291     {
4648 15 Dec 17 nicklas 292       var aligned = alignedSequences[aNo];
4648 15 Dec 17 nicklas 293       var lib = aligned.lib;
4671 07 Feb 18 nicklas 294       var cmp = aligned.compare;
4671 07 Feb 18 nicklas 295       var vcf = cmp.vcf;
7211 29 May 23 nicklas 296       var libWell = aligned.bioWell;
4671 07 Feb 18 nicklas 297       
4648 15 Dec 17 nicklas 298       var alignedReads = aligned.ALIGNED_PAIRS == null ? '-' : Reggie.formatNumber(aligned.ALIGNED_PAIRS/1000000, null, 2);
4649 20 Dec 17 nicklas 299       var duplication = aligned.FRACTION_DUPLICATION == null ? '-' : Reggie.formatNumber(100*aligned.FRACTION_DUPLICATION, '%', -1);
4671 07 Feb 18 nicklas 300       var hetPercentage = vcf.gtCount ? Reggie.formatNumber(100*vcf.hetCount/vcf.gtCount, '%', -1) : '-';
4648 15 Dec 17 nicklas 301
4646 14 Dec 17 nicklas 302       var disableChecked = cmp.recommendDisable ? "checked" : "";
4646 14 Dec 17 nicklas 303       var flagChecked = cmp.recommendFlag ? "checked" : "";
4646 14 Dec 17 nicklas 304       
4728 04 Apr 18 nicklas 305       var rowspan = cmp.messages.length || 1;
4728 04 Apr 18 nicklas 306       
4728 04 Apr 18 nicklas 307       var tmp = '<tbody class="highlight"><tr>';
4728 04 Apr 18 nicklas 308       tmp += '<td rowspan="'+rowspan+'">'+cmp.total+'</td>';
4728 04 Apr 18 nicklas 309       tmp += '<td rowspan="'+rowspan+'">'+(cmp.samePat || '')+'</td>';
4728 04 Apr 18 nicklas 310       tmp += '<td rowspan="'+rowspan+'">'+(cmp.skipped || '')+'</td>';
7211 29 May 23 nicklas 311       tmp += '<td rowspan="'+rowspan+'" class="dottedleft text-col">'+(libWell ? Strings.encodeTags(libWell.bioPlate.name + ' ' + libWell.location) : '-')+'</td>';
4728 04 Apr 18 nicklas 312       tmp += '<td rowspan="'+rowspan+'">'+alignedReads+'</td>';
4728 04 Apr 18 nicklas 313       tmp += '<td rowspan="'+rowspan+'">'+duplication+'</td>';
4728 04 Apr 18 nicklas 314       tmp += '<td rowspan="'+rowspan+'" class="dottedleft">'+vcf.gtCount+'</td>';
4728 04 Apr 18 nicklas 315       tmp += '<td rowspan="'+rowspan+'">'+hetPercentage+'</td>';
4728 04 Apr 18 nicklas 316       tmp += '<td rowspan="'+rowspan+'" class="icon-col">';
4648 15 Dec 17 nicklas 317       tmp += '<span class="link vcf-link" data-file-id="'+vcf.fileId+'" data-item-id="'+aligned.id+'" title="View genotype statistics"><img src="../images/vcf_file.png"></span>';
4646 14 Dec 17 nicklas 318       tmp += '</td>';
4728 04 Apr 18 nicklas 319       tmp += '<td rowspan="'+rowspan+'" class="dottedleft text-col">'+Strings.encodeTags(aligned.name)+'</td>';
4728 04 Apr 18 nicklas 320       tmp += '<td rowspan="'+rowspan+'" class="icon-col"><span class="link case-summary" data-name="'+Strings.encodeTags(aligned.name)+'" title="Show case summary"><img src="../images/case_summary.png"></span></td>';
4728 04 Apr 18 nicklas 321
4728 04 Apr 18 nicklas 322       // The first message is on the main <tr>
7214 29 May 23 nicklas 323       var numHighWarnings = 0;
7214 29 May 23 nicklas 324       var numLowWarnings = 0;
4728 04 Apr 18 nicklas 325       if (cmp.messages.length > 0)
4646 14 Dec 17 nicklas 326       {
4728 04 Apr 18 nicklas 327         var msg = cmp.messages[0];
7214 29 May 23 nicklas 328         if (msg.warningLevel == 'HIGH') numHighWarnings++;
7214 29 May 23 nicklas 329         if (msg.warningLevel == 'LOW') numLowWarnings++;
4728 04 Apr 18 nicklas 330         tmp += gt.getMessageHtml(msg, aligned, vcf);
4646 14 Dec 17 nicklas 331       }
4646 14 Dec 17 nicklas 332       else
4646 14 Dec 17 nicklas 333       {
4728 04 Apr 18 nicklas 334         tmp += '<td class="dottedleft icon-col"></td>';
4728 04 Apr 18 nicklas 335         tmp += '<td class="text-col" colspan="2"></td>';
4728 04 Apr 18 nicklas 336         tmp += '<td class="icon-col"></td>';
4646 14 Dec 17 nicklas 337       }
4728 04 Apr 18 nicklas 338       tmp += '<td rowspan="'+rowspan+'" class="dottedleft"><input type="checkbox" name="disable.'+aligned.id+'" '+disableChecked+'></td>';
4728 04 Apr 18 nicklas 339       tmp += '<td rowspan="'+rowspan+'"><input type="checkbox" name="flag.'+aligned.id+'" '+flagChecked+'></td>';
4728 04 Apr 18 nicklas 340       tmp += '<td rowspan="'+rowspan+'" class="dottedleft comment"><input type="text" name="comment.'+aligned.id+'" value="'+Strings.encodeTags(aligned.QC_GENOTYPE_COMMENT)+'"></td>';
4728 04 Apr 18 nicklas 341       tmp += '</tr>';
4728 04 Apr 18 nicklas 342       
4728 04 Apr 18 nicklas 343       // If there are more messages, add more <tr>
4728 04 Apr 18 nicklas 344       for (var mNo = 1; mNo < cmp.messages.length; mNo++)
4648 15 Dec 17 nicklas 345       {
4728 04 Apr 18 nicklas 346         var msg = cmp.messages[mNo];
7214 29 May 23 nicklas 347         if (msg.warningLevel == 'HIGH') numHighWarnings++;
7214 29 May 23 nicklas 348         if (msg.warningLevel == 'LOW') numLowWarnings++;
4728 04 Apr 18 nicklas 349         tmp += '<tr>'+gt.getMessageHtml(msg, aligned, vcf) + '</tr>';
4648 15 Dec 17 nicklas 350       }
4728 04 Apr 18 nicklas 351       tmp += '</tbody>';
4646 14 Dec 17 nicklas 352       
4728 04 Apr 18 nicklas 353       if (cmp.messages.length == 0)
4646 14 Dec 17 nicklas 354       {
4728 04 Apr 18 nicklas 355         // No messages are sorted last in the list
4728 04 Apr 18 nicklas 356         htmlNoMessages += tmp;
4646 14 Dec 17 nicklas 357       }
7214 29 May 23 nicklas 358       else if (numLowWarnings == 0 && numHighWarnings == 0)
4648 15 Dec 17 nicklas 359       {
4728 04 Apr 18 nicklas 360         // No warnings are sorted in the middle
4728 04 Apr 18 nicklas 361         htmlNoWarnings += tmp;
4648 15 Dec 17 nicklas 362       }
7214 29 May 23 nicklas 363       else if (numHighWarnings == 0)
7214 29 May 23 nicklas 364       {
7214 29 May 23 nicklas 365         htmlLowWarnings += tmp;
7214 29 May 23 nicklas 366       }
4646 14 Dec 17 nicklas 367       else
4646 14 Dec 17 nicklas 368       {
4728 04 Apr 18 nicklas 369         // Items with at least one warning are sorted first
4646 14 Dec 17 nicklas 370         html += tmp;
4646 14 Dec 17 nicklas 371       }
4646 14 Dec 17 nicklas 372     }
4728 04 Apr 18 nicklas 373     
7286 15 Aug 23 nicklas 374     html += htmlLowWarnings;
4728 04 Apr 18 nicklas 375     html += htmlNoWarnings;
4728 04 Apr 18 nicklas 376     html += htmlNoMessages;
4646 14 Dec 17 nicklas 377     html += '</table>';
4646 14 Dec 17 nicklas 378     Doc.element('comparisons').innerHTML = html;
4642 28 Nov 17 nicklas 379
6670 07 Apr 22 nicklas 380     Events.addEventHandler('flagrna', 'click', gt.toggleSelection);
6670 07 Apr 22 nicklas 381     Events.addEventHandler('disable', 'click', gt.toggleSelection);
6670 07 Apr 22 nicklas 382
4646 14 Dec 17 nicklas 383     // Add click handler to VCF files
4646 14 Dec 17 nicklas 384     var clickableItems = document.getElementsByClassName('vcf-link');
4646 14 Dec 17 nicklas 385     for (var i = 0; i < clickableItems.length; i++)
4646 14 Dec 17 nicklas 386     {
4646 14 Dec 17 nicklas 387       Events.addEventHandler(clickableItems[i], 'click', gt.vcfLinkOnClick);
4646 14 Dec 17 nicklas 388     }
4646 14 Dec 17 nicklas 389     
4678 12 Feb 18 nicklas 390     // Case summary links
4678 12 Feb 18 nicklas 391     var cs = document.getElementsByClassName('case-summary');
4678 12 Feb 18 nicklas 392     for (var i = 0; i < cs.length; i++)
4678 12 Feb 18 nicklas 393     {
5019 10 Oct 18 nicklas 394       Events.addEventHandler(cs[i], 'click', Reggie.openCaseSummaryPopupOnEvent);
4678 12 Feb 18 nicklas 395     }
4678 12 Feb 18 nicklas 396
4648 15 Dec 17 nicklas 397     Wizard.setCurrentStep(2);
4646 14 Dec 17 nicklas 398     Doc.show('step-2');
4646 14 Dec 17 nicklas 399     Doc.show('goregister');
4646 14 Dec 17 nicklas 400     Doc.show('gocancel');
4646 14 Dec 17 nicklas 401   }
4646 14 Dec 17 nicklas 402
4728 04 Apr 18 nicklas 403   
4728 04 Apr 18 nicklas 404   gt.getMessageHtml = function(message, aligned, vcf)
4728 04 Apr 18 nicklas 405   {
4728 04 Apr 18 nicklas 406     var level = message.warningLevel;
4728 04 Apr 18 nicklas 407     var icon = null;
4728 04 Apr 18 nicklas 408     if (level == 'INFO')
4728 04 Apr 18 nicklas 409     {
4728 04 Apr 18 nicklas 410       icon = 'ok.png';
4728 04 Apr 18 nicklas 411     }
4728 04 Apr 18 nicklas 412     else if (level == 'LOW')
4728 04 Apr 18 nicklas 413     {
4728 04 Apr 18 nicklas 414       icon = 'warning_small.png';
4728 04 Apr 18 nicklas 415     }
4728 04 Apr 18 nicklas 416     else
4728 04 Apr 18 nicklas 417     {
4728 04 Apr 18 nicklas 418       icon = 'warning.png';
4728 04 Apr 18 nicklas 419     }
4728 04 Apr 18 nicklas 420
4728 04 Apr 18 nicklas 421     var html = '';
4728 04 Apr 18 nicklas 422     html += '<td class="dottedleft icon-col"><img src="../images/'+icon+'"></td>';
4728 04 Apr 18 nicklas 423     html += '<td class="text-col" title="'+(message.messageTooltip || '')+'">'+Strings.encodeTags(message.message) + '</td>';
4728 04 Apr 18 nicklas 424     html += '<td class="text-col">';
6588 18 Feb 22 nicklas 425     if (message.otherAssay)
4728 04 Apr 18 nicklas 426     {
6588 18 Feb 22 nicklas 427       html += gt.tagCommonPartOfName(aligned.name, message.otherAssay);
5014 08 Oct 18 nicklas 428       if (message.DO_NOT_USE) html += '<img src="../images/donotuse.png" title="DoNotUse-'+Strings.encodeTags(message.DO_NOT_USE + ': ' + message.DO_NOT_USE_COMMENT)+'">';
6588 18 Feb 22 nicklas 429       if (message.flagged) html += '<img src="../images/flag.png" title="'+Strings.encodeTags(message.otherAssay)+' is already flagged">';
4728 04 Apr 18 nicklas 430       if (message.currentVerifiedBy) 
4728 04 Apr 18 nicklas 431       {
4728 04 Apr 18 nicklas 432         var vicon = message.currentVerifiedBy == 'LYSATE' ? 'gt-verified-lysate.png' : 'gt-verified.png';
6588 18 Feb 22 nicklas 433         html += '<img src="../images/'+vicon+'" title="'+Strings.encodeTags(message.otherAssay+' is already verified by '+message.currentVerifiedBy)+'">';
4728 04 Apr 18 nicklas 434       }
4728 04 Apr 18 nicklas 435     }
4728 04 Apr 18 nicklas 436     html += '</td>';
4728 04 Apr 18 nicklas 437     html += '<td class="icon-col">';
4728 04 Apr 18 nicklas 438     if (message.vcf)
4728 04 Apr 18 nicklas 439     {
4728 04 Apr 18 nicklas 440       html += ' <span class="link vcf-link" data-file-id="'+vcf.fileId+'" data-item-id="'+aligned.id+'"';
4728 04 Apr 18 nicklas 441       html += ' data-item-id2="'+message.id+'" data-file-id2="'+message.vcf.fileId+'"';
4728 04 Apr 18 nicklas 442       html += ' title="Compare genotypes (hold CTRL, ALT or SHIFT to open in a new popup)"><img src="../images/vcf_file.png"></span>';
4728 04 Apr 18 nicklas 443     }
4728 04 Apr 18 nicklas 444     html += '</td>';
4728 04 Apr 18 nicklas 445     return html;
4728 04 Apr 18 nicklas 446   }
4728 04 Apr 18 nicklas 447   
4728 04 Apr 18 nicklas 448   
4728 04 Apr 18 nicklas 449   gt.tagCommonPartOfName = function(name1, name2)
4728 04 Apr 18 nicklas 450   {
4728 04 Apr 18 nicklas 451     var n1 = name1.split('.');
4728 04 Apr 18 nicklas 452     var n2 = name2.split('.');
4728 04 Apr 18 nicklas 453     var i = 0;
4728 04 Apr 18 nicklas 454     
4728 04 Apr 18 nicklas 455     var common = '';
4728 04 Apr 18 nicklas 456     var sep = '.';
4728 04 Apr 18 nicklas 457     while (i < n1.length && i < n2.length && n1[i] == n2[i])
4728 04 Apr 18 nicklas 458     {
4728 04 Apr 18 nicklas 459       common += n1[i] + sep;
4728 04 Apr 18 nicklas 460       i++;
4728 04 Apr 18 nicklas 461     }
4728 04 Apr 18 nicklas 462     
4728 04 Apr 18 nicklas 463     var diff = '';
4728 04 Apr 18 nicklas 464     sep = '';
4728 04 Apr 18 nicklas 465     while (i < n2.length)
4728 04 Apr 18 nicklas 466     {
4728 04 Apr 18 nicklas 467       diff += sep + n2[i];
4728 04 Apr 18 nicklas 468       i++;
4728 04 Apr 18 nicklas 469       sep = '.';
4728 04 Apr 18 nicklas 470     }
4728 04 Apr 18 nicklas 471     
4728 04 Apr 18 nicklas 472     return '<span class="commonpart">'+Strings.encodeTags(common)+'</span><span class="diffpart">'+Strings.encodeTags(diff)+'</span>';
4728 04 Apr 18 nicklas 473   }
4728 04 Apr 18 nicklas 474   
4646 14 Dec 17 nicklas 475   gt.vcfLinkOnClick = function(event)
4646 14 Dec 17 nicklas 476   {
4646 14 Dec 17 nicklas 477     var fileId = Data.int(event.currentTarget, 'file-id');
4646 14 Dec 17 nicklas 478     var itemId = Data.get(event.currentTarget, 'item-id');
4648 15 Dec 17 nicklas 479     var fileId2 = Data.int(event.currentTarget, 'file-id2');
4648 15 Dec 17 nicklas 480     var itemId2 = Data.get(event.currentTarget, 'item-id2');
4681 21 Feb 18 nicklas 481     var specialKey = event.altKey || event.ctrlKey || event.shiftKey;
4681 21 Feb 18 nicklas 482     
4646 14 Dec 17 nicklas 483     var url = 'view_genotypes.jsp?ID=' + App.getSessionId();
4646 14 Dec 17 nicklas 484     url += '&fileId='+fileId;
4646 14 Dec 17 nicklas 485     url += '&itemId='+itemId;
4648 15 Dec 17 nicklas 486     url += '&fileId2='+fileId2;
4648 15 Dec 17 nicklas 487     url += '&itemId2='+itemId2;
4648 15 Dec 17 nicklas 488     
4681 21 Feb 18 nicklas 489     Dialogs.openPopup(url, (specialKey ? 'ViewVcf'+itemId+itemId2 : 'ViewVcf'), 900, 600);
4646 14 Dec 17 nicklas 490   }
6670 07 Apr 22 nicklas 491   
6670 07 Apr 22 nicklas 492   gt.toggleSelection = function(event)
6670 07 Apr 22 nicklas 493   {
6670 07 Apr 22 nicklas 494     var prefix = Data.get(event.currentTarget, 'prefix');
6670 07 Apr 22 nicklas 495     var specialKey = event.altKey || event.ctrlKey || event.shiftKey;
6670 07 Apr 22 nicklas 496     
6670 07 Apr 22 nicklas 497     var frm = document.forms['reggie'];
6670 07 Apr 22 nicklas 498     for (var alignedNo = 0; alignedNo < alignedSequences.length; alignedNo++)
6670 07 Apr 22 nicklas 499     {
6670 07 Apr 22 nicklas 500       var aligned = alignedSequences[alignedNo];
6670 07 Apr 22 nicklas 501       var chk = frm[prefix+'.'+aligned.id];
6670 07 Apr 22 nicklas 502       if (chk && !chk.disabled)
6670 07 Apr 22 nicklas 503       {
6670 07 Apr 22 nicklas 504         chk.checked = specialKey ? false : !chk.checked;
6670 07 Apr 22 nicklas 505       }
6670 07 Apr 22 nicklas 506     }
6670 07 Apr 22 nicklas 507   }
4646 14 Dec 17 nicklas 508
4646 14 Dec 17 nicklas 509   gt.submit = function()
4646 14 Dec 17 nicklas 510   {
4646 14 Dec 17 nicklas 511     var frm = document.forms['reggie'];
4646 14 Dec 17 nicklas 512     var submitInfo = {};
4648 15 Dec 17 nicklas 513     var list = [];
4648 15 Dec 17 nicklas 514     submitInfo.alignedSequences = list;
4646 14 Dec 17 nicklas 515     
4648 15 Dec 17 nicklas 516     for (var aNo = 0; aNo < alignedSequences.length; aNo++)
4646 14 Dec 17 nicklas 517     {
4648 15 Dec 17 nicklas 518       var aligned = alignedSequences[aNo];
4649 20 Dec 17 nicklas 519       var cmp = aligned.compare;
4649 20 Dec 17 nicklas 520         
4646 14 Dec 17 nicklas 521       var tmp = {};
4648 15 Dec 17 nicklas 522       tmp.id = aligned.id;
4648 15 Dec 17 nicklas 523       tmp.disable = frm['disable.'+aligned.id].checked;
4728 04 Apr 18 nicklas 524       var verified = [];
4728 04 Apr 18 nicklas 525       tmp.verified = verified;
4728 04 Apr 18 nicklas 526       var flag = null;
4728 04 Apr 18 nicklas 527       if (frm['flag.'+aligned.id].checked)
4728 04 Apr 18 nicklas 528       {
4728 04 Apr 18 nicklas 529         flag = [];
4728 04 Apr 18 nicklas 530         tmp.flag = flag;
4728 04 Apr 18 nicklas 531         flag[flag.length] = aligned.id;
4728 04 Apr 18 nicklas 532       }
4728 04 Apr 18 nicklas 533       for (var mNo = 0; mNo < cmp.messages.length; mNo++)
4728 04 Apr 18 nicklas 534       {
4728 04 Apr 18 nicklas 535         var msg = cmp.messages[mNo];
4728 04 Apr 18 nicklas 536         if (msg.id)
4649 20 Dec 17 nicklas 537         {
7201 25 May 23 nicklas 538           if (flag && msg.assayType == 'TUMOR' && msg.warningLevel != 'INFO')
4728 04 Apr 18 nicklas 539           {
4728 04 Apr 18 nicklas 540             flag[flag.length] = msg.id;
4728 04 Apr 18 nicklas 541           }
4728 04 Apr 18 nicklas 542           if (msg.verifiedBy)
4728 04 Apr 18 nicklas 543           {
7200 25 May 23 nicklas 544             verified[verified.length] = { 'id': msg.id, 'verifiedBy': msg.verifiedBy, 'assayType': msg.assayType };
4728 04 Apr 18 nicklas 545           }
4649 20 Dec 17 nicklas 546         }
4649 20 Dec 17 nicklas 547       }
4728 04 Apr 18 nicklas 548       
4648 15 Dec 17 nicklas 549       tmp.comment = frm['comment.'+aligned.id].value;
4648 15 Dec 17 nicklas 550       list[list.length] = tmp;
4646 14 Dec 17 nicklas 551     }
4646 14 Dec 17 nicklas 552     
4646 14 Dec 17 nicklas 553     var url = '../Genotype.servlet?ID='+App.getSessionId();
4646 14 Dec 17 nicklas 554     url += '&cmd=RegisterQcCheck';
4646 14 Dec 17 nicklas 555     Wizard.showLoadingAnimation('Registering...');
4642 28 Nov 17 nicklas 556     Wizard.asyncJsonRequest(url, gt.submissionResults, 'POST', JSON.stringify(submitInfo));
4642 28 Nov 17 nicklas 557   }
4642 28 Nov 17 nicklas 558   
4642 28 Nov 17 nicklas 559   gt.submissionResults = function(response)
4642 28 Nov 17 nicklas 560   {
4642 28 Nov 17 nicklas 561     Wizard.showFinalMessage(response.messages);
4642 28 Nov 17 nicklas 562     Doc.show('gorestart');
4642 28 Nov 17 nicklas 563   }
4642 28 Nov 17 nicklas 564
4642 28 Nov 17 nicklas 565   return gt;
4642 28 Nov 17 nicklas 566 }();
4642 28 Nov 17 nicklas 567
4642 28 Nov 17 nicklas 568 Doc.onLoad(GenoType.initPage);
4642 28 Nov 17 nicklas 569