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

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

Fixes #1380 and #1381: Customize visible reporter fields in experiment explorer

This was implemented by extending the 'table' taglib with a 'form'-like layout. This means that we can use the existing 'Configure columns' dialog box with almost no modifications. As a side-effect ticket #1381 is also fixed because the string "truncation" is built into the table taglib.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 26.7 KB
Line 
1<%-- $Id: view.jsp 5111 2009-09-30 10:56:51Z 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  </script>
257  </base:head>
258  <base:body>
259    <p>
260    <p:path>
261      <p:pathelement title="Experiments" href="<%="../../index.jsp?ID="+ID%>" />
262      <p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
263        href="<%="../../bioassaysets/index.jsp?ID="+ID+"&experiment_id="+experiment.getId()%>" />
264      <p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>" 
265        href="<%="../../bioassaysets/index.jsp?ID="+ID+"&cmd=ViewItem&item_id="+bioAssaySetId%>" />
266      <p:pathelement title="Explorer" />
267    </p:path>
268   
269    <t:tabcontrol id="explorer" switch="switchTab" remember="false" active="view">
270    <t:tab id="search" title="Reporter search" />
271   
272    <t:tab id="view" title="Reporter view">
273    <div class="boxed">
274   
275    <%
276    Collection<PropertyFilter> filters = reporterContext.getPropertyFilters();
277    String filter = filters != null && filters.size() > 0 ? 
278      "(" + Values.getString(filters, ") AND (", true).replaceAll("@|£", "") + ")" : "- none -";
279    %>
280    <table class="form">
281    <tr>
282      <td class="prompt">Filter</td>
283      <td>
284      <%=HTML.encodeTags(filter)%>
285      </td>
286    </tr>
287    </table>
288   
289   
290    <%
291    if (reporter != null)
292    {
293      %>
294      <form name="reporterIndex" action="index.jsp" method="post">
295      <input type="hidden" name="ID" value="<%=ID%>">
296      <input type="hidden" name="bioassayset_id" value="<%=bioAssaySetId%>">
297      <input type="hidden" name="cmd" value="SetReporterIndex">
298      <h4 class="docked">Current reporter
299            <input name="newReporterIndex" type="text" class="text" value="<%=reporterIndex+1%>" 
300        onkeypress="return Numbers.integerOnly(event, true, validateReporterIndex)"
301        size="6" maxlength="8" title="Enter a number between 1 and <%=matchingReporters%>">
302      of <%=matchingReporters %>
303      <%
304      if (reporterIndex == 0 || matchingReporters == 0)
305      {
306        %>
307        <base:icon image="first_gray.gif" />
308        <base:icon image="previous_gray.gif" />
309        <%
310      }
311      else
312      {
313        %>
314        <a href="index.jsp?ID=<%=ID%>&cmd=SetReporterIndex&bioassayset_id=<%=bioAssaySetId%>&reporterIndex=0"
315          title="Go the first reporter"><base:icon image="first.gif" /></a>
316        <a href="index.jsp?ID=<%=ID%>&cmd=SetReporterIndex&bioassayset_id=<%=bioAssaySetId%>&reporterIndex=<%=reporterIndex-1%>"
317          title="Go the previous reporter"><base:icon image="previous.gif" /></a>
318        <%
319      }
320      %>
321      &nbsp;&nbsp;
322      <%
323      if (reporterIndex == matchingReporters - 1 || matchingReporters == 0)
324      {
325        %>
326        <base:icon image="next_gray.gif" />
327        <base:icon image="last_gray.gif" />
328        <%
329      }
330      else
331      {
332        %>
333        <a href="index.jsp?ID=<%=ID%>&cmd=SetReporterIndex&bioassayset_id=<%=bioAssaySetId%>&reporterIndex=<%=reporterIndex+1%>"
334          title="Go the next reporter"><base:icon image="next.gif" /></a>
335        <a href="index.jsp?ID=<%=ID%>&cmd=SetReporterIndex&bioassayset_id=<%=bioAssaySetId%>&reporterIndex=<%=matchingReporters-1%>"
336          title="Go the last reporter"><base:icon image="last.gif" /></a>
337        <%
338      }
339      %>
340      </h4>
341      </form>
342     
343      <tbl:toolbar>
344        <tbl:button 
345          image="columns.gif" 
346          onclick="configureReporterColumns()" 
347          title="Columns&hellip;" 
348          tooltip="Show, hide and re-order reporter columns" 
349        />
350      </tbl:toolbar>
351   
352    <div class="boxedbottom">
353    <tbl:table 
354      id="reporter" 
355      clazz="form" 
356      columns="<%=Values.getString(cc.getSetting("reporter-columns"), defaultReporterColumns)%>"
357      action="index.jsp"
358      sc="<%=sc%>"
359      item="<%=itemType%>"
360      subcontext="<%=subContext%>"
361      >
362      <tbl:hidden 
363        name="bioassayset_id" 
364        value="<%=String.valueOf(bioAssaySetId)%>" 
365      />
366      <tbl:columndef id="name" title="Name" show="always" clazz="prompt"/>
367      <tbl:columndef id="externalId" title="External ID" clazz="prompt"/>
368      <tbl:columndef id="symbol" title="Gene symbol" clazz="prompt"/>
369      <tbl:columndef id="lastUpdate" title="Last update" clazz="prompt"/>
370      <tbl:columndef id="type" title="Type" clazz="prompt"/>
371      <tbl:columndef id="description" title="Description" clazz="prompt"/>
372      <%
373      List<ExtendedProperty> reporterProperties = ExtendedProperties.getProperties("ReporterData");
374      if (reporterProperties != null)
375      {
376        for (ExtendedProperty ep : reporterProperties)
377        {
378          String name = ep.getName();
379          Formatter formatter = FormatterFactory.getExtendedPropertyFormatter(sc, ep);
380          %>
381          <tbl:columndef 
382            id="<%=ep.getName()%>" 
383            title="<%=HTML.encodeTags(ep.getTitle())%>" 
384            clazz="prompt" 
385            formatter="<%=formatter%>"
386          />
387          <%
388        }
389      }
390      %>
391      <tbl:form width="2">
392        <tbl:cell column="name"><%=Base.getLink(ID, reporter.getName(), Item.REPORTER, reporter.getId(), true)%></tbl:cell>
393        <tbl:cell column="externalId"><%=HTML.encodeTags(reporter.getExternalId())%></tbl:cell>
394        <tbl:cell column="symbol"><%=HTML.encodeTags(reporter.getSymbol())%></tbl:cell>
395        <tbl:cell column="lastUpdate"><%=dateFormatter.format(reporter.getLastUpdate())%></tbl:cell>
396        <tbl:cell column="type"><base:propertyvalue dbcontrol="<%=dc%>" item="<%=reporter%>" property="reporterType" /></tbl:cell>
397        <tbl:cell column="description"><%=HTML.niceFormat(reporter.getDescription())%></tbl:cell>
398        <%
399        if (reporterProperties != null)
400        {
401          for (ExtendedProperty ep : reporterProperties)
402          {
403            String name = ep.getName();
404            Formatter formatter = FormatterFactory.getExtendedPropertyFormatter(sc, ep);
405            %>
406            <tbl:cell column="<%=ep.getName()%>"><tbl:cellvalue value="<%=reporter.getExtended(name)%>" /></tbl:cell>
407            <%
408          }
409        }
410        %>
411      </tbl:form>
412    </tbl:table>
413    </div>
414    <%
415    }
416    else
417    {
418      %>
419      No reporters found.
420      <%
421    }
422    %>
423   
424    <base:section
425      id="annotation"
426      title="<%="Annotation summary (" + selectedAnnotationTypes.size() + " selected)"%>"
427      context="<%=cc%>"
428      >
429      <form name="annotationSummary" action="index.jsp" method="POST" onsubmit="return false;">
430      <input type="hidden" name="ID" value="<%=ID%>">
431      <input type="hidden" name="bioassayset_id" value="<%=bioAssaySetId%>">
432      <input type="hidden" name="cmd" value="SetAnnotationType">
433
434        <table><tr><td>
435        <div class="multiselect">
436          <input type="text" class="text" size="40" name="display:annotationTypes"
437            title="Click to select experimental factor"><img class="smartimage" src="../../../../images/pull_down.gif" onclick="MultiOptions.activateAndDisplay('explorer','display:annotationTypes')"></div>
438          <input type="hidden" name="annotationtype_id" value="">
439          </td></tr></table>
440        <%
441        if (selectedAnnotationTypes.size() > 0)
442        {
443          for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
444          {
445            AnnotationType at = entry.getKey();
446            AnnotationSummary summary = entry.getValue();
447            %>
448            <table border="0" cellspacing="0" cellpadding="2" class="annotationsummary">
449            <tr>
450              <td class="summaryheader"><%=HTML.encodeTags(at.getName())%></td>
451              <%
452              for (AnnotationGroup ag : summary.getAnnotationGroups())
453              {
454                %>
455                <td class="groupheader" style="background: <%=ag.getColor()%>;" width="50px">
456                <%=ag.getTitle()%>
457                </td>
458                <%
459              }
460              %>
461              </tr>
462              <%
463              for (int ch = 1; ch <= channels; ++ch)
464              {
465                %>
466                <tr>
467                <td>Mean ch <%=ch%> int.</td>
468                <%
469                for (AnnotationGroup ag : summary.getAnnotationGroups())
470                {
471                  %>
472                  <td class="value" style="background: <%=ag.getColor()%>;"><div id="mean.<%=at.getId()%>.<%=ag.getId()%>.ch<%=ch%>"><%=ag.getMean(ch)%></div></td>
473                  <%
474                }
475                %>
476                </tr>
477                <%
478              }
479              if (hasRatio)
480              {
481                %>
482                <tr>
483                <td title="The geometric mean of the ratios">G. mean ratio</td>
484                <%
485                for (AnnotationGroup ag : summary.getAnnotationGroups())
486                {
487                  %>
488                  <td class="value" style="background: <%=ag.getColor()%>;"><div id="gmean.<%=at.getId()%>.<%=ag.getId()%>"></div></td>
489                  <%
490                }
491                %>
492                </tr>
493                <tr>
494                <td title="Standard deviation of log2 ratios">log2ratio SD</td>
495                <%
496                for (AnnotationGroup ag : summary.getAnnotationGroups())
497                {
498                  %>
499                  <td class="value" style="background: <%=ag.getColor()%>;"><div id="sd.<%=at.getId()%>.<%=ag.getId()%>"></div></td>
500                  <%
501                }
502                %>
503                </tr>
504                <tr>
505                <td title="The number of spots falling in this group">Count</td>
506                <%
507                for (AnnotationGroup ag : summary.getAnnotationGroups())
508                {
509                  %>
510                  <td class="value" style="background: <%=ag.getColor()%>;"><div id="count.<%=at.getId()%>.<%=ag.getId()%>">0</div></td>
511                  <%
512                }
513                %>
514                </tr>
515                <%
516              }
517              %>
518            </table>
519            <%
520          }
521        }
522        %>
523        </form>
524    </base:section>
525
526    <form name="spotIndex" action="index.jsp" method="post">
527    <input type="hidden" name="ID" value="<%=ID%>">
528    <input type="hidden" name="bioassayset_id" value="<%=bioAssaySetId%>">
529    <input type="hidden" name="cmd" value="SetSpotIndex">
530   
531      <h4 class="docked">Current spot
532      <input name="newSpotIndex" type="text" class="text" value="<%=positionIndex == -1 ? "all" : positionIndex == -2 ? "avg" : String.valueOf(positionIndex+1)%>" 
533        onkeypress="return Numbers.integerOnly(event, true, validateSpotIndex)"
534        size="6" maxlength="8" title="Enter a number between 1 and <%=matchingPositions%>">
535        of <%=matchingPositions%>
536     
537        <%
538        if (positionIndex == 0)
539        {
540          %>
541          <base:icon image="first_gray.gif" />
542          <%
543        }
544        else
545        {
546          %>
547          <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=0"
548            title="Go the first position"><base:icon image="first.gif" /></a>
549          <%
550        }
551        if (positionIndex <= 0)
552        {
553          %>
554          <base:icon image="previous_gray.gif" />
555          <%
556        }
557        else
558        {
559          %>
560          <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=positionIndex-1%>"
561            title="Go the previous position"><base:icon image="previous.gif" /></a>
562          <%
563        }
564        %>
565        &nbsp;&nbsp;
566        <%
567        if (positionIndex == matchingPositions - 1 || positionIndex < 0)
568        {
569          %>
570          <base:icon image="next_gray.gif" />
571          <%
572        }
573        else
574        {
575          %>
576          <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=positionIndex+1%>"
577            title="Go the next position"><base:icon image="next.gif" /></a>
578          <%
579        }
580        if (positionIndex == matchingPositions - 1)
581        {
582          %>
583          <base:icon image="last_gray.gif" />
584          <%
585        }
586        else
587        {
588          %>
589          <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=matchingPositions-1%>"
590            title="Go the last position"><base:icon image="last.gif" /></a>
591          <%
592        }
593        %>
594        [ <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=-1"
595          title="Show all positions">all</a>
596        | <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=-2"
597          title="Calculate average values for each bioassay">avg</a>
598        ]
599        </h4>
600     
601      </form>
602    <%
603    if (cc.getMessage() != null)
604    {
605      %>
606      <div class="error"><%=cc.getMessage()%></div>
607      <%
608      cc.setMessage(null);
609    }
610    %>
611   
612    <%
613    if (spotData != null)
614    {
615      Formatter<Number> numberFormatter = FormatterFactory.getNumberFormatter(sc);
616      %>
617
618    <tbl:table 
619      id="spotdata" 
620      clazz="itemlist" 
621      columns="<%=cc.getSetting("columns")%>"
622      sortby="<%=cc.getSortProperty()%>" 
623      direction="<%=cc.getSortDirection()%>"
624      title="<%=title%>"
625      action="index.jsp"
626      sc="<%=sc%>"
627      item="<%=itemType%>"
628      subcontext="<%=subContext%>"
629      >
630      <tbl:hidden 
631        name="bioassayset_id" 
632        value="<%=String.valueOf(bioAssaySetId)%>" 
633      />
634      <%
635      for (AnnotationType at : selectedAnnotationTypes.keySet())
636      {
637        %>
638        <tbl:columndef
639          id="<%="annotation." + at.getId()%>"
640          title="<%=HTML.encodeTags(at.getName()) %>"
641          show="always"
642        />
643        <%
644      }
645      %>
646      <tbl:columndef
647        id="bioassay"
648        property="COLUMN"
649        title="Bioassay"
650        show="always"
651        sortable="true"
652      />
653      <tbl:columndef
654        id="position"
655        property="POSITION"
656        title="Position"
657        show="<%=isAveraging ? "never" : "always" %>"
658        sortable="true"
659      />
660      <tbl:columndef
661        id="count"
662        title="Count"
663        show="<%=isAveraging ? "always" : "never" %>"
664      />
665      <%
666      for (int ch = 1; ch <= channels; ++ch)
667      {
668        %>
669        <tbl:columndef
670          id="<%="ch"+ch%>"
671          property="<%="%"+ch%>"
672          datatype="float"
673          title="<%="Ch " + ch%>"
674          tooltip="<%=transform.isTransformed() ? transform.toString() : null %>"
675          sortable="true"
676          filterable="true"
677          exportable="true"
678          formatter="<%=numberFormatter%>"
679        />
680        <%
681      }
682      %>
683      <%
684      for (TableColumn tc : columns)
685      {
686        %>
687        <tbl:columndef
688          id="<%=tc.getId()%>"
689          property="<%=tc.getProperty()%>"
690          datatype="<%=tc.getDatatype().getStringValue()%>"
691          title="<%=HTML.encodeTags(tc.getTitle())%>"
692          sortable="<%=tc.getSortable()%>"
693          filterable="<%=tc.getFilterable()%>"
694          exportable="<%=tc.getExportable()%>"
695          show="<%=!isAveraging || tc.isAveragable() ? tc.getShow() : "never"%>"
696          formatter="<%=tc.getFormatter()%>"
697        />
698        <%
699      }
700      %>
701       
702      <tbl:toolbar>
703        <tbl:button 
704          image="columns.gif" 
705          onclick="configureColumns()" 
706          title="Columns&hellip;" 
707          tooltip="Show, hide and re-order columns" 
708        />
709      </tbl:toolbar>
710      <tbl:data>
711        <tbl:columns />
712        <tbl:rows>
713        <%
714        int index = 0;
715        float[] intensity = new float[channels+1];
716        while (spotData.hasNext())
717        {
718          SqlResult item = spotData.next();
719          index++;
720          BioAssay bioAssay = explorer.getBioAssay(dc, item.getShort(1));
721          for (int ch = 1; ch <= channels; ++ch)
722          {
723            intensity[ch] = item.getFloat(2+ch);
724          }
725          %>
726          <tbl:row>
727            <%
728            for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
729            {
730              AnnotationType at = entry.getKey();
731              AnnotationGroup annotationGroup = entry.getValue().getAnnotationGroup(bioAssay.getDataCubeColumnNo());
732              String allValues = annotationGroup.getTitle();
733              if (hasRatio)
734              {
735                float logRatio = (float)(Math.log(transform.unTransform(intensity[1]) / transform.unTransform(intensity[2])));
736                annotationGroup.addStatistics("logratio", logRatio);
737                annotationGroup.addStatistics("logratio2", logRatio * logRatio);
738              }
739              for (int ch = 1; ch <= channels; ++ch)
740              {
741                annotationGroup.addValue(ch, (float)transform.unTransform(intensity[ch]));
742              }
743              %>
744              <tbl:cell column="<%="annotation."+at.getId()%>" style="<%="background: "+annotationGroup.getColor()+";"%>">
745              <%=allValues%>
746              </tbl:cell>
747              <%
748            }
749            %>
750            <tbl:cell column="bioassay"><%=Base.getLinkedName(ID, bioAssay, false, true)%></tbl:cell>
751            <tbl:cell column="position"><%=item.getInt(2)%></tbl:cell>
752            <tbl:cell column="count"><%=item.getInt(2)%></tbl:cell>
753            <%
754            for (int ch = 1; ch <= channels; ++ch)
755            {
756              %>
757              <tbl:cell column="<%="ch" + ch%>" value="<%=intensity[ch]%>" />
758              <%
759            }
760            %>
761            <%
762            int colIndex = 3 + channels;
763            for (String columnId : selected.selectedIds)
764            {
765              %>
766              <tbl:cell column="<%=columnId%>" value="<%=item.getObject(colIndex++)%>" />
767              <%
768            }
769            %>
770          </tbl:row>
771          <%
772        }
773      %>
774      </tbl:rows>
775      </tbl:data>
776      </tbl:table>
777      </div>
778      <%
779      }
780      %>
781      <script language="JavaScript" defer="defer">
782      <%
783      for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
784      {
785        AnnotationType at = entry.getKey();
786        AnnotationSummary summary = entry.getValue();
787        %>
788        <%
789        for (AnnotationGroup ag : summary.getAnnotationGroups())
790        {
791          for (int ch = 1; ch <= channels; ++ch)
792          {
793            %>
794            var div = document.getElementById('mean.<%=at.getId()%>.<%=ag.getId()%>.ch<%=ch%>');
795            div.innerHTML = '<%=Values.formatNumber(ag.getMean(ch), 2)%>';
796            <%
797          }
798          %>
799          var div = document.getElementById('count.<%=at.getId()%>.<%=ag.getId()%>');
800          div.innerHTML = '<%=ag.getCount(1)%>';
801          <%
802          if (hasRatio)
803          {
804            float r = ag.getStatistics("logratio");
805            int count = ag.getCount(1);
806            float gMean = count > 0 ? (float)Math.exp(r / count) : Float.NaN;
807            float sd = count > 1 ? 
808              (float)Math.sqrt((ag.getStatistics("logratio2") - r * (r / count))/(count-1))
809              : Float.NaN;
810            %>
811            var div = document.getElementById('gmean.<%=at.getId()%>.<%=ag.getId()%>');
812            div.innerHTML = '<%=Values.formatNumber(gMean, 2)%>';
813            var div = document.getElementById('sd.<%=at.getId()%>.<%=ag.getId()%>');
814            div.innerHTML = '<%=Values.formatNumber(sd, 2)%>';
815            <%
816          }
817        }
818      }
819      %>
820      MultiOptions.init();
821      var options = new Array();
822      <%
823      if (annotationTypes != null)
824      {
825        for (AnnotationType at : annotationTypes)
826        {
827          String isSelected = selectedAnnotationTypes.containsKey(at) ? "true" : "false";
828          %>
829          options[options.length] = {key:'<%=at.getId()%>', value:'<%=HTML.javaScriptEncode(at.getName())%>', selected:<%=isSelected%>};
830          <%
831        }
832      }
833      %>
834      MultiOptions.enableForField('annotationSummary', 'display:annotationTypes', 'annotationtype_id', 1, options);
835      </script>
836     
837      </t:tab>
838      </t:tabcontrol>
839
840  </base:body>
841  </base:page>
842  <%
843}
844finally
845{
846  if (spotData != null) spotData.close();
847  if (dc != null) dc.close();
848}
849
850%>
Note: See TracBrowser for help on using the repository browser.