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

Code
Comments
Other
Rev Date Author Line
6188 26 Mar 21 nicklas 1 var Fastq = function()
6188 26 Mar 21 nicklas 2 {
6188 26 Mar 21 nicklas 3   var fastq = {};
6188 26 Mar 21 nicklas 4   var debug = 0;
6188 26 Mar 21 nicklas 5   
6188 26 Mar 21 nicklas 6   var ADAPTER_SIZE = 59;
6188 26 Mar 21 nicklas 7   var JOB_IMAGE = { 'DONE': 'ok.png', 'ERROR': 'error.png'};
6188 26 Mar 21 nicklas 8   
6188 26 Mar 21 nicklas 9   var mergedSequences;
6188 26 Mar 21 nicklas 10   
6188 26 Mar 21 nicklas 11   // Page initialization
6188 26 Mar 21 nicklas 12   fastq.initPage = function()
6188 26 Mar 21 nicklas 13   {
6188 26 Mar 21 nicklas 14     
6188 26 Mar 21 nicklas 15     // Step 1
6188 26 Mar 21 nicklas 16
6188 26 Mar 21 nicklas 17     // Navigation
6188 26 Mar 21 nicklas 18     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
6188 26 Mar 21 nicklas 19     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
6188 26 Mar 21 nicklas 20     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
6188 26 Mar 21 nicklas 21     Buttons.addClickHandler('goregister', Wizard.goRegister);
6188 26 Mar 21 nicklas 22       
6188 26 Mar 21 nicklas 23     // Final registration
6188 26 Mar 21 nicklas 24     Events.addEventHandler('wizard', 'wizard-submit', fastq.submit);
6188 26 Mar 21 nicklas 25
6188 26 Mar 21 nicklas 26     Wizard.showLoadingAnimation('Loading bioassays...');
6188 26 Mar 21 nicklas 27     var url = '../Fastq.servlet?ID='+App.getSessionId();
6188 26 Mar 21 nicklas 28     url += '&cmd=GetUnconfirmedImportedSequences';
6188 26 Mar 21 nicklas 29     Wizard.asyncJsonRequest(url, fastq.initializeStep1);
6188 26 Mar 21 nicklas 30   }
6188 26 Mar 21 nicklas 31   
6188 26 Mar 21 nicklas 32   // --- Step 1 -----------------------------------
6188 26 Mar 21 nicklas 33   fastq.initializeStep1 = function(response)
6188 26 Mar 21 nicklas 34   {
6188 26 Mar 21 nicklas 35     mergedSequences = response.mergedSequences;
6188 26 Mar 21 nicklas 36     if (mergedSequences.length == 0)
6188 26 Mar 21 nicklas 37     {
6188 26 Mar 21 nicklas 38       Wizard.setFatalError('No merged sequences available for processing.');
6188 26 Mar 21 nicklas 39       return;
6188 26 Mar 21 nicklas 40     }
6188 26 Mar 21 nicklas 41     
6188 26 Mar 21 nicklas 42     var html = '<table id="mergedSequencesTable">';
6188 26 Mar 21 nicklas 43     html += '<thead class="bg-filled-100">';
6188 26 Mar 21 nicklas 44     // Header row
6188 26 Mar 21 nicklas 45     html += '<tr>';
6188 26 Mar 21 nicklas 46     html += '<th></th>';
6188 26 Mar 21 nicklas 47     html += '<th class="dottedleft"></th>';
6188 26 Mar 21 nicklas 48     html += '<th class="dottedleft" colspan="5">Reads (Millions)</th>';
6188 26 Mar 21 nicklas 49     html += '<th class="dottedleft" colspan="4">Fragment size</th>';
6188 26 Mar 21 nicklas 50     html += '<th class="dottedleft"></th>';
6188 26 Mar 21 nicklas 51     html += '<th class="dottedleft"></th>';
6809 24 Aug 22 nicklas 52     html += '<th class="dottedleft" colspan="5">Actions</th>';
6188 26 Mar 21 nicklas 53     html += '<th class="dottedleft">Comment</th>';
6188 26 Mar 21 nicklas 54     html += '</tr>';
6188 26 Mar 21 nicklas 55     html += '<tr>';
6188 26 Mar 21 nicklas 56     html += '<th>Library</th>';
6188 26 Mar 21 nicklas 57     html += '<th class="dottedleft">Plate</th>';
6188 26 Mar 21 nicklas 58     html += '<th class="dottedleft">READS</th>';
6188 26 Mar 21 nicklas 59     html += '<th>PF_READS</th>';
6188 26 Mar 21 nicklas 60     html += '<th>ADAPTER_READS</th>';
6188 26 Mar 21 nicklas 61     html += '<th>PT_READS</th>';
6188 26 Mar 21 nicklas 62     html += '<th class="warning-col"></th>';
6188 26 Mar 21 nicklas 63     html += '<th class="dottedleft">Size*¹</th>';
6188 26 Mar 21 nicklas 64     html += '<th>Avg²</th>';
6188 26 Mar 21 nicklas 65     html += '<th>Stdev²</th>';
6188 26 Mar 21 nicklas 66     html += '<th class="warning-col"></th>';
6188 26 Mar 21 nicklas 67     html += '<th class="dottedleft">Job</th>';
6188 26 Mar 21 nicklas 68     html += '<th class="dottedleft">Files</th>';
6670 07 Apr 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>';
6670 07 Apr 22 nicklas 70     html += '<th><span id="reimport" data-prefix="reimport" class="interactable link" title="Toggle selection – use CTRL, ALT or SHIFT to clear">Re-import</span></th>';
6670 07 Apr 22 nicklas 71     html += '<th><span id="legacy" data-prefix="legacy" class="interactable link" title="Toggle selection – use CTRL, ALT or SHIFT to clear">Legacy</span></th>';
6670 07 Apr 22 nicklas 72     html += '<th><span id="hisat" data-prefix="hisat" class="interactable link" title="Toggle selection – use CTRL, ALT or SHIFT to clear">Hisat</span></th>';
6809 24 Aug 22 nicklas 73     html += '<th><span id="hisat2023" data-prefix="hisat2023" class="interactable link" title="Toggle selection – use CTRL, ALT or SHIFT to clear">Hisat/2023</span></th>';
6188 26 Mar 21 nicklas 74     html += '<th class="dottedleft"></th>';
6188 26 Mar 21 nicklas 75     html += '</tr>';
6188 26 Mar 21 nicklas 76     html += '</thead>';
6188 26 Mar 21 nicklas 77     html += '<tbody>';
6188 26 Mar 21 nicklas 78     
6188 26 Mar 21 nicklas 79     var yellowImg = '<img src="../images/yellow-label.png">';
6188 26 Mar 21 nicklas 80     for (var mergedNo = 0; mergedNo < mergedSequences.length; mergedNo++)
6188 26 Mar 21 nicklas 81     {
6188 26 Mar 21 nicklas 82       var merged = mergedSequences[mergedNo];
6188 26 Mar 21 nicklas 83       var lib = merged.lib;
6188 26 Mar 21 nicklas 84       var libPlate = lib.bioWell ? lib.bioWell.bioPlate : null;
6188 26 Mar 21 nicklas 85       var job = merged.job;
6188 26 Mar 21 nicklas 86       var minPtReads = job.limits.minPtReads;
6188 26 Mar 21 nicklas 87
6188 26 Mar 21 nicklas 88       var isError = job.status == 'ERROR';
6188 26 Mar 21 nicklas 89       var flagChecked = false;
6188 26 Mar 21 nicklas 90       var alignChecked = !isError;
6188 26 Mar 21 nicklas 91       
6188 26 Mar 21 nicklas 92       merged.stratagene = Reggie.isStratagene(merged.name);
6188 26 Mar 21 nicklas 93       merged.external = Reggie.isExternal(merged.name);
6188 26 Mar 21 nicklas 94       var isYellow = lib.specimen && lib.specimen.YellowLabel != null;
6188 26 Mar 21 nicklas 95       var img = isYellow ? yellowImg : '';
6188 26 Mar 21 nicklas 96
6188 26 Mar 21 nicklas 97       var reads = merged.READS == null ? '-' : Reggie.formatNumber(merged.READS/1000000, null, 2);
6188 26 Mar 21 nicklas 98       var pfReads = merged.PF_READS == null ? '-' : Reggie.formatNumber(merged.PF_READS/1000000, null, 2);
6188 26 Mar 21 nicklas 99       var ptReads = merged.PT_READS == null ? '-' : Reggie.formatNumber(merged.PT_READS/1000000, null, 2);
6188 26 Mar 21 nicklas 100       var ptPercent = merged.PF_READS > 0 && merged.PT_READS != null ? Math.round(100*merged.PT_READS/merged.PF_READS) : Number.NaN;
6188 26 Mar 21 nicklas 101       var adapterReads = merged.ADAPTER_READS == null ? '-' : Reggie.formatNumber(merged.ADAPTER_READS/1000000, null, 2);
6188 26 Mar 21 nicklas 102       var adapterPercent = merged.PF_READS > 0 && merged.ADAPTER_READS != null ? Math.round(100*merged.ADAPTER_READS/merged.PF_READS) : Number.NaN;
6188 26 Mar 21 nicklas 103       
6188 26 Mar 21 nicklas 104       html += '<tr class="highlight ' + (isYellow ? 'yellow-specimen' : '') + '">';
6188 26 Mar 21 nicklas 105       html += '<td class="prompt if-yellow">'+img+Strings.encodeTags(merged.name)+'</td>';
6188 26 Mar 21 nicklas 106       html += '<td class="dottedleft">'+(libPlate ? Strings.encodeTags(libPlate.name) : '-')+'</td>';
6188 26 Mar 21 nicklas 107       // READS
6188 26 Mar 21 nicklas 108       html += '<td class="dottedleft">'+reads+'</td>';
6188 26 Mar 21 nicklas 109       html += '<td>'+pfReads+'</td>';
6188 26 Mar 21 nicklas 110       html += '<td>'+adapterReads+(isNaN(adapterPercent) ? '' : ' ('+adapterPercent+'%)') +'</td>';
6188 26 Mar 21 nicklas 111       html += '<td>'+ptReads+(isNaN(ptPercent) ? '' : ' ('+ptPercent+'%)') + '</td>';
6188 26 Mar 21 nicklas 112       html += '<td class="warning-col">';
6188 26 Mar 21 nicklas 113       if (merged.PT_READS == null || merged.PT_READS < minPtReads)
6188 26 Mar 21 nicklas 114       {
6188 26 Mar 21 nicklas 115         html += '<img src="../images/warning.png" title="Less than '+Reggie.formatCount(minPtReads) + ' passed Trimmomatic">';
6188 26 Mar 21 nicklas 116         if (!isError)
6188 26 Mar 21 nicklas 117         {
6188 26 Mar 21 nicklas 118           flagChecked = true;
6188 26 Mar 21 nicklas 119           alignChecked = false;
6188 26 Mar 21 nicklas 120         }
6188 26 Mar 21 nicklas 121       }
6188 26 Mar 21 nicklas 122       html += '</td>';
6188 26 Mar 21 nicklas 123
6188 26 Mar 21 nicklas 124       // Fragment sizes
6188 26 Mar 21 nicklas 125       var lib_size = Math.round(lib.CA_Size || lib.library_size_est) - ADAPTER_SIZE * 2;
6188 26 Mar 21 nicklas 126       html += '<td class="dottedleft">'+lib_size+'</td>';
6188 26 Mar 21 nicklas 127       html += '<td>'+(merged.FragmentSizeAvg || '-')+'</td>';
6188 26 Mar 21 nicklas 128       html += '<td>'+(merged.FragmentSizeStdev || '-')+'</td>';
6188 26 Mar 21 nicklas 129       html += '<td class="warning-col">';
6188 26 Mar 21 nicklas 130       if (merged.FragmentSizeAvg != null && merged.FragmentSizeStdev != null)
6188 26 Mar 21 nicklas 131       {
6188 26 Mar 21 nicklas 132         var delta = lib_size - merged.FragmentSizeAvg;
6188 26 Mar 21 nicklas 133         if (Math.abs(delta) > merged.FragmentSizeStdev)
6188 26 Mar 21 nicklas 134         {
6188 26 Mar 21 nicklas 135           html += '<img src="../images/warning.png" title="Fragment size differ from CA_Size: ' + delta+'">';
6188 26 Mar 21 nicklas 136         }
6188 26 Mar 21 nicklas 137       }
6188 26 Mar 21 nicklas 138       html += '</td>';
6188 26 Mar 21 nicklas 139       
6188 26 Mar 21 nicklas 140       // Job/Files
6188 26 Mar 21 nicklas 141       html += '<td class="dottedleft">';
6188 26 Mar 21 nicklas 142       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>';
6188 26 Mar 21 nicklas 143       html += '</td>';
6188 26 Mar 21 nicklas 144       if (merged.DataFilesFolder && job.server)
6188 26 Mar 21 nicklas 145       {
6188 26 Mar 21 nicklas 146         html += '<td class="dottedleft">';
6188 26 Mar 21 nicklas 147         html += '<span class="link file-link" data-server="'+Strings.encodeTags(job.server)+'" data-folder="'+Strings.encodeTags(merged.DataFilesFolder)+'" data-item-id="'+merged.id+'" title="View generated files"><img src="../images/remote_folder.png"></span>';
6188 26 Mar 21 nicklas 148         html += '</td>';
6188 26 Mar 21 nicklas 149       }
6188 26 Mar 21 nicklas 150       else
6188 26 Mar 21 nicklas 151       {
6188 26 Mar 21 nicklas 152         html += '<td class="dottedleft">-</td>';
6188 26 Mar 21 nicklas 153       }
6188 26 Mar 21 nicklas 154
6188 26 Mar 21 nicklas 155       // Actions
6188 26 Mar 21 nicklas 156       // Do not allow flagging external or stratagene
6188 26 Mar 21 nicklas 157       if (merged.stratagene || merged.external)
6188 26 Mar 21 nicklas 158       {
6188 26 Mar 21 nicklas 159         html += '<td class="dottedleft">-</td>';
6188 26 Mar 21 nicklas 160       }
6188 26 Mar 21 nicklas 161       else
6188 26 Mar 21 nicklas 162       {
6188 26 Mar 21 nicklas 163         html += '<td class="dottedleft"><input type="checkbox" name="flag.'+merged.id+'"'+(flagChecked ? ' checked':'')+'></td>';
6188 26 Mar 21 nicklas 164       }
6188 26 Mar 21 nicklas 165       
6188 26 Mar 21 nicklas 166       var alignDisabled = isError ? ' disabled' : '';
6188 26 Mar 21 nicklas 167       html += '<td><input type="checkbox" name="reimport.'+merged.id+'"'+(isError ? ' checked':'')+'></td>';
6188 26 Mar 21 nicklas 168       html += '<td><input type="checkbox" name="legacy.'+merged.id+'" '+(alignChecked ? ' checked':'')+alignDisabled+'></td>';
6188 26 Mar 21 nicklas 169       html += '<td><input type="checkbox" name="hisat.'+merged.id+'" '+(alignChecked ? ' checked':'')+alignDisabled+'></td>';
6809 24 Aug 22 nicklas 170       html += '<td><input type="checkbox" name="hisat2023.'+merged.id+'" '+(alignChecked ? ' checked':'')+alignDisabled+'></td>';
6188 26 Mar 21 nicklas 171       html += '<td class="dottedleft comment"><input type="text" name="comment.'+merged.id+'"></td>';
6188 26 Mar 21 nicklas 172       html += '</tr>';
6188 26 Mar 21 nicklas 173     }
6188 26 Mar 21 nicklas 174     html += '</tbody>';
6188 26 Mar 21 nicklas 175     html += '</table>';
6188 26 Mar 21 nicklas 176     Doc.element('mergedSequences').innerHTML = html;
6670 07 Apr 22 nicklas 177   
6670 07 Apr 22 nicklas 178     Events.addEventHandler('flagrna', 'click', fastq.toggleSelection);
6670 07 Apr 22 nicklas 179     Events.addEventHandler('reimport', 'click', fastq.toggleSelection);
6670 07 Apr 22 nicklas 180     Events.addEventHandler('legacy', 'click', fastq.toggleSelection);
6670 07 Apr 22 nicklas 181     Events.addEventHandler('hisat', 'click', fastq.toggleSelection);
6809 24 Aug 22 nicklas 182     Events.addEventHandler('hisat2023', 'click', fastq.toggleSelection);
6670 07 Apr 22 nicklas 183
6188 26 Mar 21 nicklas 184     // Add click handler to items
6188 26 Mar 21 nicklas 185     var clickableItems = document.getElementsByClassName('item-link');
6188 26 Mar 21 nicklas 186     for (var i = 0; i < clickableItems.length; i++)
6188 26 Mar 21 nicklas 187     {
6188 26 Mar 21 nicklas 188       Events.addEventHandler(clickableItems[i], 'click', Items.itemOnClick);
6188 26 Mar 21 nicklas 189     }
6188 26 Mar 21 nicklas 190     
6188 26 Mar 21 nicklas 191     // Add click handler to file links
6188 26 Mar 21 nicklas 192     var clickableItems = document.getElementsByClassName('file-link');
6188 26 Mar 21 nicklas 193     for (var i = 0; i < clickableItems.length; i++)
6188 26 Mar 21 nicklas 194     {
6188 26 Mar 21 nicklas 195       Events.addEventHandler(clickableItems[i], 'click', fastq.fileLinkOnClick);
6188 26 Mar 21 nicklas 196     }
6188 26 Mar 21 nicklas 197
6188 26 Mar 21 nicklas 198     Doc.show('step-1');
6188 26 Mar 21 nicklas 199     Doc.show('goregister');
6188 26 Mar 21 nicklas 200   }
6188 26 Mar 21 nicklas 201   
6188 26 Mar 21 nicklas 202   fastq.fileLinkOnClick = function(event)
6188 26 Mar 21 nicklas 203   {
6188 26 Mar 21 nicklas 204     var folder = Data.get(event.currentTarget, 'folder');
6188 26 Mar 21 nicklas 205     var server = Data.get(event.currentTarget, 'server');
6188 26 Mar 21 nicklas 206     var itemId = Data.get(event.currentTarget, 'item-id');
6188 26 Mar 21 nicklas 207     server = server.replace(/\s*\[.*\]/, '');
6188 26 Mar 21 nicklas 208     var url = 'view_remote_files.jsp?ID=' + App.getSessionId();
6188 26 Mar 21 nicklas 209     url += '&clusterId='+server;
6188 26 Mar 21 nicklas 210     url += '&path='+encodeURIComponent(folder);
6188 26 Mar 21 nicklas 211     url += '&itemType=DERIVEDBIOASSAY&itemId='+itemId;
6188 26 Mar 21 nicklas 212     Dialogs.openPopup(url, 'ViewProjectFiles', 750, 500);
6188 26 Mar 21 nicklas 213   }
6188 26 Mar 21 nicklas 214   
6670 07 Apr 22 nicklas 215   fastq.toggleSelection = function(event)
6670 07 Apr 22 nicklas 216   {
6670 07 Apr 22 nicklas 217     var prefix = Data.get(event.currentTarget, 'prefix');
6670 07 Apr 22 nicklas 218     var specialKey = event.altKey || event.ctrlKey || event.shiftKey;
6670 07 Apr 22 nicklas 219     
6670 07 Apr 22 nicklas 220     var frm = document.forms['reggie'];
6670 07 Apr 22 nicklas 221     for (var mergedNo = 0; mergedNo < mergedSequences.length; mergedNo++)
6670 07 Apr 22 nicklas 222     {
6670 07 Apr 22 nicklas 223       var merged = mergedSequences[mergedNo];
6670 07 Apr 22 nicklas 224       var chk = frm[prefix+'.'+merged.id];
6670 07 Apr 22 nicklas 225       if (chk && !chk.disabled)
6670 07 Apr 22 nicklas 226       {
6670 07 Apr 22 nicklas 227         chk.checked = specialKey ? false : !chk.checked;
6670 07 Apr 22 nicklas 228       }
6670 07 Apr 22 nicklas 229     }
6670 07 Apr 22 nicklas 230   }
6670 07 Apr 22 nicklas 231
6188 26 Mar 21 nicklas 232   fastq.submit = function()
6188 26 Mar 21 nicklas 233   {
6188 26 Mar 21 nicklas 234     var frm = document.forms['reggie'];
6188 26 Mar 21 nicklas 235     var submitInfo = {};
6215 16 Apr 21 nicklas 236     submitInfo.deleteItemsCreatedByFailedJobs = frm.deleteItemsCreatedByFailedJobs.checked;
6188 26 Mar 21 nicklas 237     
6188 26 Mar 21 nicklas 238     var all = [];
6188 26 Mar 21 nicklas 239     submitInfo.mergedSequences = all;
6188 26 Mar 21 nicklas 240     for (var mergedNo = 0; mergedNo < mergedSequences.length; mergedNo++)
6188 26 Mar 21 nicklas 241     {
6188 26 Mar 21 nicklas 242       var merged = mergedSequences[mergedNo];
6188 26 Mar 21 nicklas 243       var tmp = {};
6188 26 Mar 21 nicklas 244       tmp.id = merged.id;
6188 26 Mar 21 nicklas 245       
6188 26 Mar 21 nicklas 246       tmp.flag = frm['flag.'+merged.id] && frm['flag.'+merged.id].checked;
6188 26 Mar 21 nicklas 247       tmp.reimport = frm['reimport.'+merged.id].checked;
6188 26 Mar 21 nicklas 248       tmp.hisatAlign = frm['hisat.'+merged.id].checked;
6809 24 Aug 22 nicklas 249       tmp.hisat2023Align = frm['hisat2023.'+merged.id].checked;
6188 26 Mar 21 nicklas 250       tmp.legacyAlign = frm['legacy.'+merged.id].checked;
6188 26 Mar 21 nicklas 251       tmp.comment = frm['comment.'+merged.id].value;
6188 26 Mar 21 nicklas 252       
6188 26 Mar 21 nicklas 253       all[all.length] = tmp;
6188 26 Mar 21 nicklas 254     }
6188 26 Mar 21 nicklas 255     
6188 26 Mar 21 nicklas 256     var url = '../Fastq.servlet?ID='+App.getSessionId();
6188 26 Mar 21 nicklas 257     url += '&cmd=RegisterFastqImport';
6188 26 Mar 21 nicklas 258     Wizard.showLoadingAnimation('Performing registration...');
6188 26 Mar 21 nicklas 259     Wizard.asyncJsonRequest(url, fastq.submissionResults, 'POST', JSON.stringify(submitInfo));
6188 26 Mar 21 nicklas 260   }
6188 26 Mar 21 nicklas 261   
6188 26 Mar 21 nicklas 262   fastq.submissionResults = function(response)
6188 26 Mar 21 nicklas 263   {
6188 26 Mar 21 nicklas 264     Wizard.showFinalMessage(response.messages);
6188 26 Mar 21 nicklas 265     Doc.show('gorestart');
6188 26 Mar 21 nicklas 266   }
6188 26 Mar 21 nicklas 267   
6188 26 Mar 21 nicklas 268   
6188 26 Mar 21 nicklas 269   return fastq;
6188 26 Mar 21 nicklas 270 }();
6188 26 Mar 21 nicklas 271
6188 26 Mar 21 nicklas 272 Doc.onLoad(Fastq.initPage);
6188 26 Mar 21 nicklas 273