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

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

References #1383: Make it possible to select more than one annotation in experiment explorer

Fixed a problem were the wrong annotation type was selected if the ID > 9.
Fixed non-working onclick handler for the "arrow-down" icon in the selection list.

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