extensions/net.sf.basedb.reggie/trunk/resources/libprep/flowcell_protocol.js

Code
Comments
Other
Rev Date Author Line
2653 11 Sep 14 nicklas 1 var FlowCell = function()
2653 11 Sep 14 nicklas 2 {
2653 11 Sep 14 nicklas 3   var flowcell = {};
2656 11 Sep 14 nicklas 4   var debug = 0;
2653 11 Sep 14 nicklas 5   
2653 11 Sep 14 nicklas 6   var COLORS = ['blue', 'green', 'yellow', 'red'];
2653 11 Sep 14 nicklas 7   var nextColor = 0;
2653 11 Sep 14 nicklas 8
2653 11 Sep 14 nicklas 9   // Page initialization
2653 11 Sep 14 nicklas 10   flowcell.initPage = function()
2653 11 Sep 14 nicklas 11   {
2653 11 Sep 14 nicklas 12     var pageId = Doc.getPageId();
2653 11 Sep 14 nicklas 13     if (pageId == 'protocol')
2653 11 Sep 14 nicklas 14     {
2653 11 Sep 14 nicklas 15       Buttons.addClickHandler('print-button', Wizard.goPrint);    
2653 11 Sep 14 nicklas 16       var idList = Data.get('page-data', 'flowcells');
2653 11 Sep 14 nicklas 17       var url = '../FlowCell.servlet?ID='+App.getSessionId();
2653 11 Sep 14 nicklas 18       url += '&cmd=GetFlowCellInfo';
2653 11 Sep 14 nicklas 19       url += '&idlist='+idList;
2653 11 Sep 14 nicklas 20       Wizard.showLoadingAnimation('Loading flow cell info...');
2653 11 Sep 14 nicklas 21       Wizard.asyncJsonRequest(url, flowcell.initializeProtocol);
2653 11 Sep 14 nicklas 22     }
2653 11 Sep 14 nicklas 23     else
2653 11 Sep 14 nicklas 24     {
2653 11 Sep 14 nicklas 25       Buttons.addClickHandler('gocreate', flowcell.createProtocol);
2653 11 Sep 14 nicklas 26       var url = '../FlowCell.servlet?ID='+App.getSessionId();
5470 05 Jun 19 nicklas 27       url += '&cmd=GetUnprocessedFlowCells&pipeline=RNA_SEQ';    
2653 11 Sep 14 nicklas 28       Wizard.showLoadingAnimation('Loading flow cells...');
2653 11 Sep 14 nicklas 29       Wizard.asyncJsonRequest(url, flowcell.initializeStep1);
2653 11 Sep 14 nicklas 30     }
2653 11 Sep 14 nicklas 31   }
2653 11 Sep 14 nicklas 32
2653 11 Sep 14 nicklas 33
2653 11 Sep 14 nicklas 34   flowcell.initializeStep1 = function(response)
2653 11 Sep 14 nicklas 35   {
2653 11 Sep 14 nicklas 36     var frm = document.forms['reggie'];
2653 11 Sep 14 nicklas 37     var flowCells = response.flowCells;
2653 11 Sep 14 nicklas 38     
2653 11 Sep 14 nicklas 39     if (flowCells.length > 0)
2653 11 Sep 14 nicklas 40     {
3625 26 Nov 15 nicklas 41       var lastOption = null;
2653 11 Sep 14 nicklas 42       for (var fcNo=0; fcNo < flowCells.length; fcNo++)
2653 11 Sep 14 nicklas 43       {
2653 11 Sep 14 nicklas 44         var fc = flowCells[fcNo];
3625 26 Nov 15 nicklas 45         var option = flowcell.getOptionForFlowCell(fc);
3625 26 Nov 15 nicklas 46         if (fcNo == 0 || (lastOption != null && lastOption.selected && lastOption.title == option.title)) 
3625 26 Nov 15 nicklas 47         {
3625 26 Nov 15 nicklas 48           // Select the first option and more if they have the same pool(s)
3625 26 Nov 15 nicklas 49           option.selected = true;
3625 26 Nov 15 nicklas 50         }
2653 11 Sep 14 nicklas 51         frm.flowcells[frm.flowcells.length] = option;
3625 26 Nov 15 nicklas 52         lastOption = option;
2653 11 Sep 14 nicklas 53       }
2653 11 Sep 14 nicklas 54     }
2653 11 Sep 14 nicklas 55     else
2653 11 Sep 14 nicklas 56     {
2653 11 Sep 14 nicklas 57       Wizard.setFatalError('No flow cells available for processing.');
2653 11 Sep 14 nicklas 58       return;
2653 11 Sep 14 nicklas 59     }
2653 11 Sep 14 nicklas 60
2653 11 Sep 14 nicklas 61     // All is ok
2653 11 Sep 14 nicklas 62     Doc.show('step-1');
2653 11 Sep 14 nicklas 63     Doc.show('gocreate')
2653 11 Sep 14 nicklas 64     frm.flowcells.focus();
2653 11 Sep 14 nicklas 65   }
2653 11 Sep 14 nicklas 66   
2653 11 Sep 14 nicklas 67   
3625 26 Nov 15 nicklas 68   flowcell.getOptionForFlowCell = function(fc)
2653 11 Sep 14 nicklas 69   {
2653 11 Sep 14 nicklas 70     var name = fc.name +': ';
2653 11 Sep 14 nicklas 71
2653 11 Sep 14 nicklas 72     var numPools = fc.pools.length;
2653 11 Sep 14 nicklas 73     var firstPoolNum = flowcell.getPoolNum(fc.pools[0].name);
2653 11 Sep 14 nicklas 74     var lastPoolNum = flowcell.getPoolNum(fc.pools[fc.pools.length-1].name);
2653 11 Sep 14 nicklas 75
2653 11 Sep 14 nicklas 76     if (lastPoolNum - firstPoolNum == numPools - 1)
2653 11 Sep 14 nicklas 77     {
2653 11 Sep 14 nicklas 78       if (numPools > 1)
2653 11 Sep 14 nicklas 79       {
2653 11 Sep 14 nicklas 80         // Display: PoolN -- PoolY
2653 11 Sep 14 nicklas 81         name += fc.pools[0].name + ' — ' + fc.pools[fc.pools.length-1].name;
2653 11 Sep 14 nicklas 82       }
2653 11 Sep 14 nicklas 83       else
2653 11 Sep 14 nicklas 84       {
2653 11 Sep 14 nicklas 85         name += fc.pools[0].name;
2653 11 Sep 14 nicklas 86       }
2653 11 Sep 14 nicklas 87     }
2653 11 Sep 14 nicklas 88     else
2653 11 Sep 14 nicklas 89     {
2653 11 Sep 14 nicklas 90       // Display: PoolN + x more...
2653 11 Sep 14 nicklas 91       name += fc.pools[0].name + ' + ' + (numPools-1) + ' more...';
2653 11 Sep 14 nicklas 92     }
2653 11 Sep 14 nicklas 93     
5470 05 Jun 19 nicklas 94     name += ' [';
5470 05 Jun 19 nicklas 95     if (fc.FlowCellType) name += fc.FlowCellType + '; ';
5470 05 Jun 19 nicklas 96     name += fc.pipeline + ']';
2653 11 Sep 14 nicklas 97
2653 11 Sep 14 nicklas 98     // Tooltip is always all pools
2653 11 Sep 14 nicklas 99     var title = '';
2653 11 Sep 14 nicklas 100     for (var poolNo=0; poolNo < numPools; poolNo++)
2653 11 Sep 14 nicklas 101     {
2653 11 Sep 14 nicklas 102       var pool = fc.pools[poolNo];
2653 11 Sep 14 nicklas 103       if (poolNo > 0) title += ', ';
2653 11 Sep 14 nicklas 104       title += pool.name;
2653 11 Sep 14 nicklas 105     }
2653 11 Sep 14 nicklas 106     
3625 26 Nov 15 nicklas 107     var option = new Option(name, fc.id);
2653 11 Sep 14 nicklas 108     option.title = title;
2653 11 Sep 14 nicklas 109     option.flowCell = fc;
2653 11 Sep 14 nicklas 110
2653 11 Sep 14 nicklas 111     return option;
2653 11 Sep 14 nicklas 112   }
2653 11 Sep 14 nicklas 113   
2653 11 Sep 14 nicklas 114   flowcell.getPoolNum = function(poolName)
2653 11 Sep 14 nicklas 115   {
2653 11 Sep 14 nicklas 116     var num = poolName.match(/Pool(\d+)/);
2653 11 Sep 14 nicklas 117     return num ? parseInt(num[1], 10) : null;  
2653 11 Sep 14 nicklas 118   }
2653 11 Sep 14 nicklas 119
2653 11 Sep 14 nicklas 120
2653 11 Sep 14 nicklas 121   flowcell.createProtocol = function()
2653 11 Sep 14 nicklas 122   {
2653 11 Sep 14 nicklas 123     var frm = document.forms['reggie'];
2653 11 Sep 14 nicklas 124     
2653 11 Sep 14 nicklas 125     var selected = [];
2653 11 Sep 14 nicklas 126     for (var i = 0; i < frm.flowcells.length; i++)
2653 11 Sep 14 nicklas 127     {
2653 11 Sep 14 nicklas 128       if (frm.flowcells[i].selected) 
2653 11 Sep 14 nicklas 129       {
2653 11 Sep 14 nicklas 130         selected[selected.length] = frm.flowcells[i].value;
2653 11 Sep 14 nicklas 131       }
2653 11 Sep 14 nicklas 132     }
2653 11 Sep 14 nicklas 133     
2653 11 Sep 14 nicklas 134     if (selected.length == 0) 
2653 11 Sep 14 nicklas 135     {
2653 11 Sep 14 nicklas 136       Wizard.setInputStatus('flowcells', 'invalid', 'Select at least one flow cell');
2653 11 Sep 14 nicklas 137       Wizard.notifyError();
2653 11 Sep 14 nicklas 138       return;
2653 11 Sep 14 nicklas 139     }
2653 11 Sep 14 nicklas 140
2653 11 Sep 14 nicklas 141     frm.submit();
2653 11 Sep 14 nicklas 142   }
2653 11 Sep 14 nicklas 143   
2653 11 Sep 14 nicklas 144   flowcell.initializeProtocol = function(response)
2653 11 Sep 14 nicklas 145   {
2653 11 Sep 14 nicklas 146     var flowCells = response.flowCells;
2653 11 Sep 14 nicklas 147
2653 11 Sep 14 nicklas 148     var allColors = [];
2653 11 Sep 14 nicklas 149     var useDarker = false;
2653 11 Sep 14 nicklas 150
2653 11 Sep 14 nicklas 151     var names = [];
2653 11 Sep 14 nicklas 152     
2653 11 Sep 14 nicklas 153     for (var fcNo = 0; fcNo < flowCells.length; fcNo++)
2653 11 Sep 14 nicklas 154     {
2653 11 Sep 14 nicklas 155       var fc = flowCells[fcNo];
2653 11 Sep 14 nicklas 156       names[names.length] = fc.name;
2653 11 Sep 14 nicklas 157       
2653 11 Sep 14 nicklas 158       var poolColors = [];
2653 11 Sep 14 nicklas 159       var poolsRow = Doc.element('all-pools-'+fcNo);
2653 11 Sep 14 nicklas 160
2653 11 Sep 14 nicklas 161       Doc.element('flowCellName.'+fcNo).innerHTML = Strings.encodeTags(fc.name);
3625 26 Nov 15 nicklas 162       Doc.element('flowCellDescription.'+fcNo).innerHTML = Strings.encodeTags(fc.description);
2653 11 Sep 14 nicklas 163       Doc.element('sequencingCycles.'+fcNo).innerHTML = Strings.encodeTags(fc.SequencingCycles);
2653 11 Sep 14 nicklas 164       Doc.element('flowCellId.'+fcNo).innerHTML = Strings.encodeTags(fc.externalId);
5470 05 Jun 19 nicklas 165       Doc.element('flowCellType.'+fcNo).innerHTML = Strings.encodeTags(fc.FlowCellType || '') + '; ' + Strings.encodeTags(fc.pipeline || '');;
2653 11 Sep 14 nicklas 166       
2653 11 Sep 14 nicklas 167       if (fc.FlowCellType == 'NextSeq') Doc.hide('pos.b.'+fcNo);
2653 11 Sep 14 nicklas 168       
2653 11 Sep 14 nicklas 169       var lanesHtml = '';
3108 27 Jan 15 nicklas 170       for (var laneNo = 0; laneNo < fc.numLanes; laneNo++)
2653 11 Sep 14 nicklas 171       {
3108 27 Jan 15 nicklas 172         var pool = fc.lanes[laneNo];
3108 27 Jan 15 nicklas 173         // Display molarity if it differs too much from 2nM.
3108 27 Jan 15 nicklas 174         var showMolarity = Math.abs(pool.molarity - 2) > 0.25;
3108 27 Jan 15 nicklas 175         var poolName = pool.name;
2653 11 Sep 14 nicklas 176         var color = poolColors[poolName];
2653 11 Sep 14 nicklas 177         if (!color)
2653 11 Sep 14 nicklas 178         {
2653 11 Sep 14 nicklas 179           color = allColors[poolName];
2653 11 Sep 14 nicklas 180           if (!color)
2653 11 Sep 14 nicklas 181           {
2653 11 Sep 14 nicklas 182             color = COLORS[nextColor] + (useDarker ? ' darker' : '');
2653 11 Sep 14 nicklas 183             allColors[poolName] = color;
2653 11 Sep 14 nicklas 184             nextColor++;
2653 11 Sep 14 nicklas 185             if (nextColor == COLORS.length)
2653 11 Sep 14 nicklas 186             {
2653 11 Sep 14 nicklas 187               nextColor = 0;
2653 11 Sep 14 nicklas 188               useDarker = !useDarker;
2653 11 Sep 14 nicklas 189             }
2653 11 Sep 14 nicklas 190           }
2653 11 Sep 14 nicklas 191           poolColors[poolName] = color;
2653 11 Sep 14 nicklas 192           var td = document.createElement('td');
2653 11 Sep 14 nicklas 193           td.className = 'pool-legend ' + color;
2653 11 Sep 14 nicklas 194           td.innerHTML = poolName;
3108 27 Jan 15 nicklas 195           if (showMolarity) td.innerHTML += ' (' + Numbers.formatNumber(pool.molarity, 2, ' nM') + ')';
2653 11 Sep 14 nicklas 196           poolsRow.appendChild(td);
2653 11 Sep 14 nicklas 197         }
2653 11 Sep 14 nicklas 198
2653 11 Sep 14 nicklas 199         lanesHtml += '<tr>';
5462 03 Jun 19 nicklas 200         lanesHtml += '<td class="lane-no">'+(laneNo+1)+'</td>';
2653 11 Sep 14 nicklas 201         lanesHtml += '<td class="pool-name '+color+'">'+Strings.encodeTags(poolName)+'</td>';
3108 27 Jan 15 nicklas 202         lanesHtml += '<td class="remarks">';
3108 27 Jan 15 nicklas 203         if (showMolarity) lanesHtml += Numbers.formatNumber(pool.molarity, 2, ' nM');
3108 27 Jan 15 nicklas 204         lanesHtml += '</td>';
2653 11 Sep 14 nicklas 205         lanesHtml += '</tr>';
2653 11 Sep 14 nicklas 206       }
2653 11 Sep 14 nicklas 207       
2653 11 Sep 14 nicklas 208       Doc.element('pools.'+fcNo).innerHTML = lanesHtml;
2653 11 Sep 14 nicklas 209         
2653 11 Sep 14 nicklas 210       if (poolColors.length <= 6)
2653 11 Sep 14 nicklas 211       {
2653 11 Sep 14 nicklas 212         // White-space at end to avoid pools getting to wide
2653 11 Sep 14 nicklas 213         var td = document.createElement('td');
2653 11 Sep 14 nicklas 214         td.innerHTML = '';
2653 11 Sep 14 nicklas 215         poolsRow.appendChild(td);
2653 11 Sep 14 nicklas 216       }
2653 11 Sep 14 nicklas 217     }
2653 11 Sep 14 nicklas 218     
2653 11 Sep 14 nicklas 219     document.title = 'Lab protocol for ' + names.join(', ');;
2662 12 Sep 14 nicklas 220     Doc.show('all-protocol');
2653 11 Sep 14 nicklas 221   }
2653 11 Sep 14 nicklas 222   
2653 11 Sep 14 nicklas 223   return flowcell;
2653 11 Sep 14 nicklas 224 }();
2653 11 Sep 14 nicklas 225
2653 11 Sep 14 nicklas 226 Doc.onLoad(FlowCell.initPage);
2653 11 Sep 14 nicklas 227