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

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

Fixes #649 and #674

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