source: trunk/www/plugins/net/sf/basedb/plugins/jep_extra_value_calculator.jsp @ 3583

Last change on this file since 3583 was 3583, checked in by Martin Svensson, 16 years ago

References #686 Jep Formula Filter and JepExtraValueCalculator? can now work on subset of bioassays

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 13.0 KB
Line 
1<%-- $Id: jep_extra_value_calculator.jsp 3583 2007-07-20 09:44:17Z martin $
2  ------------------------------------------------------------------
3  Copyright (C) Authors contributing to this file.
4
5  This file is part of BASE - BioArray Software Environment.
6  Available at http://base.thep.lu.se/
7
8  BASE is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License
10  as published by the Free Software Foundation; either version 2
11  of the License, or (at your option) any later version.
12
13  BASE is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  GNU General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330,
21  Boston, MA  02111-1307, USA.
22  ------------------------------------------------------------------
23
24  @author Nicklas
25  @version 2.0
26--%>
27<%@ page session="false"
28  import="net.sf.basedb.core.SessionControl"
29  import="net.sf.basedb.core.DbControl"
30  import="net.sf.basedb.core.BioAssay"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.RawDataType"
34  import="net.sf.basedb.core.BioAssaySet"
35  import="net.sf.basedb.core.Formula"
36  import="net.sf.basedb.core.Job"
37  import="net.sf.basedb.core.ExtraValueType"
38  import="net.sf.basedb.core.ItemQuery"
39  import="net.sf.basedb.core.ItemResultList"
40  import="net.sf.basedb.core.Include"
41  import="net.sf.basedb.core.Type"
42  import="net.sf.basedb.core.query.Orders"
43  import="net.sf.basedb.core.query.Restrictions"
44  import="net.sf.basedb.core.query.Expressions" 
45  import="net.sf.basedb.core.query.Hql"
46  import="net.sf.basedb.clients.web.Base"
47  import="net.sf.basedb.clients.web.WebException"
48  import="net.sf.basedb.clients.web.util.HTML"
49  import="net.sf.basedb.util.Values"
50  import="java.util.List"
51%>
52<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
53<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
54<%!
55private static void addFormulaOption(StringBuilder options, String formula, String title, String description)
56{
57  options.append("<option value=\"").append(HTML.encodeTags(formula)).append("\"");
58  options.append(" title=\"").append(HTML.encodeTags(description)).append("\"");
59  options.append(">").append(HTML.encodeTags(title)).append("\n");
60}
61%>
62<%
63final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
64final String ID = sc.getId();
65ItemContext cc = sc.getCurrentContext(Item.BIOASSAYSET);
66ItemContext realContext = (ItemContext)sc.getSessionSetting("plugin.configure.currentContext");
67if (realContext == null) realContext = cc;
68DbControl dc = null;
69try
70{
71  String errorMessage = (String)sc.getSessionSetting("plugin.configure.errors.message");
72  List<Throwable> errors = (List<Throwable>)sc.getSessionSetting("plugin.configure.errors.list");
73 
74  dc = sc.newDbControl();
75  Job job = (Job)sc.getSessionSetting("plugin.configure.job");
76  dc.reattachItem(job);
77  BioAssaySet source = null;
78  if (job != null) source = (BioAssaySet)job.getParameterValue("source");
79  if (source == null && cc.getId() != 0) source = BioAssaySet.getById(dc, cc.getId());
80  if (source == null) throw new WebException("popup", "No current bioassay set", 
81    "Could not find any current bioassay set. Please select a bioassay set before trying again");
82  source = BioAssaySet.getById(dc, source.getId());
83  int maxRawMappings = source.getMaxRawMappingsForSpot();
84
85  RawDataType rdt = source.getRawDataType();
86 
87  //Find selected bioassays
88  List<BioAssay> bioAssays = null;
89  if (job != null) bioAssays = (List<BioAssay>)job.getParameterValues("bioAssays");
90  if (bioAssays == null)
91  {
92    ItemContext bioAssayContext = sc.getCurrentContext(Item.BIOASSAY);
93    ItemQuery<BioAssay> bioAssayQuery = null;
94    if (bioAssayContext.getSelected().size() > 0)
95    {
96      bioAssayQuery = source.getBioAssays();
97      bioAssayQuery.restrict(
98        Restrictions.in(Hql.property("id"), Expressions.parameter("selected"))
99      );
100      bioAssayQuery.setParameter("selected", bioAssayContext.getSelected(), Type.INT);
101      bioAssays = bioAssayQuery.list(dc);
102    }
103  }
104 
105  // Current parameter values
106  ExtraValueType currentExtraValueType = (ExtraValueType)job.getParameterValue("extraValueType");
107  String expression = (String)job.getParameterValue("expression");
108 
109 
110  // Predefined formulas
111  ItemQuery<Formula> formulaQuery = Formula.getQuery(Formula.Type.COLUMN_EXPRESSION, rdt);
112  formulaQuery.order(Orders.asc(Hql.property("name")));
113  formulaQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
114  ItemResultList<Formula> formulas = formulaQuery.list(dc);
115  StringBuilder formulaOptions = new StringBuilder();
116  for (Formula f : formulas)
117  {
118    String formula = f.getFormula(0);
119    if (maxRawMappings == 1 || !formula.contains("raw("))
120    {
121      addFormulaOption(formulaOptions, formula, f.getName(), f.getDescription());
122    }
123  }
124 
125  // Load recently used items
126  List<ExtraValueType> recentExtraValueTypes = (List<ExtraValueType>)realContext.getRecent(dc, Item.EXTRAVALUETYPE);
127  %>
128  <base:page type="popup" title="Calculate extra value">
129  <base:head scripts="linkitems.js" styles="parameters.css">
130    <script language="JavaScript">
131    function hideErrorList()
132    {
133      Main.hide('errorlist');
134      Main.show('showerrorlist');
135    }
136    function showErrorList()
137    {
138      Main.show('errorlist');
139      Main.hide('showerrorlist');
140    }
141    function selectExtraValueTypeOnClick()
142    {
143      var frm = document.forms['extraValue'];
144      var url = '../../admin/extravaluetypes/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectone&callback=setExtraValueTypeCallback';
145      if (frm['parameter:extraValueType'].length > 1)
146      {
147        var id = Math.abs(parseInt(frm['parameter:extraValueType'][1].value));
148        url += '&item_id='+id;
149      }
150      Main.openPopup(url, 'SelectExtraValueType', 1000, 700);
151    }
152    function setExtraValueTypeCallback(id, name)
153    {
154      var frm = document.forms['extraValue'];
155      var list = frm['parameter:extraValueType'];
156      if (list.length < 1 || list[0].value == '0') // >
157      {
158        Forms.addListOption(list, 0, new Option());
159      }
160      list[0].value = id;
161      list[0].text = name;
162      list.selectedIndex = 0;
163    }
164   
165    function presetOnChange(list, formula, label)
166    {
167      var index = list.selectedIndex;
168      formula.value = list[index].value;
169      if (list[index].value != '' && label) label.value = list[index].text;
170    }
171    function openExpressionBuilder()
172    {
173      Main.expressionBuilder('<%=ID%>', 'Expression', 'extraValue', 'parameter:expression', 'COLUMN_EXPRESSION', '<%=rdt.getId()%>', <%=rdt.getChannels()%>, false, <%=source.getId()%>);
174    }
175    function validate()
176    {
177      var frm = document.forms['extraValue'];
178      if (!frm.allBioAssays.checked && frm.bioAssays.length == 0)
179      {
180        alert('You have not selected any bioassays');
181        return false;
182      }
183      else if (frm['parameter:extraValueType'].selectedIndex < 0)
184      {
185        alert('You must select a type');
186        return false;
187      }
188      else if (Main.trimString(frm['parameter:expression'].value) == '')
189      {
190        alert('You must enter an expression for the extra value');
191        frm['parameter:expression'].focus();
192        return false;
193      }
194      <%
195      if (maxRawMappings != 1)
196      {
197        %>
198        else if (frm['parameter:expression'].value.search(/raw\(/) != -1)
199        {
200          alert('Can\'t use function raw() for bioassaysets with multiple mappings to raw data');
201          frm['parameter:expression'].focus();
202          return false;
203        }
204        <%
205      }
206      %>
207      return true;
208    }
209    function doNext()
210    {
211      if (validate())
212      {
213        var frm = document.forms['extraValue'];
214        if (!frm.allBioAssays.checked)
215        {
216          var ids = Link.getListIds(frm.bioAssays, 'R');
217          for (var i = 0; i < ids.length; i++)
218          {
219            Forms.createHidden(frm, 'parameter:bioAssays', ids[i]);
220          }
221        }
222        frm.submit();
223      }
224    }   
225    function doCancel()
226    {
227      location = 'index.jsp?ID=<%=ID%>&cmd=CancelWizard';
228    }
229    function allBioAssaysOnClick()
230    {
231      var frm = document.forms['extraValue'];
232      frm.bioAssays.disabled = frm.allBioAssays.checked;
233    }
234    function addBioAssaysOnClick()
235    {
236      var frm = document.forms['extraValue'];
237      if (frm.allBioAssays.checked)
238      {
239        return;
240      }
241      var ids = Link.getListIds(frm.bioAssays, 'R');
242      var excludes = ids.join(',');
243      var url = '../../views/experiments/bioassays/index.jsp?ID=<%=ID%>&cmd=UpdateContext&mode=selectmultiple&callback=addBioAssayCallback&bioassayset_id=<%=source.getId()%>';
244      url += "&exclude="+excludes;
245      Main.openPopup(url, 'AddBioAssays', 1000, 700);
246    }
247    function addBioAssayCallback(bioAssayId, name)
248    {
249      var item = Link.getItem('R', bioAssayId);
250      if (!item) item = new Item('R', bioAssayId, name);
251      Link.addItem(document.forms['extraValue'].bioAssays, item);
252    }
253    function removeBioAssaysOnClick()
254    {
255      var frm = document.forms['extraValue'];
256      if (frm.allBioAssays.checked)
257      {
258        return;
259      }
260      Link.removeSelected(frm.bioAssays);
261    }
262    function init()
263    {
264      initBioAssays();
265    }
266   
267    function initBioAssays()
268    {
269      var frm = document.forms['extraValue'];
270      <%
271      if (bioAssays != null)
272      {
273        for (BioAssay ba : bioAssays)
274        {
275          %>
276          Link.addNewItem(frm.bioAssays, new Item('R', <%=ba.getId()%>, '<%=HTML.javaScriptEncode(ba.getName())%>'));
277          <%
278        }
279      }
280      %>
281      frm.allBioAssays.checked = frm.bioAssays.length == 0;
282      allBioAssaysOnClick();
283    }
284    </script>
285  </base:head>
286  <base:body onload="init()">
287    <form name="extraValue" action="index.jsp" method="get" onsubmit="return false;">
288    <input type="hidden" name="ID" value="<%=ID%>">
289    <input type="hidden" name="requestId" value="<%=request.getParameter("requestId")%>">
290    <input type="hidden" name="cmd" value="SetParameters">
291    <input type="hidden" name="parameter:source" value="<%=source.getId()%>">
292   
293    <h3 class="docked">Calculate extra value <base:help helpid="jepextravaluecalculator.options"/></h3>
294    <div class="boxed">
295   
296    <%
297    if (errorMessage != null || (errors != null && errors.size() > 0))
298    {
299      %>
300      <div id="errors" style="margin-bottom: 12px;" class="parameterhelp">
301        <div class="error" style="margin: 0px;">
302        <%=errorMessage %>
303        </div>
304        <%
305        if (errors != null && errors.size() > 0)
306        {
307          %>
308          <div id="showerrorlist" style="display: none;">
309            <base:icon image="bullet.gif" /><a href="javascript:showErrorList()">Show details</a>
310          </div>
311          <div id="errorlist">
312          <ol>
313          <%
314          for (Throwable t : errors)
315          {
316            %>
317            <li><%=t.getMessage()%><br>
318            <%
319          }
320          %>
321          </ol>
322          <base:icon image="bullet.gif" /><a href="javascript:hideErrorList()">Hide details</a>
323          </div>
324          <%
325        }
326        %>
327      </div>
328      <%
329    }
330    %>
331
332      <table class="form" width="100%">
333      <tr valign="top">
334        <td class="prompt">Source bioassay set</td>
335        <td><%=HTML.encodeTags(source.getName())%></td>
336      </tr>
337      <tr valign="top">
338      <td class="prompt">Bioassays</td>
339        <td>
340          <input type="checkbox" name="allBioAssays" 
341            onclick="allBioAssaysOnClick()"><a 
342            href="javascript:document.forms['extraValue'].allBioAssays.click()">All bioassays</a><br>
343          <table border="0" cellspacing="0" cellpadding="0">
344          <tr valign="top">
345          <td>
346            <select name="bioAssays" size="5" multiple style="width: 20em;">
347            </select>
348          </td>
349          <td>
350            <table border="0">
351            <tr><td width="150"><base:button 
352              onclick="addBioAssaysOnClick()" 
353              title="Add&nbsp;bioassays&hellip;" 
354              tooltip="Add bioassays"
355              /></td></tr>
356            <tr><td width="150"><base:button 
357              onclick="removeBioAssaysOnClick()" 
358              title="Remove" 
359              tooltip="Remove the selected bioassays"
360            /></td></tr>
361            </table>
362          </td>
363          </tr>
364          </table>
365        </td>
366      </tr>
367      <tr>
368        <td class="prompt">Extra value type</td>
369        <td>
370          <base:select 
371            id="parameter:extraValueType"
372            clazz="selectionlist"
373            required="true"
374            current="<%=currentExtraValueType%>"
375            recent="<%=recentExtraValueTypes%>"
376            newitem="true"
377            onselect="selectExtraValueTypeOnClick()"
378          />
379        </td>
380      </tr>
381     
382      <tr>
383        <td class="prompt">Expression</td>
384        <td>
385        <select name="presets" style="width: 32em;"
386          onchange="presetOnChange(this, this.form['parameter:expression'])" 
387          >
388          <option value="">- select from list or enter formula below -
389          <%=formulaOptions.toString()%>
390        </select>
391        </td>
392      </tr>
393     
394      <tr valign="top">
395        <td>&nbsp;</td>
396        <td>
397          <table border="0" cellspacing="0" cellpadding="0">
398          <tr valign="top">
399          <td>
400            <textarea class="text required" name="parameter:expression" 
401              rows="4" cols="50"><%=HTML.encodeTags(expression)%></textarea>&nbsp;
402          </td>
403          <td><base:button onclick="openExpressionBuilder()" 
404            title="Expression builder&hellip;" 
405            image="expression_builder.gif"
406            tooltip="A simple utility for building expressions" />
407          </td>
408          </tr>
409          </table>
410        </td>
411      </tr>
412      </table>
413    </div>
414    </form>
415 
416    <table align="center">
417    <tr>
418      <td width="50%"><base:button onclick="doNext();" title="Next" /></td>
419      <td width="50%"><base:button onclick="doCancel();" title="Cancel" /></td>
420    </tr>
421    </table>
422  </base:body>
423  </base:page>
424  <%
425}
426finally
427{
428  if (dc != null) dc.close();
429}%>
Note: See TracBrowser for help on using the repository browser.