source: branches/3.4-stable/www/views/experiments/bioassays/list_bioassays.jsp @ 6780

Last change on this file since 6780 was 6780, checked in by Nicklas Nordborg, 8 years ago

Fixes #1929: Add 'none' option in annotation filters

  • Property svn:eol-style set to native
  • Property svn:keywords set to Date Id
File size: 19.6 KB
Line 
1<%-- $Id: list_bioassays.jsp 6780 2015-03-18 06:53:09Z nicklas $
2  ------------------------------------------------------------------
3  Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Martin Svensson
4  Copyright (C) 2007 Johan Enell
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.Experiment"
32  import="net.sf.basedb.core.BioAssaySet"
33  import="net.sf.basedb.core.BioAssay"
34  import="net.sf.basedb.core.RawBioAssay"
35  import="net.sf.basedb.core.AnnotationSet"
36  import="net.sf.basedb.core.AnnotationType"
37  import="net.sf.basedb.core.Annotation"
38  import="net.sf.basedb.core.ItemQuery"
39  import="net.sf.basedb.core.ItemResultIterator"
40  import="net.sf.basedb.core.ItemResultList"
41  import="net.sf.basedb.core.Permission"
42  import="net.sf.basedb.core.PluginDefinition"
43  import="net.sf.basedb.core.PermissionDeniedException"
44  import="net.sf.basedb.core.RawDataType"
45  import="net.sf.basedb.core.Type"
46  import="net.sf.basedb.core.Include"
47  import="net.sf.basedb.core.query.Restrictions"
48  import="net.sf.basedb.core.query.Expressions"
49  import="net.sf.basedb.core.query.Orders"
50  import="net.sf.basedb.core.query.Hql"
51  import="net.sf.basedb.core.plugin.GuiContext"
52  import="net.sf.basedb.core.plugin.Plugin"
53  import="net.sf.basedb.core.snapshot.AnnotationLoaderUtil"
54  import="net.sf.basedb.core.snapshot.AnnotationTypeFilter"
55  import="net.sf.basedb.core.snapshot.AnnotationSnapshot"
56  import="net.sf.basedb.core.snapshot.AnnotationSetSnapshot"
57  import="net.sf.basedb.core.snapshot.SnapshotManager"
58  import="net.sf.basedb.util.Tree"
59  import="net.sf.basedb.util.Enumeration"
60  import="net.sf.basedb.util.BioAssaySetUtil"
61  import="net.sf.basedb.clients.web.Base"
62  import="net.sf.basedb.clients.web.ModeInfo"
63  import="net.sf.basedb.clients.web.PermissionUtil"
64  import="net.sf.basedb.clients.web.util.HTML"
65  import="net.sf.basedb.util.Values"
66  import="net.sf.basedb.util.formatter.Formatter"
67  import="net.sf.basedb.clients.web.formatter.FormatterFactory"
68  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
69  import="net.sf.basedb.clients.web.extensions.JspContext"
70  import="net.sf.basedb.clients.web.extensions.renderer.PrefixSuffixRenderer"
71  import="net.sf.basedb.clients.web.extensions.toolbar.ToolbarUtil"
72  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
73  import="java.util.List"
74  import="java.util.LinkedList"
75  import="java.util.ArrayList"
76  import="java.util.Map"
77  import="java.util.HashMap"
78  import="java.util.Iterator"
79  import="java.util.Collection"
80%>
81<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
82<%@ taglib prefix="tbl" uri="/WEB-INF/table.tld" %>
83<%@ taglib prefix="t" uri="/WEB-INF/tab.tld" %>
84<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
85<%@ taglib prefix="ext" uri="/WEB-INF/extensions.tld" %>
86<%!
87  private static final Item itemType = Item.BIOASSAY;
88  private static final GuiContext guiContext = new GuiContext(itemType, GuiContext.Type.LIST);
89%>
90<%
91final int bioAssaySetId = Values.getInt(request.getParameter("bioassayset_id"));
92final SessionControl sc = Base.getExistingSessionControl(pageContext, Permission.DENIED, itemType);
93final String ID = sc.getId();
94final ItemContext cc = Base.getAndSetCurrentContext(sc, itemType, null, null);
95
96final ModeInfo mode = ModeInfo.get(request.getParameter("mode"));
97final String callback = request.getParameter("callback");
98final String title = mode.generateTitle("bioassay", "bioassays");
99final DbControl dc = sc.newDbControl();
100ItemResultIterator<BioAssay> bioAssays = null;
101List<AnnotationLoaderUtil> annotationLoaders = new ArrayList<AnnotationLoaderUtil>();
102ItemResultList<AnnotationType> experimentalFactors = null;
103try
104{
105  final ItemQuery<AnnotationType> annotationTypeQuery = Base.getAnnotationTypesQuery(itemType);
106  SnapshotManager manager = new SnapshotManager();
107  for (AnnotationType at : annotationTypeQuery.list(dc))
108  {
109    annotationLoaders.add(new AnnotationLoaderUtil(dc, manager, at));
110  }
111  final BioAssaySet bioAssaySet = BioAssaySet.getById(dc, bioAssaySetId);
112  final Experiment experiment = bioAssaySet.getExperiment();
113  final boolean hasDbSpots = bioAssaySet.getNumSpots() > 0;
114  final ItemQuery<AnnotationType> experimentalFactorQuery = experiment.getExperimentalFactors();
115  experimentalFactorQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
116  final int experimentId = experiment.getId();
117  final RawDataType rawDataType = experiment.getRawDataType();
118  final boolean createPermission = experiment.hasPermission(Permission.USE);
119  final boolean deletePermission = bioAssaySet.hasPermission(Permission.DELETE);
120  final boolean writePermission = bioAssaySet.hasPermission(Permission.WRITE);
121
122  // Query for raw bioassays related to the current bioassay
123  final ItemQuery<RawBioAssay> rawQuery = RawBioAssay.getQuery();
124  rawQuery.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
125  rawQuery.join(Hql.innerJoin("bioAssays", "bas"));
126  rawQuery.restrict(Restrictions.eq(Hql.alias("bas"), Expressions.parameter("bioAssay"))); 
127  rawQuery.order(Orders.asc(Hql.property("name"))); 
128 
129  Map<Plugin.MainType, Integer> pluginCount = PluginDefinition.countPlugins(dc, guiContext);
130  experimentalFactors = experimentalFactorQuery.list(dc);
131  try
132  {
133    final ItemQuery<BioAssay> query = Base.getConfiguredQuery(dc, cc, true, bioAssaySet.getBioAssays(), mode);
134    query.join(Hql.leftJoin("rawParents", "rba"));
135    query.setDistinct(true);
136    bioAssays = query.iterate(dc);
137  }
138  catch (Throwable t)
139  {
140    t.printStackTrace();
141    cc.setMessage(t.getMessage());
142  }
143  int numListed = 0;
144  JspContext jspContext = ExtensionsControl.createContext(dc, pageContext, 
145      guiContext, bioAssaySet);
146  ExtensionsInvoker invoker = ToolbarUtil.useExtensions(jspContext);
147  ExtensionsInvoker overviewPlotInvoker = ExtensionsControl.useExtensions(jspContext, 
148      "net.sf.basedb.clients.web.bioassayset.overviewplots");
149  %>
150  <base:page title="<%=title%>" type="<%=mode.getPageType()%>" id="list-page">
151  <base:head scripts="table.js,tabcontrol-2.js,~bioassays.js" styles="table.css,toolbar.css,headertabcontrol.css,path.css">
152    <ext:scripts context="<%=jspContext%>" />
153    <ext:stylesheets context="<%=jspContext%>" />
154  </base:head>
155  <base:body>
156    <%
157    if (!mode.isSelectionMode())
158    {
159      %>
160      <p:path><p:pathelement 
161        title="Experiments" href="<%="../index.jsp?ID="+ID%>" 
162        /><p:pathelement title="<%=HTML.encodeTags(experiment.getName())%>" 
163          href="<%="../bioassaysets/index.jsp?ID="+ID+"&amp;experiment_id="+experiment.getId()%>" 
164        /><p:pathelement title="<%=HTML.encodeTags(bioAssaySet.getName())%>"
165        /></p:path>
166      <%
167    }
168    else
169    {
170      %>
171      <h1><%=title %></h1>
172      <%
173    }
174    %>
175    <t:tabcontrol 
176      id="main"
177      subclass="mastertabcontrol content"
178      active="bioassays" notabs="<%=mode.isSelectionMode() %>">
179    <t:tab id="bioassayset.properties" title="Properties" />
180   
181    <t:tab id="bioassayset.annotations" title="Annotations" 
182        tooltip="View annotation values" />
183   
184    <t:tab id="bioassays" title="Bioassays">
185    <tbl:table 
186      id="bioassays" 
187      columns="<%=cc.getSetting("columns")%>"
188      sortby="<%=cc.getSortProperty()%>" 
189      direction="<%=cc.getSortDirection()%>"
190      action="index.jsp"
191      sc="<%=sc%>"
192      item="<%=itemType%>"
193      subclass="fulltable"
194      >
195      <tbl:hidden 
196        name="mode" 
197        value="<%=mode.getName()%>" 
198      />
199      <tbl:hidden 
200        name="bioassayset_id" 
201        value="<%=String.valueOf(bioAssaySetId)%>" 
202      />
203      <tbl:hidden 
204        name="callback" 
205        value="<%=callback%>" 
206        skip="<%=callback == null%>" 
207      />
208      <tbl:columndef 
209        id="name"
210        property="name"
211        datatype="string"
212        title="Name"
213        sortable="true" 
214        filterable="true"
215        exportable="true"
216        show="always" 
217      />
218      <tbl:columndef 
219        id="id"
220        clazz="uniquecol"
221        property="id"
222        datatype="int"
223        title="ID"
224        sortable="true"
225        filterable="true"
226        exportable="true"
227      />
228      <tbl:columndef 
229        id="spots"
230        property="numSpots"
231        datatype="int"
232        title="Spots in db"
233        sortable="true" 
234        filterable="true"
235        exportable="true"
236      />
237      <tbl:columndef 
238        id="fileSpots"
239        property="numFileSpots"
240        datatype="int"
241        title="Spots in file"
242        sortable="true" 
243        filterable="true"
244        exportable="true"
245      />
246      <tbl:columndef
247        id="rawBioAssays"
248        title="Raw bioassays"
249      />
250      <tbl:columndef 
251        id="description"
252        property="description"
253        datatype="string"
254        title="Description" 
255        sortable="true" 
256        filterable="true" 
257        exportable="true"
258      />
259      <tbl:columndef 
260        id="tools"
261        title="Tools" 
262        show="<%=mode.isSelectionMode() ? "never" : "auto"%>"
263      />
264      <%
265      for (AnnotationLoaderUtil loader : annotationLoaders)
266      {
267        AnnotationType at = loader.getAnnotationType();
268        Enumeration<String, String> annotationEnum = null;
269        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
270        if (at.isEnumeration())
271        {
272          annotationEnum = new Enumeration<String, String>();
273          if (!at.getDisplayAsList()) annotationEnum.add("", "-none-");
274          List<?> values = at.getValues();
275          for (Object value : values)
276          {
277            String encoded = formatter.format(value);
278            annotationEnum.add(encoded, encoded);
279          }
280        }
281        %>
282        <tbl:columndef 
283          id="<%="at"+at.getId()%>"
284          title="<%=HTML.encodeTags(at.getName())+" [A]"%>" 
285          property="<%="#"+at.getId()%>"
286          annotation="true"
287          datatype="<%=at.getValueType().getStringValue()%>"
288          enumeration="<%=annotationEnum%>"
289          smartenum="<%=at.getDisplayAsList() %>"
290          sortable="<%=at.getMultiplicity() == 1%>" 
291          filterable="true" 
292          exportable="true"
293          formatter="<%=formatter%>"
294          unit="<%=at.getDefaultUnit()%>"
295        />
296        <%
297      }
298      %>
299      <%
300      for (AnnotationType at : experimentalFactors)
301      {
302        Enumeration<String, String> annotationEnum = null;
303        Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
304        if (at.isEnumeration())
305        {
306          annotationEnum = new Enumeration<String, String>();
307          if (!at.getDisplayAsList()) annotationEnum.add("", "-none-");
308          List<?> values = at.getValues();
309          for (Object value : values)
310          {
311            String encoded = formatter.format(value);
312            annotationEnum.add(encoded, encoded);
313          }
314        }
315        %>
316        <tbl:columndef 
317          id="<%="ef"+at.getId()%>"
318          title="<%=HTML.encodeTags(at.getName())+" [EF]"%>" 
319          property="<%="$rba.##"+at.getId()%>"
320          exportproperty="<%="#" + at.getId() %>"
321          annotation="true"
322          datatype="<%=at.getValueType().getStringValue()%>"
323          enumeration="<%=annotationEnum%>"
324          sortable="false" 
325          filterable="true" 
326          exportable="true"
327          formatter="<%=formatter%>"
328        />
329        <%
330      }
331      %>
332      <div class="panelgroup bg-filled-50 bottomborder">
333        <tbl:toolbar
334          subclass="bottomborder"
335          visible="<%=mode.hasToolbar()%>"
336          >
337          <tbl:button 
338            id="btnColumns"
339            image="columns.png" 
340            title="Columns&hellip;" 
341            tooltip="Show, hide and re-order columns" 
342          />
343          <tbl:button 
344            id="btnImport"
345            data-plugin-type="IMPORT"
346            image="import.png" 
347            title="Import&hellip;" 
348            tooltip="Import data" 
349            visible="<%=pluginCount.containsKey(Plugin.MainType.IMPORT)%>"
350          />
351          <tbl:button 
352            id="btnExport"
353            data-plugin-type="EXPORT"
354            image="export.png" 
355            title="Export&hellip;" 
356            tooltip="Export data" 
357            visible="<%=pluginCount.containsKey(Plugin.MainType.EXPORT)%>"
358          />
359          <tbl:button
360            id="btnFilter"
361            data-plugin-type="ANALYZE"
362            data-cmd="NewFilteredBioAssaySet"
363            disabled="<%=!createPermission%>"
364            image="filter.png"
365            title="Filter bioassay set&hellip;"
366            tooltip="<%=createPermission ? 
367              "Create a new bioassay set by filtering this bioassayset" :
368              "You do not have permission analyze this experiment"%>"
369            visible="<%=!mode.isSelectionMode()%>"
370          />
371          <tbl:button 
372            id="btnRunPlugin"
373            data-plugin-type="OTHER"
374            image="runplugin.png" 
375            title="Run plugin&hellip;" 
376            tooltip="Run a plugin" 
377            visible="<%=pluginCount.containsKey(Plugin.MainType.OTHER) && !mode.isSelectionMode()%>"
378          />
379          <tbl:button 
380            id="btnAnalyze"
381            data-plugin-type="ANALYZE"
382            disabled="<%=!createPermission%>"
383            image="runplugin.png" 
384            title="Run analysis&hellip;" 
385            tooltip="<%=createPermission ? "Run an analysis plugin" : 
386              "You do not have permission to analyze this experiment"%>"
387            visible="<%=pluginCount.containsKey(Plugin.MainType.ANALYZE) && !mode.isSelectionMode()%>"
388          />
389          <ext:render extensions="<%=invoker%>" context="<%=jspContext%>" 
390            wrapper="<%=new PrefixSuffixRenderer(jspContext, "<td>", "</td>") %>"/>
391        </tbl:toolbar>
392        <tbl:panel>
393          <tbl:presetselector />
394          <tbl:navigator
395            page="<%=cc.getPage()%>" 
396            rowsperpage="<%=cc.getRowsPerPage()%>" 
397            totalrows="<%=bioAssays == null ? 0 : bioAssays.getTotalCount()%>" 
398            visible="<%=mode.hasNavigator()%>"
399          />
400        </tbl:panel>
401      </div>
402      <tbl:data>
403        <tbl:headers>
404          <tbl:headerrow>
405            <tbl:header colspan="3" />
406            <tbl:columnheaders />
407          </tbl:headerrow>
408          <tbl:headerrow>
409            <tbl:header subclass="index" />
410            <tbl:header 
411              subclass="check" 
412              visible="<%=mode.hasCheck()%>"
413              ><base:icon 
414                id="check.uncheck"
415                image="check_uncheck.png" 
416                tooltip="Check/uncheck all" 
417                 
418              /></tbl:header>
419            <tbl:header 
420              subclass="check" 
421              visible="<%=mode.hasRadio()%>"
422              />
423            <tbl:header 
424              subclass="icons" 
425              visible="<%=mode.hasIcons()%>"
426              />
427            <tbl:propertyfilter />
428          </tbl:headerrow>
429        </tbl:headers>
430        <tbl:rows>
431          <%
432          if (cc.getMessage() != null)
433          {
434            %>
435            <tbl:panel subclass="bg-filled-50">
436              <div class="messagecontainer error"><%=cc.getMessage()%></div>
437            </tbl:panel>
438            <%
439            cc.setMessage(null);
440          }
441          int index = cc.getPage()*cc.getRowsPerPage();
442          int selectedItemId = cc.getId();
443          if (bioAssays != null)
444          {           
445            while (bioAssays.hasNext())
446            {
447              BioAssay item = bioAssays.next();
448              boolean bioAssayHasDbSpots = item.getNumSpots() > 0;
449              int itemId = item.getId();
450              String name = HTML.encodeTags(item.getName());
451              String tooltip = mode.isSelectionMode() ?
452                  "Select this item" : "View this item" + (writePermission ? " (use CTRL, ALT or SHIFT to edit)" : "");
453              index++;
454              numListed++;         
455              %>
456              <tbl:row>
457                <tbl:header 
458                  clazz="index"
459                  ><%=index%></tbl:header>
460                <tbl:header 
461                  clazz="check" 
462                  visible="<%=mode.hasCheck()%>"
463                  ><input 
464                      type="checkbox" 
465                      name="<%=itemId%>" 
466                      value="<%=itemId%>" 
467                      title="<%=name%>" 
468                      <%=cc.getSelected().contains(itemId) ? "checked" : ""%>
469                    ></tbl:header>
470                <tbl:header 
471                  clazz="check" 
472                  visible="<%=mode.hasRadio()%>"
473                  ><input 
474                      type="radio" 
475                      name="item_id" 
476                      value="<%=itemId%>" 
477                      title="<%=name%>" 
478                      <%=selectedItemId == itemId ? "checked" : ""%>
479                    ></tbl:header>
480                <tbl:header 
481                  clazz="icons" 
482                  visible="<%=mode.hasIcons()%>"
483                  >&nbsp;</tbl:header>
484                <tbl:cell column="name"><div 
485                  class="link table-item"
486                  data-item-id="<%=itemId%>"
487                  data-no-edit="<%=writePermission ? 0 : 1 %>" 
488                  tabindex="0"
489                  title="<%=tooltip%>"><%=name%></div></tbl:cell>
490                <tbl:cell column="id"><%=item.getId()%></tbl:cell>
491                <tbl:cell column="spots"><%=item.getNumSpots()%></tbl:cell>
492                <tbl:cell column="fileSpots"><%=item.getNumFileSpots()%></tbl:cell>
493                <tbl:cell column="description"><%=HTML.encodeTags(item.getDescription())%></tbl:cell>
494                <tbl:cell column="rawBioAssays">
495                  <%
496                  rawQuery.setParameter("bioAssay", itemId, Type.INT);
497                  try
498                  {
499                    String separator = "";
500                    for (RawBioAssay rba : rawQuery.list(dc))
501                    {
502                      out.write(separator);
503                      if (mode.hasPropertyLink())
504                      {
505                        out.write(Base.getLinkedName(ID, rba, false, mode.hasEditLink()));
506                      }
507                      else
508                      {
509                        out.write(HTML.encodeTags(rba.getName()));
510                      }
511                      separator = ", ";
512                    }
513                  }
514                  catch (Throwable t)
515                  {
516                    %>
517                    <div class="error"><%=t.getMessage()%></div>
518                    <%
519                  }
520                  %>
521                </tbl:cell>
522                <%
523                if (item.isAnnotated())
524                {
525                  AnnotationSetSnapshot snapshot = manager.getSnapshot(dc, item.getAnnotationSet().getId());
526                  for (AnnotationLoaderUtil loader : annotationLoaders)
527                  {
528                    %>
529                    <tbl:cell 
530                      column="<%="at"+loader.getId()%>"
531                      ><%
532                      if (loader.find(snapshot)) 
533                      {
534                        %><tbl:cellvalue 
535                          list="<%=loader.getValues()%>"
536                          suffix="<%=loader.getUnitSymbol()%>"
537                        /><%
538                      }
539                      %></tbl:cell>
540                    <%
541                  }
542                }
543                for (AnnotationType at : experimentalFactors)
544                {
545                  %>
546                  <tbl:cell column="<%="ef"+at.getId()%>"
547                    ><tbl:cellvalue
548                    list="<%=BioAssaySetUtil.getAnnotationValues(dc, manager, item, at)%>"
549                  /></tbl:cell>
550                  <%
551                }               
552                %>
553                <tbl:cell column="tools" style="white-space: nowrap;">
554                  <% 
555                  if (bioAssayHasDbSpots) 
556                  {
557                    %>
558                    <base:icon 
559                      subclass="link auto-init"
560                      data-auto-init="plotter"
561                      data-item-id="<%=itemId %>"
562                      image="plotter.png" 
563                      tooltip="A simple plot tool"
564                    />
565                    <base:icon 
566                      subclass="link auto-init"
567                      data-auto-init="spotdata"
568                      data-item-id="<%=itemId %>"
569                      image="table.png" 
570                      tooltip="View spot data as a table"
571                    />
572                    <%
573                  }
574                  %>
575                </tbl:cell>
576              </tbl:row>
577              <%
578            }
579          }
580          if (numListed == 0)
581          {
582            %>
583            <tbl:panel subclass="bg-filled-50">
584              <div class="messagecontainer note">
585              <%=bioAssays == null || bioAssays.getTotalCount() == 0 ? "No bioassays were found" : "No bioassays on this page. Please select another page!" %>
586              </div>
587            </tbl:panel>
588            <%
589          }
590          %>
591          </tbl:rows>
592        </tbl:data>
593    </tbl:table>
594    </t:tab>
595   
596    <t:tab id="spotdata" title="Spot data" visible="<%=hasDbSpots%>" />
597   
598    <t:tab id="bioassayset.overviewplots" title="Overview plots" 
599      visible="<%=overviewPlotInvoker.getNumExtensions() > 0%>" />
600    </t:tabcontrol>
601
602    <base:buttongroup subclass="dialogbuttons">
603      <base:button id="btnOk" title="Ok" visible="<%=mode.hasOkButton()%>" />
604      <base:button id="close" title="Cancel" visible="<%=mode.hasCancelButton()%>" />
605      <base:button id="close" title="Close" visible="<%=mode.hasCloseButton()%>" />
606    </base:buttongroup>
607
608  </base:body>
609  </base:page>
610  <%
611}
612finally
613{
614  if (bioAssays != null) bioAssays.close();
615  if (dc != null) dc.close();
616}
617%>
Note: See TracBrowser for help on using the repository browser.