extensions/net.sf.basedb.reggie/trunk/resources/sequencing/sequencing_ended.js

Code
Comments
Other
Rev Date Author Line
2648 10 Sep 14 nicklas 1 var Sequencing = function()
2648 10 Sep 14 nicklas 2 {
2648 10 Sep 14 nicklas 3   var sequencing = {};
2656 11 Sep 14 nicklas 4   var debug = 0;
2648 10 Sep 14 nicklas 5   
3632 30 Nov 15 nicklas 6   var runParameters;
3632 30 Nov 15 nicklas 7   var sequencers;
2648 10 Sep 14 nicklas 8   var endDateIsValid = false;
2648 10 Sep 14 nicklas 9
3718 22 Jan 16 nicklas 10   var JOB_IMAGE = { 'DONE': 'ok.png', 'ERROR': 'error.png'};
3718 22 Jan 16 nicklas 11
2648 10 Sep 14 nicklas 12   // Page initialization
2648 10 Sep 14 nicklas 13   sequencing.initPage = function()
2648 10 Sep 14 nicklas 14   {
2648 10 Sep 14 nicklas 15     // Step 1
2648 10 Sep 14 nicklas 16     Events.addEventHandler('seqRuns', 'change', sequencing.sequencingRunOnChange);
3632 30 Nov 15 nicklas 17     Events.addEventHandler('runParametersXml', 'change', sequencing.runParametersXmlFileOnChange);
3632 30 Nov 15 nicklas 18     Buttons.addClickHandler('searchRunArchive', sequencing.searchRunArchive);
3632 30 Nov 15 nicklas 19     Events.addEventHandler('endDate', 'blur', sequencing.endDateTimeOnChange);
3632 30 Nov 15 nicklas 20     Events.addEventHandler('endTime', 'blur', sequencing.endDateTimeOnChange);
3632 30 Nov 15 nicklas 21
2648 10 Sep 14 nicklas 22     Events.addEventHandler('step-1', 'wizard-validate', sequencing.validateStep1);
3632 30 Nov 15 nicklas 23
2648 10 Sep 14 nicklas 24     // Navigation
2648 10 Sep 14 nicklas 25     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2648 10 Sep 14 nicklas 26     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2648 10 Sep 14 nicklas 27     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2648 10 Sep 14 nicklas 28     Buttons.addClickHandler('goregister', Wizard.goRegister);
2648 10 Sep 14 nicklas 29     
2648 10 Sep 14 nicklas 30     // Final registration
2648 10 Sep 14 nicklas 31     Events.addEventHandler('wizard', 'wizard-submit', sequencing.submit);
3632 30 Nov 15 nicklas 32   
6735 09 May 22 nicklas 33     // Load clusters
3632 30 Nov 15 nicklas 34     var frm = document.forms['reggie'];
6633 08 Mar 22 nicklas 35     var url = '../OpenGrid.servlet?ID='+App.getSessionId() + '&cmd=GetHostInfo&config=run-archive';
3632 30 Nov 15 nicklas 36     Doc.addClass('clusters', 'list-loading');
3632 30 Nov 15 nicklas 37     frm.clusters[0] = new Option('loading...');
3632 30 Nov 15 nicklas 38     Wizard.asyncJsonRequest(url, sequencing.clustersLoaded);
3632 30 Nov 15 nicklas 39
3632 30 Nov 15 nicklas 40     // Load sequencers
3632 30 Nov 15 nicklas 41     var url = '../Hardware.servlet?ID='+App.getSessionId();
3632 30 Nov 15 nicklas 42     url += '&cmd=GetHardware&subtype=SEQUENCER&annotations=SERIAL_NUMBER';
3632 30 Nov 15 nicklas 43     Wizard.asyncJsonRequest(url, sequencing.sequencersLoaded);
3632 30 Nov 15 nicklas 44     
2648 10 Sep 14 nicklas 45     Wizard.showLoadingAnimation('Loading sequencing runs...');  
2648 10 Sep 14 nicklas 46     var url = '../SequencingRun.servlet?ID='+App.getSessionId();
5471 05 Jun 19 nicklas 47     url += '&cmd=GetActiveSequencingRuns&pipeline='+encodeURIComponent(Data.get('page-data', 'pipeline'));
2648 10 Sep 14 nicklas 48     Wizard.asyncJsonRequest(url, sequencing.initializeStep1);
2648 10 Sep 14 nicklas 49   }
2648 10 Sep 14 nicklas 50
3632 30 Nov 15 nicklas 51   sequencing.clustersLoaded = function(response)
3632 30 Nov 15 nicklas 52   {
3632 30 Nov 15 nicklas 53     Doc.removeClass('clusters', 'list-loading');
3632 30 Nov 15 nicklas 54     var frm = document.forms['reggie'];
4306 17 Jan 17 nicklas 55     var clusters = response.hosts;
3632 30 Nov 15 nicklas 56     frm.clusters.length = 0;
3632 30 Nov 15 nicklas 57     for (var i = 0; i < clusters.length; i++)
3632 30 Nov 15 nicklas 58     {
3632 30 Nov 15 nicklas 59       var cl = clusters[i];
4306 17 Jan 17 nicklas 60       var option = new Option(cl.connection.name, cl.id);
3632 30 Nov 15 nicklas 61       option.cluster = cl;
3632 30 Nov 15 nicklas 62       frm.clusters[frm.clusters.length] = option;
3632 30 Nov 15 nicklas 63     }
3632 30 Nov 15 nicklas 64     if (frm.clusters.length == 0)
3632 30 Nov 15 nicklas 65     {
6735 09 May 22 nicklas 66       frm.clusters[frm.clusters.length] = new Option('No available clusters');
3632 30 Nov 15 nicklas 67       frm.clusters.disabled = true;
3632 30 Nov 15 nicklas 68       Doc.addClass('searchRunArchive', 'disabled');
3632 30 Nov 15 nicklas 69     }
3632 30 Nov 15 nicklas 70   }
3632 30 Nov 15 nicklas 71
3632 30 Nov 15 nicklas 72   sequencing.sequencersLoaded = function(response)
3632 30 Nov 15 nicklas 73   {
3632 30 Nov 15 nicklas 74     sequencers = response.hardware;
3632 30 Nov 15 nicklas 75   }
2648 10 Sep 14 nicklas 76   
2648 10 Sep 14 nicklas 77   sequencing.initializeStep1 = function(response)
2648 10 Sep 14 nicklas 78   {
2648 10 Sep 14 nicklas 79     var seqRuns = response.sequencingRuns;
2648 10 Sep 14 nicklas 80     var frm = document.forms['reggie'];  
2648 10 Sep 14 nicklas 81
2648 10 Sep 14 nicklas 82     if (seqRuns.length > 0)
2648 10 Sep 14 nicklas 83     {
2648 10 Sep 14 nicklas 84       for (var runNo=0; runNo < seqRuns.length; runNo++)
2648 10 Sep 14 nicklas 85       {
2648 10 Sep 14 nicklas 86         var seqRun = seqRuns[runNo];
2648 10 Sep 14 nicklas 87         var option = sequencing.getOptionForSeqRun(seqRun);
2648 10 Sep 14 nicklas 88         frm.seqRuns.options[frm.seqRuns.length] = option;
2648 10 Sep 14 nicklas 89       }
2648 10 Sep 14 nicklas 90     }
2648 10 Sep 14 nicklas 91     else
2648 10 Sep 14 nicklas 92     {
2648 10 Sep 14 nicklas 93       Wizard.setFatalError('No sequencing runs available for processing.');
2648 10 Sep 14 nicklas 94       return;
2648 10 Sep 14 nicklas 95     }
2648 10 Sep 14 nicklas 96     
2648 10 Sep 14 nicklas 97     Doc.show('step-1');
3632 30 Nov 15 nicklas 98     Doc.show('gocancel');
3632 30 Nov 15 nicklas 99     Doc.show('goregister');
2648 10 Sep 14 nicklas 100
2648 10 Sep 14 nicklas 101     sequencing.sequencingRunOnChange();
2648 10 Sep 14 nicklas 102     frm.seqRuns.focus();
2648 10 Sep 14 nicklas 103   }
2648 10 Sep 14 nicklas 104   
2648 10 Sep 14 nicklas 105   sequencing.getOptionForSeqRun = function(seqRun)
2648 10 Sep 14 nicklas 106   {
2648 10 Sep 14 nicklas 107     var flowCell = seqRun.flowCell;
2648 10 Sep 14 nicklas 108     var name = seqRun.name+': ';
2648 10 Sep 14 nicklas 109     var numPools = flowCell.pools.length;
2648 10 Sep 14 nicklas 110     var firstPoolNum = sequencing.getPoolNum(flowCell.pools[0].name);
2648 10 Sep 14 nicklas 111     var lastPoolNum = sequencing.getPoolNum(flowCell.pools[flowCell.pools.length-1].name);
2648 10 Sep 14 nicklas 112
2648 10 Sep 14 nicklas 113     if (lastPoolNum - firstPoolNum == numPools - 1)
2648 10 Sep 14 nicklas 114     {
2648 10 Sep 14 nicklas 115       if (numPools > 1)
2648 10 Sep 14 nicklas 116       {
2648 10 Sep 14 nicklas 117         // Display: PoolN -- PoolY
2648 10 Sep 14 nicklas 118         name += flowCell.pools[0].name + ' — ' + flowCell.pools[flowCell.pools.length-1].name;
2648 10 Sep 14 nicklas 119       }
2648 10 Sep 14 nicklas 120       else
2648 10 Sep 14 nicklas 121       {
2648 10 Sep 14 nicklas 122         name += flowCell.pools[0].name;
2648 10 Sep 14 nicklas 123       }
2648 10 Sep 14 nicklas 124     }
2648 10 Sep 14 nicklas 125     else
2648 10 Sep 14 nicklas 126     {
2648 10 Sep 14 nicklas 127       // Display: PoolN + x more...
2648 10 Sep 14 nicklas 128       name += flowCell.pools[0].name + ' + ' + (numPools-1) + ' more...';
2648 10 Sep 14 nicklas 129     }
2648 10 Sep 14 nicklas 130
2648 10 Sep 14 nicklas 131     // Tooltip is always all pools
2648 10 Sep 14 nicklas 132     var title = '';
2648 10 Sep 14 nicklas 133     for (var poolNo=0; poolNo < numPools; poolNo++)
2648 10 Sep 14 nicklas 134     {
2648 10 Sep 14 nicklas 135       var pool = flowCell.pools[poolNo];
2648 10 Sep 14 nicklas 136       if (poolNo > 0) title += ', ';
2648 10 Sep 14 nicklas 137       title += pool.name;
2648 10 Sep 14 nicklas 138     }
2648 10 Sep 14 nicklas 139     
5471 05 Jun 19 nicklas 140     var opt = [];
5471 05 Jun 19 nicklas 141     if (flowCell.FlowCellType) opt[opt.length] = flowCell.FlowCellType;
5471 05 Jun 19 nicklas 142     opt[opt.length] = seqRun.pipeline;
5478 10 Jun 19 nicklas 143     if (seqRun.autoAnalyze) opt[opt.length] = 'auto-analyze';
5471 05 Jun 19 nicklas 144     name += ' [' + opt.join('; ') + ']';
2648 10 Sep 14 nicklas 145
2648 10 Sep 14 nicklas 146     var option = new Option(name, seqRun.id);
2648 10 Sep 14 nicklas 147     option.title = title;
2648 10 Sep 14 nicklas 148     option.seqRun = seqRun;  
2648 10 Sep 14 nicklas 149     return option;
2648 10 Sep 14 nicklas 150   }
2648 10 Sep 14 nicklas 151
2648 10 Sep 14 nicklas 152     
2648 10 Sep 14 nicklas 153   sequencing.getPoolNum = function(poolName)
2648 10 Sep 14 nicklas 154   {
2648 10 Sep 14 nicklas 155     var num = poolName.match(/Pool(\d+)/);
2648 10 Sep 14 nicklas 156     return num ? parseInt(num[1], 10) : null;
2648 10 Sep 14 nicklas 157   }
2648 10 Sep 14 nicklas 158
2648 10 Sep 14 nicklas 159
2648 10 Sep 14 nicklas 160   sequencing.sequencingRunOnChange = function()
2648 10 Sep 14 nicklas 161   {
3632 30 Nov 15 nicklas 162     sequencing.resetSeqRunInfo();
3632 30 Nov 15 nicklas 163   }
3632 30 Nov 15 nicklas 164   
3632 30 Nov 15 nicklas 165   sequencing.resetSeqRunInfo = function()
3632 30 Nov 15 nicklas 166   {
2648 10 Sep 14 nicklas 167     var frm = document.forms['reggie'];  
2648 10 Sep 14 nicklas 168     var seqRun = frm.seqRuns[frm.seqRuns.selectedIndex].seqRun;
2648 10 Sep 14 nicklas 169     
3692 13 Jan 16 nicklas 170     if (seqRun.autoAnalyze)
3692 13 Jan 16 nicklas 171     {
3718 22 Jan 16 nicklas 172       var aa = seqRun.autoAnalyze;
3718 22 Jan 16 nicklas 173       var img = JOB_IMAGE[aa.status] || 'info.png';
3718 22 Jan 16 nicklas 174       var msg = '<span id="autoAnalyzeJob" class="link" data-item-type="JOB" data-item-id="'+aa.id+'"><img src="../images/'+img+'" style="margin-right: 0.5em;"></span>';
3718 22 Jan 16 nicklas 175
3718 22 Jan 16 nicklas 176       msg += '<span class="itemsubtype">['+aa.status+']</span> ';
3718 22 Jan 16 nicklas 177       if (aa.status == 'EXECUTING')
3718 22 Jan 16 nicklas 178       {
3718 22 Jan 16 nicklas 179         msg += aa.progress + '% ';
3718 22 Jan 16 nicklas 180       }
3718 22 Jan 16 nicklas 181       msg += Strings.encodeTags(seqRun.autoAnalyze.message);
3718 22 Jan 16 nicklas 182       Wizard.setInputStatus('autoAnalyze', 'warning', 'Auto-analyze has been selected for this sequencing run. Manual registration in this step will stop the automatic processing.');
3718 22 Jan 16 nicklas 183       Doc.element('autoAnalyze').innerHTML = msg;
3718 22 Jan 16 nicklas 184       Doc.show('autoAnalyzeSection');
3718 22 Jan 16 nicklas 185       Events.addEventHandler('autoAnalyzeJob', 'click', Items.itemOnClick);
3718 22 Jan 16 nicklas 186       Wizard.showGoNextConfirmation(true, 'Check to verify registration of an auto-analyze sequencing run.');
3692 13 Jan 16 nicklas 187     }
3718 22 Jan 16 nicklas 188     else
3718 22 Jan 16 nicklas 189     {
3718 22 Jan 16 nicklas 190       Doc.hide('autoAnalyzeSection');
3718 22 Jan 16 nicklas 191       Wizard.hideGoNextConfirmation();
3718 22 Jan 16 nicklas 192     }
3692 13 Jan 16 nicklas 193
3632 30 Nov 15 nicklas 194     // Flow cell info
2648 10 Sep 14 nicklas 195     var fc = seqRun.flowCell;
3632 30 Nov 15 nicklas 196     Doc.element('externalId').innerHTML = Strings.encodeTags(fc.FlowCellID || '');
2648 10 Sep 14 nicklas 197     Doc.element('flowCellType').innerHTML = Strings.encodeTags(fc.FlowCellType || '');
2648 10 Sep 14 nicklas 198     var pools = fc.pools;
5473 05 Jun 19 nicklas 199     
5473 05 Jun 19 nicklas 200     var poolNames = [];
5473 05 Jun 19 nicklas 201     var libPlateNames = [];
2648 10 Sep 14 nicklas 202     for (var poolNo = 0; poolNo < pools.length; poolNo++)
2648 10 Sep 14 nicklas 203     {
2648 10 Sep 14 nicklas 204       var pool = pools[poolNo];
5473 05 Jun 19 nicklas 205       poolNames[poolNames.length] = pool.name;
5473 05 Jun 19 nicklas 206       if (pool.libPlates)
2648 10 Sep 14 nicklas 207       {
5473 05 Jun 19 nicklas 208         for (var plateNo = 0; plateNo < pool.libPlates.length; plateNo++)
5473 05 Jun 19 nicklas 209         {
5473 05 Jun 19 nicklas 210           var plateName = pool.libPlates[plateNo].name;
5473 05 Jun 19 nicklas 211           if (libPlateNames.indexOf(plateName) == -1)
5473 05 Jun 19 nicklas 212           {
5473 05 Jun 19 nicklas 213             libPlateNames[libPlateNames.length] = plateName;
5473 05 Jun 19 nicklas 214           }
5473 05 Jun 19 nicklas 215         }
2648 10 Sep 14 nicklas 216       }
2648 10 Sep 14 nicklas 217     }
5473 05 Jun 19 nicklas 218     Doc.element('pools').innerHTML = Strings.encodeTags(poolNames.join(', '));
5473 05 Jun 19 nicklas 219     Doc.element('libPlates').innerHTML = Strings.encodeTags(libPlateNames.join(', ')) || 'n/a';
3632 30 Nov 15 nicklas 220
3632 30 Nov 15 nicklas 221     // Sequencing info
3632 30 Nov 15 nicklas 222     var sequencer = seqRun.sequencer;
3632 30 Nov 15 nicklas 223     Doc.element('startDate').innerHTML = Reggie.reformatDate(seqRun.SequencingStart);
3632 30 Nov 15 nicklas 224     Doc.element('position').innerHTML = Strings.encodeTags(seqRun.HiSeqPosition);
3632 30 Nov 15 nicklas 225     Doc.element('sequencingCycles').innerHTML = Strings.encodeTags(fc.SequencingCycles);
3632 30 Nov 15 nicklas 226     Doc.element('sequencer').innerHTML = sequencer ? 
3632 30 Nov 15 nicklas 227         Strings.encodeTags(sequencer.name + ' ('+sequencer.SerialNumber+')') : '';
3632 30 Nov 15 nicklas 228     frm.comments.value = seqRun.comments;
3632 30 Nov 15 nicklas 229     
3632 30 Nov 15 nicklas 230     // Loaded from RunParameters.xml
3632 30 Nov 15 nicklas 231     Doc.element('experimentName').innerHTML = '';
3632 30 Nov 15 nicklas 232     Doc.element('runId').innerHTML = '';
3632 30 Nov 15 nicklas 233     Doc.element('runNumber').innerHTML = '';
3632 30 Nov 15 nicklas 234     Doc.element('dataFolder').innerHTML = '';
3636 01 Dec 15 nicklas 235     Doc.element('endDate').value = '';
3636 01 Dec 15 nicklas 236     Doc.element('endTime').value = '';
3636 01 Dec 15 nicklas 237     
3632 30 Nov 15 nicklas 238     runParameters = null;
3632 30 Nov 15 nicklas 239     Wizard.setInputStatus('runParametersXml');
3632 30 Nov 15 nicklas 240     Wizard.setInputStatus('externalId');
3632 30 Nov 15 nicklas 241     Wizard.setInputStatus('startDate');
3632 30 Nov 15 nicklas 242     Wizard.setInputStatus('sequencingCycles');
3632 30 Nov 15 nicklas 243     Wizard.setInputStatus('sequencer');
3632 30 Nov 15 nicklas 244     Wizard.setInputStatus('position');
2648 10 Sep 14 nicklas 245   }
2648 10 Sep 14 nicklas 246
3632 30 Nov 15 nicklas 247   sequencing.runParametersXmlFileOnChange = function(event)
2648 10 Sep 14 nicklas 248   {
3632 30 Nov 15 nicklas 249     sequencing.resetSeqRunInfo();
3632 30 Nov 15 nicklas 250     Wizard.setNoConfirmOnFirstStep(false);
3632 30 Nov 15 nicklas 251     var file = event.target.files[0];
2648 10 Sep 14 nicklas 252     
3632 30 Nov 15 nicklas 253     var reader = new FileReader();
3632 30 Nov 15 nicklas 254     reader.onload = sequencing.runParametersXmlFileLoaded;
3632 30 Nov 15 nicklas 255     reader.readAsText(file);
2648 10 Sep 14 nicklas 256   }
2648 10 Sep 14 nicklas 257   
3632 30 Nov 15 nicklas 258   sequencing.runParametersXmlFileLoaded = function(event)
2648 10 Sep 14 nicklas 259   {
3632 30 Nov 15 nicklas 260     runParameters = sequencing.parseRunParametersXmlFile(event.target.result);
3632 30 Nov 15 nicklas 261     sequencing.validateAndCopyRunParameters(runParameters);
3632 30 Nov 15 nicklas 262   }
3632 30 Nov 15 nicklas 263   
3632 30 Nov 15 nicklas 264   sequencing.searchRunArchive = function()
3632 30 Nov 15 nicklas 265   {
3632 30 Nov 15 nicklas 266     sequencing.resetSeqRunInfo();
3632 30 Nov 15 nicklas 267     
2648 10 Sep 14 nicklas 268     var frm = document.forms['reggie'];
3632 30 Nov 15 nicklas 269     var flowCell = frm.seqRuns[frm.seqRuns.selectedIndex].seqRun.flowCell;
2648 10 Sep 14 nicklas 270     
3632 30 Nov 15 nicklas 271     var url = '../SequencingRun.servlet?ID='+App.getSessionId();
3632 30 Nov 15 nicklas 272     url += '&cmd=SearchRunArchive';
3632 30 Nov 15 nicklas 273     url += '&FlowCellID='+encodeURIComponent(flowCell.FlowCellID);
3632 30 Nov 15 nicklas 274     url += '&cluster='+encodeURIComponent(frm.clusters.value);
2648 10 Sep 14 nicklas 275     
3632 30 Nov 15 nicklas 276     Wizard.setInputStatus('runParametersXml', 'checking', 'Searching...');
3632 30 Nov 15 nicklas 277     Wizard.asyncJsonRequest(url, sequencing.runArchiveSearched);
3632 30 Nov 15 nicklas 278   }
3632 30 Nov 15 nicklas 279
3632 30 Nov 15 nicklas 280   sequencing.runArchiveSearched = function(response)
3632 30 Nov 15 nicklas 281   {
3632 30 Nov 15 nicklas 282     Wizard.setInputStatus('runParametersXml');
3632 30 Nov 15 nicklas 283     if (response.exitStatus != 0)
2648 10 Sep 14 nicklas 284     {
3632 30 Nov 15 nicklas 285       Wizard.setInputStatus('runParametersXml', 'invalid', Strings.encodeTags(response.stderr).replace(/\n/g, '<br>'));
3632 30 Nov 15 nicklas 286       return;
3632 30 Nov 15 nicklas 287     }
3632 30 Nov 15 nicklas 288     Wizard.setNoConfirmOnFirstStep(false);
3632 30 Nov 15 nicklas 289     
3632 30 Nov 15 nicklas 290     Doc.element('dataFolder').innerHTML = Strings.encodeTags(response.dataFolder);
3636 01 Dec 15 nicklas 291     if (response.endDateTime)
3636 01 Dec 15 nicklas 292     {
3636 01 Dec 15 nicklas 293       Doc.element('endDate').value = response.endDateTime.substr(0, 8);
3636 01 Dec 15 nicklas 294       Doc.element('endTime').value = response.endDateTime.substr(9, 4);
3636 01 Dec 15 nicklas 295     }
3632 30 Nov 15 nicklas 296     
3632 30 Nov 15 nicklas 297     runParameters = sequencing.parseRunParametersXmlFile(response.runParameters);
3632 30 Nov 15 nicklas 298     sequencing.validateAndCopyRunParameters(runParameters);
3632 30 Nov 15 nicklas 299   }
3632 30 Nov 15 nicklas 300
3632 30 Nov 15 nicklas 301   sequencing.parseRunParametersXmlFile = function(data)
3632 30 Nov 15 nicklas 302   {
5471 05 Jun 19 nicklas 303     var frm = document.forms['reggie'];
5471 05 Jun 19 nicklas 304     var seqRun = frm.seqRuns[frm.seqRuns.selectedIndex].seqRun;
5471 05 Jun 19 nicklas 305     var fc = seqRun.flowCell;
3632 30 Nov 15 nicklas 306     var doc;
3632 30 Nov 15 nicklas 307     var info = {};
3632 30 Nov 15 nicklas 308     try
3632 30 Nov 15 nicklas 309     {
3632 30 Nov 15 nicklas 310       var parser = new DOMParser();
3632 30 Nov 15 nicklas 311       doc = parser.parseFromString(data, "application/xml");
3632 30 Nov 15 nicklas 312     
3632 30 Nov 15 nicklas 313       if (doc.documentElement.tagName == 'parsererror')
2648 10 Sep 14 nicklas 314       {
3632 30 Nov 15 nicklas 315         throw new Error(doc.documentElement.firstChild.textContent.split(/\n/)[0]);
2648 10 Sep 14 nicklas 316       }
3632 30 Nov 15 nicklas 317       
5471 05 Jun 19 nicklas 318       if (fc.FlowCellType == 'NextSeq')
5471 05 Jun 19 nicklas 319       {
5471 05 Jun 19 nicklas 320         info.ExperimentName = sequencing.getTextValue(doc, 'ExperimentName');
5471 05 Jun 19 nicklas 321         info.RunID = sequencing.getTextValue(doc, 'RunID');
5471 05 Jun 19 nicklas 322         info.HiSeqPosition = 'A';
5471 05 Jun 19 nicklas 323         info.ScannerID = sequencing.getTextValue(doc, 'InstrumentID');
5471 05 Jun 19 nicklas 324         info.ScanNumber = parseInt(sequencing.getTextValue(doc, 'RunNumber'));
5471 05 Jun 19 nicklas 325         info.FlowCellID = sequencing.getTextValue(doc, 'FlowCellSerial');
5869 19 Mar 20 nicklas 326         
5869 19 Mar 20 nicklas 327         var read1 = sequencing.getTextValue(doc, 'Read1');
5869 19 Mar 20 nicklas 328         var index1 = sequencing.getTextValue(doc, 'Index1Read');
5869 19 Mar 20 nicklas 329         var index2 = sequencing.getTextValue(doc, 'Index2Read');
5869 19 Mar 20 nicklas 330         var read2 = sequencing.getTextValue(doc, 'Read2');
5869 19 Mar 20 nicklas 331         info.SequencingCycles = sequencing.getSequencingCycles(read1, index1, index2, read2);
5471 05 Jun 19 nicklas 332         info.SequencingStart = '20'+sequencing.getTextValue(doc, 'RunStartDate');
5471 05 Jun 19 nicklas 333       }
5471 05 Jun 19 nicklas 334       else if (fc.FlowCellType == 'HiSeq')
5471 05 Jun 19 nicklas 335       {
5471 05 Jun 19 nicklas 336         info.ExperimentName = sequencing.getTextValue(doc, 'ExperimentName');
5471 05 Jun 19 nicklas 337         info.RunID = sequencing.getTextValue(doc, 'RunID');
5471 05 Jun 19 nicklas 338         info.HiSeqPosition = sequencing.getTextValue(doc, 'FCPosition');
5471 05 Jun 19 nicklas 339         info.ScannerID = sequencing.getTextValue(doc, 'ScannerID');
5471 05 Jun 19 nicklas 340         info.ScanNumber = parseInt(sequencing.getTextValue(doc, 'ScanNumber'));
5471 05 Jun 19 nicklas 341         info.FlowCellID = sequencing.getTextValue(doc, 'Barcode');
5869 19 Mar 20 nicklas 342
5869 19 Mar 20 nicklas 343         var read1 = sequencing.getTextValue(doc, 'Read1');
5869 19 Mar 20 nicklas 344         var index1 = sequencing.getTextValue(doc, 'Index1Read');
5869 19 Mar 20 nicklas 345         var index2 = sequencing.getTextValue(doc, 'Index2Read');
5869 19 Mar 20 nicklas 346         var read2 = sequencing.getTextValue(doc, 'Read2');
5869 19 Mar 20 nicklas 347         info.SequencingCycles = sequencing.getSequencingCycles(read1, index1, index2, read2);
5471 05 Jun 19 nicklas 348         info.SequencingStart = '20'+sequencing.getTextValue(doc, 'RunStartDate');
5471 05 Jun 19 nicklas 349       }
5857 10 Mar 20 nicklas 350       else if (fc.FlowCellType == 'NovaSeq')
5857 10 Mar 20 nicklas 351       {
5857 10 Mar 20 nicklas 352         info.ExperimentName = sequencing.getTextValue(doc, 'ExperimentName');
5857 10 Mar 20 nicklas 353         info.RunID = sequencing.getTextValue(doc, 'RunId'); // Note! "RunId" instead of "RunID"
5857 10 Mar 20 nicklas 354         info.HiSeqPosition = sequencing.getTextValue(doc, 'Side');
5857 10 Mar 20 nicklas 355         info.ScannerID = sequencing.getTextValue(doc, 'InstrumentName');
5857 10 Mar 20 nicklas 356         info.ScanNumber = parseInt(sequencing.getTextValue(doc, 'RunNumber'));
5857 10 Mar 20 nicklas 357         info.FlowCellID = sequencing.getTextValue(doc, 'RfidsInfo>FlowCellSerialBarcode');
5869 19 Mar 20 nicklas 358         var read1 = sequencing.getTextValue(doc, 'Read1NumberOfCycles');
5869 19 Mar 20 nicklas 359         var index1 = sequencing.getTextValue(doc, 'IndexRead1NumberOfCycles');
5869 19 Mar 20 nicklas 360         var index2 = sequencing.getTextValue(doc, 'IndexRead2NumberOfCycles');
5869 19 Mar 20 nicklas 361         var read2 = sequencing.getTextValue(doc, 'Read2NumberOfCycles');
5869 19 Mar 20 nicklas 362         info.SequencingCycles = sequencing.getSequencingCycles(read1, index1, index2, read2);
5857 10 Mar 20 nicklas 363         info.SequencingStart = '20'+sequencing.getTextValue(doc, 'RunStartDate');
5857 10 Mar 20 nicklas 364       }
2648 10 Sep 14 nicklas 365     }
3632 30 Nov 15 nicklas 366     catch (err)
2648 10 Sep 14 nicklas 367     {
3632 30 Nov 15 nicklas 368       Wizard.setInputStatus('runParametersXml', 'invalid', err.toString());
3632 30 Nov 15 nicklas 369       info.error = true;
3632 30 Nov 15 nicklas 370     }
3632 30 Nov 15 nicklas 371     
3632 30 Nov 15 nicklas 372     if (debug) App.debug(JSON.stringify(info));
3632 30 Nov 15 nicklas 373     return info;
3632 30 Nov 15 nicklas 374   }
2648 10 Sep 14 nicklas 375
3632 30 Nov 15 nicklas 376   sequencing.getTextValue = function(doc, selector)
3632 30 Nov 15 nicklas 377   {
3632 30 Nov 15 nicklas 378     var el = doc.querySelector(selector);
3632 30 Nov 15 nicklas 379     if (el == null)
3632 30 Nov 15 nicklas 380     {
3632 30 Nov 15 nicklas 381       throw new Error("Can't find tag &lt;"+selector+"&gt;");
3632 30 Nov 15 nicklas 382     }
3632 30 Nov 15 nicklas 383     return el.textContent;
3632 30 Nov 15 nicklas 384   }
5869 19 Mar 20 nicklas 385   
5869 19 Mar 20 nicklas 386   sequencing.getSequencingCycles = function(read1, index1, index2, read2)
5869 19 Mar 20 nicklas 387   {
5869 19 Mar 20 nicklas 388     return read1+'-'+index1+'-'+(index2=='0'?'':index2+'-')+read2;
5869 19 Mar 20 nicklas 389   }
3632 30 Nov 15 nicklas 390
3632 30 Nov 15 nicklas 391   sequencing.validateAndCopyRunParameters = function(info)
3632 30 Nov 15 nicklas 392   {
3632 30 Nov 15 nicklas 393     if (info.error) return;
3632 30 Nov 15 nicklas 394     var frm = document.forms['reggie'];
3632 30 Nov 15 nicklas 395     var seqRun = frm.seqRuns[frm.seqRuns.selectedIndex].seqRun;
3632 30 Nov 15 nicklas 396     var fc = seqRun.flowCell;
3632 30 Nov 15 nicklas 397
3632 30 Nov 15 nicklas 398     // Flow cell info
3632 30 Nov 15 nicklas 399     Doc.element('externalId').innerHTML = info.FlowCellID || '';
3632 30 Nov 15 nicklas 400     if (fc.FlowCellID != info.FlowCellID)
3632 30 Nov 15 nicklas 401     {
3632 30 Nov 15 nicklas 402       if (fc.FlowCellID.toLowerCase() != info.FlowCellID.toLowerCase())
2648 10 Sep 14 nicklas 403       {
3632 30 Nov 15 nicklas 404         Wizard.setInputStatus('externalId', 'invalid', 'Not same as registered barcode ('+Strings.encodeTags(fc.FlowCellID)+').');
3632 30 Nov 15 nicklas 405         info.error = true;
2648 10 Sep 14 nicklas 406       }
3632 30 Nov 15 nicklas 407       else
3632 30 Nov 15 nicklas 408       {
3632 30 Nov 15 nicklas 409         Wizard.setInputStatus('externalId', 'warning', 'Not same as registered barcode ('+Strings.encodeTags(fc.FlowCellID)+').');
3632 30 Nov 15 nicklas 410       }
2648 10 Sep 14 nicklas 411     }
3632 30 Nov 15 nicklas 412
3632 30 Nov 15 nicklas 413     // Seq run info
3632 30 Nov 15 nicklas 414     Doc.element('startDate').innerHTML = Reggie.reformatDate(info.SequencingStart) || '';
5869 19 Mar 20 nicklas 415     if (seqRun.SequencingStart && seqRun.SequencingStart != info.SequencingStart)
2648 10 Sep 14 nicklas 416     {
3632 30 Nov 15 nicklas 417       Wizard.setInputStatus('startDate', 'warning', 'Not same as registered start date ('+Reggie.reformatDate(seqRun.SequencingStart)+').');
2648 10 Sep 14 nicklas 418     }
3632 30 Nov 15 nicklas 419     Doc.element('sequencingCycles').innerHTML = info.SequencingCycles || '';
5869 19 Mar 20 nicklas 420     if (fc.SequencingCycles && fc.SequencingCycles != info.SequencingCycles)
2648 10 Sep 14 nicklas 421     {
3632 30 Nov 15 nicklas 422       Wizard.setInputStatus('sequencingCycles', 'warning', 'Not same as planned SequencingCycles ('+Strings.encodeTags(fc.SequencingCycles)+').');
3632 30 Nov 15 nicklas 423     }
3632 30 Nov 15 nicklas 424     Doc.element('position').innerHTML = info.HiSeqPosition || '';
5869 19 Mar 20 nicklas 425     if (seqRun.HiSeqPosition && seqRun.HiSeqPosition != info.HiSeqPosition)
3632 30 Nov 15 nicklas 426     {
3632 30 Nov 15 nicklas 427       Wizard.setInputStatus('position', 'warning', 'Not same as planned position ('+Strings.encodeTags(seqRun.HiSeqPosition)+').');
3632 30 Nov 15 nicklas 428     }
3632 30 Nov 15 nicklas 429
5869 19 Mar 20 nicklas 430     if (info.ScannerID && (!seqRun.sequencer || seqRun.sequencer.SerialNumber != info.ScannerID))
3632 30 Nov 15 nicklas 431     {
5869 19 Mar 20 nicklas 432       if (seqRun.sequencer && seqRun.sequencer.SerialNumber != info.ScannerID)
2648 10 Sep 14 nicklas 433       {
3632 30 Nov 15 nicklas 434         Doc.element('sequencer').innerHTML = info.ScannerID;
3632 30 Nov 15 nicklas 435         Wizard.setInputStatus('sequencer', 'warning', 'Not same as registered sequencer ('+Strings.encodeTags(seqRun.sequencer.name)+').');
5869 19 Mar 20 nicklas 436       }
5869 19 Mar 20 nicklas 437       
5869 19 Mar 20 nicklas 438       // Try to find the sequencer
5869 19 Mar 20 nicklas 439       if (sequencers && sequencers.length) 
5869 19 Mar 20 nicklas 440       {
5869 19 Mar 20 nicklas 441         for (var i = 0; i < sequencers.length; i++)
3632 30 Nov 15 nicklas 442         {
5869 19 Mar 20 nicklas 443           var seq = sequencers[i];
5869 19 Mar 20 nicklas 444           if (seq.SerialNumber == info.ScannerID)
3632 30 Nov 15 nicklas 445           {
5869 19 Mar 20 nicklas 446             Doc.element('sequencer').innerHTML = Strings.encodeTags(seq.name + ' ('+seq.SerialNumber + ')');
5869 19 Mar 20 nicklas 447             info.sequencer = seq;
5869 19 Mar 20 nicklas 448             break;
3632 30 Nov 15 nicklas 449           }
3632 30 Nov 15 nicklas 450         }
2648 10 Sep 14 nicklas 451       }
2648 10 Sep 14 nicklas 452     }
2648 10 Sep 14 nicklas 453     
3632 30 Nov 15 nicklas 454     
3632 30 Nov 15 nicklas 455     Doc.element('experimentName').innerHTML = info.ExperimentName || '';
3632 30 Nov 15 nicklas 456     Doc.element('runId').innerHTML = info.RunID || '';
3632 30 Nov 15 nicklas 457     Doc.element('runNumber').innerHTML = info.ScanNumber || '';
3632 30 Nov 15 nicklas 458     
3632 30 Nov 15 nicklas 459     if (!info.error) Wizard.setInputStatus('runParametersXml', 'valid');
3632 30 Nov 15 nicklas 460     frm.endDate.focus();
3632 30 Nov 15 nicklas 461     
2648 10 Sep 14 nicklas 462   }
2648 10 Sep 14 nicklas 463
3632 30 Nov 15 nicklas 464   sequencing.validateStep1 = function(event)
3632 30 Nov 15 nicklas 465   {
3632 30 Nov 15 nicklas 466     if (!runParameters)
3632 30 Nov 15 nicklas 467     {
3632 30 Nov 15 nicklas 468       Wizard.setInputStatus('runParametersXml', 'invalid', 'Missing');
3632 30 Nov 15 nicklas 469     }
3718 22 Jan 16 nicklas 470     if (!runParameters || runParameters.error || !endDateIsValid) 
3632 30 Nov 15 nicklas 471     {
3632 30 Nov 15 nicklas 472       event.preventDefault();
3632 30 Nov 15 nicklas 473     }
3632 30 Nov 15 nicklas 474   }
3632 30 Nov 15 nicklas 475   
3632 30 Nov 15 nicklas 476
2648 10 Sep 14 nicklas 477   sequencing.endDateTimeOnChange = function()
2648 10 Sep 14 nicklas 478   {
2648 10 Sep 14 nicklas 479     var frm = document.forms['reggie'];
2648 10 Sep 14 nicklas 480     endDateIsValid = false;
2648 10 Sep 14 nicklas 481     Wizard.setInputStatus('endDate');
2648 10 Sep 14 nicklas 482     
2648 10 Sep 14 nicklas 483     var endDate = frm.endDate.value;
2648 10 Sep 14 nicklas 484     var endTime = frm.endTime.value;
2648 10 Sep 14 nicklas 485     
2648 10 Sep 14 nicklas 486     if (endDate == '')
2648 10 Sep 14 nicklas 487     {
2648 10 Sep 14 nicklas 488       Wizard.setInputStatus('endDate', 'invalid', 'Missing date');
2648 10 Sep 14 nicklas 489       return;
2648 10 Sep 14 nicklas 490     }
2648 10 Sep 14 nicklas 491     else
2648 10 Sep 14 nicklas 492     {
2648 10 Sep 14 nicklas 493       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
2648 10 Sep 14 nicklas 494       endDate = Reggie.autoFillDate(endDate);
2648 10 Sep 14 nicklas 495       frm.endDate.value = endDate;
2648 10 Sep 14 nicklas 496
2648 10 Sep 14 nicklas 497       if (!Dates.isDate(endDate, 'yyyyMMdd'))
2648 10 Sep 14 nicklas 498       {
2648 10 Sep 14 nicklas 499         Wizard.setInputStatus('endDate', 'invalid', 'Not a valid date');
2648 10 Sep 14 nicklas 500         return;
2648 10 Sep 14 nicklas 501       }
2648 10 Sep 14 nicklas 502     }
2648 10 Sep 14 nicklas 503     
2648 10 Sep 14 nicklas 504     if (endTime == '')
2648 10 Sep 14 nicklas 505     {
2648 10 Sep 14 nicklas 506       Wizard.setInputStatus('endDate', 'invalid', 'Missing time');
2648 10 Sep 14 nicklas 507       return;
2648 10 Sep 14 nicklas 508     }
2648 10 Sep 14 nicklas 509     else
2648 10 Sep 14 nicklas 510     {
2648 10 Sep 14 nicklas 511       endTime = Reggie.autoFillTime(endTime);
2648 10 Sep 14 nicklas 512       frm.endTime.value = endTime;
2648 10 Sep 14 nicklas 513       
2648 10 Sep 14 nicklas 514       if (!Dates.isDate(endDate + ' ' + endTime, 'yyyyMMdd HHmm'))
2648 10 Sep 14 nicklas 515       {
2648 10 Sep 14 nicklas 516         Wizard.setInputStatus('endDate', 'invalid', 'Not a valid time');
2648 10 Sep 14 nicklas 517         return;
2648 10 Sep 14 nicklas 518       }
2648 10 Sep 14 nicklas 519     }
2648 10 Sep 14 nicklas 520
2648 10 Sep 14 nicklas 521
2648 10 Sep 14 nicklas 522     Wizard.setInputStatus('endDate', 'valid');
2648 10 Sep 14 nicklas 523     endDateIsValid = true;
2648 10 Sep 14 nicklas 524   }
2648 10 Sep 14 nicklas 525
2648 10 Sep 14 nicklas 526   
2648 10 Sep 14 nicklas 527   sequencing.submit = function()
2648 10 Sep 14 nicklas 528   {
2648 10 Sep 14 nicklas 529     var frm = document.forms['reggie'];
2648 10 Sep 14 nicklas 530     var seqRun = frm.seqRuns[frm.seqRuns.selectedIndex].seqRun;
2648 10 Sep 14 nicklas 531     seqRun.endDate = Strings.trim(frm.endDate.value + ' ' + frm.endTime.value);
3632 30 Nov 15 nicklas 532     seqRun.comments = frm.comments.value;
2648 10 Sep 14 nicklas 533       
2648 10 Sep 14 nicklas 534     var submitInfo = {};
2648 10 Sep 14 nicklas 535     submitInfo.sequencingRun = seqRun;
3632 30 Nov 15 nicklas 536     submitInfo.runParameters = runParameters;
3632 30 Nov 15 nicklas 537     
2648 10 Sep 14 nicklas 538     var url = '../SequencingRun.servlet?ID='+App.getSessionId();
5488 12 Jun 19 nicklas 539     url += '&cmd=RegisterSequencingEnded&pipeline='+encodeURIComponent(Data.get('page-data', 'pipeline'));
5488 12 Jun 19 nicklas 540     
2648 10 Sep 14 nicklas 541     Wizard.showLoadingAnimation('Performing registration...');
2648 10 Sep 14 nicklas 542     Wizard.asyncJsonRequest(url, sequencing.submissionResults, 'POST', JSON.stringify(submitInfo));
2648 10 Sep 14 nicklas 543   }
2648 10 Sep 14 nicklas 544   
2648 10 Sep 14 nicklas 545   sequencing.submissionResults = function(response)
2648 10 Sep 14 nicklas 546   {
2648 10 Sep 14 nicklas 547     Wizard.showFinalMessage(response.messages);
2648 10 Sep 14 nicklas 548     Doc.show('gorestart');
2648 10 Sep 14 nicklas 549   }
2648 10 Sep 14 nicklas 550
2648 10 Sep 14 nicklas 551   return sequencing;
2648 10 Sep 14 nicklas 552 }();
2648 10 Sep 14 nicklas 553
2648 10 Sep 14 nicklas 554 Doc.onLoad(Sequencing.initPage);
2648 10 Sep 14 nicklas 555