source: extensions/net.sf.basedb.reggie/trunk/resources/analysis/align_start.jsp @ 2593

Last change on this file since 2593 was 2593, checked in by Nicklas Nordborg, 8 years ago

Resetting debug flags.

File size: 18.9 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.User"
5  import="net.sf.basedb.core.DbControl"
6  import="net.sf.basedb.core.SessionControl"
7  import="net.sf.basedb.core.Application"
8  import="net.sf.basedb.clients.web.Base" 
9  import="net.sf.basedb.clients.web.util.HTML" 
10  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
11%>
12<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
13<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
14<%
15final SessionControl sc = Base.getExistingSessionControl(request, true);
16final String ID = sc.getId();
17final float scale = Base.getScale(sc);
18final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.reggie");
19DbControl dc = null;
20try
21{
22  dc = sc.newDbControl();
23  final User user = User.getById(dc, sc.getLoggedInUserId());
24%>
25<base:page type="default" >
26<base:head scripts="ajax.js" styles="path.css">
27  <link rel="stylesheet" type="text/css" href="../css/reggie.css">
28  <script language="JavaScript" src="../reggie.js" type="text/javascript" charset="UTF-8"></script>
29
30<script language="JavaScript">
31
32var debug = 0;
33var currentStep = 1;
34var clusterIsValid = false;
35
36function init()
37{
38  var frm = document.forms['reggie'];
39  var mergedSequences = getMergedSequences();
40
41  if (mergedSequences != null && mergedSequences.length > 0)
42  {
43    var firstPlate = null;
44    for (var msNo=0; msNo < mergedSequences.length; msNo++)
45    {
46      var ms = mergedSequences[msNo];
47      var lib = ms.lib;
48      var libPlate = lib.bioWell.bioPlate;
49      if (firstPlate == null) firstPlate = libPlate.name;
50     
51      var name = (msNo+1) + ': ' + libPlate.name + ' - ' + ms.name;
52      if (ms.AutoProcess == 'ReProcess')
53      {
54        name += ' [R]';
55      }
56     
57      var option = new Option(name, ms.id, false, libPlate.name==firstPlate);
58      option.mergedSequences = ms;
59      frm.mergedSequences.options[frm.mergedSequences.length] = option;
60    }
61    //sequencingRunOnChange();
62  }
63  else
64  {
65    setInputStatus('mergedSequences', 'No new sequences available for processing', 'invalid');
66  }
67
68  // All is ok
69  frm.mergedSequences.focus();
70}
71
72function goNextAuto()
73{
74  goNext(false);
75}
76
77function goNext(manual)
78{
79  setInnerHTML('gonext.message', '');
80  if (currentStep == 1)
81  {
82    if (step1IsValid()) gotoStep2();
83  }
84  setCurrentStep(currentStep);
85}
86
87function step1IsValid()
88{
89  var frm = document.forms['reggie'];
90  for (var msNo = 0; msNo < frm.mergedSequences.length; msNo++)
91  {
92    if (frm.mergedSequences[msNo].selected) return true;
93  }
94  setInputStatus('mergedSequences', 'Select at least one item', 'invalid');
95  return false;
96}
97
98function step2IsValid()
99{
100
101  return true;
102}
103
104
105function getMergedSequences()
106{
107  var frm = document.forms['reggie']; 
108 
109  var request = Ajax.getXmlHttpRequest();
110  try
111  {
112    showLoadingAnimation('Loading merged sequences runs...');
113    var url = '../MaskAlign.servlet?ID=<%=ID%>&cmd=GetMergedSequencesForAlignment';   
114    request.open("GET", url, false); 
115    request.send(null);
116  }
117  finally
118  {
119    hideLoadingAnimation();
120  }
121 
122  if (debug) Main.debug(request.responseText);
123  var response = JSON.parse(request.responseText); 
124  if (response.status != 'ok')
125  {
126    setFatalError(response.message);
127    return false;
128  }
129  return response.mergedSequences;
130}
131
132
133function gotoStep2()
134{
135  var frm = document.forms['reggie'];
136 
137  // Disable controls
138  frm.mergedSequences.disabled = true;
139
140  currentStep = 2;
141  Main.hide('step.1.section');
142  Main.show('step.2.section');
143  Main.addClass(document.getElementById('step.1.section'), 'disabled');
144  Main.show('gocancel');
145  Main.show('goregister');
146  Main.hide('gonext');
147 
148  // Load masking protocols
149  var maskingProtocols = getProtocols('MASKING_PROTOCOL');
150  for (var i = 0; i < maskingProtocols.length; i++)
151  {
152    var protocol = maskingProtocols[i];
153    frm.maskingProtocol[frm.maskingProtocol.length] = new Option(protocol.name, protocol.id, protocol.isDefault);
154    setInputStatus('maskingProtocol', '', 'valid');
155  }
156  if (frm.maskingProtocol.length == 0)
157  {
158    frm.maskingProtocol[0] = new Option('- none -', '');
159  }
160 
161  // Load masking software
162  var software = getSoftware('MASKING_SOFTWARE');
163  for (var i = 0; i < software.length; i++)
164  {
165    var sw = software[i];
166    frm.maskingSoftware[frm.maskingSoftware.length] = new Option(sw.name, sw.id, sw.isDefault);
167    setInputStatus('maskingSoftware', '', 'valid');
168  }
169  if (frm.maskingSoftware.length == 0)
170  {
171    frm.maskingSoftware[0] = new Option('- none -', '');
172  }
173 
174  // Load clusters
175  var clusters = getClusters();
176  for (var i = 0; i < clusters.length; i++)
177  {
178    var cl = clusters[i];
179    var option = new Option(cl.name, cl.id);
180    option.cluster = cl;
181    frm.clusters[frm.clusters.length] = option;
182    setInputStatus('clusters', '', 'valid');
183    clusterIsValid = true;
184  }
185  if (frm.clusters.length == 0)
186  {
187    setInputStatus('clusters', 'No available Open Grid clusters', 'invalid');
188    clusterIsValid = false;
189  }
190  else
191  {
192    clusterOnChange();
193  }
194  // Check debug by default if debug is set or not on a secure server (=production server)
195  frm.debug.checked = debug || location.protocol != 'https:';
196 
197  // Load align protocols
198  var alignProtocols = getProtocols('ALIGNMENT_PROTOCOL');
199  for (var i = 0; i < alignProtocols.length; i++)
200  {
201    var protocol = alignProtocols[i];
202    frm.alignProtocol[frm.alignProtocol.length] = new Option(protocol.name, protocol.id, protocol.isDefault);
203    setInputStatus('alignProtocol', '', 'valid');
204  }
205  if (frm.alignProtocol.length == 0)
206  {
207    frm.alignProtocol[0] = new Option('- none -', '');
208  }
209 
210  // Load align software
211  var software = getSoftware('ALIGNMENT_SOFTWARE');
212  for (var i = 0; i < software.length; i++)
213  {
214    var sw = software[i];
215    frm.alignSoftware[frm.alignSoftware.length] = new Option(sw.name, sw.id, sw.isDefault);
216    setInputStatus('alignSoftware', '', 'valid');
217  }
218  if (frm.alignSoftware.length == 0)
219  {
220    frm.alignSoftware[0] = new Option('- none -', '');
221  }
222
223}
224
225function getProtocols(subtype)
226{
227  var request = Ajax.getXmlHttpRequest();
228  try
229  {
230    showLoadingAnimation('Loading ' + subtype + ' protocols...');
231    var url = '../Protocol.servlet?ID=<%=ID%>&cmd=GetProtocols&subtype='+subtype;   
232    request.open("GET", url, false); 
233    request.send(null);
234  }
235  finally
236  {
237    hideLoadingAnimation();
238  }
239
240  if (debug) Main.debug(request.responseText);
241  var response = JSON.parse(request.responseText); 
242  if (response.status != 'ok')
243  {
244    setFatalError(response.message);
245    return false;
246  }
247  return response.protocols;
248}
249
250function getSoftware(subtype)
251{
252  var request = Ajax.getXmlHttpRequest();
253  try
254  {
255    showLoadingAnimation('Loading ' + subtype + ' hardware...');
256    var url = '../Software.servlet?ID=<%=ID%>&cmd=GetSoftware&subtype='+subtype;   
257    request.open("GET", url, false); 
258    request.send(null);
259  }
260  finally
261  {
262    hideLoadingAnimation();
263  }
264
265  if (debug) Main.debug(request.responseText);
266  var response = JSON.parse(request.responseText); 
267  if (response.status != 'ok')
268  {
269    setFatalError(response.message);
270    return false;
271  }
272  return response.software;
273}
274
275function getClusters()
276{
277  var request = Ajax.getXmlHttpRequest();
278  try
279  {
280    showLoadingAnimation('Loading Open Grid Scheduler clusters...');
281    var url = '../OpenGrid.servlet?ID=<%=ID%>&cmd=GetHostInfo';   
282    request.open("GET", url, false); 
283    request.send(null);
284  }
285  finally
286  {
287    hideLoadingAnimation();
288  }
289
290  if (debug) Main.debug(request.responseText);
291  var response = JSON.parse(request.responseText); 
292  if (response.status != 'ok')
293  {
294    setFatalError(response.message);
295    return false;
296  }
297  return response.clusters;
298}
299
300function clusterOnChange()
301{
302  var frm = document.forms['reggie'];
303 
304  var cluster = frm.clusters[frm.clusters.selectedIndex].cluster;
305  if (cluster.priorities && cluster.priorities.length > 0)
306  {
307    frm.priority.length = 0;
308    for (var pNo = 0; pNo < cluster.priorities.length; pNo++)
309    {
310      var p = cluster.priorities[pNo];
311      frm.priority[frm.priority.length] = new Option(p.name + ' ('+p.value+')', p.value, p['default']);
312    }
313    Main.show('job-priority');
314  }
315  else
316  {
317    Main.hide('job-priority');
318  }
319}
320
321
322function goRegister()
323{
324  if (!step2IsValid()) return;
325
326  var frm = document.forms['reggie'];
327 
328  frm.maskingSoftware.disabled = true;
329  frm.maskingProtocol.disabled = true;
330  frm.alignSoftware.disabled = true;
331  frm.alignProtocol.disabled = true;
332  frm.priority.disabled = true;
333  frm.debug.disabled = true;
334 
335  Main.addClass(document.getElementById('step.2.section'), 'disabled');
336 
337  Main.hide('goregister');
338  Main.hide('gocancel');
339  Main.hide('gonext.message');
340 
341  var submitInfo = {};
342 
343  submitInfo.maskingSoftware = parseInt(frm.maskingSoftware.value);
344  submitInfo.maskingProtocol = parseInt(frm.maskingProtocol.value);
345  submitInfo.alignSoftware = parseInt(frm.alignSoftware.value);
346  submitInfo.alignProtocol = parseInt(frm.alignProtocol.value);
347  submitInfo.cluster = frm.clusters.value;
348  if (frm.priority.selectedIndex >= 0)
349  {
350    submitInfo.priority = parseInt(frm.priority.value);
351  }
352  submitInfo.debug = frm.debug.checked;
353 
354  var mergedSequences = [];
355  submitInfo.mergedSequences = mergedSequences;
356 
357  for (var msNo = 0; msNo < frm.mergedSequences.length; msNo++)
358  {
359    if (frm.mergedSequences[msNo].selected) 
360    {
361      var ms = {};
362      ms.id = frm.mergedSequences[msNo].mergedSequences.id;
363      mergedSequences[mergedSequences.length] = ms;
364    }
365  }
366 
367  if (debug) Main.debug(JSON.stringify(submitInfo));
368  var url = '../MaskAlign.servlet?ID=<%=ID%>&cmd=StartMaskingAndAlignment';
369  var request = Ajax.getXmlHttpRequest();
370  try
371  {
372    showLoadingAnimation('Performing registration...');
373    request.open("POST", url, false);
374    request.send(JSON.stringify(submitInfo));
375  }
376  finally
377  {
378    hideLoadingAnimation();
379  }
380 
381  if (debug) Main.debug(request.responseText);
382  var response = JSON.parse(request.responseText);
383 
384  if (response.messages && response.messages.length > 0)
385  {
386    var msg = '<ul>';
387    for (var i = 0; i < response.messages.length; i++)
388    {
389      var msgLine = response.messages[i];
390      if (msgLine.indexOf('[Warning]') >= 0)
391      {
392        msg += '<li class="warning">' + msgLine.replace('[Warning]', '');
393      }
394      else
395      {
396        msg += '<li>' + msgLine;
397      }
398    }
399    msg += '</ul>';
400    setInnerHTML('messages', msg);
401    Main.show('messages');
402  }
403 
404  if (response.status != 'ok')
405  {
406    Main.addClass(document.getElementById('messages'), 'failure');
407    setFatalError(response.message);
408    return false;
409  }
410
411  Main.show('gorestart');
412}
413
414
415var subtypeMergedSequences = null;
416function selectMergedSequences()
417{
418  var frm = document.forms['reggie'];
419  if (frm.mergedSequences.disabled) return;
420 
421  if (subtypeMergedSequences == null)
422  {
423    var request = Ajax.getXmlHttpRequest();
424    var url = '../Subtype.servlet?ID=<%=ID%>&cmd=GetSubtypeInfo&name=MERGED_SEQUENCES';
425    request.open("GET", url, false); 
426    request.send(null);
427
428    if (debug) Main.debug(request.responseText);
429    var response = JSON.parse(request.responseText); 
430    if (response.status != 'ok')
431    {
432      setFatalError(response.message);
433      return false;
434    }
435    subtypeMergedSequences = response.subtype;
436  }
437 
438  var url = getRoot() + 'views/derivedbioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=setMergedSequencesCallback';
439  url += '&tmpfilter:INT:itemSubtype='+subtypeMergedSequences.id;
440  Main.openPopup(url, 'SelectMergedSequences', 1000, 700);
441}
442
443function setMergedSequencesCallback(id, name)
444{
445  var frm = document.forms['reggie'];
446  var mergedSequences = frm.mergedSequences;
447  for (var i = 0; i < mergedSequences.length; i++)
448  {
449    if (mergedSequences[i].value == id)
450    {
451      mergedSequences[i].selected = true;
452      setInputStatus('mergedSequences', '', '');
453      return;
454    }
455  }
456
457  var ms = {};
458  ms.id = id;
459  ms.name = name;
460 
461  var option = new Option(name, id);
462  option.mergedSequences = ms;
463  option.selected = true;
464  mergedSequences[mergedSequences.length] = option;
465  setInputStatus('mergedSequences', '', '');
466}
467
468</script>
469<style>
470
471</style>
472</base:head>
473<base:body onload="init()">
474
475  <p:path><p:pathelement 
476    title="Reggie" href="<%="../index.jsp?ID="+ID%>" 
477    /><p:pathelement title="Start filter and alignment" 
478    /></p:path>
479
480  <div class="content">
481  <%
482  if (sc.getActiveProjectId() == 0)
483  {
484    %>
485    <div class="messagecontainer note" style="width: 950px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
486      No project has been selected. You may proceed with the registration but
487      created items will not be shared.
488    </div>
489    <%
490  }
491  %>
492 
493  <div class="allsteps">
494    <div class="step current" id="step.1">1</div>
495    ›
496    <div class="step future" id="step.2">2</div>
497  </div>
498
499  <form name="reggie" onsubmit="return false;">
500 
501  <div id="step.1.section">
502  <table class="stepform">
503  <tr>
504    <td rowspan="3" class="stepno">1</td>
505    <td class="steptitle">Select merged sequences</td>
506  </tr>
507  <tr>
508    <td class="stepfields">
509      <table style="border-collapse: collapse;">
510      <tr valign="top">
511        <td class="prompt">Merged sequences</td>
512        <td class="input"><select class="required" style="width:90%;" multiple size="30"
513            name="mergedSequences" id="mergedSequences"></select>
514           
515          <base:buttongroup style="margin-top: 0.5em;">
516            <base:button title="Select manually&hellip;" onclick="selectMergedSequences()" id="btnSelectMergedSequences" />
517          </base:buttongroup>
518        </td>
519        <td class="status" id="mergedSequences.status"></td>
520        <td class="help"><span id="mergedSequences.message" class="message" style="display: none;"></span>
521          Select the sequences that should be aligned. The list contains all merged sequences that
522          has not yet been aligned.<br><br>
523          Items marked with <b>[R]</b> have been marked for re-alignment due to a failure of
524          a previous alignment.
525        </td>
526      </tr>
527      </table>
528    </td>
529  </tr>
530  </table>
531  </div>
532 
533  <div id="step.2.section" style="display: none;">
534  <table class="stepform">
535  <tr>
536    <td rowspan="3" class="stepno">2</td>
537    <td class="steptitle" id="step.2.title">Masking and alignment information</td>
538  </tr>
539  <tr>
540    <td class="stepfields">
541      <table style="border-collapse: collapse;">
542      <tr valign="top" style="background-color: #E8E8E8;">
543        <td class="prompt">Masking</td>
544        <td class="input"></td>
545        <td class="status"></td>
546        <td class="help"></td>
547      </tr>
548      <tr valign="top">
549        <td class="subprompt">Software</td>
550        <td class="input"><select style="width:90%" name="maskingSoftware" id="maskingSoftware" 
551          onkeypress="focusOnEnter(event, 'maskingProtocol')"></select></td>
552        <td class="status" id="maskingSoftware.status"></td>
553        <td class="help"><span id="maskingSoftware.message" class="message" style="display: none;"></span>
554          Select the software to use for masking.
555        </td>
556      </tr>
557      <tr valign="top">
558        <td class="subprompt">Protocol</td>
559        <td class="input"><select style="width:90%" name="maskingProtocol" id="maskingProtocol" 
560          onkeypress="focusOnEnter(event, 'alignSoftware')"></select></td>
561        <td class="status" id="maskingProtocol.status"></td>
562        <td class="help"><span id="maskingProtocol.message" class="message" style="display: none;"></span>
563          Select the protocol used for filtering.
564        </td>
565      </tr>
566      <tr valign="top" style="background-color: #E8E8E8;">
567        <td class="prompt">Align</td>
568        <td class="input"></td>
569        <td class="status"></td>
570        <td class="help"></td>
571      </tr>
572      <tr valign="top">
573        <td class="subprompt">Software</td>
574        <td class="input"><select style="width:90%" name="alignSoftware" id="alignSoftware" 
575          onkeypress="focusOnEnter(event, 'alignProtocol')"></select></td>
576        <td class="status" id="alignSoftware.status"></td>
577        <td class="help"><span id="alignSoftware.message" class="message" style="display: none;"></span>
578          Select the software to use for alignment.
579        </td>
580      </tr>
581      <tr valign="top">
582        <td class="subprompt">Protocol</td>
583        <td class="input"><select style="width:90%" name="alignProtocol" id="alignProtocol" 
584          onkeypress="focusOnEnter(event, 'clusters')"></select></td>
585        <td class="status" id="alignProtocol.status"></td>
586        <td class="help"><span id="alignProtocol.message" class="message" style="display: none;"></span>
587          Select the protocol used for alignment.
588        </td>
589      </tr>
590      <tr valign="top" style="background-color: #E8E8E8;">
591        <td class="prompt">Open Grid Scheduler</td>
592        <td class="input"></td>
593        <td class="status"></td>
594        <td class="help"></td>
595      </tr>
596      <tr valign="top">
597        <td class="subprompt">Cluster</td>
598        <td class="input"><select style="width:90%" name="clusters" id="clusters" class="required"
599          onchange="clusterOnChange()"
600          ></select></td>
601        <td class="status" id="clusters.status"></td>
602        <td class="help"><span id="clusters.message" class="message" style="display: none;"></span>
603          Select the cluster to use for running the software.
604        </td>
605      </tr>
606      <tr valign="top" id="job-priority" style="display: none;">
607        <td class="subprompt">Job priority</td>
608        <td class="input"><select style="width:90%" name="priority" id="priority"></select></td>
609        <td class="status" id="priority.status"></td>
610        <td class="help"><span id="priority.message" class="message" style="display: none;"></span>
611          Select the priority of the job.
612        </td>
613      </tr>
614      <tr valign="top">
615        <td class="subprompt">Debug</td>
616        <td class="input"><input type="checkbox" name="debug"></td>
617        <td class="status" id="debug.status"></td>
618        <td class="help"><span id="debug.message" class="message" style="display: none;"></span>
619          When running in debug mode only part of the sequenced data is used and
620          temporary files are not removed from the cluster node.
621        </td>
622      </tr>
623      </table>
624    </td>
625  </tr>
626  </table>
627  </div>
628   
629  <div class="loading" id="loading" style="display: none;"><table><tr><td><img src="../images/loading.gif"></td><td id="loading.msg">Please wait...</td></tr></table></div>
630 
631  <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>
632 
633  <div id="messages" class="success" style="display: none; width: 950px; margin-left: 20px; margin-top: 20px;"></div>
634 
635  <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
636    <tr>
637      <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
638      <td><base:button id="gonext" title="Next" image="<%=home+"/images/gonext.png"%>" onclick="goNext(true)"/></td>
639      <td><base:button id="goregister" title="Register" image="<%=home+"/images/import.png"%>" onclick="goRegister()" style="display: none;"/></td>
640      <td><base:button id="gorestart" title="Restart" image="<%=home+"/images/goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
641      <td id="gonext.message" class="message"></td>
642    </tr>
643  </table>
644 
645  </form>
646  </div>
647 
648</base:body>
649</base:page>
650<%
651}
652finally
653{
654  if (dc != null) dc.close();
655}
656%>
Note: See TracBrowser for help on using the repository browser.