source: trunk/www/views/experiments/explorer/view/view.jsp @ 5114

Last change on this file since 5114 was 5114, checked in by Nicklas Nordborg, 13 years ago

References #1386: Plot function in the bioassay table in experiment explorer

First version is checked in since it is friday. Most major functions should be in place. Some minor options may need tweaking as well as some visual aspects. As usual, error handling must be tested.

The code for generating an image with a stack trace has been moved to ThrowableUtil?.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 27.1 KB
Line 
1<%-- $Id: view.jsp 5114 2009-10-02 12:29:28Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Johan Enell, Nicklas Nordborg
4  Copyright (C) 2007 Nicklas Nordborg
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 BASE. If not, see <http://www.gnu.org/licenses/>.
21  ------------------------------------------------------------------
22
23  @author Nicklas
24  @version 2.0
25--%>
26<%@ page session="false"
27  import="net.sf.basedb.core.SessionControl"
28  import="net.sf.basedb.core.DbControl"
29  import="net.sf.basedb.core.Item"
30  import="net.sf.basedb.core.ItemContext"
31  import="net.sf.basedb.core.PropertyFilter"
32  import="net.sf.basedb.core.Include"
33  import="net.sf.basedb.core.BioAssaySet"
34  import="net.sf.basedb.core.BioAssay"
35  import="net.sf.basedb.core.Experiment"
36  import="net.sf.basedb.core.RawDataType"
37  import="net.sf.basedb.core.RawBioAssay"
38  import="net.sf.basedb.core.RawDataUtil"
39  import="net.sf.basedb.core.ExtendedProperties"
40  import="net.sf.basedb.core.ExtendedProperty"
41  import="net.sf.basedb.core.AnnotationType"
42  import="net.sf.basedb.core.Annotation"
43  import="net.sf.basedb.core.Formula"
44  import="net.sf.basedb.core.IntensityTransform"
45  import="net.sf.basedb.core.ItemQuery"
46  import="net.sf.basedb.core.ItemResultList"
47  import="net.sf.basedb.core.DynamicSpotQuery"
48  import="net.sf.basedb.core.DynamicResultIterator"
49  import="net.sf.basedb.core.VirtualColumn"
50  import="net.sf.basedb.core.Type"
51  import="net.sf.basedb.core.data.ReporterData"
52  import="net.sf.basedb.core.data.RawData"
53  import="net.sf.basedb.core.query.Restrictions"
54  import="net.sf.basedb.core.query.Expressions"
55  import="net.sf.basedb.core.query.Dynamic"
56  import="net.sf.basedb.core.query.Orders"
57  import="net.sf.basedb.core.query.Selects"
58  import="net.sf.basedb.core.query.Aggregations"
59  import="net.sf.basedb.core.query.Hql"
60  import="net.sf.basedb.core.query.JoinType"
61  import="net.sf.basedb.core.query.SqlResult"
62  import="net.sf.basedb.util.Values"
63  import="net.sf.basedb.clients.web.Base"
64  import="net.sf.basedb.clients.web.DynamicUtil"
65  import="net.sf.basedb.clients.web.ExperimentExplorer"
66  import="net.sf.basedb.clients.web.ExperimentExplorer.AnnotationSummary"
67  import="net.sf.basedb.clients.web.ExperimentExplorer.AnnotationGroup"
68  import="net.sf.basedb.clients.web.WebException"
69  import="net.sf.basedb.clients.web.util.HTML"
70  import="net.sf.basedb.util.formatter.Formatter"
71  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
72  import="net.sf.basedb.clients.web.formatter.SpotImageFormatter"
73  import="net.sf.basedb.clients.web.taglib.table.TableColumn"
74  import="java.util.Date"
75  import="java.util.List"
76  import="java.util.ArrayList"
77  import="java.util.LinkedList"
78  import="java.util.Collection"
79  import="java.util.Arrays"
80  import="java.util.Set"
81  import="java.util.Map"
82  import="java.util.HashMap"
83%>
84<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
85<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
86<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
87<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
88<%!
89  private static final Item itemType = Item.SPOTDATA;
90  private static final String defaultReporterColumns = "name,externalId,symbol,description";
91%>
92<%
93final SessionControl sc = Base.getExistingSessionControl(pageContext, true);
94final String ID = sc.getId();
95final float scale = Base.getScale(sc);
96final String root = request.getContextPath();
97
98final int bioAssaySetId = Values.getInt(request.getParameter("bioassayset_id"));
99final DbControl dc = sc.newDbControl();
100DynamicResultIterator spotData = null;
101try
102{
103  Formatter<Date> dateFormatter = FormatterFactory.getDateTimeFormatter(sc);
104  String title = null;
105  final BioAssaySet bioAssaySet = BioAssaySet.getById(dc, bioAssaySetId);
106  final Experiment experiment = bioAssaySet.getExperiment();
107  final RawDataType rawDataType = experiment.getRawDataType();
108  final int channels = rawDataType.getChannels();
109  final boolean hasRatio = channels == 2;
110  final int maxRawMappings = bioAssaySet.getMaxRawMappingsForSpot();
111  final IntensityTransform transform = bioAssaySet.getIntensityTransform();
112 
113  final ExperimentExplorer explorer = ExperimentExplorer.getExplorer(bioAssaySet);
114  final ItemContext cc = explorer.getAndSetSpotContext(sc, pageContext);
115  final ItemContext reporterContext = explorer.getAndSetReporterContext(sc, null);
116  final String subContext = cc.getSubContext();
117 
118  List<TableColumn> columns = new LinkedList<TableColumn>();
119  DynamicUtil.addFormulaColumns(columns, dc, rawDataType, Formula.Type.COLUMN_EXPRESSION, 
120    transform, "frm.", "", maxRawMappings == 1);
121  DynamicUtil.addExtraColumns(columns, dc, bioAssaySet, "ev", "#", "[Xtra] ");
122  if (maxRawMappings == 1)
123  {
124    DynamicUtil.addRawDataColumns(columns, dc, rawDataType, "raw.", "$", "[Raw] ");
125    columns.add(new TableColumn("raw.spotimage", "$id", "raw('id')", Type.INT, 
126      "[Raw] Spotimage", "", "auto", false, false, false, null, 
127      new SpotImageFormatter(dc, rawDataType, root)));
128  }
129
130  final int matchingReporters = explorer.getMatchingReporters(dc);
131  int reporterIndex = explorer.getReporterIndex();
132  if (reporterIndex >= matchingReporters) reporterIndex = matchingReporters - 1;
133  final ReporterData reporter = matchingReporters == 0 ? 
134      null : explorer.getReporter(dc, reporterIndex);
135
136  final int matchingPositions = matchingReporters == 0 ? 
137      0 : explorer.getNumPositions(dc, reporterIndex);
138 
139  int positionIndex = explorer.getPositionIndex();
140  if (positionIndex >= matchingPositions) positionIndex = matchingPositions - 1;
141  final boolean isAveraging = positionIndex == ExperimentExplorer.SPOT_AVG;
142 
143  final List<AnnotationType> annotationTypes = explorer.getAnnotationTypes(dc, true);
144  final Set<Integer> tmp = explorer.getAnnotationTypeIds();
145  final Map<AnnotationType, AnnotationSummary> selectedAnnotationTypes = 
146    new HashMap<AnnotationType, AnnotationSummary>(tmp.size());
147  for (Integer atId : tmp)
148  {
149    try
150    {
151      selectedAnnotationTypes.put(AnnotationType.getById(dc, atId), null);
152    }
153    catch (Throwable t)
154    {}
155  }
156
157  DynamicUtil.SelectedInfo selected = DynamicUtil.getSelectedColumns(cc, columns, isAveraging);
158 
159  List<String> sortProperties = null;
160  if (isAveraging && cc.getSortProperty() != null)
161  {
162    // We must check that we are not sorting on a non-averagable property
163    sortProperties = new ArrayList<String>(Arrays.asList(cc.getSortProperty().split(",")));
164    for (TableColumn tc : columns)
165    {
166      if (!tc.isAveragable()) sortProperties.remove(tc.getProperty());
167    }
168    cc.setSortProperty(Values.getString(sortProperties, ",", true));
169  }
170 
171  if (matchingReporters > 0)
172  {
173    for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
174    {
175      entry.setValue(explorer.getAnnotationSummary(dc, entry.getKey()));
176    }
177    try
178    {
179      DynamicSpotQuery spotQuery = explorer.getSpotQuery(dc, reporterIndex, positionIndex, selected.selectedColumns);
180      spotData = spotQuery.iterate(dc);
181    }
182    catch (Throwable t)
183    {
184      cc.setMessage(t.getMessage());
185    }
186  }
187  %>
188  <base:page title="<%=title%>">
189  <base:head scripts="table.js,tabcontrol.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css,explorer.css">
190  <script language="JavaScript">
191    var submitPage = 'index.jsp';
192    var formId = 'spotdata';
193    function configureColumns()
194    {
195      Table.configureColumns('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>', '<%=subContext%>');
196    }
197    function configureReporterColumns()
198    {
199      var frm = document.forms['reporter'];
200      frm.cmd.value = 'SetReporterColumns';
201      Table.configureColumns('<%=ID%>', 'reporter', '<%=itemType.name()%>', '<%=defaultReporterColumns%>', '<%=subContext%>', 'reporter-columns');
202    }
203    function presetOnChange()
204    {
205      Table.presetOnChange('<%=ID%>', formId, '<%=itemType.name()%>', '<%=(String)cc.getObject("defaultColumns")%>', '<%=subContext%>');
206    }
207    function validateReporterIndex()
208    {
209      var frm = document.forms['reporterIndex'];
210      var reporterIndex = parseInt(frm.newReporterIndex.value);
211      var maxIndex = <%=matchingReporters%>;
212      if (reporterIndex < 1 || reporterIndex > maxIndex)
213      {
214        alert('The reporter index must be between 1 and ' + maxIndex);
215        return false;
216      }
217      frm.cmd.value = 'SetReporterIndex';
218      Forms.createHidden(frm, 'reporterIndex', reporterIndex-1);
219      return true;
220    }
221    function validateSpotIndex()
222    {
223      var frm = document.forms['spotIndex'];
224      var spotIndex = parseInt(frm.newSpotIndex.value);
225      var maxIndex = <%=matchingPositions%>;
226      if (spotIndex < 1 || spotIndex > maxIndex)
227      {
228        alert('The spot index must be between 1 and ' + maxIndex);
229        return false;
230      }
231      frm.cmd.value = 'SetSpotIndex';
232      Forms.createHidden(frm, 'spotIndex', spotIndex-1);
233      return true;
234    }
235    function annotationTypeOnChange()
236    {
237      var frm = document.forms['explorer'];
238      frm.cmd.value = 'SetAnnotationType';
239      frm.submit();
240    }
241    function viewSearch()
242    {
243      location.href = '../search/index.jsp?ID=<%=ID%>&bioassayset_id=<%=bioAssaySetId%>';
244    }
245    function switchTab(tabControlId, tabId)
246    {
247      if (tabId == 'search')
248      {
249        viewSearch();
250      }
251      else
252      {
253        TabControl.setActiveTab(tabControlId, tabId);
254      }
255    }
256    function plotSpotData()
257    {
258      var url = 'plotter.jsp?ID=<%=ID%>';
259      url += '&bioAssaySetId=<%=bioAssaySetId%>';
260      url += '&reporterIndex=<%=reporterIndex%>';
261      url += '&positionIndex=<%=positionIndex%>';
262      Main.openPopup(url, 'SpotPlot', 1100, 700);
263    }
264  </script>
265  </base:head>
266  <base:body>
267    <p>
268    <p:path>
269      <p:pathelement title="Experiments" href="<%="../../index.jsp?ID="+ID%>" />
270      <p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
271        href="<%="../../bioassaysets/index.jsp?ID="+ID+"&experiment_id="+experiment.getId()%>" />
272      <p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" 
273        href="<%="../../bioassaysets/index.jsp?ID="+ID+"&cmd=ViewItem&item_id="+bioAssaySetId%>" />
274      <p:pathelement title="Explorer" />
275    </p:path>
276   
277    <t:tabcontrol id="explorer" switch="switchTab" remember="false" active="view">
278    <t:tab id="search" title="Reporter search" />
279   
280    <t:tab id="view" title="Reporter view">
281    <div class="boxed">
282   
283    <%
284    Collection<PropertyFilter> filters = reporterContext.getPropertyFilters();
285    String filter = filters != null && filters.size() > 0 ? 
286      "(" + Values.getString(filters, ") AND (", true).replaceAll("@|£", "") + ")" : "- none -";
287    %>
288    <table class="form">
289    <tr>
290      <td class="prompt">Filter</td>
291      <td>
292      <%=HTML.encodeTags(filter)%>
293      </td>
294    </tr>
295    </table>
296   
297   
298    <%
299    if (reporter != null)
300    {
301      %>
302      <form name="reporterIndex" action="index.jsp" method="post">
303      <input type="hidden" name="ID" value="<%=ID%>">
304      <input type="hidden" name="bioassayset_id" value="<%=bioAssaySetId%>">
305      <input type="hidden" name="cmd" value="SetReporterIndex">
306      <h4 class="docked">Current reporter
307            <input name="newReporterIndex" type="text" class="text" value="<%=reporterIndex+1%>" 
308        onkeypress="return Numbers.integerOnly(event, true, validateReporterIndex)"
309        size="6" maxlength="8" title="Enter a number between 1 and <%=matchingReporters%>">
310      of <%=matchingReporters %>
311      <%
312      if (reporterIndex == 0 || matchingReporters == 0)
313      {
314        %>
315        <base:icon image="first_gray.gif" />
316        <base:icon image="previous_gray.gif" />
317        <%
318      }
319      else
320      {
321        %>
322        <a href="index.jsp?ID=<%=ID%>&cmd=SetReporterIndex&bioassayset_id=<%=bioAssaySetId%>&reporterIndex=0"
323          title="Go the first reporter"><base:icon image="first.gif" /></a>
324        <a href="index.jsp?ID=<%=ID%>&cmd=SetReporterIndex&bioassayset_id=<%=bioAssaySetId%>&reporterIndex=<%=reporterIndex-1%>"
325          title="Go the previous reporter"><base:icon image="previous.gif" /></a>
326        <%
327      }
328      %>
329      &nbsp;&nbsp;
330      <%
331      if (reporterIndex == matchingReporters - 1 || matchingReporters == 0)
332      {
333        %>
334        <base:icon image="next_gray.gif" />
335        <base:icon image="last_gray.gif" />
336        <%
337      }
338      else
339      {
340        %>
341        <a href="index.jsp?ID=<%=ID%>&cmd=SetReporterIndex&bioassayset_id=<%=bioAssaySetId%>&reporterIndex=<%=reporterIndex+1%>"
342          title="Go the next reporter"><base:icon image="next.gif" /></a>
343        <a href="index.jsp?ID=<%=ID%>&cmd=SetReporterIndex&bioassayset_id=<%=bioAssaySetId%>&reporterIndex=<%=matchingReporters-1%>"
344          title="Go the last reporter"><base:icon image="last.gif" /></a>
345        <%
346      }
347      %>
348      </h4>
349      </form>
350     
351      <tbl:toolbar>
352        <tbl:button 
353          image="columns.gif" 
354          onclick="configureReporterColumns()" 
355          title="Columns&hellip;" 
356          tooltip="Show, hide and re-order reporter columns" 
357        />
358      </tbl:toolbar>
359   
360    <div class="boxedbottom">
361    <tbl:table 
362      id="reporter" 
363      clazz="form" 
364      columns="<%=Values.getString(cc.getSetting("reporter-columns"), defaultReporterColumns)%>"
365      action="index.jsp"
366      sc="<%=sc%>"
367      item="<%=itemType%>"
368      subcontext="<%=subContext%>"
369      >
370      <tbl:hidden 
371        name="bioassayset_id" 
372        value="<%=String.valueOf(bioAssaySetId)%>" 
373      />
374      <tbl:columndef id="name" title="Name" show="always" clazz="prompt"/>
375      <tbl:columndef id="externalId" title="External ID" clazz="prompt"/>
376      <tbl:columndef id="symbol" title="Gene symbol" clazz="prompt"/>
377      <tbl:columndef id="lastUpdate" title="Last update" clazz="prompt"/>
378      <tbl:columndef id="type" title="Type" clazz="prompt"/>
379      <tbl:columndef id="description" title="Description" clazz="prompt"/>
380      <%
381      List<ExtendedProperty> reporterProperties = ExtendedProperties.getProperties("ReporterData");
382      if (reporterProperties != null)
383      {
384        for (ExtendedProperty ep : reporterProperties)
385        {
386          String name = ep.getName();
387          Formatter formatter = FormatterFactory.getExtendedPropertyFormatter(sc, ep);
388          %>
389          <tbl:columndef 
390            id="<%=ep.getName()%>" 
391            title="<%=HTML.encodeTags(ep.getTitle())%>" 
392            clazz="prompt" 
393            formatter="<%=formatter%>"
394          />
395          <%
396        }
397      }
398      %>
399      <tbl:form width="2">
400        <tbl:cell column="name"><%=Base.getLink(ID, reporter.getName(), Item.REPORTER, reporter.getId(), true)%></tbl:cell>
401        <tbl:cell column="externalId"><%=HTML.encodeTags(reporter.getExternalId())%></tbl:cell>
402        <tbl:cell column="symbol"><%=HTML.encodeTags(reporter.getSymbol())%></tbl:cell>
403        <tbl:cell column="lastUpdate"><%=dateFormatter.format(reporter.getLastUpdate())%></tbl:cell>
404        <tbl:cell column="type"><base:propertyvalue dbcontrol="<%=dc%>" item="<%=reporter%>" property="reporterType" /></tbl:cell>
405        <tbl:cell column="description"><%=HTML.niceFormat(reporter.getDescription())%></tbl:cell>
406        <%
407        if (reporterProperties != null)
408        {
409          for (ExtendedProperty ep : reporterProperties)
410          {
411            String name = ep.getName();
412            Formatter formatter = FormatterFactory.getExtendedPropertyFormatter(sc, ep);
413            %>
414            <tbl:cell column="<%=ep.getName()%>"><tbl:cellvalue value="<%=reporter.getExtended(name)%>" /></tbl:cell>
415            <%
416          }
417        }
418        %>
419      </tbl:form>
420    </tbl:table>
421    </div>
422    <%
423    }
424    else
425    {
426      %>
427      No reporters found.
428      <%
429    }
430    %>
431   
432    <base:section
433      id="annotation"
434      title="<%="Annotation summary (" + selectedAnnotationTypes.size() + " selected)"%>"
435      context="<%=cc%>"
436      >
437      <form name="annotationSummary" action="index.jsp" method="POST" onsubmit="return false;">
438      <input type="hidden" name="ID" value="<%=ID%>">
439      <input type="hidden" name="bioassayset_id" value="<%=bioAssaySetId%>">
440      <input type="hidden" name="cmd" value="SetAnnotationType">
441
442        <table><tr><td>
443        <div class="multiselect">
444          <input type="text" class="text" size="40" name="display:annotationTypes"
445            title="Click to select experimental factor"><img class="smartimage" src="../../../../images/pull_down.gif" onclick="MultiOptions.activateAndDisplay('explorer','display:annotationTypes')"></div>
446          <input type="hidden" name="annotationtype_id" value="">
447          </td></tr></table>
448        <%
449        if (selectedAnnotationTypes.size() > 0)
450        {
451          for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
452          {
453            AnnotationType at = entry.getKey();
454            AnnotationSummary summary = entry.getValue();
455            %>
456            <table border="0" cellspacing="0" cellpadding="2" class="annotationsummary">
457            <tr>
458              <td class="summaryheader"><%=Base.getLinkedName(ID, at, false, true)%></td>
459              <%
460              for (AnnotationGroup ag : summary.getAnnotationGroups())
461              {
462                %>
463                <td class="groupheader" style="background: <%=ag.getColor()%>;" width="50px">
464                <%=ag.getTitle()%>
465                </td>
466                <%
467              }
468              %>
469              </tr>
470              <%
471              for (int ch = 1; ch <= channels; ++ch)
472              {
473                %>
474                <tr>
475                <td>Mean ch <%=ch%> int.</td>
476                <%
477                for (AnnotationGroup ag : summary.getAnnotationGroups())
478                {
479                  %>
480                  <td class="value" style="background: <%=ag.getColor()%>;"><div id="mean.<%=at.getId()%>.<%=ag.getId()%>.ch<%=ch%>"><%=ag.getMean(ch)%></div></td>
481                  <%
482                }
483                %>
484                </tr>
485                <%
486              }
487              if (hasRatio)
488              {
489                %>
490                <tr>
491                <td title="The geometric mean of the ratios">G. mean ratio</td>
492                <%
493                for (AnnotationGroup ag : summary.getAnnotationGroups())
494                {
495                  %>
496                  <td class="value" style="background: <%=ag.getColor()%>;"><div id="gmean.<%=at.getId()%>.<%=ag.getId()%>"></div></td>
497                  <%
498                }
499                %>
500                </tr>
501                <tr>
502                <td title="Standard deviation of log2 ratios">log2ratio SD</td>
503                <%
504                for (AnnotationGroup ag : summary.getAnnotationGroups())
505                {
506                  %>
507                  <td class="value" style="background: <%=ag.getColor()%>;"><div id="sd.<%=at.getId()%>.<%=ag.getId()%>"></div></td>
508                  <%
509                }
510                %>
511                </tr>
512                <tr>
513                <td title="The number of spots falling in this group">Count</td>
514                <%
515                for (AnnotationGroup ag : summary.getAnnotationGroups())
516                {
517                  %>
518                  <td class="value" style="background: <%=ag.getColor()%>;"><div id="count.<%=at.getId()%>.<%=ag.getId()%>">0</div></td>
519                  <%
520                }
521                %>
522                </tr>
523                <%
524              }
525              %>
526            </table>
527            <%
528          }
529        }
530        %>
531        </form>
532    </base:section>
533
534    <form name="spotIndex" action="index.jsp" method="post">
535    <input type="hidden" name="ID" value="<%=ID%>">
536    <input type="hidden" name="bioassayset_id" value="<%=bioAssaySetId%>">
537    <input type="hidden" name="cmd" value="SetSpotIndex">
538   
539      <h4 class="docked">Current spot
540      <input name="newSpotIndex" type="text" class="text" value="<%=positionIndex == -1 ? "all" : positionIndex == -2 ? "avg" : String.valueOf(positionIndex+1)%>" 
541        onkeypress="return Numbers.integerOnly(event, true, validateSpotIndex)"
542        size="6" maxlength="8" title="Enter a number between 1 and <%=matchingPositions%>">
543        of <%=matchingPositions%>
544     
545        <%
546        if (positionIndex == 0)
547        {
548          %>
549          <base:icon image="first_gray.gif" />
550          <%
551        }
552        else
553        {
554          %>
555          <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=0"
556            title="Go the first position"><base:icon image="first.gif" /></a>
557          <%
558        }
559        if (positionIndex <= 0)
560        {
561          %>
562          <base:icon image="previous_gray.gif" />
563          <%
564        }
565        else
566        {
567          %>
568          <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=positionIndex-1%>"
569            title="Go the previous position"><base:icon image="previous.gif" /></a>
570          <%
571        }
572        %>
573        &nbsp;&nbsp;
574        <%
575        if (positionIndex == matchingPositions - 1 || positionIndex < 0)
576        {
577          %>
578          <base:icon image="next_gray.gif" />
579          <%
580        }
581        else
582        {
583          %>
584          <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=positionIndex+1%>"
585            title="Go the next position"><base:icon image="next.gif" /></a>
586          <%
587        }
588        if (positionIndex == matchingPositions - 1)
589        {
590          %>
591          <base:icon image="last_gray.gif" />
592          <%
593        }
594        else
595        {
596          %>
597          <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=matchingPositions-1%>"
598            title="Go the last position"><base:icon image="last.gif" /></a>
599          <%
600        }
601        %>
602        [ <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=-1"
603          title="Show all positions">all</a>
604        | <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=-2"
605          title="Calculate average values for each bioassay">avg</a>
606        ]
607        </h4>
608     
609      </form>
610    <%
611    if (cc.getMessage() != null)
612    {
613      %>
614      <div class="error"><%=cc.getMessage()%></div>
615      <%
616      cc.setMessage(null);
617    }
618    %>
619   
620    <%
621    if (spotData != null)
622    {
623      Formatter<Number> numberFormatter = FormatterFactory.getNumberFormatter(sc);
624      %>
625
626    <tbl:table 
627      id="spotdata" 
628      clazz="itemlist" 
629      columns="<%=cc.getSetting("columns")%>"
630      sortby="<%=cc.getSortProperty()%>" 
631      direction="<%=cc.getSortDirection()%>"
632      title="<%=title%>"
633      action="index.jsp"
634      sc="<%=sc%>"
635      item="<%=itemType%>"
636      subcontext="<%=subContext%>"
637      >
638      <tbl:hidden 
639        name="bioassayset_id" 
640        value="<%=String.valueOf(bioAssaySetId)%>" 
641      />
642      <%
643      for (AnnotationType at : selectedAnnotationTypes.keySet())
644      {
645        %>
646        <tbl:columndef
647          id="<%="annotation." + at.getId()%>"
648          title="<%=HTML.encodeTags(at.getName()) %>"
649          show="always"
650        />
651        <%
652      }
653      %>
654      <tbl:columndef
655        id="bioassay"
656        property="COLUMN"
657        title="Bioassay"
658        show="always"
659        sortable="true"
660      />
661      <tbl:columndef
662        id="position"
663        property="POSITION"
664        title="Position"
665        show="<%=isAveraging ? "never" : "always" %>"
666        sortable="true"
667      />
668      <tbl:columndef
669        id="count"
670        title="Count"
671        show="<%=isAveraging ? "always" : "never" %>"
672      />
673      <%
674      for (int ch = 1; ch <= channels; ++ch)
675      {
676        %>
677        <tbl:columndef
678          id="<%="ch"+ch%>"
679          property="<%="%"+ch%>"
680          datatype="float"
681          title="<%="Ch " + ch%>"
682          tooltip="<%=transform.isTransformed() ? transform.toString() : null %>"
683          sortable="true"
684          filterable="true"
685          exportable="true"
686          formatter="<%=numberFormatter%>"
687        />
688        <%
689      }
690      %>
691      <%
692      for (TableColumn tc : columns)
693      {
694        %>
695        <tbl:columndef
696          id="<%=tc.getId()%>"
697          property="<%=tc.getProperty()%>"
698          datatype="<%=tc.getDatatype().getStringValue()%>"
699          title="<%=HTML.encodeTags(tc.getTitle())%>"
700          sortable="<%=tc.getSortable()%>"
701          filterable="<%=tc.getFilterable()%>"
702          exportable="<%=tc.getExportable()%>"
703          show="<%=!isAveraging || tc.isAveragable() ? tc.getShow() : "never"%>"
704          formatter="<%=tc.getFormatter()%>"
705        />
706        <%
707      }
708      %>
709       
710      <tbl:toolbar>
711        <tbl:button 
712          image="columns.gif" 
713          onclick="configureColumns()" 
714          title="Columns&hellip;" 
715          tooltip="Show, hide and re-order columns" 
716        />
717        <tbl:button 
718          image="plotter.gif"
719          onclick="plotSpotData()"
720          title="Plot&hellip;"
721          tooltip="Plot selected data from this table"
722        />
723      </tbl:toolbar>
724      <tbl:data>
725        <tbl:columns />
726        <tbl:rows>
727        <%
728        int index = 0;
729        float[] intensity = new float[channels+1];
730        while (spotData.hasNext())
731        {
732          SqlResult item = spotData.next();
733          index++;
734          BioAssay bioAssay = explorer.getBioAssay(dc, item.getShort(1));
735          for (int ch = 1; ch <= channels; ++ch)
736          {
737            intensity[ch] = item.getFloat(2+ch);
738          }
739          %>
740          <tbl:row>
741            <%
742            for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
743            {
744              AnnotationType at = entry.getKey();
745              AnnotationGroup annotationGroup = entry.getValue().getAnnotationGroup(bioAssay.getDataCubeColumnNo());
746              String allValues = annotationGroup.getTitle();
747              if (hasRatio)
748              {
749                float logRatio = (float)(Math.log(transform.unTransform(intensity[1]) / transform.unTransform(intensity[2])));
750                annotationGroup.addStatistics("logratio", logRatio);
751                annotationGroup.addStatistics("logratio2", logRatio * logRatio);
752              }
753              for (int ch = 1; ch <= channels; ++ch)
754              {
755                annotationGroup.addValue(ch, (float)transform.unTransform(intensity[ch]));
756              }
757              %>
758              <tbl:cell column="<%="annotation."+at.getId()%>" style="<%="background: "+annotationGroup.getColor()+";"%>">
759              <%=allValues%>
760              </tbl:cell>
761              <%
762            }
763            %>
764            <tbl:cell column="bioassay"><%=Base.getLinkedName(ID, bioAssay, false, true)%></tbl:cell>
765            <tbl:cell column="position"><%=item.getInt(2)%></tbl:cell>
766            <tbl:cell column="count"><%=item.getInt(2)%></tbl:cell>
767            <%
768            for (int ch = 1; ch <= channels; ++ch)
769            {
770              %>
771              <tbl:cell column="<%="ch" + ch%>" value="<%=intensity[ch]%>" />
772              <%
773            }
774            %>
775            <%
776            int colIndex = 3 + channels;
777            for (String columnId : selected.selectedIds)
778            {
779              %>
780              <tbl:cell column="<%=columnId%>" value="<%=item.getObject(colIndex++)%>" />
781              <%
782            }
783            %>
784          </tbl:row>
785          <%
786        }
787      %>
788      </tbl:rows>
789      </tbl:data>
790      </tbl:table>
791      </div>
792      <%
793      }
794      %>
795      <script language="JavaScript" defer="defer">
796      <%
797      for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
798      {
799        AnnotationType at = entry.getKey();
800        AnnotationSummary summary = entry.getValue();
801        %>
802        <%
803        for (AnnotationGroup ag : summary.getAnnotationGroups())
804        {
805          for (int ch = 1; ch <= channels; ++ch)
806          {
807            %>
808            var div = document.getElementById('mean.<%=at.getId()%>.<%=ag.getId()%>.ch<%=ch%>');
809            div.innerHTML = '<%=Values.formatNumber(ag.getMean(ch), 2)%>';
810            <%
811          }
812          %>
813          var div = document.getElementById('count.<%=at.getId()%>.<%=ag.getId()%>');
814          div.innerHTML = '<%=ag.getCount(1)%>';
815          <%
816          if (hasRatio)
817          {
818            float r = ag.getStatistics("logratio");
819            int count = ag.getCount(1);
820            float gMean = count > 0 ? (float)Math.exp(r / count) : Float.NaN;
821            float sd = count > 1 ? 
822              (float)Math.sqrt((ag.getStatistics("logratio2") - r * (r / count))/(count-1))
823              : Float.NaN;
824            %>
825            var div = document.getElementById('gmean.<%=at.getId()%>.<%=ag.getId()%>');
826            div.innerHTML = '<%=Values.formatNumber(gMean, 2)%>';
827            var div = document.getElementById('sd.<%=at.getId()%>.<%=ag.getId()%>');
828            div.innerHTML = '<%=Values.formatNumber(sd, 2)%>';
829            <%
830          }
831        }
832      }
833      %>
834      MultiOptions.init();
835      var options = new Array();
836      <%
837      if (annotationTypes != null)
838      {
839        for (AnnotationType at : annotationTypes)
840        {
841          String isSelected = selectedAnnotationTypes.containsKey(at) ? "true" : "false";
842          %>
843          options[options.length] = {key:'<%=at.getId()%>', value:'<%=HTML.javaScriptEncode(at.getName())%>', selected:<%=isSelected%>};
844          <%
845        }
846      }
847      %>
848      MultiOptions.enableForField('annotationSummary', 'display:annotationTypes', 'annotationtype_id', 1, options);
849      </script>
850     
851      </t:tab>
852      </t:tabcontrol>
853
854  </base:body>
855  </base:page>
856  <%
857}
858finally
859{
860  if (spotData != null) spotData.close();
861  if (dc != null) dc.close();
862}
863
864%>
Note: See TracBrowser for help on using the repository browser.