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

Code
Comments
Other
Rev Date Author Line
2636 04 Sep 14 nicklas 1 var Demux = function()
2636 04 Sep 14 nicklas 2 {
2636 04 Sep 14 nicklas 3   var demux = {};
2656 11 Sep 14 nicklas 4   var debug = 0;
2636 04 Sep 14 nicklas 5   
2682 18 Sep 14 nicklas 6   var ADAPTER_SIZE = 59;
2636 04 Sep 14 nicklas 7   var JOB_IMAGE = { 'DONE': 'ok.png', 'ERROR': 'error.png'};
2636 04 Sep 14 nicklas 8
2636 04 Sep 14 nicklas 9   // Page initialization
2636 04 Sep 14 nicklas 10   demux.initPage = function()
2636 04 Sep 14 nicklas 11   {
2636 04 Sep 14 nicklas 12     // Step 1
2636 04 Sep 14 nicklas 13     Events.addEventHandler('demuxJobs', 'change', demux.demuxJobOnChange);
2636 04 Sep 14 nicklas 14
2636 04 Sep 14 nicklas 15     // Step 2
2636 04 Sep 14 nicklas 16     Events.addEventHandler('step-2', 'wizard-initialize', demux.initializeStep2);
2636 04 Sep 14 nicklas 17     Events.addEventHandler('outcomeSuccessful', 'click', demux.outcomeOnChange);
2636 04 Sep 14 nicklas 18     Events.addEventHandler('outcomeFailed', 'click', demux.outcomeOnChange);
2636 04 Sep 14 nicklas 19     Events.addEventHandler('deleteItemsCreatedByFailedJob', 'click', demux.outcomeOnChange);
2636 04 Sep 14 nicklas 20     
2636 04 Sep 14 nicklas 21     // Navigation
2636 04 Sep 14 nicklas 22     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2636 04 Sep 14 nicklas 23     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2636 04 Sep 14 nicklas 24     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2636 04 Sep 14 nicklas 25     Buttons.addClickHandler('goregister', Wizard.goRegister);
2636 04 Sep 14 nicklas 26     
2636 04 Sep 14 nicklas 27     // Final registration
2636 04 Sep 14 nicklas 28     Events.addEventHandler('wizard', 'wizard-submit', demux.submit);
2636 04 Sep 14 nicklas 29
2636 04 Sep 14 nicklas 30     Wizard.showLoadingAnimation('Loading bioassays...');  
2636 04 Sep 14 nicklas 31     var url = '../DemuxMerge.servlet?ID='+App.getSessionId();
5493 13 Jun 19 nicklas 32     url += '&cmd=GetUnconfirmedDemuxJobs&pipeline=RNA_SEQ';
2636 04 Sep 14 nicklas 33     Wizard.asyncJsonRequest(url, demux.initializeStep1);
2636 04 Sep 14 nicklas 34   }
2636 04 Sep 14 nicklas 35   
2636 04 Sep 14 nicklas 36   // --- Step 1 -----------------------------------
2636 04 Sep 14 nicklas 37   demux.initializeStep1 = function(response)
2636 04 Sep 14 nicklas 38   {
2636 04 Sep 14 nicklas 39     var frm = document.forms['reggie'];
2636 04 Sep 14 nicklas 40     var jobs = response.jobs;
2636 04 Sep 14 nicklas 41     if (jobs.length == 0)
2636 04 Sep 14 nicklas 42     {
2636 04 Sep 14 nicklas 43       Wizard.setFatalError('No jobs available for confirmation.');
2636 04 Sep 14 nicklas 44       return;
2636 04 Sep 14 nicklas 45     }
2636 04 Sep 14 nicklas 46
2636 04 Sep 14 nicklas 47     for (var jobNo=0; jobNo < jobs.length; jobNo++)
2636 04 Sep 14 nicklas 48     {
2636 04 Sep 14 nicklas 49       var job = jobs[jobNo];
2636 04 Sep 14 nicklas 50       var name = job.status == 'ERROR' ? job.name + ' ( ! )' : job.name;
3723 25 Jan 16 nicklas 51       if (job.partial)
3723 25 Jan 16 nicklas 52       {
3723 25 Jan 16 nicklas 53         name += ' [partially confirmed]';
3723 25 Jan 16 nicklas 54       }
2636 04 Sep 14 nicklas 55       var option = new Option(name, job.id);
2636 04 Sep 14 nicklas 56       option.job = job;
2636 04 Sep 14 nicklas 57       frm.demuxJobs.options[frm.demuxJobs.length] = option;
2636 04 Sep 14 nicklas 58     }
2636 04 Sep 14 nicklas 59     
2636 04 Sep 14 nicklas 60     demux.demuxJobOnChange();
2636 04 Sep 14 nicklas 61
2636 04 Sep 14 nicklas 62     Doc.show('step-1');
2636 04 Sep 14 nicklas 63     Doc.show('gonext');
2636 04 Sep 14 nicklas 64
2636 04 Sep 14 nicklas 65     frm.demuxJobs.focus();
2636 04 Sep 14 nicklas 66   }
2636 04 Sep 14 nicklas 67   
2636 04 Sep 14 nicklas 68   demux.demuxJobOnChange = function()
2636 04 Sep 14 nicklas 69   {
2636 04 Sep 14 nicklas 70     var frm = document.forms['reggie'];  
2636 04 Sep 14 nicklas 71     var job = frm.demuxJobs[frm.demuxJobs.selectedIndex].job;
2636 04 Sep 14 nicklas 72     
2636 04 Sep 14 nicklas 73     Doc.element('startDate').innerHTML = Reggie.reformatDate(job.started);
2636 04 Sep 14 nicklas 74     Doc.element('endDate').innerHTML = Reggie.reformatDate(job.ended);
2636 04 Sep 14 nicklas 75     Doc.element('jobStatus').innerHTML = '<img src="../images/'+JOB_IMAGE[job.status]+'"> '+Strings.encodeTags(job.statusMessage);
2636 04 Sep 14 nicklas 76
2636 04 Sep 14 nicklas 77     var demuxedSequences = job.demuxedSequences;
5620 20 Sep 19 nicklas 78     var fcHtml = '<table id="fc-info-table"><tr>';
5620 20 Sep 19 nicklas 79     fcHtml += '<th>ID</th>';
5620 20 Sep 19 nicklas 80     fcHtml += '<th>PF_READS</th>';
5620 20 Sep 19 nicklas 81     fcHtml += '<th>PF_UNUSED_PCT</th>';
5620 20 Sep 19 nicklas 82     fcHtml += '<th>PF_NNNN_PCT</th>';
5620 20 Sep 19 nicklas 83     fcHtml += '<th>Demultiplex metrics</th>';
5620 20 Sep 19 nicklas 84     fcHtml += '<th>Warnings</th></tr>';
2636 04 Sep 14 nicklas 85     var fcNames = '';
2636 04 Sep 14 nicklas 86     var warningsHtml = '';
3140 24 Feb 15 nicklas 87     var skippedTilesHtml = '';
2636 04 Sep 14 nicklas 88     for (var dxNo = 0; dxNo < demuxedSequences.length; dxNo++)
2636 04 Sep 14 nicklas 89     {
2636 04 Sep 14 nicklas 90       var dx = demuxedSequences[dxNo];
2636 04 Sep 14 nicklas 91       var fc = dx.seqRun.flowCell;
2636 04 Sep 14 nicklas 92       
3181 18 Mar 15 nicklas 93       var pfReads = dx.PF_READS == null ? '-' : Reggie.formatNumber(dx.PF_READS/1000000, 'M', 2);
2636 04 Sep 14 nicklas 94       var pfUnused =  dx.PF_UNUSED_PCT == null ? '-' : Reggie.formatNumber(dx.PF_UNUSED_PCT, '%', 2);
2636 04 Sep 14 nicklas 95       var pfNNNN = dx.PF_NNNN_PCT == null ? '-' : Reggie.formatNumber(dx.PF_NNNN_PCT, '%', 2);
2636 04 Sep 14 nicklas 96
2636 04 Sep 14 nicklas 97       if (fcNames.length > 0) fcNames += ', ';
2636 04 Sep 14 nicklas 98       fcNames += Strings.encodeTags(fc.FlowCellID);
2636 04 Sep 14 nicklas 99       
2636 04 Sep 14 nicklas 100       fcHtml += '<tr><td>'+Strings.encodeTags(fc.FlowCellID)+'</td>';
2636 04 Sep 14 nicklas 101       fcHtml += '<td>' + pfReads + '</td>';
2636 04 Sep 14 nicklas 102       fcHtml += '<td>' + pfUnused + ' </td>';
2636 04 Sep 14 nicklas 103       fcHtml += '<td>' + pfNNNN + '</td>';
5620 20 Sep 19 nicklas 104       fcHtml += '<td>';
5620 20 Sep 19 nicklas 105       if  (dx.DemultiplexMetrics)
5620 20 Sep 19 nicklas 106       {
5620 20 Sep 19 nicklas 107         fcHtml += '<span class="link metrics-link" data-file-id="'+dx.DemultiplexMetrics.id+'" title="View metrics data from the demux">'+dx.DemultiplexMetrics.name+'</span>';
5620 20 Sep 19 nicklas 108       }
5620 20 Sep 19 nicklas 109       fcHtml += '</td>';
2683 18 Sep 14 nicklas 110       fcHtml += '<td>'+dx.DEMUX_WARNING.length+'</td>';
2683 18 Sep 14 nicklas 111       fcHtml += '</tr>';
2636 04 Sep 14 nicklas 112       
2636 04 Sep 14 nicklas 113       var pools = fc.pools;
5526 25 Jun 19 nicklas 114       var poolNames = [];
5526 25 Jun 19 nicklas 115       var libPlateNames = [];
2636 04 Sep 14 nicklas 116       for (var poolNo = 0; poolNo < pools.length; poolNo++)
2636 04 Sep 14 nicklas 117       {
2636 04 Sep 14 nicklas 118         var pool = pools[poolNo];
5526 25 Jun 19 nicklas 119         poolNames[poolNames.length] = pool.name;
5526 25 Jun 19 nicklas 120         if (pool.libPlates)
2636 04 Sep 14 nicklas 121         {
5526 25 Jun 19 nicklas 122           for (var plateNo = 0; plateNo < pool.libPlates.length; plateNo++)
5526 25 Jun 19 nicklas 123           {
5526 25 Jun 19 nicklas 124             var plateName = pool.libPlates[plateNo].name;
5526 25 Jun 19 nicklas 125             if (libPlateNames.indexOf(plateName) == -1)
5526 25 Jun 19 nicklas 126             {
5526 25 Jun 19 nicklas 127               libPlateNames[libPlateNames.length] = plateName;
5526 25 Jun 19 nicklas 128             }
5526 25 Jun 19 nicklas 129           }
2636 04 Sep 14 nicklas 130         }
2636 04 Sep 14 nicklas 131       }
2636 04 Sep 14 nicklas 132       
2636 04 Sep 14 nicklas 133       if (dx.DEMUX_WARNING.length > 0)
2636 04 Sep 14 nicklas 134       {
2636 04 Sep 14 nicklas 135         for (var warnNo = 0; warnNo < dx.DEMUX_WARNING.length; warnNo++)
2636 04 Sep 14 nicklas 136         {
2636 04 Sep 14 nicklas 137           warningsHtml += '<li class="warning">'+Strings.encodeTags(fc.FlowCellID)+': '+Strings.encodeTags(dx.DEMUX_WARNING[warnNo]);
2636 04 Sep 14 nicklas 138         }
2636 04 Sep 14 nicklas 139       }
3140 24 Feb 15 nicklas 140       
3140 24 Feb 15 nicklas 141       if (dx.SKIPPED_TILES.length > 0)
3140 24 Feb 15 nicklas 142       {
3140 24 Feb 15 nicklas 143         dx.SKIPPED_TILES.sort();
3140 24 Feb 15 nicklas 144         var lastLaneNo = 0;
3140 24 Feb 15 nicklas 145         for (var tileNo = 0; tileNo < dx.SKIPPED_TILES.length; tileNo++)
3140 24 Feb 15 nicklas 146         {
3140 24 Feb 15 nicklas 147           var tmp = dx.SKIPPED_TILES[tileNo];
3140 24 Feb 15 nicklas 148           var i = tmp.indexOf(':');
3140 24 Feb 15 nicklas 149           var laneNo = tmp.substring(0, i);
3140 24 Feb 15 nicklas 150           var tile = tmp.substring(i+1);
3140 24 Feb 15 nicklas 151           if (lastLaneNo != laneNo)
3140 24 Feb 15 nicklas 152           {
3140 24 Feb 15 nicklas 153             skippedTilesHtml += '<li class="warning">' + Strings.encodeTags(fc.FlowCellID) + ' - lane ' +laneNo + ': ';
3140 24 Feb 15 nicklas 154             lastLaneNo = laneNo;
3140 24 Feb 15 nicklas 155           }
3140 24 Feb 15 nicklas 156           else
3140 24 Feb 15 nicklas 157           {
3140 24 Feb 15 nicklas 158             skippedTilesHtml += ', ';
3140 24 Feb 15 nicklas 159           }
3140 24 Feb 15 nicklas 160           skippedTilesHtml += Strings.encodeTags(tile);
3140 24 Feb 15 nicklas 161         }
3140 24 Feb 15 nicklas 162       }
2636 04 Sep 14 nicklas 163     }
2636 04 Sep 14 nicklas 164     fcHtml += '</table>';
2636 04 Sep 14 nicklas 165
2636 04 Sep 14 nicklas 166     Doc.element('flowCellsInDemux').innerHTML = job.status == 'ERROR' ? fcNames : fcHtml;
5526 25 Jun 19 nicklas 167     Doc.element('pools').innerHTML = Strings.encodeTags(poolNames.join(', '));
5526 25 Jun 19 nicklas 168     Doc.element('libPlates').innerHTML = Strings.encodeTags(libPlateNames.join(', ')) || 'n/a';
2636 04 Sep 14 nicklas 169     Doc.element('comments').innerHTML = Strings.encodeTags(job.comments);
2636 04 Sep 14 nicklas 170     Doc.element('warnings').innerHTML = warningsHtml;
3140 24 Feb 15 nicklas 171     Doc.element('skippedTiles').innerHTML = skippedTilesHtml;
3140 24 Feb 15 nicklas 172     Doc.showHide('skippedTilesRow', skippedTilesHtml != '');
5620 20 Sep 19 nicklas 173
5620 20 Sep 19 nicklas 174     // Add click handler to file links
5620 20 Sep 19 nicklas 175     var clickableItems = document.getElementsByClassName('metrics-link');
5620 20 Sep 19 nicklas 176     for (var i = 0; i < clickableItems.length; i++)
5620 20 Sep 19 nicklas 177     {
5620 20 Sep 19 nicklas 178       Events.addEventHandler(clickableItems[i], 'click', Files.viewFileOnClick);
5620 20 Sep 19 nicklas 179     }
2636 04 Sep 14 nicklas 180   }
2636 04 Sep 14 nicklas 181
2636 04 Sep 14 nicklas 182   
2636 04 Sep 14 nicklas 183   demux.initializeStep2 = function()
2636 04 Sep 14 nicklas 184   {
2636 04 Sep 14 nicklas 185     var frm = document.forms['reggie'];
2636 04 Sep 14 nicklas 186     var job = frm.demuxJobs[frm.demuxJobs.selectedIndex].job;
3723 25 Jan 16 nicklas 187     
3723 25 Jan 16 nicklas 188     if (job.partial)
3723 25 Jan 16 nicklas 189     {
3723 25 Jan 16 nicklas 190       Doc.element('outcomeFailed').disabled = true;
3723 25 Jan 16 nicklas 191       Wizard.setInputStatus('outcome', 'warning', 'Some libraries have already been confirmed.');
3723 25 Jan 16 nicklas 192     }
2636 04 Sep 14 nicklas 193
2636 04 Sep 14 nicklas 194     var url = '../DemuxMerge.servlet?ID='+App.getSessionId();
2636 04 Sep 14 nicklas 195     url += '&cmd=GetMergedSequences&job='+job.id;
2636 04 Sep 14 nicklas 196     
2636 04 Sep 14 nicklas 197     Wizard.showLoadingAnimation('Loading merged sequences...');
2636 04 Sep 14 nicklas 198     Wizard.asyncJsonRequest(url, demux.mergedSequencesLoaded);
2636 04 Sep 14 nicklas 199   }
2636 04 Sep 14 nicklas 200   
2636 04 Sep 14 nicklas 201   demux.mergedSequencesLoaded = function(response)
2636 04 Sep 14 nicklas 202   {
2636 04 Sep 14 nicklas 203     var frm = document.forms['reggie'];
2636 04 Sep 14 nicklas 204     var job = frm.demuxJobs[frm.demuxJobs.selectedIndex].job;
2636 04 Sep 14 nicklas 205     var isError = job.status == 'ERROR';
2636 04 Sep 14 nicklas 206     
2636 04 Sep 14 nicklas 207     Wizard.setCurrentStep(2);
2636 04 Sep 14 nicklas 208     Doc.show('goregister');
2636 04 Sep 14 nicklas 209     Doc.show('gocancel');
2636 04 Sep 14 nicklas 210     
2636 04 Sep 14 nicklas 211     var mergedSeq = response.mergedSequences;
2819 16 Oct 14 nicklas 212     mergedSeq.sort(demux.sortByPool);
2636 04 Sep 14 nicklas 213     job.mergedSequences = mergedSeq;
3049 17 Dec 14 nicklas 214     var minPtReads = job.limits.minPtReads;
2636 04 Sep 14 nicklas 215       
2636 04 Sep 14 nicklas 216     var html = '<table id="mergedSequencesTable">';
3026 11 Dec 14 nicklas 217     html += '<thead class="bg-filled-100">';
2636 04 Sep 14 nicklas 218     // Header row
2636 04 Sep 14 nicklas 219     html += '<tr>';
2819 16 Oct 14 nicklas 220     html += '<th></th>';
2819 16 Oct 14 nicklas 221     html += '<th class="dottedleft"></th>';
3181 18 Mar 15 nicklas 222     html += '<th class="dottedleft" colspan="5">Reads (Millions)</th>';
2682 18 Sep 14 nicklas 223     html += '<th class="dottedleft" colspan="4">Fragment size</th>';
6809 24 Aug 22 nicklas 224     html += '<th class="dottedleft" colspan="4">Actions</th>';
2636 04 Sep 14 nicklas 225     html += '<th class="dottedleft">Comment</th>';
2636 04 Sep 14 nicklas 226     html += '</tr>';
2636 04 Sep 14 nicklas 227     html += '<tr>';
2819 16 Oct 14 nicklas 228     html += '<th>Library</th>';
2819 16 Oct 14 nicklas 229     html += '<th class="dottedleft">Pools</th>';
2636 04 Sep 14 nicklas 230     html += '<th class="dottedleft">READS</th>';
2636 04 Sep 14 nicklas 231     html += '<th>PF_READS</th>';
2689 23 Sep 14 nicklas 232     html += '<th>ADAPTER_READS</th>';
2636 04 Sep 14 nicklas 233     html += '<th>PT_READS</th>';
2682 18 Sep 14 nicklas 234     html += '<th class="warning-col"></th>';
3320 11 May 15 nicklas 235     html += '<th class="dottedleft">Size*¹</th>';
2682 18 Sep 14 nicklas 236     html += '<th>Avg²</th>';
2682 18 Sep 14 nicklas 237     html += '<th>Stdev²</th>';
2682 18 Sep 14 nicklas 238     html += '<th class="warning-col"></th>';
6670 07 Apr 22 nicklas 239     html += '<th class="dottedleft"><span id="flagrna" data-prefix="flag" class="interactable link" title="Toggle selection â€“ use CTRL, ALT or SHIFT to clear">Flag RNA</span></th>';
6670 07 Apr 22 nicklas 240     html += '<th><span id="legacy" data-prefix="legacy" class="interactable link" title="Toggle selection â€“ use CTRL, ALT or SHIFT to clear">Legacy</span></th>';
6670 07 Apr 22 nicklas 241     html += '<th><span id="hisat" data-prefix="hisat" class="interactable link" title="Toggle selection â€“ use CTRL, ALT or SHIFT to clear">Hisat</span></th>';
6809 24 Aug 22 nicklas 242     html += '<th><span id="hisat2023" data-prefix="hisat2023" class="interactable link" title="Toggle selection â€“ use CTRL, ALT or SHIFT to clear">Hisat/2023</span></th>';
2636 04 Sep 14 nicklas 243     html += '<th class="dottedleft"></th>';
2636 04 Sep 14 nicklas 244     html += '</tr>';
2636 04 Sep 14 nicklas 245     html += '</thead>';
2636 04 Sep 14 nicklas 246     html += '<tbody>';
2636 04 Sep 14 nicklas 247     
3768 24 Feb 16 nicklas 248     var yellowImg = '<img src="../images/yellow-label.png">';
2819 16 Oct 14 nicklas 249     var lastPoolName = mergedSeq[0].pools[0].name;
2636 04 Sep 14 nicklas 250     for (var mergedNo = 0; mergedNo < mergedSeq.length; mergedNo++)
2636 04 Sep 14 nicklas 251     {
2636 04 Sep 14 nicklas 252       var merged = mergedSeq[mergedNo];
2682 18 Sep 14 nicklas 253       var lib = merged.lib;
2819 16 Oct 14 nicklas 254       var pools = merged.pools;
2682 18 Sep 14 nicklas 255       
2636 04 Sep 14 nicklas 256       merged.stratagene = Reggie.isStratagene(merged.name);
2636 04 Sep 14 nicklas 257       merged.external = Reggie.isExternal(merged.name);
3768 24 Feb 16 nicklas 258       var isYellow = lib.specimen && lib.specimen.YellowLabel != null;
3768 24 Feb 16 nicklas 259       var img = isYellow ? yellowImg : '';
2636 04 Sep 14 nicklas 260
2636 04 Sep 14 nicklas 261       var reads = merged.READS == null ? '-' : Reggie.formatNumber(merged.READS/1000000, null, 2);
2636 04 Sep 14 nicklas 262       var pfReads = merged.PF_READS == null ? '-' : Reggie.formatNumber(merged.PF_READS/1000000, null, 2);
2636 04 Sep 14 nicklas 263       var ptReads = merged.PT_READS == null ? '-' : Reggie.formatNumber(merged.PT_READS/1000000, null, 2);
2736 06 Oct 14 nicklas 264       var ptPercent = merged.PF_READS > 0 && merged.PT_READS != null ? Math.round(100*merged.PT_READS/merged.PF_READS) : Number.NaN;
2689 23 Sep 14 nicklas 265       var adapterReads = merged.ADAPTER_READS == null ? '-' : Reggie.formatNumber(merged.ADAPTER_READS/1000000, null, 2);
2736 06 Oct 14 nicklas 266       var adapterPercent = merged.PF_READS > 0 && merged.ADAPTER_READS != null ? Math.round(100*merged.ADAPTER_READS/merged.PF_READS) : Number.NaN;
3049 17 Dec 14 nicklas 267
3049 17 Dec 14 nicklas 268       var flagChecked = false;
5552 12 Aug 19 nicklas 269       var alignChecked = !merged.stratagene;
3723 25 Jan 16 nicklas 270       merged.alreadyConfirmed = merged.AnalysisResult != null;
2736 06 Oct 14 nicklas 271       
3768 24 Feb 16 nicklas 272       html += '<tr class="highlight ' + (isYellow ? 'yellow-specimen' : '') + '"';
2819 16 Oct 14 nicklas 273       if (pools[0].name != lastPoolName)
2819 16 Oct 14 nicklas 274       {
2819 16 Oct 14 nicklas 275         lastPoolName = pools[0].name;
2819 16 Oct 14 nicklas 276         html += 'style="border-top: 1px solid #000000;"';
2819 16 Oct 14 nicklas 277       }
3768 24 Feb 16 nicklas 278       html += '><td class="prompt if-yellow">'+img+Strings.encodeTags(merged.name)+'</td>';
2819 16 Oct 14 nicklas 279       html += '<td class="dottedleft">';
2819 16 Oct 14 nicklas 280       for (var poolNo = 0; poolNo < pools.length; poolNo++)
2819 16 Oct 14 nicklas 281       {
2819 16 Oct 14 nicklas 282         if (poolNo > 0) html += ', ';
2819 16 Oct 14 nicklas 283         html += Strings.encodeTags(pools[poolNo].name);
2819 16 Oct 14 nicklas 284       }
2819 16 Oct 14 nicklas 285       html += '</td>';
2636 04 Sep 14 nicklas 286       html += '<td class="dottedleft">'+reads+'</td>';
2636 04 Sep 14 nicklas 287       html += '<td>'+pfReads+'</td>';
2736 06 Oct 14 nicklas 288       html += '<td>'+adapterReads+(isNaN(adapterPercent) ? '' : ' ('+adapterPercent+'%)') +'</td>';
2736 06 Oct 14 nicklas 289       html += '<td>'+ptReads+(isNaN(ptPercent) ? '' : ' ('+ptPercent+'%)') + '</td>';
2682 18 Sep 14 nicklas 290       html += '<td class="warning-col">';
3049 17 Dec 14 nicklas 291       if (merged.PT_READS == null || merged.PT_READS < minPtReads)
2682 18 Sep 14 nicklas 292       {
3049 17 Dec 14 nicklas 293         html += '<img src="../images/warning.png" title="Less than '+Reggie.formatCount(minPtReads) + ' passed Trimmomatic">';
3049 17 Dec 14 nicklas 294         flagChecked = true;
3049 17 Dec 14 nicklas 295         alignChecked = false;
2682 18 Sep 14 nicklas 296       }
2682 18 Sep 14 nicklas 297       html += '</td>';
2636 04 Sep 14 nicklas 298
3320 11 May 15 nicklas 299       var lib_size = Math.round(lib.CA_Size || lib.library_size_est) - ADAPTER_SIZE * 2;
2682 18 Sep 14 nicklas 300
2682 18 Sep 14 nicklas 301       html += '<td class="dottedleft">'+lib_size+'</td>';
2736 06 Oct 14 nicklas 302       html += '<td>'+(merged.FragmentSizeAvg || '-')+'</td>';
2736 06 Oct 14 nicklas 303       html += '<td>'+(merged.FragmentSizeStdev || '-')+'</td>';
2682 18 Sep 14 nicklas 304       html += '<td class="warning-col">';
2736 06 Oct 14 nicklas 305       if (merged.FragmentSizeAvg != null && merged.FragmentSizeStdev != null)
2682 18 Sep 14 nicklas 306       {
2736 06 Oct 14 nicklas 307         var delta = lib_size - merged.FragmentSizeAvg;
2736 06 Oct 14 nicklas 308         if (Math.abs(delta) > merged.FragmentSizeStdev)
2736 06 Oct 14 nicklas 309         {
2736 06 Oct 14 nicklas 310           html += '<img src="../images/warning.png" title="Fragment size differ from CA_Size: ' + delta+'">';
2736 06 Oct 14 nicklas 311         }
2682 18 Sep 14 nicklas 312       }
2682 18 Sep 14 nicklas 313       html += '</td>';
2682 18 Sep 14 nicklas 314
3723 25 Jan 16 nicklas 315       if (merged.alreadyConfirmed)
2636 04 Sep 14 nicklas 316       {
4597 27 Sep 17 nicklas 317         html += '<td class="dottedleft" colspan="3"></td>';
3723 25 Jan 16 nicklas 318         html += '<td class="dottedleft italic comment" style="padding-left: 2px;">Already confirmed</td>';
2636 04 Sep 14 nicklas 319       }
2636 04 Sep 14 nicklas 320       else
2636 04 Sep 14 nicklas 321       {
3723 25 Jan 16 nicklas 322         // Do not allow flagging external or stratagene
3723 25 Jan 16 nicklas 323         if (merged.stratagene || merged.external)
3723 25 Jan 16 nicklas 324         {
3723 25 Jan 16 nicklas 325           html += '<td class="dottedleft">-</td>';
3723 25 Jan 16 nicklas 326         }
3723 25 Jan 16 nicklas 327         else
3723 25 Jan 16 nicklas 328         {
3723 25 Jan 16 nicklas 329           html += '<td class="dottedleft"><input type="checkbox" name="flag.'+merged.id+'"'+(flagChecked ? ' checked':'')+'></td>';
3723 25 Jan 16 nicklas 330         }
3723 25 Jan 16 nicklas 331           
4597 27 Sep 17 nicklas 332         html += '<td><input type="checkbox" name="legacy.'+merged.id+'" '+(alignChecked ? ' checked':'')+'></td>';
4597 27 Sep 17 nicklas 333         html += '<td><input type="checkbox" name="hisat.'+merged.id+'" '+(alignChecked ? ' checked':'')+'></td>';
6809 24 Aug 22 nicklas 334         html += '<td><input type="checkbox" name="hisat2023.'+merged.id+'" '+(alignChecked ? ' checked':'')+'></td>';
3723 25 Jan 16 nicklas 335         html += '<td class="dottedleft comment"><input type="text" name="comment.'+merged.id+'"></td>';
2636 04 Sep 14 nicklas 336       }
2636 04 Sep 14 nicklas 337       html += '</tr>';
2636 04 Sep 14 nicklas 338     }
2636 04 Sep 14 nicklas 339     html += '</tbody>';
2636 04 Sep 14 nicklas 340     html += '</table>';
2636 04 Sep 14 nicklas 341     Doc.element('mergedSequences').innerHTML = html;
6670 07 Apr 22 nicklas 342     
6670 07 Apr 22 nicklas 343     Events.addEventHandler('flagrna', 'click', demux.toggleSelection);
6670 07 Apr 22 nicklas 344     Events.addEventHandler('legacy', 'click', demux.toggleSelection);
6670 07 Apr 22 nicklas 345     Events.addEventHandler('hisat', 'click', demux.toggleSelection);
6809 24 Aug 22 nicklas 346     Events.addEventHandler('hisat2023', 'click', demux.toggleSelection);
6670 07 Apr 22 nicklas 347
2636 04 Sep 14 nicklas 348     if (isError)
2636 04 Sep 14 nicklas 349     {
2636 04 Sep 14 nicklas 350       Doc.element('outcomeSuccessful').disabled = true;
2636 04 Sep 14 nicklas 351       Doc.element('outcomeFailed').checked = true;
2681 18 Sep 14 nicklas 352       frm.deleteItemsCreatedByFailedJob.checked = true;
2681 18 Sep 14 nicklas 353       frm.demuxAgain.checked = true;
2636 04 Sep 14 nicklas 354       demux.outcomeOnChange();
2636 04 Sep 14 nicklas 355     }
2636 04 Sep 14 nicklas 356   }
2819 16 Oct 14 nicklas 357   
2819 16 Oct 14 nicklas 358   /**
2819 16 Oct 14 nicklas 359     Sort by the name of the first pool.
2819 16 Oct 14 nicklas 360   */
2819 16 Oct 14 nicklas 361   demux.sortByPool = function(a, b)
2819 16 Oct 14 nicklas 362   {
2819 16 Oct 14 nicklas 363     var p1 = a.pools[0].name;
2819 16 Oct 14 nicklas 364     var p2 = b.pools[0].name;
2819 16 Oct 14 nicklas 365     if (p1 < p2) return -1;
2819 16 Oct 14 nicklas 366     if (p1 > p2) return 1;
2819 16 Oct 14 nicklas 367     if (a.name < b.name) return -1;
2819 16 Oct 14 nicklas 368     if (a.name > b.name) return 1;
2819 16 Oct 14 nicklas 369     return a.id - b.id;
2819 16 Oct 14 nicklas 370   }
2636 04 Sep 14 nicklas 371
2636 04 Sep 14 nicklas 372   demux.outcomeOnChange = function()
2636 04 Sep 14 nicklas 373   {
2636 04 Sep 14 nicklas 374     var frm = document.forms['reggie'];  
2636 04 Sep 14 nicklas 375     var failed = Doc.element('outcomeFailed').checked;
2636 04 Sep 14 nicklas 376     var deleteItems = frm.deleteItemsCreatedByFailedJob.checked;
2636 04 Sep 14 nicklas 377     frm.flagPools.disabled = !failed;
2681 18 Sep 14 nicklas 378     frm.demuxAgain.disabled = !failed;
2681 18 Sep 14 nicklas 379     frm.deleteItemsCreatedByFailedJob.disabled = !failed;
2636 04 Sep 14 nicklas 380     if (frm.flagPools.disabled) frm.flagPools.checked = false;
2681 18 Sep 14 nicklas 381     if (frm.demuxAgain.disabled) frm.demuxAgain.checked = false;
2681 18 Sep 14 nicklas 382     if (frm.deleteItemsCreatedByFailedJob.disabled) frm.deleteItemsCreatedByFailedJob.checked = false;
2636 04 Sep 14 nicklas 383     
2636 04 Sep 14 nicklas 384     var job = frm.demuxJobs[frm.demuxJobs.selectedIndex].job;
2636 04 Sep 14 nicklas 385     var mergedSequences = job.mergedSequences;
2636 04 Sep 14 nicklas 386     
2636 04 Sep 14 nicklas 387     for (var mergeNo = 0; mergeNo < mergedSequences.length; mergeNo++)
2636 04 Sep 14 nicklas 388     {
2636 04 Sep 14 nicklas 389       var merge = mergedSequences[mergeNo];
2636 04 Sep 14 nicklas 390       if (frm['flag.'+merge.id])
2636 04 Sep 14 nicklas 391       {
2636 04 Sep 14 nicklas 392         frm['flag.'+merge.id].disabled = failed;
3483 09 Sep 15 nicklas 393         demux.resetCheckbox(frm['flag.'+merge.id]);
2636 04 Sep 14 nicklas 394       }
4597 27 Sep 17 nicklas 395       if (frm['legacy.'+merge.id])
3723 25 Jan 16 nicklas 396       {
4597 27 Sep 17 nicklas 397         frm['legacy.'+merge.id].disabled = failed;
4597 27 Sep 17 nicklas 398         demux.resetCheckbox(frm['legacy.'+merge.id]);
3723 25 Jan 16 nicklas 399       }
4597 27 Sep 17 nicklas 400       if (frm['hisat.'+merge.id])
4597 27 Sep 17 nicklas 401       {
4597 27 Sep 17 nicklas 402         frm['hisat.'+merge.id].disabled = failed;
4597 27 Sep 17 nicklas 403         demux.resetCheckbox(frm['hisat.'+merge.id]);
4597 27 Sep 17 nicklas 404       }
6809 24 Aug 22 nicklas 405       if (frm['hisat2023.'+merge.id])
6809 24 Aug 22 nicklas 406       {
6809 24 Aug 22 nicklas 407         frm['hisat2023.'+merge.id].disabled = failed;
6809 24 Aug 22 nicklas 408         demux.resetCheckbox(frm['hisat2023.'+merge.id]);
6809 24 Aug 22 nicklas 409       }
3723 25 Jan 16 nicklas 410       if (frm['comment.'+merge.id])
3723 25 Jan 16 nicklas 411       {
3723 25 Jan 16 nicklas 412         frm['comment.'+merge.id].disabled = deleteItems;
3723 25 Jan 16 nicklas 413       }
2636 04 Sep 14 nicklas 414     }
2636 04 Sep 14 nicklas 415   }
2636 04 Sep 14 nicklas 416
6670 07 Apr 22 nicklas 417   demux.toggleSelection = function(event)
6670 07 Apr 22 nicklas 418   {
6670 07 Apr 22 nicklas 419     var prefix = Data.get(event.currentTarget, 'prefix');
6670 07 Apr 22 nicklas 420     var specialKey = event.altKey || event.ctrlKey || event.shiftKey;
6670 07 Apr 22 nicklas 421     
6670 07 Apr 22 nicklas 422     var frm = document.forms['reggie'];
6670 07 Apr 22 nicklas 423     var job = frm.demuxJobs[frm.demuxJobs.selectedIndex].job;
6670 07 Apr 22 nicklas 424     var mergedSequences = job.mergedSequences;
6670 07 Apr 22 nicklas 425     for (var mergedNo = 0; mergedNo < mergedSequences.length; mergedNo++)
6670 07 Apr 22 nicklas 426     {
6670 07 Apr 22 nicklas 427       var merged = mergedSequences[mergedNo];
6670 07 Apr 22 nicklas 428       var chk = frm[prefix+'.'+merged.id];
6670 07 Apr 22 nicklas 429       if (chk && !chk.disabled)
6670 07 Apr 22 nicklas 430       {
6670 07 Apr 22 nicklas 431         chk.checked = specialKey ? false : !chk.checked;
6670 07 Apr 22 nicklas 432       }
6670 07 Apr 22 nicklas 433     }
6670 07 Apr 22 nicklas 434   }
6670 07 Apr 22 nicklas 435
3483 09 Sep 15 nicklas 436   /**
3483 09 Sep 15 nicklas 437     A disabled checkbox is forced to be unchecked, the old value is stored in
3483 09 Sep 15 nicklas 438     'oldChecked'. An enabled checkbox with 'oldChecked' set is checked.
3483 09 Sep 15 nicklas 439    */
3483 09 Sep 15 nicklas 440   demux.resetCheckbox = function(checkbox)
3483 09 Sep 15 nicklas 441   {
3483 09 Sep 15 nicklas 442     if (checkbox.disabled)
3483 09 Sep 15 nicklas 443     {
3483 09 Sep 15 nicklas 444       checkbox.oldChecked = checkbox.checked;
3483 09 Sep 15 nicklas 445       checkbox.checked = false;
3483 09 Sep 15 nicklas 446     }
3483 09 Sep 15 nicklas 447     else if (checkbox.oldChecked != null)
3483 09 Sep 15 nicklas 448     {
3483 09 Sep 15 nicklas 449       checkbox.checked = checkbox.oldChecked;
3483 09 Sep 15 nicklas 450       checkbox.oldChecked = null;
3483 09 Sep 15 nicklas 451     }
3483 09 Sep 15 nicklas 452   }
2636 04 Sep 14 nicklas 453   
2636 04 Sep 14 nicklas 454   demux.submit = function()
2636 04 Sep 14 nicklas 455   {
2636 04 Sep 14 nicklas 456
2636 04 Sep 14 nicklas 457     var frm = document.forms['reggie'];  
2636 04 Sep 14 nicklas 458     var failed = Doc.element('outcomeFailed').checked;
2636 04 Sep 14 nicklas 459     var submitInfo = {};
2636 04 Sep 14 nicklas 460     submitInfo.failed = failed;
2636 04 Sep 14 nicklas 461     submitInfo.flagPools = frm.flagPools.checked;
2636 04 Sep 14 nicklas 462     submitInfo.deleteItemsCreatedByFailedJob = frm.deleteItemsCreatedByFailedJob.checked;
2640 08 Sep 14 nicklas 463     submitInfo.demuxAgain = frm.demuxAgain.checked;
2636 04 Sep 14 nicklas 464     
2636 04 Sep 14 nicklas 465     var job = frm.demuxJobs[frm.demuxJobs.selectedIndex].job;
2636 04 Sep 14 nicklas 466     var demuxedSequences = job.demuxedSequences;
2636 04 Sep 14 nicklas 467     var mergedSequences = job.mergedSequences;
2636 04 Sep 14 nicklas 468       
2636 04 Sep 14 nicklas 469     var dx = [];
2636 04 Sep 14 nicklas 470     submitInfo.demuxedSequences = dx;
2636 04 Sep 14 nicklas 471     for (var demuxNo = 0; demuxNo < demuxedSequences.length; demuxNo++)
2636 04 Sep 14 nicklas 472     {
2636 04 Sep 14 nicklas 473       var tmp = {};
2636 04 Sep 14 nicklas 474       tmp.id = demuxedSequences[demuxNo].id;
2636 04 Sep 14 nicklas 475       dx[dx.length] = tmp;
2636 04 Sep 14 nicklas 476     }
2636 04 Sep 14 nicklas 477     
2636 04 Sep 14 nicklas 478     var merged = [];
2636 04 Sep 14 nicklas 479     submitInfo.mergedSequences = merged;
2636 04 Sep 14 nicklas 480     for (var mergeNo = 0; mergeNo < mergedSequences.length; mergeNo++)
2636 04 Sep 14 nicklas 481     {
2636 04 Sep 14 nicklas 482       var merge = mergedSequences[mergeNo];
3723 25 Jan 16 nicklas 483       if (!merge.alreadyConfirmed)
3723 25 Jan 16 nicklas 484       {
3723 25 Jan 16 nicklas 485         var tmp = {};
3723 25 Jan 16 nicklas 486         tmp.id = merge.id;
3723 25 Jan 16 nicklas 487         tmp.flag = frm['flag.'+merge.id] && frm['flag.'+merge.id].checked;
4597 27 Sep 17 nicklas 488         tmp.legacyAlign = frm['legacy.'+merge.id].checked;
4597 27 Sep 17 nicklas 489         tmp.hisatAlign = frm['hisat.'+merge.id].checked;
6809 24 Aug 22 nicklas 490         tmp.hisat2023Align = frm['hisat2023.'+merge.id].checked;
3723 25 Jan 16 nicklas 491         tmp.comment = frm['comment.'+merge.id].value;
3723 25 Jan 16 nicklas 492         merged[merged.length] = tmp;
3723 25 Jan 16 nicklas 493       }
2636 04 Sep 14 nicklas 494     }
2636 04 Sep 14 nicklas 495     
2636 04 Sep 14 nicklas 496     var url = '../DemuxMerge.servlet?ID='+App.getSessionId();
5551 12 Aug 19 nicklas 497     url += '&cmd=RegisterDemuxAndMerge&pipeline=RNA_SEQ';
2636 04 Sep 14 nicklas 498     
2636 04 Sep 14 nicklas 499     Wizard.showLoadingAnimation('Performing registration...');
2636 04 Sep 14 nicklas 500     Wizard.asyncJsonRequest(url, demux.submissionResults, 'POST', JSON.stringify(submitInfo));
2636 04 Sep 14 nicklas 501   }
2636 04 Sep 14 nicklas 502   
2636 04 Sep 14 nicklas 503   demux.submissionResults = function(response)
2636 04 Sep 14 nicklas 504   {
2636 04 Sep 14 nicklas 505     Wizard.showFinalMessage(response.messages);
2636 04 Sep 14 nicklas 506     Doc.show('gorestart');
2636 04 Sep 14 nicklas 507   }
2636 04 Sep 14 nicklas 508   
2636 04 Sep 14 nicklas 509   
2636 04 Sep 14 nicklas 510   return demux;
2636 04 Sep 14 nicklas 511 }();
2636 04 Sep 14 nicklas 512
2636 04 Sep 14 nicklas 513 Doc.onLoad(Demux.initPage);
2636 04 Sep 14 nicklas 514