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

Last change on this file since 4485 was 4485, checked in by Nicklas Nordborg, 14 years ago

Fixes #1108: Overview/Correction? factor plots doesn't show "Generating plot..." meter in IE.

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