source: trunk/www/views/experiments/bioassaysets/view_bioassayset.jsp @ 4476

Last change on this file since 4476 was 4476, checked in by Jari Häkkinen, 14 years ago

Addresses #1106. Moving to GPLv3 in chunked commits.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 19.3 KB
Line 
1<%-- $Id: view_bioassayset.jsp 4476 2008-09-05 15:14:42Z jari $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Hakkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell
5
6  This file is part of BASE - BioArray Software Environment.
7  Available at http://base.thep.lu.se/
8
9  BASE is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License
11  as published by the Free Software Foundation; either version 3
12  of the License, or (at your option) any later version.
13
14  BASE is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  GNU General Public License for more details.
18
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place - Suite 330,
22  Boston, MA  02111-1307, USA.
23  ------------------------------------------------------------------
24
25  @author Nicklas
26  @version 2.0
27--%>
28<%@ page session="false"
29  import="net.sf.basedb.core.SessionControl"
30  import="net.sf.basedb.core.DbControl"
31  import="net.sf.basedb.core.Item"
32  import="net.sf.basedb.core.ItemContext"
33  import="net.sf.basedb.core.Permission"
34  import="net.sf.basedb.core.Experiment"
35  import="net.sf.basedb.core.BioAssaySet"
36  import="net.sf.basedb.core.BioAssay"
37  import="net.sf.basedb.core.Transformation"
38  import="net.sf.basedb.core.Job"
39  import="net.sf.basedb.core.PluginDefinition"
40  import="net.sf.basedb.core.PluginConfiguration"
41  import="net.sf.basedb.core.User"
42  import="net.sf.basedb.core.ItemQuery"
43  import="net.sf.basedb.core.ItemResultList"
44  import="net.sf.basedb.core.Include"
45  import="net.sf.basedb.core.PermissionDeniedException"
46  import="net.sf.basedb.core.PluginDefinition"
47  import="net.sf.basedb.core.ParameterInfo"
48  import="net.sf.basedb.core.RawDataType"
49  import="net.sf.basedb.core.BasicItem"
50  import="net.sf.basedb.core.Nameable"
51  import="net.sf.basedb.core.File"
52  import="net.sf.basedb.core.plugin.GuiContext"
53  import="net.sf.basedb.core.plugin.Plugin"
54  import="net.sf.basedb.core.query.Orders"
55  import="net.sf.basedb.core.query.Hql"
56  import="net.sf.basedb.clients.web.Base"
57  import="net.sf.basedb.clients.web.PermissionUtil"
58  import="net.sf.basedb.clients.web.util.HTML"
59  import="net.sf.basedb.util.Values"
60  import="net.sf.basedb.clients.web.util.NameablePluginAdaptor"
61  import="net.sf.basedb.util.formatter.Formatter"
62  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
63  import="java.util.Date"
64  import="java.util.Map"
65  import="java.util.Set"
66  import="java.util.List"
67%>
68<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
69<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
70<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
71<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
72<%!
73  private static final Item itemType = Item.BIOASSAYSET;
74  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.ITEM);
75%>
76<%
77final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
78final String ID = sc.getId();
79final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
80final int itemId = cc.getId();
81final String tabId = Values.getString(request.getParameter("tab"), "properties");
82
83final float scale = Base.getScale(sc);
84final String root = request.getContextPath();
85final DbControl dc = sc.newDbControl();
86try
87{
88  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
89
90  String title = null;
91  final BioAssaySet bioAssaySet = BioAssaySet.getById(dc, itemId);
92  final Experiment experiment = bioAssaySet.getExperiment();
93  final int experimentId = experiment.getId();
94  final boolean hasDbSpots = bioAssaySet.getNumSpots() > 0;
95  Transformation transformation = bioAssaySet.getTransformation();
96  RawDataType rawDataType = experiment.getRawDataType();
97 
98  Job job = null;
99  boolean readJob = true;
100  PluginDefinition plugin = null;
101  boolean readPlugin = true;
102  PluginConfiguration configuration = null;
103  boolean readConfiguration = true;
104
105  try
106  {
107    job = transformation.getJob();
108  }
109  catch (PermissionDeniedException ex)
110  {
111    readJob = false;
112    readPlugin = false;
113    readConfiguration = false;
114  }
115  if (job != null)
116  {
117    try
118    {
119      plugin = job.getPluginDefinition();
120    }
121    catch (PermissionDeniedException ex)
122    {
123      readPlugin = false;
124    }
125    try
126    {
127      configuration = job.getPluginConfiguration();
128    }
129    catch (PermissionDeniedException ex)
130    {
131      readConfiguration = false;
132    }
133  }
134 
135  final boolean createPermission = experiment.hasPermission(Permission.USE);
136  final boolean writePermission = bioAssaySet.hasPermission(Permission.WRITE);
137  final boolean deletePermission = bioAssaySet.hasPermission(Permission.DELETE);
138  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
139  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
140  %>
141
142  <base:page title="<%=title%>">
143  <base:head scripts="table.js,tabcontrol.js,newjoust.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css,newjoust.css">
144    <script language="JavaScript">
145    function editItem()
146    {
147      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
148    }
149    function deleteItem()
150    {
151      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&experiment_id=<%=experimentId%>&item_id=<%=itemId%>');
152    }
153    function restoreItem()
154    {
155      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&experiment_id=<%=experimentId%>&item_id=<%=itemId%>');
156    }
157    function switchTab(tabControlId, tabId)
158    {
159      if (TabControl.isActive(tabControlId, tabId)) return;
160      if (tabId == 'bioassays')
161      {
162        location.href = '../bioassays/index.jsp?ID=<%=ID%>&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>&tab='+tabId;
163      }
164      else if (tabId == 'spotdata')
165      {
166        location.href = '../spotdata/index.jsp?ID=<%=ID%>&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>';
167      }
168      else if ((tabId == 'overviewplots' || tabId == 'cfplots') && tabId != '<%=tabId%>')
169      {
170        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>&tab='+tabId;
171      }
172      else
173      {
174        TabControl.setActiveTab(tabControlId, tabId);
175      }
176    }
177    function runItemPlugin(cmd)
178    {
179      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&experiment_id=<%=experimentId%>&item_id=<%=itemId%>', 'RunPlugin'+cmd, 740, 540);
180    }
181    var imageQueue = new Array();
182    var nextImage = 0;
183    function addImage(imageId, url)
184    {
185      imageQueue[imageQueue.length] = imageId;
186      var img = document.getElementById(imageId);
187      img.realSrc = url;
188    }
189    function imageLoaded()
190    {
191      nextImage++;
192      prepareNextImage();
193    }
194    function prepareNextImage()
195    {
196      if (imageQueue.length > nextImage)
197      {
198        var imageId = imageQueue[nextImage];
199        var img = document.getElementById(imageId);
200        img.src = '../../../images/plot_generating_400x300.gif';
201        setTimeout('loadNextImage()', 100);
202      }
203    }
204    function loadNextImage()
205    {
206      if (imageQueue.length > nextImage)
207      {
208        var imageId = imageQueue[nextImage];
209        var img = document.getElementById(imageId);
210        img.onload = imageLoaded;
211        img.src = img.realSrc;
212      }
213    }
214    </script>
215    <style>
216    .plot {
217      border: 1px solid #666666;
218      background-image: url('../../../images/plot_empty_400x300.png');
219    }
220    </style>
221  </base:head>
222  <base:body onload="loadNextImage()">
223    <p>
224    <p:path>
225      <p:pathelement title="Experiments" href="<%="../index.jsp?ID="+ID%>" />
226      <p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
227        href="<%="index.jsp?ID="+ID+"&experiment_id="+experimentId%>" />
228      <p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" />
229    </p:path>
230   
231    <t:tabcontrol id="view" active="<%=tabId%>" switch="switchTab" remember="false">
232    <t:tab id="properties" title="Properties">
233   
234    <tbl:toolbar
235      >
236      <tbl:button 
237        disabled="<%=writePermission ? false : true%>" 
238        image="<%=writePermission ? "edit.gif" : "edit_disabled.gif"%>" 
239        onclick="editItem()" 
240        title="Edit&hellip;" 
241        tooltip="<%=writePermission ? "Edit this bioassay set" : "You do not have permission to edit this bioassay set"%>" 
242      />
243      <tbl:button 
244        disabled="<%=deletePermission ? false : true%>" 
245        image="<%=deletePermission ? "delete.gif" : "delete_disabled.gif"%>" 
246        onclick="deleteItem()" 
247        title="Delete"
248        visible="<%=!bioAssaySet.isRemoved()%>"
249        tooltip="<%=deletePermission ? "Delete this bioassay set" : "You do not have permission to delete this bioassay set"%>" 
250      />
251      <tbl:button 
252        disabled="<%=writePermission ? false : true%>" 
253        image="<%=writePermission ? "restore.gif" : "restore_disabled.gif"%>" 
254        onclick="restoreItem()" 
255        title="Restore"
256        visible="<%=bioAssaySet.isRemoved()%>"
257        tooltip="<%=writePermission ? "Restore this bioassay set" : "You do not have permission to restore this bioassay set"%>" 
258      />
259      <tbl:button 
260        image="import.gif" 
261        onclick="runItemPlugin('ImportItem')" 
262        title="Import&hellip;" 
263        tooltip="Import data" 
264        visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
265      />
266      <tbl:button 
267        image="export.gif" 
268        onclick="runItemPlugin('ExportItem')" 
269        title="Export&hellip;" 
270        tooltip="Export data" 
271        visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
272      />
273      <tbl:button
274        image="plotter.gif"
275        onclick="<%="openPlotTool(" + itemId + ")"%>"
276        title="Plot tool&hellip;"
277        tooltip="A simple tool for generating plots"
278        visible="<%=hasDbSpots%>"
279      />
280      <tbl:button
281        image="explorer.png"
282        onclick="<%="openExperimentExplorer(" + itemId + ")"%>"
283        title="Experiment explorer"
284        tooltip="View the data reporter by reporter"
285        visible="<%=hasDbSpots%>"
286      />
287      <tbl:button
288        disabled="<%=!createPermission%>"
289        image="<%=createPermission ? "filter.gif" : "filter_disabled.gif"%>"
290        onclick="<%="filter(" + itemId +")"%>"
291        title="Filter bioassay set&hellip;"
292        tooltip="<%=createPermission ? 
293          "Create a new bioassay set by filtering this bioassayset" :
294          "You do not have permission analyze this experiment"%>"
295        visible="<%=pluginCount.containsKey(Plugin.MainType.ANALYZE)%>"
296      />
297      <tbl:button 
298        image="runplugin.gif" 
299        onclick="runItemPlugin('RunPlugin')"
300        title="Run plugin&hellip;" 
301        tooltip="Run a plugin" 
302        visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
303      />
304      <tbl:button 
305        disabled="<%=!createPermission%>"
306        image="<%=createPermission ? "runplugin.gif" : "runplugin_disabled.gif"%>" 
307        onclick="<%="runAnalysisPlugin(" + itemId + ")"%>"
308        title="Run analysis&hellip;" 
309        tooltip="<%=createPermission ? "Run an analysis plugin" : 
310          "You do not have permission to analyze this experiment"%>"
311        visible="<%=pluginCount.containsKey(Plugin.MainType.ANALYZE)%>"
312      />
313      <tbl:button
314        image="help.gif"
315        onclick="<%="Main.openHelp('" + ID +"', 'bioassayset.view.properties')"%>"
316        title="Help&hellip;"
317        tooltip="Get help about this page"
318      />
319      </tbl:toolbar>
320    <div class="boxedbottom">
321      <div class="itemstatus">Permissions on this item: <i><%=PermissionUtil.getFullPermissionNames(bioAssaySet)%></i></div>
322      <%
323      if (bioAssaySet.isRemoved())
324      {
325        %>
326        <div class="itemstatus">
327          <base:icon image="deleted.gif" 
328            visible="<%=bioAssaySet.isRemoved()%>"> This item has been flagged for deletion<br></base:icon>
329        </div>
330        <%
331      }
332      %>
333     
334      <table width="100%">
335      <tr valign="top">
336      <td width="50%">
337        <h4>Bioassay set</h4>
338        <table class="form" cellspacing=0>
339        <tr>
340          <td class="prompt">Name</td>
341          <td><%=HTML.encodeTags(bioAssaySet.getName())%></td>
342        </tr>
343        <tr>
344          <td class="prompt">Experiment</td>
345          <td><%=Base.getLinkedName(ID, experiment, false, writePermission)%>
346          (<%=experiment.getRawDataType()%>)</td>
347        </tr>
348        <tr>
349          <td class="prompt">Spots</td>
350          <td>db: <%=bioAssaySet.getNumSpots()%>; file: <%=bioAssaySet.getNumFileSpots()%></td>
351        </tr>
352        <tr>
353          <td class="prompt">Reporters</td>
354          <td>db: <%=bioAssaySet.getNumReporters()%>; file: <%=bioAssaySet.getNumFileReporters()%></td>
355        </tr>
356        <tr>
357          <td class="prompt">Description</td>
358          <td><%=HTML.niceFormat(bioAssaySet.getDescription())%></td>
359        </tr>
360        </table>
361       
362        <h4>Transformation &amp; job</h4>
363        <table class="form" cellspacing=0>
364        <tr>
365          <td class="prompt">Transformation</td>
366          <td><%=Base.getLinkedName(ID, transformation, false, 
367              transformation.hasPermission(Permission.WRITE))%></td>
368        </tr>
369        <tr>
370          <td class="prompt">Job</td>
371          <td><%=Base.getLinkedName(ID, job, !readJob, false)%></td>
372        </tr>
373        <tr valign=top>
374          <td class="prompt">Started</td>
375          <td>
376            <%=job == null ? "" : dateTimeFormatter.format(job.getStarted())%>
377          </td>
378        </tr>
379        <tr valign=top>
380          <td class="prompt">Ended</td>
381          <td>
382            <%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%>
383          </td>
384        </tr>
385        <tr valign=top>
386          <td class="prompt">Server</td>
387          <td>
388            <%=job == null ? "" : HTML.encodeTags(job.getServer())%>
389          </td>
390        </tr>
391        <tr>
392          <td class="prompt">Description</td>
393          <td><%=HTML.niceFormat(transformation.getDescription())%></td>
394        </tr>
395        </table>
396      </td>
397      <td width="50%">
398        <h4>Plugin &amp; parameters</h4>
399        <table class="form" cellspacing=0>
400        <tr>
401          <td class="prompt">Plugin</td>
402          <td><%=Base.getLinkedName(ID, plugin == null ? null : new NameablePluginAdaptor(plugin), 
403              !readPlugin, plugin != null && plugin.hasPermission(Permission.WRITE))%></td>
404        </tr>
405        <tr>
406          <td class="prompt">Plugin configuration</td>
407          <td><%=Base.getLinkedName(ID, configuration, !readConfiguration, 
408            configuration != null && configuration.hasPermission(Permission.WRITE))%></td>
409        </tr>
410        <%
411        if (job != null)
412        {
413          for (String name : job.getParameterNames())
414          {
415            StringBuilder sb = new StringBuilder();
416            String displayValue = "";
417            String description = "";
418            try
419            {
420              ParameterInfo pi = job.getParameterInfo(name);
421              if (pi.getLabel() != null) name = HTML.encodeTags(pi.getLabel());
422              description = HTML.encodeTags(pi.getDescription());
423              List<?> values = pi.getValues();
424              int i = 0;
425              for (Object value : values)
426              {
427                if (value != null)
428                {
429                  if (i > 0) sb.append(", ");
430                  i++;
431                  if (value instanceof BasicItem)
432                  {
433                    BasicItem item = (BasicItem)value;
434                    String itemName = "";
435                    if (item instanceof File)
436                    {
437                      itemName = ((File)item).getPath().toString();
438                    }
439                    else if (item instanceof Nameable)
440                    {
441                      itemName = ((Nameable)item).getName();
442                    }
443                    else
444                    {
445                      itemName = item.toString();
446                    }
447                    sb.append(Base.getLink(ID, HTML.encodeTags(itemName), 
448                      item.getType(), item.getId(), item.hasPermission(Permission.WRITE)));
449                  }
450                  else if (value instanceof Date)
451                  {
452                    sb.append(dateFormatter.format((Date)value));
453                  }
454                  else
455                  {
456                    sb.append(HTML.encodeTags(value.toString()));
457                  }
458                }
459              }
460              displayValue = sb.toString();
461            }
462            catch (Throwable ex)
463            {
464              displayValue = "<i>ERROR: "+ex.getMessage()+"</i>";
465            }
466            %>
467            <tr>
468            <td class="prompt"><span title="<%=description%>"><%=name%></span></td>
469              <td>
470                <%=displayValue%>
471              </td>
472            </tr>
473            <%
474          }
475        }
476        %>
477        </table>
478
479      </td>
480      </tr>
481      </table>
482     
483      <jsp:include page="../../../common/datafiles/list_files.jsp">
484        <jsp:param name="item_type" value="<%=itemType.name()%>" />
485        <jsp:param name="item_id" value="<%=itemId%>" />
486        <jsp:param name="ID" value="<%=ID%>" />
487      </jsp:include>
488     
489      <p>
490      <h4 class="docked">Sub analysis tree</h4>
491      <jsp:include page="analysis_tree.jsp">
492        <jsp:param name="ID" value="<%=ID%>" />
493        <jsp:param name="experiment_id" value="<%=experimentId%>" />
494        <jsp:param name="item_id" value="<%=itemId%>" />
495      </jsp:include>
496      </div>
497      </t:tab>
498     
499      <t:tab id="annotations" title="Annotations" 
500        tooltip="View annotation values">
501        <div class="boxed">
502        <jsp:include page="../../../common/annotations/list_annotations.jsp">
503          <jsp:param name="item_type" value="<%=itemType.name()%>" />
504          <jsp:param name="item_id" value="<%=itemId%>" />
505          <jsp:param name="ID" value="<%=ID%>" />
506        </jsp:include>
507        </div>
508      </t:tab>
509     
510      <t:tab id="bioassays" title="Bioassays" />
511     
512      <t:tab id="spotdata" title="Spot data" 
513        visible="<%=hasDbSpots%>" />
514     
515      <t:tab id="overviewplots" title="Overview plots" 
516        tooltip="MA-plots of each bioassay in this bioassay set"
517        visible="<%=hasDbSpots && rawDataType.getChannels() == 2%>">
518      <%
519      if ("overviewplots".equals(tabId))
520      {
521        String M = HTML.urlEncode("log2(ch(1) / ch(2))");
522        String A = HTML.urlEncode("log(ch(1) * ch(2)) / 2");
523        String xLabel = HTML.urlEncode("A, log10(ch1 * ch2) / 2");
524        String yLabel = HTML.urlEncode("M, log2(ch1 / ch2)");
525        String filter = HTML.urlEncode("ch(1) > 0 && ch(2) > 0");
526        ItemQuery<BioAssay> bioAssayQuery = bioAssaySet.getBioAssays();
527        bioAssayQuery.order(Orders.asc(Hql.property("name")));
528        StringBuilder script = new StringBuilder();
529        for (BioAssay bioAssay : bioAssayQuery.list(dc))
530        {
531          String url = "../plotter/plot?ID="+ID+"&bioassay_id="+bioAssay.getId();
532          url += "&type=scatter&width=400&height=300";
533          url += "&x="+A+"&y="+M+"&xLabel="+xLabel+"&yLabel="+yLabel;
534          url += "&filter="+filter;
535          url += "&title="+HTML.urlEncode(bioAssay.getName());
536          script.append("addImage('MA").append(bioAssay.getId()).append("','").
537              append(url).append("');\n");
538          %>
539          <img id="MA<%=bioAssay.getId()%>" 
540            src="../../../images/transparent_pixel.gif" 
541            width="400" height="300"
542            alt="MA-plot for bioassay <%=HTML.encodeTags(bioAssay.getName())%>"
543            class="plot"
544            >
545          <%
546        }
547        %>
548        <script language="JavaScript">
549        <%=script%>
550        </script>
551        <%
552      }
553      %>
554      </t:tab>
555     
556      <t:tab id="cfplots" title="Correction factor plots" 
557        tooltip="MA-plot of the parent bioassays together with a correction factor for each spot in the current bioassayset."
558        visible="<%=hasDbSpots && rawDataType.getChannels() == 2 && bioAssaySet.getTransformation().getSource() != null %>">
559      <%
560      if ("cfplots".equals(tabId))
561      {
562        ItemQuery<BioAssay> bioAssayQuery = bioAssaySet.getBioAssays();
563        bioAssayQuery.order(Orders.asc(Hql.property("name")));
564        String xLabel = HTML.urlEncode("A, log10(ch1 * ch2) / 2");
565        String yLabel = HTML.urlEncode("M, log2(ch1 / ch2)");
566        StringBuilder script = new StringBuilder();
567        for (BioAssay bioAssay : bioAssayQuery.list(dc))
568        {
569          String url = "../plotter/plot?ID="+ID+"&bioassay_id="+bioAssay.getId();
570          url += "&type=cfplot&width=400&height=300";
571          url += "&xLabel="+xLabel+"&yLabel="+yLabel;
572          url += "&title="+HTML.urlEncode(bioAssay.getName());
573          script.append("addImage('CF").append(bioAssay.getId()).append("','").
574          append(url).append("');\n");
575          %>
576          <img id="CF<%=bioAssay.getId()%>" 
577            src="../../../images/transparent_pixel.gif" 
578            width="400" height="300"
579            alt="Correction factor plot for bioassay <%=HTML.encodeTags(bioAssay.getName())%>"
580            class="plot"
581            >
582          <%
583        }
584        %>
585        <script language="JavaScript">
586        <%=script%>
587        </script>
588        <%
589      }
590      %>
591      </t:tab>
592
593      </t:tabcontrol>
594
595  </base:body>
596  </base:page>
597  <%
598}
599finally
600{
601  if (dc != null) dc.close();
602}
603
604%>
Note: See TracBrowser for help on using the repository browser.