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

Code
Comments
Other
Rev Date Author Line
5801 19 Dec 19 nicklas 1 var Demux = function()
5801 19 Dec 19 nicklas 2 {
5801 19 Dec 19 nicklas 3   var demux = {};
5801 19 Dec 19 nicklas 4   var debug = 0;
5801 19 Dec 19 nicklas 5
5801 19 Dec 19 nicklas 6   var pipeline = null;
5801 19 Dec 19 nicklas 7   var subtypeSequencingRun = null;
5801 19 Dec 19 nicklas 8   var annotationTypePipeline = null;
5801 19 Dec 19 nicklas 9   var seqRunsAreValid = false;
5801 19 Dec 19 nicklas 10   var clusterIsValid = false;
5801 19 Dec 19 nicklas 11   var newSeqRuns;
5801 19 Dec 19 nicklas 12   
5801 19 Dec 19 nicklas 13   // Page initialization
5801 19 Dec 19 nicklas 14   demux.initPage = function()
5801 19 Dec 19 nicklas 15   {
5801 19 Dec 19 nicklas 16     
5801 19 Dec 19 nicklas 17     // Step 1
5801 19 Dec 19 nicklas 18     Buttons.addClickHandler('btnSelectSeqRuns', demux.selectSeqencingRuns);
5801 19 Dec 19 nicklas 19     Events.addEventHandler('seqRuns', 'base-selected', demux.setSeqRunCallback);
5801 19 Dec 19 nicklas 20     Events.addEventHandler('seqRuns', 'change', demux.seqRunsOnChange);
5801 19 Dec 19 nicklas 21     Events.addEventHandler('step-1', 'wizard-validate', demux.validateStep1);
5801 19 Dec 19 nicklas 22
5801 19 Dec 19 nicklas 23     // Step 2
5801 19 Dec 19 nicklas 24     Events.addEventHandler('step-2', 'wizard-initialize', demux.initializeStep2);
5801 19 Dec 19 nicklas 25     Events.addEventHandler('step-2', 'wizard-validate', demux.validateStep2);
5801 19 Dec 19 nicklas 26     Events.addEventHandler('clusters', 'change', demux.clusterOnChange);
5801 19 Dec 19 nicklas 27     Events.addEventHandler('demuxSoftware', 'change', demux.softwareOnChange);
5801 19 Dec 19 nicklas 28     
5801 19 Dec 19 nicklas 29     // Navigation
5801 19 Dec 19 nicklas 30     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
5801 19 Dec 19 nicklas 31     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
5801 19 Dec 19 nicklas 32     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
5801 19 Dec 19 nicklas 33     Buttons.addClickHandler('goregister', Wizard.goRegister);
5801 19 Dec 19 nicklas 34       
5801 19 Dec 19 nicklas 35     // Final registration
5801 19 Dec 19 nicklas 36     Events.addEventHandler('wizard', 'wizard-submit', demux.submit);
5801 19 Dec 19 nicklas 37     
5801 19 Dec 19 nicklas 38
5801 19 Dec 19 nicklas 39     Wizard.showLoadingAnimation('Loading bioassays...');
5801 19 Dec 19 nicklas 40     var url = '../DemuxMerge.servlet?ID='+App.getSessionId();
5801 19 Dec 19 nicklas 41     url += '&cmd=GetConfirmedSequencingRuns&pipeline='+encodeURIComponent(Data.get('page-data', 'pipeline'));
5801 19 Dec 19 nicklas 42     Wizard.asyncJsonRequest(url, demux.initializeStep1);
5801 19 Dec 19 nicklas 43   }
5801 19 Dec 19 nicklas 44   
5801 19 Dec 19 nicklas 45   // --- Step 1 -----------------------------------
5801 19 Dec 19 nicklas 46   demux.initializeStep1 = function(response)
5801 19 Dec 19 nicklas 47   {
5801 19 Dec 19 nicklas 48     pipeline = response.pipeline; // We need the 'name' value here to be able to filter in "Select manually"
5801 19 Dec 19 nicklas 49     var seqRuns = response.sequencingRuns;
5801 19 Dec 19 nicklas 50     seqRuns.sort(demux.sortByPool);
5801 19 Dec 19 nicklas 51     var frm = document.forms['reggie'];  
5801 19 Dec 19 nicklas 52
5801 19 Dec 19 nicklas 53     if (seqRuns.length > 0)
5801 19 Dec 19 nicklas 54     {
5801 19 Dec 19 nicklas 55       for (var runNo=0; runNo < seqRuns.length; runNo++)
5801 19 Dec 19 nicklas 56       {
5801 19 Dec 19 nicklas 57         var seqRun = seqRuns[runNo];
5801 19 Dec 19 nicklas 58         var option = demux.getOptionForSeqRun(seqRun);
5801 19 Dec 19 nicklas 59         frm.seqRuns.options[frm.seqRuns.length] = option;
5801 19 Dec 19 nicklas 60       }
5801 19 Dec 19 nicklas 61       demux.seqRunsOnChange();
5801 19 Dec 19 nicklas 62     }
5801 19 Dec 19 nicklas 63     else
5801 19 Dec 19 nicklas 64     {
5801 19 Dec 19 nicklas 65       Wizard.setInputStatus('seqRuns', 'invalid', 'No new sequencing runs available for processing');
5801 19 Dec 19 nicklas 66     }
5801 19 Dec 19 nicklas 67     
5801 19 Dec 19 nicklas 68     Doc.show('step-1');
5801 19 Dec 19 nicklas 69     Doc.show('gonext');
5801 19 Dec 19 nicklas 70
5801 19 Dec 19 nicklas 71     frm.seqRuns.focus();
5801 19 Dec 19 nicklas 72   }
5801 19 Dec 19 nicklas 73   
5801 19 Dec 19 nicklas 74   demux.validateStep1 = function(event)
5801 19 Dec 19 nicklas 75   {
5801 19 Dec 19 nicklas 76     if (!seqRunsAreValid) event.preventDefault();
5801 19 Dec 19 nicklas 77   }
5801 19 Dec 19 nicklas 78   
5801 19 Dec 19 nicklas 79   /**
5801 19 Dec 19 nicklas 80     Sort by the name of the first pool.
5801 19 Dec 19 nicklas 81   */
5801 19 Dec 19 nicklas 82   demux.sortByPool = function(a, b)
5801 19 Dec 19 nicklas 83   {
5801 19 Dec 19 nicklas 84     var p1 = a.flowCell.pools[0].name;
5801 19 Dec 19 nicklas 85     var p2 = b.flowCell.pools[0].name;
5801 19 Dec 19 nicklas 86     if (p1 < p2) return -1;
5801 19 Dec 19 nicklas 87     if (p1 > p2) return 1;
5801 19 Dec 19 nicklas 88     if (a.name < b.name) return -1;
5801 19 Dec 19 nicklas 89     if (a.name > b.name) return 1;
5801 19 Dec 19 nicklas 90     return a.id - b.id;
5801 19 Dec 19 nicklas 91   }
5801 19 Dec 19 nicklas 92   
5801 19 Dec 19 nicklas 93   demux.getOptionForSeqRun = function(seqRun)
5801 19 Dec 19 nicklas 94   {
5801 19 Dec 19 nicklas 95     var flowCell = seqRun.flowCell;
5801 19 Dec 19 nicklas 96     var name = seqRun.name+': ';
5801 19 Dec 19 nicklas 97     var numPools = flowCell.pools.length;
5801 19 Dec 19 nicklas 98     var firstPoolNum = demux.getPoolNum(flowCell.pools[0].name);
5801 19 Dec 19 nicklas 99     var lastPoolNum = demux.getPoolNum(flowCell.pools[flowCell.pools.length-1].name);
5801 19 Dec 19 nicklas 100
5801 19 Dec 19 nicklas 101     if (lastPoolNum - firstPoolNum == numPools - 1)
5801 19 Dec 19 nicklas 102     {
5801 19 Dec 19 nicklas 103       if (numPools > 1)
5801 19 Dec 19 nicklas 104       {
5801 19 Dec 19 nicklas 105         // Display: PoolN -- PoolY
5801 19 Dec 19 nicklas 106         name += flowCell.pools[0].name + ' — ' + flowCell.pools[flowCell.pools.length-1].name;
5801 19 Dec 19 nicklas 107       }
5801 19 Dec 19 nicklas 108       else
5801 19 Dec 19 nicklas 109       {
5801 19 Dec 19 nicklas 110         name += flowCell.pools[0].name;
5801 19 Dec 19 nicklas 111       }
5801 19 Dec 19 nicklas 112     }
5801 19 Dec 19 nicklas 113     else
5801 19 Dec 19 nicklas 114     {
5801 19 Dec 19 nicklas 115       // Display: PoolN + x more...
5801 19 Dec 19 nicklas 116       name += flowCell.pools[0].name + ' + ' + (numPools-1) + ' more...';
5801 19 Dec 19 nicklas 117     }
5801 19 Dec 19 nicklas 118     
5801 19 Dec 19 nicklas 119     var opt = [];
5801 19 Dec 19 nicklas 120     opt[opt.length] = flowCell.libraries.length + ' libraries';
5801 19 Dec 19 nicklas 121     if (flowCell.FlowCellType) opt[opt.length] = flowCell.FlowCellType;
5801 19 Dec 19 nicklas 122     opt[opt.length] = seqRun.pipeline;
5801 19 Dec 19 nicklas 123     name += ' [' + opt.join('; ') + ']';
5801 19 Dec 19 nicklas 124
5801 19 Dec 19 nicklas 125     if (seqRun.AutoProcess == 'ReProcess')
5801 19 Dec 19 nicklas 126     {
5801 19 Dec 19 nicklas 127       name += ' [R]';
5801 19 Dec 19 nicklas 128     }
5801 19 Dec 19 nicklas 129     
5801 19 Dec 19 nicklas 130     // Count the number of libraries marked with DoNotUse
5801 19 Dec 19 nicklas 131     var numDoNotUse = 0;
5801 19 Dec 19 nicklas 132     for (var libNo = 0; libNo < flowCell.libraries.length; libNo++)
5801 19 Dec 19 nicklas 133     {
5801 19 Dec 19 nicklas 134       if (flowCell.libraries[libNo].DO_NOT_USE) numDoNotUse++;
5801 19 Dec 19 nicklas 135     }
5801 19 Dec 19 nicklas 136     flowCell.numDoNotUse = numDoNotUse;
5801 19 Dec 19 nicklas 137     
5801 19 Dec 19 nicklas 138     // Tooltip is always all pools
5801 19 Dec 19 nicklas 139     var title = '';
5801 19 Dec 19 nicklas 140     for (var poolNo=0; poolNo < numPools; poolNo++)
5801 19 Dec 19 nicklas 141     {
5801 19 Dec 19 nicklas 142       var pool = flowCell.pools[poolNo];
5801 19 Dec 19 nicklas 143       if (poolNo > 0) title += ', ';
5801 19 Dec 19 nicklas 144       title += pool.name;
5801 19 Dec 19 nicklas 145     }
5801 19 Dec 19 nicklas 146
5801 19 Dec 19 nicklas 147     var option = new Option(name, seqRun.id);
5801 19 Dec 19 nicklas 148     option.title = title;
5801 19 Dec 19 nicklas 149     option.seqRun = seqRun;  
5801 19 Dec 19 nicklas 150     return option;
5801 19 Dec 19 nicklas 151   }
5801 19 Dec 19 nicklas 152
5801 19 Dec 19 nicklas 153   demux.getPoolNum = function(poolName)
5801 19 Dec 19 nicklas 154   {
5801 19 Dec 19 nicklas 155     var num = poolName.match(/Pool(\d+)/);
5801 19 Dec 19 nicklas 156     return num ? parseInt(num[1], 10) : null;
5801 19 Dec 19 nicklas 157   }
5801 19 Dec 19 nicklas 158
5801 19 Dec 19 nicklas 159   demux.selectSeqencingRuns = function()
5801 19 Dec 19 nicklas 160   {
5801 19 Dec 19 nicklas 161     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 162     if (frm.seqRuns.disabled) return;
5801 19 Dec 19 nicklas 163     
5801 19 Dec 19 nicklas 164     if (subtypeSequencingRun == null)
5801 19 Dec 19 nicklas 165     {
5801 19 Dec 19 nicklas 166       subtypeSequencingRun = Reggie.getSubtypeInfo('SEQUENCING_RUN');
5801 19 Dec 19 nicklas 167     }
5801 19 Dec 19 nicklas 168     if (annotationTypePipeline == null)
5801 19 Dec 19 nicklas 169     {
5801 19 Dec 19 nicklas 170       annotationTypePipeline = Reggie.getAnnotationTypeInfo('PIPELINE');
5801 19 Dec 19 nicklas 171     }
5801 19 Dec 19 nicklas 172     
5801 19 Dec 19 nicklas 173     newSeqRuns = [];
5801 19 Dec 19 nicklas 174     var url = '&resetTemporary=1';
5801 19 Dec 19 nicklas 175     url += '&tmpfilter:INT:itemSubtype='+subtypeSequencingRun.id;
5801 19 Dec 19 nicklas 176     url += '&tmpfilter:STRING:'+encodeURIComponent('#')+annotationTypePipeline.id+'='+encodeURIComponent(pipeline.name);
5801 19 Dec 19 nicklas 177     Dialogs.selectItem('DERIVEDBIOASSAY', 'seqRuns', 1, url);
5801 19 Dec 19 nicklas 178   }
5801 19 Dec 19 nicklas 179
5801 19 Dec 19 nicklas 180   demux.setSeqRunCallback = function(event)
5801 19 Dec 19 nicklas 181   {
5801 19 Dec 19 nicklas 182     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 183     var seqRunList = frm.seqRuns;
5801 19 Dec 19 nicklas 184
5801 19 Dec 19 nicklas 185     var isNew = true;
5801 19 Dec 19 nicklas 186     for (var i = 0; i < seqRunList.length; i++)
5801 19 Dec 19 nicklas 187     {
5801 19 Dec 19 nicklas 188       if (seqRunList[i].value == event.detail.id)
5801 19 Dec 19 nicklas 189       {
5801 19 Dec 19 nicklas 190         seqRunList[i].selected = true;
5801 19 Dec 19 nicklas 191         isNew = false;
5801 19 Dec 19 nicklas 192       }
5801 19 Dec 19 nicklas 193     }
5801 19 Dec 19 nicklas 194     
5801 19 Dec 19 nicklas 195     if (isNew) newSeqRuns[newSeqRuns.length] = event.detail.id;
5801 19 Dec 19 nicklas 196     
5801 19 Dec 19 nicklas 197     if (event.detail.remaining == 0)
5801 19 Dec 19 nicklas 198     {
5801 19 Dec 19 nicklas 199       if (newSeqRuns.length > 0)
5801 19 Dec 19 nicklas 200       {
5801 19 Dec 19 nicklas 201         // Get more information about the selected sequencing run
5801 19 Dec 19 nicklas 202         var url = '../DemuxMerge.servlet?ID='+App.getSessionId();
5801 19 Dec 19 nicklas 203         url += '&cmd=GetSequencingRunInfo&ids=' + newSeqRuns.join(',');
5801 19 Dec 19 nicklas 204         Wizard.asyncJsonRequest(url, demux.seqRunInfoLoaded);
5801 19 Dec 19 nicklas 205       }
5801 19 Dec 19 nicklas 206       else
5801 19 Dec 19 nicklas 207       {
5801 19 Dec 19 nicklas 208         demux.seqRunsOnChange();
5801 19 Dec 19 nicklas 209       }
5801 19 Dec 19 nicklas 210     }
5801 19 Dec 19 nicklas 211   }
5801 19 Dec 19 nicklas 212   
5801 19 Dec 19 nicklas 213   demux.seqRunInfoLoaded = function(response)
5801 19 Dec 19 nicklas 214   {
5801 19 Dec 19 nicklas 215     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 216     var seqRuns = response.sequencingRuns;
5801 19 Dec 19 nicklas 217     var seqRunList = frm.seqRuns;
5801 19 Dec 19 nicklas 218     for (var seqNo = 0; seqNo < seqRuns.length; seqNo++)
5801 19 Dec 19 nicklas 219     {
5801 19 Dec 19 nicklas 220       var seqRun = seqRuns[seqNo];
5801 19 Dec 19 nicklas 221       var option = demux.getOptionForSeqRun(seqRun);
5801 19 Dec 19 nicklas 222       option.selected = true;
5801 19 Dec 19 nicklas 223       seqRunList[seqRunList.length] = option;
5801 19 Dec 19 nicklas 224     }
5801 19 Dec 19 nicklas 225     demux.seqRunsOnChange();
5801 19 Dec 19 nicklas 226   }
5801 19 Dec 19 nicklas 227
5801 19 Dec 19 nicklas 228   // Check if all selected sequencing runs have the same pools
5801 19 Dec 19 nicklas 229   demux.seqRunsOnChange = function()
5801 19 Dec 19 nicklas 230   {
5801 19 Dec 19 nicklas 231     seqRunsAreValid = false;
5801 19 Dec 19 nicklas 232     
5801 19 Dec 19 nicklas 233     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 234     var numSelected = 0;
5801 19 Dec 19 nicklas 235     var pools;
5801 19 Dec 19 nicklas 236     var numDoNotUse = 0;
5801 19 Dec 19 nicklas 237     var hasPoolMix = false;
6214 15 Apr 21 nicklas 238     var invalidSelection = null;
5801 19 Dec 19 nicklas 239     Wizard.setInputStatus('seqRuns');
5801 19 Dec 19 nicklas 240     for (var seqNo = 0; seqNo < frm.seqRuns.length; seqNo++)
5801 19 Dec 19 nicklas 241     {
5801 19 Dec 19 nicklas 242       if (frm.seqRuns[seqNo].selected)
5801 19 Dec 19 nicklas 243       {
5801 19 Dec 19 nicklas 244         var sr = frm.seqRuns[seqNo].seqRun;
5801 19 Dec 19 nicklas 245         if (sr.pipeline && sr.pipeline != pipeline.name)
5801 19 Dec 19 nicklas 246         {
6214 15 Apr 21 nicklas 247           invalidSelection = Strings.encodeTags(sr.name+' ('+sr.pipeline)+') is not intended for the '+pipeline.name+' pipeline.';
5801 19 Dec 19 nicklas 248         }
6214 15 Apr 21 nicklas 249         else if (!sr.DataFilesFolder)
6214 15 Apr 21 nicklas 250         {
6214 15 Apr 21 nicklas 251           invalidSelection = Strings.encodeTags(sr.name+' is missing DataFilesFolder information');
6214 15 Apr 21 nicklas 252         }
5801 19 Dec 19 nicklas 253
5801 19 Dec 19 nicklas 254         numSelected++;
5801 19 Dec 19 nicklas 255         if (numSelected == 1)
5801 19 Dec 19 nicklas 256         {
5801 19 Dec 19 nicklas 257           pools = sr.flowCell.pools;
5801 19 Dec 19 nicklas 258           numDoNotUse = sr.flowCell.numDoNotUse;
5801 19 Dec 19 nicklas 259         }
5801 19 Dec 19 nicklas 260         else
5801 19 Dec 19 nicklas 261         {
5801 19 Dec 19 nicklas 262           if (!demux.compareListOfPools(pools, sr.flowCell.pools))
5801 19 Dec 19 nicklas 263           {
5801 19 Dec 19 nicklas 264             hasPoolMix = true;
5801 19 Dec 19 nicklas 265           }
5801 19 Dec 19 nicklas 266         }
5801 19 Dec 19 nicklas 267       }
5801 19 Dec 19 nicklas 268     }
5801 19 Dec 19 nicklas 269     if (numSelected == 0)
5801 19 Dec 19 nicklas 270     {
5801 19 Dec 19 nicklas 271       Wizard.setInputStatus('seqRuns', 'invalid', 'Select at least one sequencing run');
5801 19 Dec 19 nicklas 272       return;
5801 19 Dec 19 nicklas 273     }
6214 15 Apr 21 nicklas 274     if (invalidSelection) 
5801 19 Dec 19 nicklas 275     {
6214 15 Apr 21 nicklas 276       Wizard.setInputStatus('seqRuns', 'invalid', invalidSelection);
5801 19 Dec 19 nicklas 277       return;
5801 19 Dec 19 nicklas 278     }
5801 19 Dec 19 nicklas 279
5801 19 Dec 19 nicklas 280     seqRunsAreValid = true;
5801 19 Dec 19 nicklas 281     if (hasPoolMix)
5801 19 Dec 19 nicklas 282     {
5801 19 Dec 19 nicklas 283       Wizard.setInputStatus('seqRuns', 'warning', 'The selected sequencing runs have different pools');
5801 19 Dec 19 nicklas 284     }
5801 19 Dec 19 nicklas 285     else if (numDoNotUse > 0)
5801 19 Dec 19 nicklas 286     {
5801 19 Dec 19 nicklas 287       var msg = numDoNotUse == 1 ? '1 library is marked with DoNotUse.' :
5801 19 Dec 19 nicklas 288         numDoNotUse + ' libraries are marked with DoNotUse.'
5801 19 Dec 19 nicklas 289       Wizard.setInputStatus('seqRuns', 'warning', msg);
5801 19 Dec 19 nicklas 290     }
5801 19 Dec 19 nicklas 291     else
5801 19 Dec 19 nicklas 292     {
5801 19 Dec 19 nicklas 293       Wizard.setInputStatus('seqRuns', 'valid');
5801 19 Dec 19 nicklas 294     }
5801 19 Dec 19 nicklas 295   }
5801 19 Dec 19 nicklas 296   
5801 19 Dec 19 nicklas 297   // Check if two lists of pools are the same or not
5801 19 Dec 19 nicklas 298   demux.compareListOfPools = function(p1, p2)
5801 19 Dec 19 nicklas 299   {
5801 19 Dec 19 nicklas 300     if (p1.length != p2.length) return false;
5801 19 Dec 19 nicklas 301     for (var i = 0; i < p1.length; i++)
5801 19 Dec 19 nicklas 302     {
5801 19 Dec 19 nicklas 303       if (p1[i].id != p2[i].id) return false;
5801 19 Dec 19 nicklas 304     }
5801 19 Dec 19 nicklas 305     return true;
5801 19 Dec 19 nicklas 306   }
5801 19 Dec 19 nicklas 307   
5801 19 Dec 19 nicklas 308   demux.initializeStep2 = function()
5801 19 Dec 19 nicklas 309   {
5801 19 Dec 19 nicklas 310     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 311     
5801 19 Dec 19 nicklas 312     // ReadString input fields
5801 19 Dec 19 nicklas 313     var html = '';
5801 19 Dec 19 nicklas 314     for (var seqNo = 0; seqNo < frm.seqRuns.length; seqNo++)
5801 19 Dec 19 nicklas 315     {
5801 19 Dec 19 nicklas 316       if (frm.seqRuns[seqNo].selected)
5801 19 Dec 19 nicklas 317       {
5801 19 Dec 19 nicklas 318         var seqRun = frm.seqRuns[seqNo].seqRun;
5801 19 Dec 19 nicklas 319         var fc = seqRun.flowCell;
5801 19 Dec 19 nicklas 320         var libs = fc.libraries;
5801 19 Dec 19 nicklas 321         var readStringId = 'readString.'+seqNo;
5801 19 Dec 19 nicklas 322         html += '<tr>';
5801 19 Dec 19 nicklas 323         html += '<td class="prompt" colspan="2">'+Strings.encodeTags(frm.seqRuns[seqNo].text)+'</td>';
5801 19 Dec 19 nicklas 324         html += '<td class="status"></td>';
5801 19 Dec 19 nicklas 325         html += '<td class="help"></td>';
5801 19 Dec 19 nicklas 326         html += '</tr>';
5801 19 Dec 19 nicklas 327
5801 19 Dec 19 nicklas 328         html += '<tr>';
5801 19 Dec 19 nicklas 329         html += '<td class="subprompt">Sequencing cycles</td>';
5801 19 Dec 19 nicklas 330         html += '<td>'+Strings.encodeTags(seqRun.SequencingCycles)+'</td>';
5801 19 Dec 19 nicklas 331         html += '<td class="status"></td>';
5801 19 Dec 19 nicklas 332         html += '<td class="help"></td>';
5801 19 Dec 19 nicklas 333         html += '</tr>';
5801 19 Dec 19 nicklas 334         
5801 19 Dec 19 nicklas 335         html += '<tr>';
5801 19 Dec 19 nicklas 336         html += '<td class="subprompt">ReadString</td>';
5801 19 Dec 19 nicklas 337         html += '<td><input type="text" class="required" name="'+readStringId+'" id="'+readStringId+'" value="'+Strings.encodeTags(seqRun.ReadString)+'" style="width: 15em;"></td>';
5801 19 Dec 19 nicklas 338         html += '<td class="status" id="'+readStringId+'.status"></td>';
5801 19 Dec 19 nicklas 339         html += '<td class="help"><span id="'+readStringId+'.message"></span></td>';
5801 19 Dec 19 nicklas 340         html += '</tr>';
5801 19 Dec 19 nicklas 341         
5801 19 Dec 19 nicklas 342         html += '<tr>';
5801 19 Dec 19 nicklas 343         html += '<td class="subprompt">Omit lanes</td>';
5801 19 Dec 19 nicklas 344         html += '<td>';
5801 19 Dec 19 nicklas 345         for (var laneNo = 1; laneNo <= fc.numLanes; laneNo++)
5801 19 Dec 19 nicklas 346         {
5801 19 Dec 19 nicklas 347           var checked = fc.FailedLanes.indexOf(laneNo) >= 0 ? 'checked' : '';
5801 19 Dec 19 nicklas 348           html += '<label><input type="checkbox" name="omitLanes.'+seqNo+'" value="'+laneNo+'" ' + checked + '>'+laneNo+'</label> ';
5801 19 Dec 19 nicklas 349         }
5801 19 Dec 19 nicklas 350         html += '</td>';
5801 19 Dec 19 nicklas 351         html += '<td class="status"></td>';
5801 19 Dec 19 nicklas 352         html += '<td class="help">By default, failed lanes are omitted</td>';
5801 19 Dec 19 nicklas 353         html += '</tr>';
5801 19 Dec 19 nicklas 354         
5801 19 Dec 19 nicklas 355         // Check for DoNotUse
5801 19 Dec 19 nicklas 356         if (fc.numDoNotUse > 0)
5801 19 Dec 19 nicklas 357         {
5801 19 Dec 19 nicklas 358           var text = fc.numDoNotUse == 1 ? '1 library' : fc.numDoNotUse + ' libraries';
5801 19 Dec 19 nicklas 359           html += '<tr>';
5801 19 Dec 19 nicklas 360           html += '<td class="subprompt">DoNotUse</td>';
5801 19 Dec 19 nicklas 361           html += '<td><label><input type="checkbox" name="excludeDoNotUse.'+seqNo+'" checked>Exclude ' + text + ' marked with DoNotUse</label>';
5801 19 Dec 19 nicklas 362           html += ' <img src="../images/info.png" class="link" id="donotuseinfo.'+seqNo+'" data-seq-no="'+seqNo+'" title="More information about the libraries..."></td>';
5801 19 Dec 19 nicklas 363           html += '<td class="status warning"></td>';
5801 19 Dec 19 nicklas 364           html += '<td class="help">By default, libraries marked with DoNotUse are omitted</td>';
5801 19 Dec 19 nicklas 365           html += '</tr>';
5801 19 Dec 19 nicklas 366         }
5801 19 Dec 19 nicklas 367         
5801 19 Dec 19 nicklas 368         html += '<tr>';
5801 19 Dec 19 nicklas 369         html += '<td class="subprompt"></td>';
5801 19 Dec 19 nicklas 370         html += '<td><div id="check.'+seqNo+'" class="button basicbutton interactable" data-seqrun-id="'+seqRun.id+'"><img src="../images/validate.png" alt="Check data files&amp;hellip;">Check data files&hellip;</div></td>';
5801 19 Dec 19 nicklas 371         html += '<td class="status"></td>';
5801 19 Dec 19 nicklas 372         html += '<td class="help"></td>';
5801 19 Dec 19 nicklas 373         html += '</tr>';
5801 19 Dec 19 nicklas 374         
5801 19 Dec 19 nicklas 375       }
5801 19 Dec 19 nicklas 376     }
5801 19 Dec 19 nicklas 377     Doc.element('SequencingRun-section').innerHTML = html;
5801 19 Dec 19 nicklas 378     for (var seqNo = 0; seqNo < frm.seqRuns.length; seqNo++)
5801 19 Dec 19 nicklas 379     {
5801 19 Dec 19 nicklas 380       if (frm.seqRuns[seqNo].selected)
5801 19 Dec 19 nicklas 381       {
5801 19 Dec 19 nicklas 382         demux.readStringOnBlur(frm['readString.'+seqNo]);
5801 19 Dec 19 nicklas 383         Events.addEventHandler('readString.'+seqNo, 'blur', demux.readStringOnBlur);
5801 19 Dec 19 nicklas 384         Buttons.addClickHandler('check.'+seqNo, demux.checkDataFilesOnClick);
5801 19 Dec 19 nicklas 385         Buttons.addClickHandler('donotuseinfo.'+seqNo, demux.showDoNotUseInfo);
5801 19 Dec 19 nicklas 386       }
5801 19 Dec 19 nicklas 387     }
5801 19 Dec 19 nicklas 388     
5801 19 Dec 19 nicklas 389     Wizard.setCurrentStep(2);
5801 19 Dec 19 nicklas 390     Doc.show('gocancel');
5801 19 Dec 19 nicklas 391     Doc.show('goregister');
5801 19 Dec 19 nicklas 392     
5801 19 Dec 19 nicklas 393     // Check debug by default if debug is set or not on a secure server (=production server)
5801 19 Dec 19 nicklas 394     frm.debug.checked = debug || location.protocol != 'https:';
5801 19 Dec 19 nicklas 395
6213 15 Apr 21 nicklas 396     Reggie.loadProtocols('DEMUX_PROTOCOL', 'demuxProtocol', 'PIPELINE,DEMUX_TYPE', pipeline.name+',Picard');
6213 15 Apr 21 nicklas 397     Reggie.loadSoftware('DEMUX_SOFTWARE', 'demuxSoftware', 'PIPELINE,DEMUX_TYPE,PARAMETER_SET', pipeline.name+',Picard');
5801 19 Dec 19 nicklas 398
6735 09 May 22 nicklas 399     // Load clusters
5801 19 Dec 19 nicklas 400     var url = '../OpenGrid.servlet?ID='+App.getSessionId() + '&cmd=GetHostInfo&config='+(pipeline.id == 'MIPS' ? 'demux-mips' : 'demux');
5801 19 Dec 19 nicklas 401     Doc.addClass('clusters', 'list-loading');
5801 19 Dec 19 nicklas 402     frm.clusters[0] = new Option('loading...');
5801 19 Dec 19 nicklas 403     Wizard.asyncJsonRequest(url, demux.clustersLoaded);
5801 19 Dec 19 nicklas 404   }
5801 19 Dec 19 nicklas 405
5801 19 Dec 19 nicklas 406   demux.showDoNotUseInfo = function(event)
5801 19 Dec 19 nicklas 407   {
5801 19 Dec 19 nicklas 408     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 409     var seqNo = Data.get(event.currentTarget, 'seq-no');
5801 19 Dec 19 nicklas 410     var seqRun = frm.seqRuns[seqNo].seqRun;
5801 19 Dec 19 nicklas 411     var fc = seqRun.flowCell;
5801 19 Dec 19 nicklas 412     var libs = fc.libraries;
5801 19 Dec 19 nicklas 413     
5801 19 Dec 19 nicklas 414     var msg = '<table>';
5801 19 Dec 19 nicklas 415     for (var libNo = 0; libNo < libs.length; libNo++)
5801 19 Dec 19 nicklas 416     {
5801 19 Dec 19 nicklas 417       var lib = libs[libNo];
5801 19 Dec 19 nicklas 418       if (lib.DO_NOT_USE)
5801 19 Dec 19 nicklas 419       {
5801 19 Dec 19 nicklas 420         msg += '<tr><td><b>'+Strings.encodeTags(lib.name) + '</b></td><td><span class="itemsubtype">[' + lib.DO_NOT_USE + ']</span></td>';
5801 19 Dec 19 nicklas 421         msg += '<td>'+ Strings.encodeTags(lib.DO_NOT_USE_COMMENT) + '</td></tr>';
5801 19 Dec 19 nicklas 422       }
5801 19 Dec 19 nicklas 423     }
5801 19 Dec 19 nicklas 424     msg += '</table>';
5801 19 Dec 19 nicklas 425     Forms.showNotification(event.currentTarget, msg, 'donotuseinfo', 'pointer-left');
5801 19 Dec 19 nicklas 426   }
5801 19 Dec 19 nicklas 427   
5801 19 Dec 19 nicklas 428   demux.clustersLoaded = function(response)
5801 19 Dec 19 nicklas 429   {
5801 19 Dec 19 nicklas 430     Doc.removeClass('clusters', 'list-loading');
5801 19 Dec 19 nicklas 431     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 432     var clusters = response.hosts;
5801 19 Dec 19 nicklas 433     frm.clusters.length = 0;
5801 19 Dec 19 nicklas 434     for (var i = 0; i < clusters.length; i++)
5801 19 Dec 19 nicklas 435     {
5801 19 Dec 19 nicklas 436       var cl = clusters[i];
5801 19 Dec 19 nicklas 437       var option = new Option(cl.connection.name, cl.id);
5801 19 Dec 19 nicklas 438       option.cluster = cl;
5801 19 Dec 19 nicklas 439       frm.clusters[frm.clusters.length] = option;
5801 19 Dec 19 nicklas 440       Wizard.setInputStatus('clusters', 'valid');
5801 19 Dec 19 nicklas 441       clusterIsValid = true;
5801 19 Dec 19 nicklas 442     }
5801 19 Dec 19 nicklas 443     if (frm.clusters.length == 0)
5801 19 Dec 19 nicklas 444     {
6735 09 May 22 nicklas 445       Wizard.setInputStatus('clusters', 'invalid', 'No available clusters');
5801 19 Dec 19 nicklas 446       clusterIsValid = false;
5801 19 Dec 19 nicklas 447     }
5801 19 Dec 19 nicklas 448     else
5801 19 Dec 19 nicklas 449     {
5801 19 Dec 19 nicklas 450       demux.clusterOnChange();
5801 19 Dec 19 nicklas 451     }
5801 19 Dec 19 nicklas 452   }
5801 19 Dec 19 nicklas 453
5801 19 Dec 19 nicklas 454   demux.checkDataFilesOnClick = function(event)
5801 19 Dec 19 nicklas 455   {
5801 19 Dec 19 nicklas 456     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 457     var seqNo = parseInt(event.currentTarget.id.substring(6));
5801 19 Dec 19 nicklas 458     var url = '../analysis/check_data_files.jsp?ID='+App.getSessionId();
5801 19 Dec 19 nicklas 459     url += '&seqrun='+Data.get(event.currentTarget, 'seqrun-id');
5801 19 Dec 19 nicklas 460     url += '&readString='+encodeURIComponent(frm['readString.'+seqNo].value);
5801 19 Dec 19 nicklas 461     
5801 19 Dec 19 nicklas 462     var omitLanes = [];
5801 19 Dec 19 nicklas 463     var checkboxes = frm['omitLanes.'+seqNo];
5801 19 Dec 19 nicklas 464     for (var i = 0; i < checkboxes.length; i++)
5801 19 Dec 19 nicklas 465     {
5801 19 Dec 19 nicklas 466       if (checkboxes[i].checked) 
5801 19 Dec 19 nicklas 467       {
5801 19 Dec 19 nicklas 468         omitLanes[omitLanes.length] = parseInt(checkboxes[i].value);
5801 19 Dec 19 nicklas 469       }
5801 19 Dec 19 nicklas 470     }
5801 19 Dec 19 nicklas 471     if (omitLanes.length > 0) url += '&omitLanes='+omitLanes.join(',');
5801 19 Dec 19 nicklas 472     
5801 19 Dec 19 nicklas 473     Dialogs.openPopup(url, 'CheckDataFiles', 900, 600);
5801 19 Dec 19 nicklas 474   }
5801 19 Dec 19 nicklas 475
5801 19 Dec 19 nicklas 476   
5801 19 Dec 19 nicklas 477   demux.clusterOnChange = function()
5801 19 Dec 19 nicklas 478   {
5801 19 Dec 19 nicklas 479     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 480     var cluster = frm.clusters[frm.clusters.selectedIndex].cluster;
5801 19 Dec 19 nicklas 481     if (cluster.priorities && cluster.priorities.length > 0)
5801 19 Dec 19 nicklas 482     {
5801 19 Dec 19 nicklas 483       frm.priority.length = 0;
5801 19 Dec 19 nicklas 484       for (var pNo = 0; pNo < cluster.priorities.length; pNo++)
5801 19 Dec 19 nicklas 485       {
5801 19 Dec 19 nicklas 486         var p = cluster.priorities[pNo];
5801 19 Dec 19 nicklas 487         frm.priority[frm.priority.length] = new Option(p.name + ' ('+p.value+')', p.value, p['default'], p['default']);
5801 19 Dec 19 nicklas 488       }
5801 19 Dec 19 nicklas 489       Doc.show('job-priority');
5801 19 Dec 19 nicklas 490     }
5801 19 Dec 19 nicklas 491     else
5801 19 Dec 19 nicklas 492     {
5801 19 Dec 19 nicklas 493       Doc.hide('job-priority');
5801 19 Dec 19 nicklas 494     }
5801 19 Dec 19 nicklas 495     
5801 19 Dec 19 nicklas 496   }
5801 19 Dec 19 nicklas 497
5801 19 Dec 19 nicklas 498   demux.readStringOnBlur = function(eventOrTarget)
5801 19 Dec 19 nicklas 499   {
5801 19 Dec 19 nicklas 500     var target = eventOrTarget.currentTarget || eventOrTarget;
5801 19 Dec 19 nicklas 501     var isValid = false;
5801 19 Dec 19 nicklas 502
5801 19 Dec 19 nicklas 503     Wizard.setInputStatus(target.id);
5801 19 Dec 19 nicklas 504     var readString = target.value;
5801 19 Dec 19 nicklas 505     
5801 19 Dec 19 nicklas 506     if (!readString.match(/^(\d+[TBMS])+$/))
5801 19 Dec 19 nicklas 507     {
5801 19 Dec 19 nicklas 508       Wizard.setInputStatus(target.id, 'invalid', 'Invalid read string');
5801 19 Dec 19 nicklas 509     }
5801 19 Dec 19 nicklas 510     else
5801 19 Dec 19 nicklas 511     {
5801 19 Dec 19 nicklas 512       isValid = true;
5801 19 Dec 19 nicklas 513       Wizard.setInputStatus(target.id, 'valid');
5801 19 Dec 19 nicklas 514     }
5801 19 Dec 19 nicklas 515     
5801 19 Dec 19 nicklas 516     Data.set(target, 'valid', isValid ? 1 : 0);
5801 19 Dec 19 nicklas 517   }
5801 19 Dec 19 nicklas 518
5801 19 Dec 19 nicklas 519   demux.softwareOnChange = function(event)
5801 19 Dec 19 nicklas 520   {
5801 19 Dec 19 nicklas 521     var target = event.currentTarget;
5801 19 Dec 19 nicklas 522     var item = target[target.selectedIndex].item;
5801 19 Dec 19 nicklas 523     if (!item) item = {};
5801 19 Dec 19 nicklas 524     
5801 19 Dec 19 nicklas 525     Doc.element(target.id+'.parameterSet').innerHTML = Strings.encodeTags(item.ParameterSet || 'default');
5801 19 Dec 19 nicklas 526     Doc.element(target.id+'.description').innerHTML = Strings.encodeTags(item.description);
5801 19 Dec 19 nicklas 527     Wizard.setInputStatus(target.id, 'valid');
5801 19 Dec 19 nicklas 528
5801 19 Dec 19 nicklas 529     if (item.ParameterSet)
5801 19 Dec 19 nicklas 530     {
5801 19 Dec 19 nicklas 531       var url = '../Install.servlet?ID='+App.getSessionId();
5801 19 Dec 19 nicklas 532       url += '&cmd=GetParameterSetInfo';
5801 19 Dec 19 nicklas 533       url += '&parameterSet='+encodeURIComponent(item.ParameterSet);
5801 19 Dec 19 nicklas 534       url += '&targetId='+target.id;
5801 19 Dec 19 nicklas 535       Wizard.asyncJsonRequest(url, demux.parameterSetInfoLoaded);
5801 19 Dec 19 nicklas 536     }
5801 19 Dec 19 nicklas 537   }
5801 19 Dec 19 nicklas 538   
5801 19 Dec 19 nicklas 539   demux.parameterSetInfoLoaded = function(response)
5801 19 Dec 19 nicklas 540   {
5801 19 Dec 19 nicklas 541     if (!response.parameters || response.parameters.length == 0)
5801 19 Dec 19 nicklas 542     {
5801 19 Dec 19 nicklas 543       Wizard.setInputStatus(response.targetId, 'warning', 'Can\'t find \'' + Strings.encodeTags(response.parameterSet) + '\' parameter set in reggie-config.xml');
5801 19 Dec 19 nicklas 544     }
5801 19 Dec 19 nicklas 545   }
5801 19 Dec 19 nicklas 546
5801 19 Dec 19 nicklas 547   
5801 19 Dec 19 nicklas 548   demux.validateStep2 = function(event)
5801 19 Dec 19 nicklas 549   {
5801 19 Dec 19 nicklas 550     
7372 06 Oct 23 nicklas 551     if (!clusterIsValid)
5801 19 Dec 19 nicklas 552     {
5801 19 Dec 19 nicklas 553       event.preventDefault();
5801 19 Dec 19 nicklas 554       return;
5801 19 Dec 19 nicklas 555     }
5801 19 Dec 19 nicklas 556       
5801 19 Dec 19 nicklas 557     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 558     for (var seqNo = 0; seqNo < frm.seqRuns.length; seqNo++)
5801 19 Dec 19 nicklas 559     {
5801 19 Dec 19 nicklas 560       if (frm.seqRuns[seqNo].selected) 
5801 19 Dec 19 nicklas 561       {
5801 19 Dec 19 nicklas 562         if (!Wizard.isValid(frm['readString.'+seqNo]))
5801 19 Dec 19 nicklas 563         {
5801 19 Dec 19 nicklas 564           event.preventDefault();
5801 19 Dec 19 nicklas 565           return;
5801 19 Dec 19 nicklas 566         }
5801 19 Dec 19 nicklas 567       }
5801 19 Dec 19 nicklas 568     }
5801 19 Dec 19 nicklas 569   }
5801 19 Dec 19 nicklas 570   
5801 19 Dec 19 nicklas 571   demux.submit = function()
5801 19 Dec 19 nicklas 572   {
5801 19 Dec 19 nicklas 573     var frm = document.forms['reggie'];
5801 19 Dec 19 nicklas 574     var submitInfo = {};
5801 19 Dec 19 nicklas 575     submitInfo.demuxSoftware = parseInt(frm.demuxSoftware.value);
5801 19 Dec 19 nicklas 576     submitInfo.demuxProtocol = parseInt(frm.demuxProtocol.value);
5801 19 Dec 19 nicklas 577     submitInfo.cluster = frm.clusters.value;
5801 19 Dec 19 nicklas 578     if (frm.priority.selectedIndex >= 0)
5801 19 Dec 19 nicklas 579     {
5801 19 Dec 19 nicklas 580       submitInfo.priority = parseInt(frm.priority.value);
5801 19 Dec 19 nicklas 581     }
5801 19 Dec 19 nicklas 582     submitInfo.debug = frm.debug.checked;
5801 19 Dec 19 nicklas 583     submitInfo.autoConfirm = frm.autoConfirm.checked;
5801 19 Dec 19 nicklas 584     
5801 19 Dec 19 nicklas 585     var sequencingRuns = [];
5801 19 Dec 19 nicklas 586     submitInfo.sequencingRuns = sequencingRuns;
5801 19 Dec 19 nicklas 587     
5801 19 Dec 19 nicklas 588     for (var seqNo = 0; seqNo < frm.seqRuns.length; seqNo++)
5801 19 Dec 19 nicklas 589     {
5801 19 Dec 19 nicklas 590       if (frm.seqRuns[seqNo].selected) 
5801 19 Dec 19 nicklas 591       {
5801 19 Dec 19 nicklas 592         var seqRun = {};
5801 19 Dec 19 nicklas 593         seqRun.id = frm.seqRuns[seqNo].seqRun.id;
5801 19 Dec 19 nicklas 594         seqRun.ReadString = frm['readString.'+seqNo].value;
5801 19 Dec 19 nicklas 595         
5801 19 Dec 19 nicklas 596         var omitLanes = [];
5801 19 Dec 19 nicklas 597         var checkboxes = frm['omitLanes.'+seqNo];
5801 19 Dec 19 nicklas 598         for (var i = 0; i < checkboxes.length; i++)
5801 19 Dec 19 nicklas 599         {
5801 19 Dec 19 nicklas 600           if (checkboxes[i].checked) 
5801 19 Dec 19 nicklas 601           {
5801 19 Dec 19 nicklas 602             omitLanes[omitLanes.length] = parseInt(checkboxes[i].value);
5801 19 Dec 19 nicklas 603           }
5801 19 Dec 19 nicklas 604         }
5801 19 Dec 19 nicklas 605         seqRun.OmitLanes = omitLanes;
5801 19 Dec 19 nicklas 606         if (frm['excludeDoNotUse.'+seqNo])
5801 19 Dec 19 nicklas 607         {
5801 19 Dec 19 nicklas 608           seqRun.excludeDoNotUse = frm['excludeDoNotUse.'+seqNo].checked;
5801 19 Dec 19 nicklas 609         }
5801 19 Dec 19 nicklas 610         sequencingRuns[sequencingRuns.length] = seqRun;
5801 19 Dec 19 nicklas 611       }
5801 19 Dec 19 nicklas 612     }
5801 19 Dec 19 nicklas 613     
5801 19 Dec 19 nicklas 614     var url = '../DemuxMerge.servlet?ID='+App.getSessionId();
5801 19 Dec 19 nicklas 615     url += '&cmd=StartDemuxAndMerge&pipeline='+encodeURIComponent(Data.get('page-data', 'pipeline'));
5801 19 Dec 19 nicklas 616     
5801 19 Dec 19 nicklas 617     Wizard.showLoadingAnimation('Performing registration...');
5801 19 Dec 19 nicklas 618     Wizard.asyncJsonRequest(url, demux.submissionResults, 'POST', JSON.stringify(submitInfo));
5801 19 Dec 19 nicklas 619   }
5801 19 Dec 19 nicklas 620   
5801 19 Dec 19 nicklas 621   demux.submissionResults = function(response)
5801 19 Dec 19 nicklas 622   {
5801 19 Dec 19 nicklas 623     Wizard.showFinalMessage(response.messages);
5801 19 Dec 19 nicklas 624     Doc.show('gorestart');
5801 19 Dec 19 nicklas 625   }
5801 19 Dec 19 nicklas 626
5801 19 Dec 19 nicklas 627   return demux;
5801 19 Dec 19 nicklas 628 }();
5801 19 Dec 19 nicklas 629
5801 19 Dec 19 nicklas 630 Doc.onLoad(Demux.initPage);
5801 19 Dec 19 nicklas 631