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

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