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

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