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

Last change on this file since 6833 was 6833, checked in by Nicklas Nordborg, 7 years ago

References #1912: Add more filter rows in list pages

Fixes a NPE in experiment explorer when there is no reporter filter.

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