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

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

References #1655: GUI improvements

  • Selection list for filtering tables
  • Minor issues with experiment explorer
  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 28.7 KB
Line 
1<%-- $Id: view.jsp 5959 2012-02-14 13:43:44Z 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            style="width: 6em;" 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        />
404        <%
405        for (TableColumn tc : reporterColumns)
406        {
407          %>
408          <tbl:columndef
409            id="<%=tc.getId()%>"
410            title="<%=HTML.encodeTags(tc.getTitle())%>"
411            formatter="<%=tc.getFormatter()%>"
412            show="<%=reporter == null ? "never" : "auto" %>"
413          />
414          <%
415        }
416        List<ExtendedProperty> reporterProperties = ExtendedProperties.getProperties("ReporterData");
417        %>
418        <tbl:form width="2" clazz="fullform special">
419          <tbl:cell column="filter"><%=HTML.encodeTags(filter)%></tbl:cell>
420          <tbl:cell column="id"><%=reporter.getId()%></tbl:cell>
421          <tbl:cell column="version"><%=reporter.getVersion()%></tbl:cell>
422          <tbl:cell column="name"><%=Base.getLink(ID, reporter.getName(), Item.REPORTER, reporter.getId(), true)%></tbl:cell>
423          <tbl:cell column="externalId"><%=Base.getLink(ID, reporter.getExternalId(), Item.REPORTER, reporter.getId(), true)%></tbl:cell>
424          <tbl:cell column="symbol"><%=HTML.encodeTags(reporter.getSymbol())%></tbl:cell>
425          <tbl:cell column="lastUpdate"><%=dateTimeFormatter.format(reporter.getLastUpdate())%></tbl:cell>
426          <tbl:cell column="lastSource"><%=HTML.encodeTags(reporter.getLastSource())%></tbl:cell>
427          <tbl:cell column="entryDate"><%=dateFormatter.format(reporter.getEntryDate()) %></tbl:cell>
428          <tbl:cell column="type"><base:propertyvalue dbcontrol="<%=dc%>" item="<%=reporter%>" property="reporterType" /></tbl:cell>
429          <tbl:cell column="description"><%=HTML.niceFormat(reporter.getDescription())%></tbl:cell>
430          <%
431          if (reporterProperties != null)
432          {
433            for (ExtendedProperty ep : reporterProperties)
434            {
435              String name = ep.getName();
436              %>
437              <tbl:cell column="<%=ep.getName()%>"><tbl:cellvalue value="<%=reporter.getExtended(name)%>" /></tbl:cell>
438              <%
439            }
440          }
441          %>
442        </tbl:form>
443      </tbl:table>
444 
445    <base:section
446      id="annotation"
447      title="<%="Annotation summary (" + selectedAnnotationTypes.size() + " selected)"%>"
448      context="<%=cc%>"
449      style="border-bottom: 0px;"
450      >
451      <form name="annotationSummary" action="index.jsp" method="POST" onsubmit="return false;">
452      <input type="hidden" name="ID" value="<%=ID%>">
453      <input type="hidden" name="bioassayset_id" value="<%=bioAssaySetId%>">
454      <input type="hidden" name="cmd" value="SetAnnotationType">
455        <div class="multiselect" style="width: 25em;">
456          <table>
457          <tr>
458            <td><input type="text" class="text" name="display:annotationTypes" title="Click to select experimental factor"></td>
459            <td class="dropdown"><img 
460              src="../../../../images/mini_scroll_down.png" 
461              onclick="MultiOptions.activateAndDisplay('annotationSummary','display:annotationTypes')"></td>
462            </td>
463            </tr>
464          </table>
465          <input type="hidden" name="annotationtype_id" value="">
466        </div>
467          <%
468          for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
469          {
470            AnnotationType at = entry.getKey();
471            AnnotationSummary summary = entry.getValue();
472            %>
473            <table class="annotationsummary">
474            <tr>
475              <td class="summaryheader"><%=Base.getLinkedName(ID, at, false, true)%></td>
476              <td class="plotheader"><base:icon
477                image="plotter.png"
478                onclick="<%="annotationPlot(" + at.getId() + ")"%>"
479                tooltip="Box plot for selected spot data per annotation group"
480              /></td>
481              <%
482              for (AnnotationGroup ag : summary.getAnnotationGroups())
483              {
484                %>
485                <td class="groupheader" style="background: <%=ag.getColor()%>;">
486                <%=ag.getTitle()%>
487                </td>
488                <%
489              }
490              %>
491              </tr>
492              <%
493              for (int ch = 1; ch <= channels; ++ch)
494              {
495                %>
496                <tr>
497                <td colspan="2">Mean ch <%=ch%> int.</td>
498                <%
499                for (AnnotationGroup ag : summary.getAnnotationGroups())
500                {
501                  %>
502                  <td class="value" style="background: <%=ag.getColor()%>;"
503                    id="mean.<%=at.getId()%>.<%=ag.getId()%>.ch<%=ch%>"></td>
504                  <%
505                }
506                %>
507                </tr>
508                <%
509              }
510              if (hasRatio)
511              {
512                %>
513                <tr>
514                <td colspan="2" title="The geometric mean of the ratios">G. mean ratio</td>
515                <%
516                for (AnnotationGroup ag : summary.getAnnotationGroups())
517                {
518                  %>
519                  <td class="value" style="background: <%=ag.getColor()%>;"
520                    id="gmean.<%=at.getId()%>.<%=ag.getId()%>"></td>
521                  <%
522                }
523                %>
524                </tr>
525                <tr>
526                <td colspan="2" title="Standard deviation of log2 ratios">log2ratio SD</td>
527                <%
528                for (AnnotationGroup ag : summary.getAnnotationGroups())
529                {
530                  %>
531                  <td class="value" style="background: <%=ag.getColor()%>;"
532                    id="sd.<%=at.getId()%>.<%=ag.getId()%>"></td>
533                  <%
534                }
535                %>
536                </tr>
537                <%
538              }
539              %>
540              <tr>
541              <td colspan="2" title="The number of spots falling in this group">Count</td>
542              <%
543              for (AnnotationGroup ag : summary.getAnnotationGroups())
544              {
545                %>
546                <td class="value" style="background: <%=ag.getColor()%>;"
547                  id="count.<%=at.getId()%>.<%=ag.getId()%>"></td>
548                <%
549              }
550              %>
551              </tr>
552            </table>
553          <%
554          }
555        %>
556      </form>
557    </base:section>
558
559    <%
560    if (cc.getMessage() != null)
561    {
562      %>
563      <div class="messagecontainer error"><%=HTML.encodeTags(cc.getMessage())%></div>
564      <%
565      cc.setMessage(null);
566    }
567    %>
568   
569    <%
570    if (spotData != null)
571    {
572      Formatter<Number> numberFormatter = FormatterFactory.getNumberFormatter(sc);
573      %>
574      <form name="spotIndex" action="index.jsp" method="post">
575      <input type="hidden" name="ID" value="<%=ID%>">
576      <input type="hidden" name="bioassayset_id" value="<%=bioAssaySetId%>">
577      <input type="hidden" name="cmd" value="SetSpotIndex">
578      <tbl:toolbar subclass="topborder">
579        <tbl:label style="padding: 0px 2px 0px 6px;">
580        Current spot
581        <input name="newSpotIndex" type="text" class="text" value="<%=positionIndex == -1 ? "all" : positionIndex == -2 ? "avg" : String.valueOf(positionIndex+1)%>" 
582          onkeypress="return Numbers.integerOnly(event, true, validateSpotIndex)"
583          size="6" maxlength="8" title="Enter a number between 1 and <%=matchingPositions%>">
584          of <%=matchingPositions%>
585       
586          <%
587          if (positionIndex <= 0)
588          {
589            %>
590            <base:icon image="first.png" enabled="false" />
591            <base:icon image="previous.png" enabled="false" />
592            <%
593          }
594          else
595          {
596            %>
597            <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=0"
598              title="Go the first position"><base:icon image="first.png" /></a>
599            <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=positionIndex-1%>"
600              title="Go the previous position"><base:icon image="previous.png" /></a>
601            <%
602          }
603          %>
604          &nbsp;&nbsp;
605          <%
606          if (positionIndex == matchingPositions - 1 || positionIndex < 0)
607          {
608            %>
609            <base:icon image="next.png" enabled="false" />
610            <%
611          }
612          else
613          {
614            %>
615            <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=positionIndex+1%>"
616              title="Go the next position"><base:icon image="next.png" /></a>
617            <%
618          }
619          if (positionIndex == matchingPositions - 1)
620          {
621            %>
622            <base:icon image="last.png" enabled="false" />
623            <%
624          }
625          else
626          {
627            %>
628            <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=<%=matchingPositions-1%>"
629              title="Go the last position"><base:icon image="last.png" /></a>
630            <%
631          }
632          %>
633          [ <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=-1"
634            title="Show all positions">all</a>
635          | <a href="index.jsp?ID=<%=ID%>&cmd=SetSpotIndex&bioassayset_id=<%=bioAssaySetId%>&spotIndex=-2"
636            title="Calculate average values for each bioassay">avg</a>
637          ]
638        </tbl:label>
639        <tbl:button 
640          image="columns.png" 
641          onclick="configureColumns()" 
642          title="Columns&hellip;" 
643          tooltip="Show, hide and re-order columns" 
644        />
645        <tbl:button 
646          image="plotter.png"
647          onclick="assayPlot()"
648          title="Plot&hellip;"
649          tooltip="Plot selected data from this table"
650        />
651      </tbl:toolbar>
652      </form>
653      <tbl:table 
654        id="spotdata" 
655        columns="<%=cc.getSetting("columns")%>"
656        sortby="<%=cc.getSortProperty()%>" 
657        direction="<%=cc.getSortDirection()%>"
658        action="index.jsp"
659        sc="<%=sc%>"
660        item="<%=itemType%>"
661        subcontext="<%=subContext%>"
662        >
663        <tbl:hidden 
664          name="bioassayset_id" 
665          value="<%=String.valueOf(bioAssaySetId)%>" 
666        />
667        <%
668        for (AnnotationType at : selectedAnnotationTypes.keySet())
669        {
670          %>
671          <tbl:columndef
672            id="<%="annotation." + at.getId()%>"
673            title="<%=HTML.encodeTags(at.getName()) %>"
674            show="always"
675          />
676          <%
677        }
678        %>
679        <tbl:columndef
680          id="bioassay"
681          property="COLUMN"
682          title="Bioassay"
683          show="always"
684          sortable="true"
685        />
686        <tbl:columndef
687          id="position"
688          property="POSITION"
689          title="Position"
690          show="<%=isAveraging ? "never" : "always" %>"
691          sortable="true"
692        />
693        <tbl:columndef
694          id="count"
695          title="Count"
696          show="<%=isAveraging ? "always" : "never" %>"
697        />
698        <%
699        for (int ch = 1; ch <= channels; ++ch)
700        {
701          %>
702          <tbl:columndef
703            id="<%="ch"+ch%>"
704            property="<%="%"+ch%>"
705            datatype="float"
706            title="<%="Ch " + ch%>"
707            tooltip="<%=transform.isTransformed() ? transform.toString() : null %>"
708            sortable="true"
709            filterable="true"
710            exportable="true"
711            formatter="<%=numberFormatter%>"
712          />
713          <%
714        }
715        %>
716        <%
717        for (TableColumn tc : spotColumns)
718        {
719          %>
720          <tbl:columndef
721            id="<%=tc.getId()%>"
722            property="<%=tc.getProperty()%>"
723            datatype="<%=tc.getDatatype().getStringValue()%>"
724            title="<%=HTML.encodeTags(tc.getTitle())%>"
725            sortable="<%=tc.getSortable()%>"
726            filterable="<%=tc.getFilterable()%>"
727            exportable="<%=tc.getExportable()%>"
728            show="<%=!isAveraging || tc.isAveragable() ? tc.getShow() : "never"%>"
729            formatter="<%=tc.getFormatter()%>"
730          />
731          <%
732        }
733        %>
734        <tbl:data style="border-left: 0px; border-right: 0px;">
735          <tbl:headers>
736            <tbl:headerrow>
737              <tbl:columnheaders />
738            </tbl:headerrow>
739          </tbl:headers>
740          <tbl:rows>
741          <%
742          int index = 0;
743          float[] intensity = new float[channels+1];
744          while (spotData.hasNext())
745          {
746            SqlResult item = spotData.next();
747            index++;
748            BioAssay bioAssay = explorer.getBioAssay(dc, item.getShort(1));
749            for (int ch = 1; ch <= channels; ++ch)
750            {
751              intensity[ch] = item.getFloat(2+ch);
752            }
753            %>
754            <tbl:row>
755              <%
756              for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
757              {
758                AnnotationType at = entry.getKey();
759                AnnotationGroup annotationGroup = entry.getValue().getAnnotationGroup(bioAssay.getDataCubeColumnNo());
760                String allValues = annotationGroup.getTitle();
761                if (hasRatio)
762                {
763                  float logRatio = (float)(Math.log(transform.unTransform(intensity[1]) / transform.unTransform(intensity[2])));
764                  annotationGroup.addStatistics("logratio", logRatio);
765                  annotationGroup.addStatistics("logratio2", logRatio * logRatio);
766                }
767                for (int ch = 1; ch <= channels; ++ch)
768                {
769                  annotationGroup.addValue(ch, (float)transform.unTransform(intensity[ch]));
770                }
771                %>
772                <tbl:cell column="<%="annotation."+at.getId()%>" style="<%="background: "+annotationGroup.getColor()+";"%>">
773                <%=allValues%>
774                </tbl:cell>
775                <%
776              }
777              %>
778              <tbl:cell column="bioassay"><%=Base.getLinkedName(ID, bioAssay, false, true)%></tbl:cell>
779              <tbl:cell column="position"><%=item.getInt(2)%></tbl:cell>
780              <tbl:cell column="count"><%=item.getInt(2)%></tbl:cell>
781              <%
782              for (int ch = 1; ch <= channels; ++ch)
783              {
784                %>
785                <tbl:cell column="<%="ch" + ch%>" value="<%=intensity[ch]%>" />
786                <%
787              }
788              %>
789              <%
790              int colIndex = 3 + channels;
791              for (String columnId : selected.selectedIds)
792              {
793                %>
794                <tbl:cell column="<%=columnId%>" value="<%=item.getObject(colIndex++)%>" />
795                <%
796              }
797              %>
798            </tbl:row>
799            <%
800          }
801        %>
802        </tbl:rows>
803        </tbl:data>
804      </tbl:table>
805      <%
806      }
807      %>
808      <script language="JavaScript">
809      function init()
810      {
811        <%
812        for (Map.Entry<AnnotationType, AnnotationSummary> entry : selectedAnnotationTypes.entrySet())
813        {
814          AnnotationType at = entry.getKey();
815          AnnotationSummary summary = entry.getValue();
816          if (summary != null)
817          {
818            for (AnnotationGroup ag : summary.getAnnotationGroups())
819            {
820              for (int ch = 1; ch <= channels; ++ch)
821              {
822                %>
823                var div = document.getElementById('mean.<%=at.getId()%>.<%=ag.getId()%>.ch<%=ch%>');
824                div.innerHTML = '<%=Values.formatNumber(ag.getMean(ch), 2)%>';
825                <%
826              }
827              %>
828              var div = document.getElementById('count.<%=at.getId()%>.<%=ag.getId()%>');
829              div.innerHTML = '<%=ag.getCount(1)%>';
830              <%
831              if (hasRatio)
832              {
833                float r = ag.getStatistics("logratio");
834                int count = ag.getCount(1);
835                float gMean = count > 0 ? (float)Math.exp(r / count) : Float.NaN;
836                float sd = count > 1 ? 
837                  (float)Math.sqrt((ag.getStatistics("logratio2") - r * (r / count))/(count-1))
838                  : Float.NaN;
839                %>
840                var div = document.getElementById('gmean.<%=at.getId()%>.<%=ag.getId()%>');
841                div.innerHTML = '<%=Values.formatNumber(gMean, 2)%>';
842                var div = document.getElementById('sd.<%=at.getId()%>.<%=ag.getId()%>');
843                div.innerHTML = '<%=Values.formatNumber(sd, 2)%>';
844                <%
845              }
846            }
847          }
848        }
849        %>
850        MultiOptions.init();
851        var options = new Array();
852        <%
853        if (annotationTypes != null)
854        {
855          for (AnnotationType at : annotationTypes)
856          {
857            String isSelected = selectedAnnotationTypes.containsKey(at) ? "true" : "false";
858            %>
859            options[options.length] = {key:'<%=at.getId()%>', value:'<%=HTML.javaScriptEncode(at.getName())%>', selected:<%=isSelected%>};
860            <%
861          }
862        }
863        %>
864        MultiOptions.enableForField('annotationSummary', 'display:annotationTypes', 'annotationtype_id', 1, options);
865      }
866      Main.onLoad(init);
867      </script>
868      <%
869    }
870    %>
871    </t:tab>
872    </t:tabcontrol>
873
874  </base:body>
875  </base:page>
876  <%
877}
878finally
879{
880  if (spotData != null) spotData.close();
881  if (dc != null) dc.close();
882}
883
884%>
Note: See TracBrowser for help on using the repository browser.