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

Last change on this file since 5952 was 5952, checked in by Nicklas Nordborg, 11 years ago

References #1655: GUI improvements

List page in the View menu

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