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

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

References #903: Experiment Explorer is slow

Increased the cache to include all matching reporters and their positions. This means that we can get rid of 2 of the 3 queries that are loading spot/position information. I have no measurements of the performance increase, but the it feels a bit faster.

The initial caching of reporter/position information still takes some time. The information we need is very similar to Export 2 test in ticket #1238 and the time needed is about the same as after the fix from [4807].

The loading of spot data also takes some time when the number of bioassays grow large. I get around 3 seconds for 80 bioassays on 'auster'.

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