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

Code
Comments
Other
Rev Date Author Line
6815 26 Aug 22 nicklas 1 var Hisat = function()
6815 26 Aug 22 nicklas 2 {
6815 26 Aug 22 nicklas 3   var hisat = {};
6815 26 Aug 22 nicklas 4   var debug = 0;
6815 26 Aug 22 nicklas 5   
6815 26 Aug 22 nicklas 6   var JOB_IMAGE = { 'DONE': 'ok.png', 'ERROR': 'error.png'};
6815 26 Aug 22 nicklas 7   
6815 26 Aug 22 nicklas 8   var alignedSequences;
6815 26 Aug 22 nicklas 9   
6815 26 Aug 22 nicklas 10   // Page initialization
6815 26 Aug 22 nicklas 11   hisat.initPage = function()
6815 26 Aug 22 nicklas 12   {
6815 26 Aug 22 nicklas 13     
6815 26 Aug 22 nicklas 14     // Step 1
6815 26 Aug 22 nicklas 15
6815 26 Aug 22 nicklas 16     // Navigation
6815 26 Aug 22 nicklas 17     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
6815 26 Aug 22 nicklas 18     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
6815 26 Aug 22 nicklas 19     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
6815 26 Aug 22 nicklas 20     Buttons.addClickHandler('goregister', Wizard.goRegister);
6815 26 Aug 22 nicklas 21       
6815 26 Aug 22 nicklas 22     // Final registration
6815 26 Aug 22 nicklas 23     Events.addEventHandler('wizard', 'wizard-submit', hisat.submit);
6815 26 Aug 22 nicklas 24
6815 26 Aug 22 nicklas 25     Wizard.showLoadingAnimation('Loading bioassays...');
6815 26 Aug 22 nicklas 26     var url = '../Hisat2023.servlet?ID='+App.getSessionId();
6815 26 Aug 22 nicklas 27     url += '&cmd=GetUnconfirmedAlignedSequences';
6815 26 Aug 22 nicklas 28     Wizard.asyncJsonRequest(url, hisat.initializeStep1);
6815 26 Aug 22 nicklas 29   }
6815 26 Aug 22 nicklas 30   
6815 26 Aug 22 nicklas 31   // --- Step 1 -----------------------------------
6815 26 Aug 22 nicklas 32   hisat.initializeStep1 = function(response)
6815 26 Aug 22 nicklas 33   {
6815 26 Aug 22 nicklas 34     alignedSequences = response.alignedSequences;
6815 26 Aug 22 nicklas 35     if (alignedSequences.length == 0)
6815 26 Aug 22 nicklas 36     {
6815 26 Aug 22 nicklas 37       Wizard.setFatalError('No aligned sequences available for processing.');
6815 26 Aug 22 nicklas 38       return;
6815 26 Aug 22 nicklas 39     }
6815 26 Aug 22 nicklas 40     
6815 26 Aug 22 nicklas 41     var html = '<table id="alignedSequencesTable">';
6815 26 Aug 22 nicklas 42     html += '<thead class="bg-filled-100">';
6815 26 Aug 22 nicklas 43     // Header row
6815 26 Aug 22 nicklas 44     html += '<tr>';
6815 26 Aug 22 nicklas 45     html += '<th></th>';
6815 26 Aug 22 nicklas 46     html += '<th class="dottedleft"></th>';
6815 26 Aug 22 nicklas 47     html += '<th class="dottedleft" colspan="6">Reads (millions)</th>';
6815 26 Aug 22 nicklas 48     html += '<th class="dottedleft" colspan="3">Genotypes QC</th>'
6815 26 Aug 22 nicklas 49     html += '<th class="dottedleft"></th>';
6815 26 Aug 22 nicklas 50     html += '<th class="dottedleft"></th>';
6815 26 Aug 22 nicklas 51     html += '<th class="dottedleft" colspan="3">Actions</th>';
6815 26 Aug 22 nicklas 52     html += '<th class="dottedleft">Comment</th>';
6815 26 Aug 22 nicklas 53     html += '</tr>';
6815 26 Aug 22 nicklas 54     
6815 26 Aug 22 nicklas 55     html += '<tr>';
6815 26 Aug 22 nicklas 56     html += '<th>Library</th>';
6815 26 Aug 22 nicklas 57     html += '<th class="dottedleft">Plate</th>';
6815 26 Aug 22 nicklas 58     html += '<th class="dottedleft">PF_READS</th>';
6815 26 Aug 22 nicklas 59     html += '<th>PT_READS</th>';
6815 26 Aug 22 nicklas 60     html += '<th>PM_READS</th>';
6815 26 Aug 22 nicklas 61     html += '<th>ALIGNED_PAIRS</th>';
6815 26 Aug 22 nicklas 62     html += '<th class="icon-col"></th>';
6815 26 Aug 22 nicklas 63     html += '<th>Duplicates</th>';
6815 26 Aug 22 nicklas 64     html += '<th class="dottedleft">Count</th>';
6815 26 Aug 22 nicklas 65     html += '<th>HET</th>';
6815 26 Aug 22 nicklas 66     html += '<th class="icon-col"></th>';
6815 26 Aug 22 nicklas 67     html += '<th class="dottedleft">Job</th>';
6815 26 Aug 22 nicklas 68     html += '<th class="dottedleft">Files</th>';
6815 26 Aug 22 nicklas 69     html += '<th class="dottedleft"><span id="flagrna" data-prefix="flag" class="interactable link" title="Toggle selection – use CTRL, ALT or SHIFT to clear">Flag RNA</span></th>';
6815 26 Aug 22 nicklas 70     html += '<th><span id="realign" data-prefix="realign" class="interactable link" title="Toggle selection – use CTRL, ALT or SHIFT to clear">Re-align</span></th>';
6815 26 Aug 22 nicklas 71     html += '<th><span id="stringtie" data-prefix="stringtie" class="interactable link" title="Toggle selection – use CTRL, ALT or SHIFT to clear">StringTie</span></th>';
6815 26 Aug 22 nicklas 72     html += '<th class="dottedleft"></th>';
6815 26 Aug 22 nicklas 73     html += '</tr>';
6815 26 Aug 22 nicklas 74     html += '</thead>';
6815 26 Aug 22 nicklas 75     html += '<tbody>';
6815 26 Aug 22 nicklas 76     var numWithError = 0;
6815 26 Aug 22 nicklas 77     var yellowImg = '<img src="../images/yellow-label.png">';
6815 26 Aug 22 nicklas 78     for (var alignedNo = 0; alignedNo < alignedSequences.length; alignedNo++)
6815 26 Aug 22 nicklas 79     {
6815 26 Aug 22 nicklas 80       var aligned = alignedSequences[alignedNo];
6815 26 Aug 22 nicklas 81
6815 26 Aug 22 nicklas 82       var lib = aligned.lib;
6815 26 Aug 22 nicklas 83       lib.stratagene = Reggie.isStratagene(lib.name);
6815 26 Aug 22 nicklas 84       lib.external = Reggie.isExternal(lib.name);
6815 26 Aug 22 nicklas 85       var isYellow = lib.specimen && lib.specimen.YellowLabel != null;
6815 26 Aug 22 nicklas 86       var img = isYellow ? yellowImg : '';
6815 26 Aug 22 nicklas 87
6815 26 Aug 22 nicklas 88       var libPlate = lib.bioWell ? lib.bioWell.bioPlate : null;
6815 26 Aug 22 nicklas 89       
6815 26 Aug 22 nicklas 90       var merged = aligned.merged;
6815 26 Aug 22 nicklas 91       var masked = aligned.masked;
6815 26 Aug 22 nicklas 92       
6815 26 Aug 22 nicklas 93       var pfReads = merged.PF_READS == null ? '-' : Reggie.formatNumber(merged.PF_READS/1000000, null, 2)
6815 26 Aug 22 nicklas 94       var ptReads = merged.PT_READS == null ? '-' : Reggie.formatNumber(merged.PT_READS/1000000, null, 2)
6815 26 Aug 22 nicklas 95       var maskedReads = masked.PM_READS == null ? '-' : Reggie.formatNumber(masked.PM_READS/1000000, null, 2)
6815 26 Aug 22 nicklas 96       var alignedReads = aligned.ALIGNED_PAIRS == null ? '-' : Reggie.formatNumber(aligned.ALIGNED_PAIRS/1000000, null, 2);
6815 26 Aug 22 nicklas 97       var ptPercent = merged.PF_READS && merged.PT_READS ? ' (' + Math.round(100*merged.PT_READS/merged.PF_READS) + '%)' : '';
6815 26 Aug 22 nicklas 98       var alignedPercent = aligned.ALIGNED_PAIRS && merged.PF_READS ? ' (' + Math.round(100*aligned.ALIGNED_PAIRS/merged.PF_READS) + '%)' : '';
6815 26 Aug 22 nicklas 99       var percentDuplicates = aligned.FRACTION_DUPLICATION == null ? '-' : Math.round(100*aligned.FRACTION_DUPLICATION)+'%';
6815 26 Aug 22 nicklas 100       var genotypeCount = aligned.QC_GENOTYPE_COUNT || '-';
6815 26 Aug 22 nicklas 101       var hetPct = aligned.QC_GENOTYPE_HET_PCT == null ? '' : Math.round(aligned.QC_GENOTYPE_HET_PCT)+'%';
6815 26 Aug 22 nicklas 102       var job = aligned.job;
6815 26 Aug 22 nicklas 103       var limits = job.limits;
6815 26 Aug 22 nicklas 104       
6815 26 Aug 22 nicklas 105       var flag = null;
6815 26 Aug 22 nicklas 106       var isError = job.status == 'ERROR';
6815 26 Aug 22 nicklas 107       var stringTieChecked = aligned.ALIGNED_PAIRS != null && aligned.ALIGNED_PAIRS > limits.minAlignedPairsStop;
6815 26 Aug 22 nicklas 108       
6815 26 Aug 22 nicklas 109       html += '<tr class="highlight ' + (alignedNo % 4 < 2 ? 'evenrow' : 'oddrow') + (isYellow ? ' yellow-specimen' : '') +  '">';
6815 26 Aug 22 nicklas 110       html += '<td class="prompt if-yellow">'+img+aligned.name+'</td>';
6815 26 Aug 22 nicklas 111       html += '<td class="dottedleft">'+(libPlate ? Strings.encodeTags(libPlate.name) : '-')+'</td>';
6815 26 Aug 22 nicklas 112       html += '<td class="dottedleft">'+pfReads+'</td>';
6815 26 Aug 22 nicklas 113       html += '<td>'+ptReads+ptPercent+'</td>';
6815 26 Aug 22 nicklas 114       html += '<td>'+maskedReads+'</td>';
6815 26 Aug 22 nicklas 115       html += '<td>'+alignedReads+alignedPercent+'</td>';
6815 26 Aug 22 nicklas 116       html += '<td class="icon-col">';
6815 26 Aug 22 nicklas 117       if (aligned.ALIGNED_PAIRS != null && aligned.ALIGNED_PAIRS < limits.minAlignedPairsFlag)
6815 26 Aug 22 nicklas 118       {
6815 26 Aug 22 nicklas 119         html += '<img src="../images/warning.png" title="Less than '+Reggie.formatCount(limits.minAlignedPairsFlag) + ' aligned pairs">';
6815 26 Aug 22 nicklas 120         flag = 'AlignFailed';
6815 26 Aug 22 nicklas 121       }
6815 26 Aug 22 nicklas 122       html += '</td>';
6815 26 Aug 22 nicklas 123
6815 26 Aug 22 nicklas 124       html += '<td>'+percentDuplicates+'</td>';
6815 26 Aug 22 nicklas 125       html += '<td class="dottedleft">'+genotypeCount+'</td>';
6815 26 Aug 22 nicklas 126       html += '<td>'+hetPct;
6815 26 Aug 22 nicklas 127       if (aligned.QC_GENOTYPE_HET_PCT == null)
6815 26 Aug 22 nicklas 128       {
6815 26 Aug 22 nicklas 129         html += '<img src="../images/warning.png" title="Genotype QC failed">';
6815 26 Aug 22 nicklas 130         isError = true;
6815 26 Aug 22 nicklas 131       }
6815 26 Aug 22 nicklas 132       else if (aligned.QC_GENOTYPE_HET_PCT > limits.maxHetPct)
6815 26 Aug 22 nicklas 133       {
6815 26 Aug 22 nicklas 134         html += '<img src="../images/warning.png" title="More than '+Reggie.formatCount(limits.maxHetPct) + '% HET may indicate contamination">';
6815 26 Aug 22 nicklas 135         if (flag == null) flag = 'HighHET';
6815 26 Aug 22 nicklas 136       }
6815 26 Aug 22 nicklas 137       html += '</td>';
6815 26 Aug 22 nicklas 138       html += '<td class="icon-col">';
6815 26 Aug 22 nicklas 139       if  (aligned.qcVcf)
6815 26 Aug 22 nicklas 140       {
6815 26 Aug 22 nicklas 141         html += '<span class="link vcf-link" data-file-id="'+aligned.qcVcf.id+'" data-item-id="'+aligned.id+'" title="View VCF statistics"><img src="../images/vcf_file.png"></span>';
6815 26 Aug 22 nicklas 142       }
6815 26 Aug 22 nicklas 143       html += '</td>';
6815 26 Aug 22 nicklas 144       html += '<td class="dottedleft">';
6815 26 Aug 22 nicklas 145       html += '<span class="link item-link" data-item-type="JOB" data-item-id="'+job.id+'" title="'+Strings.encodeTags(job.statusMessage)+'"><img src="../images/'+JOB_IMAGE[job.status]+'"></span>';
6815 26 Aug 22 nicklas 146       html += '</td>';
6815 26 Aug 22 nicklas 147       if (aligned.DataFilesFolder && job.server)
6815 26 Aug 22 nicklas 148       {
6815 26 Aug 22 nicklas 149         html += '<td class="dottedleft">';
6815 26 Aug 22 nicklas 150         html += '<span class="link file-link" data-server="'+Strings.encodeTags(job.server)+'" data-folder="'+Strings.encodeTags(aligned.DataFilesFolder)+'" data-item-id="'+aligned.id+'" title="View generated files"><img src="../images/remote_folder.png"></span>';
6815 26 Aug 22 nicklas 151         html += '</td>';
6815 26 Aug 22 nicklas 152       }
6815 26 Aug 22 nicklas 153       else
6815 26 Aug 22 nicklas 154       {
6815 26 Aug 22 nicklas 155         html += '<td class="dottedleft">-</td>';
6815 26 Aug 22 nicklas 156       }
6815 26 Aug 22 nicklas 157       
6815 26 Aug 22 nicklas 158       var realignChecked = isError ? ' checked' : '';
6815 26 Aug 22 nicklas 159       var stringTieDisabled = isError ? ' disabled' : '';
6815 26 Aug 22 nicklas 160       if (isError) numWithError++;
6815 26 Aug 22 nicklas 161       if (lib.stratagene || lib.external)
6815 26 Aug 22 nicklas 162       {
6815 26 Aug 22 nicklas 163         html += '<td class="dottedleft">-</td>';
6815 26 Aug 22 nicklas 164       }
6815 26 Aug 22 nicklas 165       else
6815 26 Aug 22 nicklas 166       {
7123 21 Apr 23 nicklas 167         // We do not automatically check the FLAG option here since the other Hisat pipeline will do this
7123 21 Apr 23 nicklas 168         // But we allow the operator to flag if needed
7123 21 Apr 23 nicklas 169         html += '<td class="dottedleft"><input type="checkbox" name="flag.'+aligned.id+'"'+(flag != null ? ' value="'+flag+'"':'')+'></td>';
6815 26 Aug 22 nicklas 170       }
6815 26 Aug 22 nicklas 171       
6815 26 Aug 22 nicklas 172       html += '<td><input type="checkbox" name="realign.'+aligned.id+'"'+realignChecked+'></td>';
6815 26 Aug 22 nicklas 173       html += '<td><input type="checkbox" name="stringtie.'+aligned.id+'"'+stringTieDisabled+(stringTieChecked ? ' checked':'')+'></td>';
6815 26 Aug 22 nicklas 174       html += '<td class="dottedleft comment"><input type="text" name="comment.'+aligned.id+'"></td>';
6815 26 Aug 22 nicklas 175       html += '</tr>';
6815 26 Aug 22 nicklas 176
6815 26 Aug 22 nicklas 177     }
6815 26 Aug 22 nicklas 178     html += '</tbody>';
6815 26 Aug 22 nicklas 179     html += '</table>';
6815 26 Aug 22 nicklas 180     Doc.element('alignedSequences').innerHTML = html;
6815 26 Aug 22 nicklas 181     if (numWithError > 0) Doc.show('delete-items', 'table');
6815 26 Aug 22 nicklas 182     
6815 26 Aug 22 nicklas 183     Events.addEventHandler('flagrna', 'click', hisat.toggleSelection);
6815 26 Aug 22 nicklas 184     Events.addEventHandler('realign', 'click', hisat.toggleSelection);
6815 26 Aug 22 nicklas 185     Events.addEventHandler('stringtie', 'click', hisat.toggleSelection);
6815 26 Aug 22 nicklas 186     
6815 26 Aug 22 nicklas 187     // Add click handler to items
6815 26 Aug 22 nicklas 188     var clickableItems = document.getElementsByClassName('item-link');
6815 26 Aug 22 nicklas 189     for (var i = 0; i < clickableItems.length; i++)
6815 26 Aug 22 nicklas 190     {
6815 26 Aug 22 nicklas 191       Events.addEventHandler(clickableItems[i], 'click', Items.itemOnClick);
6815 26 Aug 22 nicklas 192     }
6815 26 Aug 22 nicklas 193     
6815 26 Aug 22 nicklas 194     // Add click handler to file links
6815 26 Aug 22 nicklas 195     var clickableItems = document.getElementsByClassName('file-link');
6815 26 Aug 22 nicklas 196     for (var i = 0; i < clickableItems.length; i++)
6815 26 Aug 22 nicklas 197     {
6815 26 Aug 22 nicklas 198       Events.addEventHandler(clickableItems[i], 'click', hisat.fileLinkOnClick);
6815 26 Aug 22 nicklas 199     }
6815 26 Aug 22 nicklas 200
6815 26 Aug 22 nicklas 201     // Add click handler to VCF files
6815 26 Aug 22 nicklas 202     var clickableItems = document.getElementsByClassName('vcf-link');
6815 26 Aug 22 nicklas 203     for (var i = 0; i < clickableItems.length; i++)
6815 26 Aug 22 nicklas 204     {
6815 26 Aug 22 nicklas 205       Events.addEventHandler(clickableItems[i], 'click', hisat.vcfLinkOnClick);
6815 26 Aug 22 nicklas 206     }
6815 26 Aug 22 nicklas 207
6815 26 Aug 22 nicklas 208     Doc.show('step-1');
6815 26 Aug 22 nicklas 209     Doc.show('goregister');
6815 26 Aug 22 nicklas 210   }
6815 26 Aug 22 nicklas 211   
6815 26 Aug 22 nicklas 212   hisat.fileLinkOnClick = function(event)
6815 26 Aug 22 nicklas 213   {
6815 26 Aug 22 nicklas 214     var folder = Data.get(event.currentTarget, 'folder');
6815 26 Aug 22 nicklas 215     var server = Data.get(event.currentTarget, 'server');
6815 26 Aug 22 nicklas 216     var itemId = Data.get(event.currentTarget, 'item-id');
6815 26 Aug 22 nicklas 217     server = server.replace(/\s*\[.*\]/, '');
6815 26 Aug 22 nicklas 218     var url = 'view_remote_files.jsp?ID=' + App.getSessionId();
6815 26 Aug 22 nicklas 219     url += '&clusterId='+server;
6815 26 Aug 22 nicklas 220     url += '&path='+encodeURIComponent(folder);
6815 26 Aug 22 nicklas 221     url += '&itemType=DERIVEDBIOASSAY&itemId='+itemId;
6815 26 Aug 22 nicklas 222     Dialogs.openPopup(url, 'ViewProjectFiles', 750, 500);
6815 26 Aug 22 nicklas 223   }
6815 26 Aug 22 nicklas 224   
6815 26 Aug 22 nicklas 225   hisat.vcfLinkOnClick = function(event)
6815 26 Aug 22 nicklas 226   {
6815 26 Aug 22 nicklas 227     var fileId = Data.int(event.currentTarget, 'file-id');
6815 26 Aug 22 nicklas 228     var itemId = Data.get(event.currentTarget, 'item-id');
6815 26 Aug 22 nicklas 229
6815 26 Aug 22 nicklas 230     var url = 'view_genotypes.jsp?ID=' + App.getSessionId();
6815 26 Aug 22 nicklas 231     url += '&fileId='+fileId;
6815 26 Aug 22 nicklas 232     url += '&itemId='+itemId;
6815 26 Aug 22 nicklas 233     Dialogs.openPopup(url, 'ViewVcf', 750, 500);
6815 26 Aug 22 nicklas 234   }
6815 26 Aug 22 nicklas 235   
6815 26 Aug 22 nicklas 236   hisat.toggleSelection = function(event)
6815 26 Aug 22 nicklas 237   {
6815 26 Aug 22 nicklas 238     var prefix = Data.get(event.currentTarget, 'prefix');
6815 26 Aug 22 nicklas 239     var specialKey = event.altKey || event.ctrlKey || event.shiftKey;
6815 26 Aug 22 nicklas 240     
6815 26 Aug 22 nicklas 241     var frm = document.forms['reggie'];
6815 26 Aug 22 nicklas 242     for (var alignedNo = 0; alignedNo < alignedSequences.length; alignedNo++)
6815 26 Aug 22 nicklas 243     {
6815 26 Aug 22 nicklas 244       var aligned = alignedSequences[alignedNo];
6815 26 Aug 22 nicklas 245       var chk = frm[prefix+'.'+aligned.id];
6815 26 Aug 22 nicklas 246       if (chk && !chk.disabled)
6815 26 Aug 22 nicklas 247       {
6815 26 Aug 22 nicklas 248         chk.checked = specialKey ? false : !chk.checked;
6815 26 Aug 22 nicklas 249       }
6815 26 Aug 22 nicklas 250     }
6815 26 Aug 22 nicklas 251   }
6815 26 Aug 22 nicklas 252   
6815 26 Aug 22 nicklas 253   hisat.submit = function()
6815 26 Aug 22 nicklas 254   {
6815 26 Aug 22 nicklas 255     var frm = document.forms['reggie'];
6815 26 Aug 22 nicklas 256     var submitInfo = {};
6815 26 Aug 22 nicklas 257     submitInfo.deleteItemsCreatedByFailedJobs = frm.deleteItemsCreatedByFailedJobs.checked;
6815 26 Aug 22 nicklas 258     
6815 26 Aug 22 nicklas 259     var all = [];
6815 26 Aug 22 nicklas 260     submitInfo.alignedSequences = all;
6815 26 Aug 22 nicklas 261     for (var alignedNo = 0; alignedNo < alignedSequences.length; alignedNo++)
6815 26 Aug 22 nicklas 262     {
6815 26 Aug 22 nicklas 263       var aligned = alignedSequences[alignedNo];
6815 26 Aug 22 nicklas 264       var tmp = {};
6815 26 Aug 22 nicklas 265       tmp.id = aligned.id;
6815 26 Aug 22 nicklas 266       
6815 26 Aug 22 nicklas 267       tmp.flag = frm['flag.'+aligned.id] && frm['flag.'+aligned.id].checked ? frm['flag.'+aligned.id].value : null;
6815 26 Aug 22 nicklas 268       tmp.realign = frm['realign.'+aligned.id].checked;
6815 26 Aug 22 nicklas 269       tmp.stringtie = frm['stringtie.'+aligned.id].checked;
6815 26 Aug 22 nicklas 270       tmp.comment = frm['comment.'+aligned.id].value;
6815 26 Aug 22 nicklas 271       
6815 26 Aug 22 nicklas 272       all[all.length] = tmp;
6815 26 Aug 22 nicklas 273     }
7123 21 Apr 23 nicklas 274
6815 26 Aug 22 nicklas 275     var url = '../Hisat2023.servlet?ID='+App.getSessionId();
6815 26 Aug 22 nicklas 276     url += '&cmd=RegisterHisat2023Alignment';
6815 26 Aug 22 nicklas 277     Wizard.showLoadingAnimation('Performing registration...');
6815 26 Aug 22 nicklas 278     Wizard.asyncJsonRequest(url, hisat.submissionResults, 'POST', JSON.stringify(submitInfo));
6815 26 Aug 22 nicklas 279   }
6815 26 Aug 22 nicklas 280   
6815 26 Aug 22 nicklas 281   hisat.submissionResults = function(response)
6815 26 Aug 22 nicklas 282   {
6815 26 Aug 22 nicklas 283     Wizard.showFinalMessage(response.messages);
6815 26 Aug 22 nicklas 284     Doc.show('gorestart');
6815 26 Aug 22 nicklas 285   }
6815 26 Aug 22 nicklas 286   
6815 26 Aug 22 nicklas 287   
6815 26 Aug 22 nicklas 288   return hisat;
6815 26 Aug 22 nicklas 289 }();
6815 26 Aug 22 nicklas 290
6815 26 Aug 22 nicklas 291 Doc.onLoad(Hisat.initPage);
6815 26 Aug 22 nicklas 292