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

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

References #1120: The dynamic part of BASE should keep track whether intensity data is in log space or not

Fixes for spot data listings and experiment explorer.

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