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

Last change on this file since 7635 was 7635, checked in by Nicklas Nordborg, 3 years ago

References #2136: Remove support for spot images

Removed spot-image related functionality from the web client.

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