source: branches/2.5-stable/www/views/experiments/bioassaysets/view_bioassayset.jsp @ 4065

Last change on this file since 4065 was 4065, checked in by Nicklas Nordborg, 15 years ago

Fixes #870 and #883: Overview plots and correction factor plots should be loaded one by one

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 18.7 KB
Line 
1<%-- $Id: view_bioassayset.jsp 4065 2007-12-14 13:34:36Z nicklas $
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 2
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  Transformation transformation = bioAssaySet.getTransformation();
95  RawDataType rawDataType = experiment.getRawDataType();
96 
97  Job job = null;
98  boolean readJob = true;
99  PluginDefinition plugin = null;
100  boolean readPlugin = true;
101  PluginConfiguration configuration = null;
102  boolean readConfiguration = true;
103
104  try
105  {
106    job = transformation.getJob();
107  }
108  catch (PermissionDeniedException ex)
109  {
110    readJob = false;
111    readPlugin = false;
112    readConfiguration = false;
113  }
114  if (job != null)
115  {
116    try
117    {
118      plugin = job.getPluginDefinition();
119    }
120    catch (PermissionDeniedException ex)
121    {
122      readPlugin = false;
123    }
124    try
125    {
126      configuration = job.getPluginConfiguration();
127    }
128    catch (PermissionDeniedException ex)
129    {
130      readConfiguration = false;
131    }
132  }
133 
134  final boolean createPermission = experiment.hasPermission(Permission.USE);
135  final boolean writePermission = bioAssaySet.hasPermission(Permission.WRITE);
136  final boolean deletePermission = bioAssaySet.hasPermission(Permission.DELETE);
137  Formatter<Date> dateFormatter = FormatterFactory.getDateFormatter(sc);
138  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
139  %>
140
141  <base:page title="<%=title%>">
142  <base:head scripts="table.js,tabcontrol.js,newjoust.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css,newjoust.css">
143    <script language="JavaScript">
144    function editItem()
145    {
146      Main.viewOrEditItem('<%=ID%>', '<%=itemType.name()%>', <%=itemId%>, true);
147    }
148    function deleteItem()
149    {
150      location.replace('index.jsp?ID=<%=ID%>&cmd=DeleteItem&experiment_id=<%=experimentId%>&item_id=<%=itemId%>');
151    }
152    function restoreItem()
153    {
154      location.replace('index.jsp?ID=<%=ID%>&cmd=RestoreItem&experiment_id=<%=experimentId%>&item_id=<%=itemId%>');
155    }
156    function switchTab(tabControlId, tabId)
157    {
158      if (TabControl.isActive(tabControlId, tabId)) return;
159      if (tabId == 'bioassays')
160      {
161        location.href = '../bioassays/index.jsp?ID=<%=ID%>&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>&tab='+tabId;
162      }
163      else if (tabId == 'spotdata')
164      {
165        location.href = '../spotdata/index.jsp?ID=<%=ID%>&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>';
166      }
167      else if ((tabId == 'overviewplots' || tabId == 'cfplots') && tabId != '<%=tabId%>')
168      {
169        location.href = 'index.jsp?ID=<%=ID%>&cmd=ViewItem&experiment_id=<%=experimentId%>&bioassayset_id=<%=itemId%>&tab='+tabId;
170      }
171      else
172      {
173        TabControl.setActiveTab(tabControlId, tabId);
174      }
175    }
176    function runItemPlugin(cmd)
177    {
178      Main.openPopup('index.jsp?ID=<%=ID%>&cmd='+cmd+'&experiment_id=<%=experimentId%>&item_id=<%=itemId%>', 'RunPlugin'+cmd, 740, 540);
179    }
180    var imageQueue = new Array();
181    var nextImage = 0;
182    function addImage(imageId, url)
183    {
184      imageQueue[imageQueue.length] = imageId;
185      var img = document.getElementById(imageId);
186      img.realSrc = url;
187    }
188    function imageLoaded()
189    {
190      nextImage++;
191      prepareNextImage();
192    }
193    function prepareNextImage()
194    {
195      if (imageQueue.length > nextImage)
196      {
197        var imageId = imageQueue[nextImage];
198        var img = document.getElementById(imageId);
199        img.src = '../../../images/plot_generating_400x300.gif';
200        setTimeout('loadNextImage()', 100);
201      }
202    }
203    function loadNextImage()
204    {
205      if (imageQueue.length > nextImage)
206      {
207        var imageId = imageQueue[nextImage];
208        var img = document.getElementById(imageId);
209        img.onload = imageLoaded;
210        img.src = img.realSrc;
211      }
212    }
213    </script>
214    <style>
215    .plot {
216      border: 1px solid #666666;
217      background-image: url('../../../images/plot_empty_400x300.png');
218    }
219    </style>
220  </base:head>
221  <base:body onload="loadNextImage()">
222    <p>
223    <p:path>
224      <p:pathelement title="Experiments" href="<%="../index.jsp?ID="+ID%>" />
225      <p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
226        href="<%="index.jsp?ID="+ID+"&experiment_id="+experimentId%>" />
227      <p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" />
228    </p:path>
229   
230    <t:tabcontrol id="view" active="<%=tabId%>" switch="switchTab" remember="false">
231    <t:tab id="properties" title="Properties">
232   
233    <tbl:toolbar
234      >
235      <tbl:button 
236        disabled="<%=writePermission ? false : true%>" 
237        image="<%=writePermission ? "edit.gif" : "edit_disabled.gif"%>" 
238        onclick="editItem()" 
239        title="Edit&hellip;" 
240        tooltip="<%=writePermission ? "Edit this bioassay set" : "You do not have permission to edit this bioassay set"%>" 
241      />
242      <tbl:button 
243        disabled="<%=deletePermission ? false : true%>" 
244        image="<%=deletePermission ? "delete.gif" : "delete_disabled.gif"%>" 
245        onclick="deleteItem()" 
246        title="Delete"
247        visible="<%=!bioAssaySet.isRemoved()%>"
248        tooltip="<%=deletePermission ? "Delete this bioassay set" : "You do not have permission to delete this bioassay set"%>" 
249      />
250      <tbl:button 
251        disabled="<%=writePermission ? false : true%>" 
252        image="<%=writePermission ? "restore.gif" : "restore_disabled.gif"%>" 
253        onclick="restoreItem()" 
254        title="Restore"
255        visible="<%=bioAssaySet.isRemoved()%>"
256        tooltip="<%=writePermission ? "Restore this bioassay set" : "You do not have permission to restore this bioassay set"%>" 
257      />
258      <tbl:button 
259        image="import.gif" 
260        onclick="runItemPlugin('ImportItem')" 
261        title="Import&hellip;" 
262        tooltip="Import data" 
263        visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
264      />
265      <tbl:button 
266        image="export.gif" 
267        onclick="runItemPlugin('ExportItem')" 
268        title="Export&hellip;" 
269        tooltip="Export data" 
270        visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
271      />
272      <tbl:button
273        image="plotter.gif"
274        onclick="<%="openPlotTool(" + itemId + ")"%>"
275        title="Plot tool&hellip;"
276        tooltip="A simple tool for generating plots"
277      />
278      <tbl:button
279        image="explorer.png"
280        onclick="<%="openExperimentExplorer(" + itemId + ")"%>"
281        title="Experiment explorer"
282        tooltip="View the data reporter by reporter"
283      />
284      <tbl:button
285        disabled="<%=!createPermission%>"
286        image="<%=createPermission ? "filter.gif" : "filter_disabled.gif"%>"
287        onclick="<%="filter(" + itemId +")"%>"
288        title="Filter bioassay set&hellip;"
289        tooltip="<%=createPermission ? 
290          "Create a new bioassay set by filtering this bioassayset" :
291          "You do not have permission analyze this experiment"%>"
292      />
293      <tbl:button 
294        image="runplugin.gif" 
295        onclick="runItemPlugin('RunPlugin')"
296        title="Run plugin&hellip;" 
297        tooltip="Run a plugin" 
298        visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER)%>"
299      />
300      <tbl:button 
301        disabled="<%=!createPermission%>"
302        image="<%=createPermission ? "runplugin.gif" : "runplugin_disabled.gif"%>" 
303        onclick="<%="runAnalysisPlugin(" + itemId + ")"%>"
304        title="Run analysis&hellip;" 
305        tooltip="<%=createPermission ? "Run an analysis plugin" : 
306          "You do not have permission to analyze this experiment"%>"
307        visible="<%=pluginCount.containsKey(Plugin.MainType.ANALYZE)%>"
308      />
309      <tbl:button
310        image="help.gif"
311        onclick="<%="Main.openHelp('" + ID +"', 'bioassayset.view.properties')"%>"
312        title="Help&hellip;"
313        tooltip="Get help about this page"
314      />
315      </tbl:toolbar>
316    <div class="boxedbottom">
317      <div class="itemstatus">Permissions on this item: <i><%=PermissionUtil.getFullPermissionNames(bioAssaySet)%></i></div>
318      <%
319      if (bioAssaySet.isRemoved())
320      {
321        %>
322        <div class="itemstatus">
323          <base:icon image="deleted.gif" 
324            visible="<%=bioAssaySet.isRemoved()%>"> This item has been flagged for deletion<br></base:icon>
325        </div>
326        <%
327      }
328      %>
329     
330      <table width="100%">
331      <tr valign="top">
332      <td width="50%">
333        <h4>Bioassay set</h4>
334        <table class="form" cellspacing=0>
335        <tr>
336          <td class="prompt">Name</td>
337          <td><%=HTML.encodeTags(bioAssaySet.getName())%></td>
338        </tr>
339        <tr>
340          <td class="prompt">Experiment</td>
341          <td><%=Base.getLinkedName(ID, experiment, false, writePermission)%>
342          (<%=experiment.getRawDataType()%>)</td>
343        </tr>
344        <tr>
345          <td class="prompt">Spots</td>
346          <td><%=bioAssaySet.getNumSpots()%></td>
347        </tr>
348        <tr>
349          <td class="prompt">Reporters</td>
350          <td><%=bioAssaySet.getNumReporters()%></td>
351        </tr>
352        <tr>
353          <td class="prompt">Description</td>
354          <td><%=HTML.niceFormat(bioAssaySet.getDescription())%></td>
355        </tr>
356        </table>
357       
358        <h4>Transformation &amp; job</h4>
359        <table class="form" cellspacing=0>
360        <tr>
361          <td class="prompt">Transformation</td>
362          <td><%=Base.getLinkedName(ID, transformation, false, 
363              transformation.hasPermission(Permission.WRITE))%></td>
364        </tr>
365        <tr>
366          <td class="prompt">Job</td>
367          <td><%=Base.getLinkedName(ID, job, !readJob, false)%></td>
368        </tr>
369        <tr valign=top>
370          <td class="prompt">Started</td>
371          <td>
372            <%=job == null ? "" : dateTimeFormatter.format(job.getStarted())%>
373          </td>
374        </tr>
375        <tr valign=top>
376          <td class="prompt">Ended</td>
377          <td>
378            <%=job == null ? "" : dateTimeFormatter.format(job.getEnded())%>
379          </td>
380        </tr>
381        <tr valign=top>
382          <td class="prompt">Server</td>
383          <td>
384            <%=job == null ? "" : HTML.encodeTags(job.getServer())%>
385          </td>
386        </tr>
387        <tr>
388          <td class="prompt">Description</td>
389          <td><%=HTML.niceFormat(transformation.getDescription())%></td>
390        </tr>
391        </table>
392      </td>
393      <td width="50%">
394        <h4>Plugin &amp; parameters</h4>
395        <table class="form" cellspacing=0>
396        <tr>
397          <td class="prompt">Plugin</td>
398          <td><%=Base.getLinkedName(ID, plugin == null ? null : new NameablePluginAdaptor(plugin), 
399              !readPlugin, plugin != null && plugin.hasPermission(Permission.WRITE))%></td>
400        </tr>
401        <tr>
402          <td class="prompt">Plugin configuration</td>
403          <td><%=Base.getLinkedName(ID, configuration, !readConfiguration, 
404            configuration != null && configuration.hasPermission(Permission.WRITE))%></td>
405        </tr>
406        <%
407        if (job != null)
408        {
409          for (String name : job.getParameterNames())
410          {
411            StringBuilder sb = new StringBuilder();
412            String displayValue = "";
413            String description = "";
414            try
415            {
416              ParameterInfo pi = job.getParameterInfo(name);
417              if (pi.getLabel() != null) name = HTML.encodeTags(pi.getLabel());
418              description = HTML.encodeTags(pi.getDescription());
419              List<?> values = pi.getValues();
420              int i = 0;
421              for (Object value : values)
422              {
423                if (value != null)
424                {
425                  if (i > 0) sb.append(", ");
426                  i++;
427                  if (value instanceof BasicItem)
428                  {
429                    BasicItem item = (BasicItem)value;
430                    String itemName = "";
431                    if (item instanceof File)
432                    {
433                      itemName = ((File)item).getPath().toString();
434                    }
435                    else if (item instanceof Nameable)
436                    {
437                      itemName = ((Nameable)item).getName();
438                    }
439                    else
440                    {
441                      itemName = item.toString();
442                    }
443                    sb.append(Base.getLink(ID, HTML.encodeTags(itemName), 
444                      item.getType(), item.getId(), item.hasPermission(Permission.WRITE)));
445                  }
446                  else if (value instanceof Date)
447                  {
448                    sb.append(dateFormatter.format((Date)value));
449                  }
450                  else
451                  {
452                    sb.append(HTML.encodeTags(value.toString()));
453                  }
454                }
455              }
456              displayValue = sb.toString();
457            }
458            catch (Throwable ex)
459            {
460              displayValue = "<i>ERROR: "+ex.getMessage()+"</i>";
461            }
462            %>
463            <tr>
464            <td class="prompt"><span title="<%=description%>"><%=name%></span></td>
465              <td>
466                <%=displayValue%>
467              </td>
468            </tr>
469            <%
470          }
471        }
472        %>
473        </table>
474
475      </td>
476      </tr>
477      </table>
478     
479      <p>
480      <h4 class="docked">Sub analysis tree</h4>
481      <jsp:include page="analysis_tree.jsp">
482        <jsp:param name="ID" value="<%=ID%>" />
483        <jsp:param name="experiment_id" value="<%=experimentId%>" />
484        <jsp:param name="item_id" value="<%=itemId%>" />
485      </jsp:include>
486      </div>
487      </t:tab>
488     
489      <t:tab id="annotations" title="Annotations" 
490        tooltip="View annotation values">
491        <div class="boxed">
492        <jsp:include page="../../../common/annotations/list_annotations.jsp">
493          <jsp:param name="item_type" value="<%=itemType.name()%>" />
494          <jsp:param name="item_id" value="<%=itemId%>" />
495          <jsp:param name="ID" value="<%=ID%>" />
496        </jsp:include>
497        </div>
498      </t:tab>
499     
500      <t:tab id="bioassays" title="Bioassays" />
501     
502      <t:tab id="spotdata" title="Spot data" />
503     
504      <t:tab id="overviewplots" title="Overview plots" 
505        tooltip="MA-plots of each bioassay in this bioassay set"
506        visible="<%=rawDataType.getChannels() == 2%>">
507      <%
508      if ("overviewplots".equals(tabId))
509      {
510        String M = HTML.urlEncode("log2(ch(1) / ch(2))");
511        String A = HTML.urlEncode("log(ch(1) * ch(2)) / 2");
512        String xLabel = HTML.urlEncode("A, log10(ch1 * ch2) / 2");
513        String yLabel = HTML.urlEncode("M, log2(ch1 / ch2)");
514        String filter = HTML.urlEncode("ch(1) > 0 && ch(2) > 0");
515        ItemQuery<BioAssay> bioAssayQuery = bioAssaySet.getBioAssays();
516        bioAssayQuery.order(Orders.asc(Hql.property("name")));
517        StringBuilder script = new StringBuilder();
518        for (BioAssay bioAssay : bioAssayQuery.list(dc))
519        {
520          String url = "../plotter/plot?ID="+ID+"&bioassay_id="+bioAssay.getId();
521          url += "&type=scatter&width=400&height=300";
522          url += "&x="+A+"&y="+M+"&xLabel="+xLabel+"&yLabel="+yLabel;
523          url += "&filter="+filter;
524          url += "&title="+HTML.urlEncode(bioAssay.getName());
525          script.append("addImage('MA").append(bioAssay.getId()).append("','").
526              append(url).append("');\n");
527          %>
528          <img id="MA<%=bioAssay.getId()%>" 
529            src="../../../images/transparent_pixel.gif" 
530            width="400" height="300"
531            alt="MA-plot for bioassay <%=HTML.encodeTags(bioAssay.getName())%>"
532            class="plot"
533            >
534          <%
535        }
536        %>
537        <script language="JavaScript">
538        <%=script%>
539        </script>
540        <%
541      }
542      %>
543      </t:tab>
544     
545      <t:tab id="cfplots" title="Correction factor plots" 
546        tooltip="MA-plot of the parent bioassays together with a correction factor for each spot in the current bioassayset."
547        visible="<%=rawDataType.getChannels() == 2 && bioAssaySet.getTransformation().getSource() != null %>">
548      <%
549      if ("cfplots".equals(tabId))
550      {
551        ItemQuery<BioAssay> bioAssayQuery = bioAssaySet.getBioAssays();
552        bioAssayQuery.order(Orders.asc(Hql.property("name")));
553        String xLabel = HTML.urlEncode("A, log10(ch1 * ch2) / 2");
554        String yLabel = HTML.urlEncode("M, log2(ch1 / ch2)");
555        StringBuilder script = new StringBuilder();
556        for (BioAssay bioAssay : bioAssayQuery.list(dc))
557        {
558          String url = "../plotter/plot?ID="+ID+"&bioassay_id="+bioAssay.getId();
559          url += "&type=cfplot&width=400&height=300";
560          url += "&xLabel="+xLabel+"&yLabel="+yLabel;
561          url += "&title="+HTML.urlEncode(bioAssay.getName());
562          script.append("addImage('CF").append(bioAssay.getId()).append("','").
563          append(url).append("');\n");
564          %>
565          <img id="CF<%=bioAssay.getId()%>" 
566            src="../../../images/transparent_pixel.gif" 
567            width="400" height="300"
568            alt="Correction factor plot for bioassay <%=HTML.encodeTags(bioAssay.getName())%>"
569            class="plot"
570            >
571          <%
572        }
573        %>
574        <script language="JavaScript">
575        <%=script%>
576        </script>
577        <%
578      }
579      %>
580      </t:tab>
581
582      </t:tabcontrol>
583
584  </base:body>
585  </base:page>
586  <%
587}
588finally
589{
590  if (dc != null) dc.close();
591}
592
593%>
Note: See TracBrowser for help on using the repository browser.