From b7096bc67eb577fe1560d84590b801e2d4506415 Mon Sep 17 00:00:00 2001
From: kaloyane <kaloyane>
Date: Wed, 21 Sep 2011 15:27:50 +0000
Subject: [PATCH] [LMS-2520] Sanofi: Allow to show data from all Analysis
 Procedures in the Gene Review Panel

SVN: 23026
---
 .../generic/shared/util/EntityHelper.java     |  2 +-
 .../AnalysisProcedureChooser.java             | 90 +++++++++++--------
 .../ExperimentAnalysisSummarySection.java     |  3 +-
 .../MaterialMergedSummarySection.java         |  8 +-
 .../detailviewers/WellSearchGrid.java         |  5 +-
 .../server/resultset/WellContentProvider.java |  4 +
 .../logic/FeatureVectorDatasetLoader.java     | 16 +---
 .../server/logic/ScreeningUtils.java          |  6 +-
 .../server/logic/WellContentLoader.java       | 29 +++++-
 .../shared/basic/dto/DatasetReference.java    | 10 ++-
 .../shared/basic/dto/WellSearchCriteria.java  | 13 +++
 .../dto/grids/WellSearchGridColumnIds.java    |  2 +
 .../heatmaps/WellTooltipGeneratorTest.java    |  2 +-
 .../utils/EntityTypeLabelUtilsTest.java       |  2 +-
 14 files changed, 125 insertions(+), 67 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/EntityHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/EntityHelper.java
index c534b618bc4..b74c2873816 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/EntityHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/util/EntityHelper.java
@@ -128,7 +128,7 @@ public class EntityHelper
     {
         IEntityProperty property = null;
 
-        if (holder.getProperties() != null)
+        if (holder != null && holder.getProperties() != null)
         {
             property = EntityHelper.tryFindProperty(holder.getProperties(), propertyCode);
         }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
index cf36f2e0624..1af57154e8f 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/AnalysisProcedureChooser.java
@@ -59,6 +59,8 @@ class AnalysisProcedureChooser extends LayoutContainer
 
     private final static String UNSPECIFIED_PROCEDURE = "Unspecified";
 
+    private final static String ALL_PROCEDURES = "All";
+
     /**
      * Can be used from external classes wishing to be notified when the analysis procedure
      * selection changes.
@@ -82,16 +84,15 @@ class AnalysisProcedureChooser extends LayoutContainer
     public static final AnalysisProcedureChooser createHorizontal(
             IViewContext<IScreeningClientServiceAsync> viewContext,
             ExperimentSearchCriteriaHolder experimentCriteriaHolder,
-            String selectedAnalysisProcedureOrNull,
+            AnalysisProcedureCriteria initialSelection,
             IAnalysisProcedureSelectionListener selectionListener,
             boolean triggerInitialSelectionEvent)
     {
         AnalysisProcedureLister analysisProcedureLister =
                 createNumericalDatasetsAnalysisProcedureLister(viewContext,
                         experimentCriteriaHolder);
-        return new AnalysisProcedureChooser(viewContext, analysisProcedureLister,
-                selectedAnalysisProcedureOrNull, selectionListener, triggerInitialSelectionEvent,
-                true);
+        return new AnalysisProcedureChooser(viewContext, analysisProcedureLister, initialSelection,
+                selectionListener, triggerInitialSelectionEvent, true);
     }
 
     /**
@@ -102,16 +103,15 @@ class AnalysisProcedureChooser extends LayoutContainer
     public static final AnalysisProcedureChooser createVertical(
             IViewContext<IScreeningClientServiceAsync> viewContext,
             ExperimentSearchCriteriaHolder experimentCriteriaHolder,
-            String selectedAnalysisProcedureOrNull,
+            AnalysisProcedureCriteria initialSelection,
             IAnalysisProcedureSelectionListener selectionListener,
             boolean triggerInitialSelectionEvent)
     {
         AnalysisProcedureLister analysisProcedureLister =
                 createNumericalDatasetsAnalysisProcedureLister(viewContext,
                         experimentCriteriaHolder);
-        return new AnalysisProcedureChooser(viewContext, analysisProcedureLister,
-                selectedAnalysisProcedureOrNull, selectionListener, triggerInitialSelectionEvent,
-                false);
+        return new AnalysisProcedureChooser(viewContext, analysisProcedureLister, initialSelection,
+                selectionListener, triggerInitialSelectionEvent, false);
     }
 
     /**
@@ -119,7 +119,8 @@ class AnalysisProcedureChooser extends LayoutContainer
      * separate row above the combobox.
      */
     public static final AnalysisProcedureChooser create(IViewContext<?> viewContext,
-            final AnalysisProcedures analysisProcedures, String selectedAnalysisProcedureOrNull,
+            final AnalysisProcedures analysisProcedures,
+            AnalysisProcedureCriteria initialSelection,
             IAnalysisProcedureSelectionListener selectionListener)
     {
         // dummy lister which always returns the same result
@@ -131,8 +132,8 @@ class AnalysisProcedureChooser extends LayoutContainer
                     resultsCallback.onSuccess(analysisProcedures);
                 }
             };
-        return new AnalysisProcedureChooser(viewContext, analysisProcedureLister,
-                selectedAnalysisProcedureOrNull, selectionListener, true, false);
+        return new AnalysisProcedureChooser(viewContext, analysisProcedureLister, initialSelection,
+                selectionListener, true, false);
     }
 
     private static AnalysisProcedureLister createNumericalDatasetsAnalysisProcedureLister(
@@ -160,6 +161,8 @@ class AnalysisProcedureChooser extends LayoutContainer
 
     private final SimpleModelComboBox<String> analysisProceduresComboBox;
 
+    private final boolean displaySelectAllProcedures;
+
     private final Listener<BaseEvent> selectionChangeListener = new Listener<BaseEvent>()
         {
 
@@ -172,7 +175,7 @@ class AnalysisProcedureChooser extends LayoutContainer
 
     private AnalysisProcedureChooser(IViewContext<?> viewContext,
             AnalysisProcedureLister analysisProcedureLister,
-            String selectedAnalysisProcedureOrNull,
+            AnalysisProcedureCriteria initialSelection,
             IAnalysisProcedureSelectionListener selectionListener,
             boolean triggerInitialSelectionEvent, boolean horizontalLayout)
     {
@@ -182,8 +185,9 @@ class AnalysisProcedureChooser extends LayoutContainer
         this.selectionListener = selectionListener;
         this.analysisProcedureLister = analysisProcedureLister;
         this.analysisProceduresComboBox = createLayout(horizontalLayout);
+        this.displaySelectAllProcedures = initialSelection.isAllProcedures();
 
-        initSelection(selectedAnalysisProcedureOrNull, triggerInitialSelectionEvent);
+        initSelection(initialSelection, triggerInitialSelectionEvent);
     }
 
     private SimpleModelComboBox<String> createLayout(boolean horizontalLayout)
@@ -214,14 +218,14 @@ class AnalysisProcedureChooser extends LayoutContainer
         return layoutPanel;
     }
 
-    private void initSelection(String selectedAnalysisProcedureOrNull, boolean triggerEvents)
+    private void initSelection(AnalysisProcedureCriteria initialSelection, boolean triggerEvents)
     {
         if (false == triggerEvents)
         {
             disableEvents(true);
         }
 
-        refresh(selectedAnalysisProcedureOrNull);
+        refresh(initialSelection);
 
         if (false == triggerEvents)
         {
@@ -232,11 +236,10 @@ class AnalysisProcedureChooser extends LayoutContainer
 
     public void updateAnalysisProcedures()
     {
-        String selectedProcedureOrNull = getSelectionAsCriteria().tryGetAnalysisProcedureCode();
-        refresh(selectedProcedureOrNull);
+        refresh(getSelectionAsCriteria());
     }
 
-    private void refresh(final String selectedAnalysisProcedureOrNull)
+    private void refresh(final AnalysisProcedureCriteria selectedProcedureCriteria)
     {
 
         analysisProceduresComboBox.removeAll();
@@ -246,7 +249,7 @@ class AnalysisProcedureChooser extends LayoutContainer
                     {
                         public void onSuccess(AnalysisProcedures analysisProcedures)
                         {
-                            refresh(selectedAnalysisProcedureOrNull, analysisProcedures);
+                            refresh(selectedProcedureCriteria, analysisProcedures);
                         }
 
                         public void onFailure(Throwable caught)
@@ -256,11 +259,11 @@ class AnalysisProcedureChooser extends LayoutContainer
                     });
     }
 
-    private void refresh(final String selectedAnalysisProcedureOrNull,
+    private void refresh(AnalysisProcedureCriteria selectedProcedureCriteria,
             AnalysisProcedures analysisProcedures)
     {
         addAnalysisProcedures(analysisProcedures.getProcedureCodes());
-        setInitialSelection(selectedAnalysisProcedureOrNull);
+        setInitialSelection(selectedProcedureCriteria);
     }
 
     private Component createComboLabel()
@@ -304,11 +307,15 @@ class AnalysisProcedureChooser extends LayoutContainer
         List<String> sortedCodes = new ArrayList<String>();
         for (String code : codes)
         {
-            sortedCodes.add(analysisCodeToComboBoxValue(code));
+            sortedCodes.add(unspecifiedIfEmpty(code));
 
         }
         boolean unspecifiedPresent = sortedCodes.remove(UNSPECIFIED_PROCEDURE);
         Collections.sort(sortedCodes);
+        if (displaySelectAllProcedures)
+        {
+            sortedCodes.add(0, ALL_PROCEDURES);
+        }
         if (unspecifiedPresent)
         {
             // unspecified is always displayed at the end
@@ -325,15 +332,18 @@ class AnalysisProcedureChooser extends LayoutContainer
         }
     }
 
-    private void setInitialSelection(String value)
+    private void setInitialSelection(AnalysisProcedureCriteria selectedProcedureCriteria)
     {
-        String analysisProcedureOrNull = value;
+        String analysisProcedureOrNull = selectedProcedureCriteria.tryGetAnalysisProcedureCode();
         if (StringUtils.isBlank(analysisProcedureOrNull))
         {
             analysisProcedureOrNull = getDefaultAnalysisProcedure();
         }
-
-        String comboBoxValue = analysisCodeToComboBoxValue(analysisProcedureOrNull);
+        
+        String comboBoxValue = analysisProcedureOrNull;
+        if (StringUtils.isBlank(comboBoxValue)) {
+            comboBoxValue = selectedProcedureCriteria.isNoProcedures() ? UNSPECIFIED_PROCEDURE : ALL_PROCEDURES;
+        }
 
         LabeledItem<String> valueToSelect =
                 analysisProceduresComboBox.findModelForVal(comboBoxValue);
@@ -360,11 +370,18 @@ class AnalysisProcedureChooser extends LayoutContainer
 
     private AnalysisProcedureCriteria getSelectionAsCriteria()
     {
-        String selection = analysisProceduresComboBox.getChosenItem();
-        String analysisProcedureOrNull = comboBoxValueToAnalysisProcedure(selection);
-        return StringUtils.isBlank(analysisProcedureOrNull) ? AnalysisProcedureCriteria
-                .createNoProcedures() : AnalysisProcedureCriteria
-                .createFromCode(analysisProcedureOrNull);
+        String selectedAP = analysisProceduresComboBox.getChosenItem();
+        if (UNSPECIFIED_PROCEDURE.equals(selectedAP))
+        {
+            return AnalysisProcedureCriteria.createNoProcedures();
+        } else if (ALL_PROCEDURES.equals(selectedAP))
+        {
+            return AnalysisProcedureCriteria.createAllProcedures();
+        } else
+        {
+            return AnalysisProcedureCriteria.createFromCode(selectedAP);
+        }
+
     }
 
     private String getDefaultAnalysisProcedure()
@@ -374,22 +391,19 @@ class AnalysisProcedureChooser extends LayoutContainer
 
     private void setDefaultAnalysisProcedure(AnalysisProcedureCriteria analysisProcedureCriteria)
     {
-        String analysisProcedureCode = analysisProcedureCriteria.tryGetAnalysisProcedureCode();
+        String analysisProcedureCode =
+                (analysisProcedureCriteria.isAllProcedures()) ? ALL_PROCEDURES
+                        : analysisProcedureCriteria.tryGetAnalysisProcedureCode();
         if (StringUtils.isNotBlank(analysisProcedureCode))
         {
             screeningDisplaySettingsManager.setDefaultAnalysisProcedure(analysisProcedureCode);
         }
     }
 
-    private String analysisCodeToComboBoxValue(String analysisProcedureOrNull)
+    private String unspecifiedIfEmpty(String analysisProcedureOrNull)
     {
         return StringUtils.isBlank(analysisProcedureOrNull) ? UNSPECIFIED_PROCEDURE
                 : analysisProcedureOrNull;
     }
 
-    private String comboBoxValueToAnalysisProcedure(String comboBoxValue)
-    {
-        return UNSPECIFIED_PROCEDURE.equals(comboBoxValue) ? null : comboBoxValue;
-    }
-
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java
index 9fadaa51bae..e7880f443b5 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentAnalysisSummarySection.java
@@ -8,6 +8,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningCli
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.AnalysisProcedureChooser.IAnalysisProcedureSelectionListener;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteriaHolder;
 
@@ -81,7 +82,7 @@ public class ExperimentAnalysisSummarySection extends DisposableTabContent
         ExperimentSearchCriteriaHolder criteriaHolder = new ExperimentSearchCriteriaHolder(experimentCriteria);
 
         return AnalysisProcedureChooser.createHorizontal(screeningViewContext, criteriaHolder,
-                null, getGridAsListener(), true);
+                AnalysisProcedureCriteria.createNoProcedures(), getGridAsListener(), true);
     }
 
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialMergedSummarySection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialMergedSummarySection.java
index 1261a931103..25a1f1f4ae8 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialMergedSummarySection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialMergedSummarySection.java
@@ -147,12 +147,12 @@ class MaterialMergedSummarySection extends DisposableTabContent
 
     private AnalysisProcedureChooser createAnalysisProcedureChooser()
     {
-        String initialAnalysisProcedureOrNull =
-                (initialAnalysisProcedureCriteriaOrNull == null) ? null
-                        : initialAnalysisProcedureCriteriaOrNull.tryGetAnalysisProcedureCode();
+        AnalysisProcedureCriteria initialSelection =
+                (initialAnalysisProcedureCriteriaOrNull == null) ? AnalysisProcedureCriteria
+                        .createNoProcedures() : initialAnalysisProcedureCriteriaOrNull;
 
         return AnalysisProcedureChooser.createVertical(screeningViewContext,
-                experimentSearchCriteriaHolder, initialAnalysisProcedureOrNull,
+                experimentSearchCriteriaHolder, initialSelection,
                 createAnalysisProcedureListener(), false);
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
index 6653f3af4ae..c790f045b77 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
@@ -571,8 +571,9 @@ public class WellSearchGrid extends TypedTableGrid<WellContent> implements
     private AnalysisProcedureChooser createAnalysisProcedureChooser()
     {
         AnalysisProcedureChooser analysisProcedureChooser =
-                AnalysisProcedureChooser.createVertical(getViewContext(), experimentCriteriaHolder,
-                        null, this, true);
+                AnalysisProcedureChooser.createVertical(getViewContext(),
+                        experimentCriteriaHolder,
+                        AnalysisProcedureCriteria.createAllProcedures(), this, true);
         return analysisProcedureChooser;
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/WellContentProvider.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/WellContentProvider.java
index e41158e6428..b77f81b54b3 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/WellContentProvider.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/resultset/WellContentProvider.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.plugin.screening.client.web.server.resultset;
 
+import static ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.WellSearchGridColumnIds.ANALYSIS_PROCEDURE;
 import static ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.WellSearchGridColumnIds.EXPERIMENT;
 import static ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.WellSearchGridColumnIds.FILE_FORMAT_TYPE;
 import static ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.WellSearchGridColumnIds.IMAGE_ANALYSIS_DATA_SET;
@@ -103,6 +104,7 @@ public class WellContentProvider extends AbstractTableModelProvider<WellContent>
         builder.addColumn(FILE_FORMAT_TYPE);
         builder.addColumn(IMAGE_DATA_SET);
         builder.addColumn(IMAGE_ANALYSIS_DATA_SET);
+        builder.addColumn(ANALYSIS_PROCEDURE);
     }
 
     private void addMaterialColumns(TypedTableModelBuilder<WellContent> builder,
@@ -173,6 +175,8 @@ public class WellContentProvider extends AbstractTableModelProvider<WellContent>
         DatasetReference dataset = well.tryGetFeatureVectorDataset();
         builder.column(IMAGE_ANALYSIS_DATA_SET).addString(
                 dataset == null ? null : dataset.getCode());
+        builder.column(ANALYSIS_PROCEDURE).addString(
+                dataset == null ? null : dataset.getAnalysisProcedure());
 
     }
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
index a139d9b87e8..a52c744978b 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
@@ -27,8 +27,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.commons.lang.StringUtils;
-
 import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
@@ -165,21 +163,9 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
 
     private boolean isMatchingAnalysisProcedure(ExternalData dataset)
     {
-        if (analysisProcedureCriteria.isAllProcedures())
-        {
-            return true;
-        }
-
         String dataSetAnalysisProcedure =
                 EntityHelper.tryFindPropertyValue(dataset, ScreeningConstants.ANALYSIS_PROCEDURE);
-        if (analysisProcedureCriteria.isNoProcedures())
-        {
-            return StringUtils.isBlank(dataSetAnalysisProcedure);
-        } else
-        {
-            String analysisProcedureCode = analysisProcedureCriteria.tryGetAnalysisProcedureCode();
-            return analysisProcedureCode.equals(dataSetAnalysisProcedure);
-        }
+        return analysisProcedureCriteria.matches(dataSetAnalysisProcedure);
     }
 
     private boolean isMatchingAnalysisDataSet(ExternalData dataset)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
index b7c95e9c1af..38c172dc8a7 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
@@ -28,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
+import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
 import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory;
 import ch.systemsx.cisd.openbis.plugin.screening.server.dataaccess.AnalysisProcedureResult;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.AnalysisProcedures;
@@ -63,9 +64,12 @@ public class ScreeningUtils
         @SuppressWarnings("deprecation")
         String fileTypeCode = dataset.getFileFormatType().getCode();
         Experiment experiment = dataset.getExperiment();
+        String analysisProcedureOrNull =
+                EntityHelper.tryFindPropertyValue(dataset, ScreeningConstants.ANALYSIS_PROCEDURE);
         return new DatasetReference(dataset.getId(), dataset.getCode(), dataTypeCode,
                 dataset.getRegistrationDate(), fileTypeCode, dataStore.getCode(),
-                dataStore.getHostUrl(), experiment.getPermId(), experiment.getIdentifier());
+                dataStore.getHostUrl(), experiment.getPermId(), experiment.getIdentifier(),
+                analysisProcedureOrNull);
     }
 
     public static List<ExternalDataPE> filterImageAnalysisDatasetsPE(List<ExternalDataPE> datasets)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
index 8f8cd9ed80e..4b64a151e79 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
@@ -143,8 +143,10 @@ public class WellContentLoader extends AbstractContentLoader
         List<WellContent> withPropsAndDataSets =
                 loader.enrichWithDatasets(locations,
                         materialCriteria.getAnalysisProcedureCriteria());
-        List<WellContent> withFeatureVectors =
-                loader.enrichWithFeatureVectors(withPropsAndDataSets);
+        List<WellContent> byAnalysisProcedure =
+                loader.filterByAnalysisProcedure(withPropsAndDataSets,
+                        materialCriteria.getAnalysisProcedureCriteria());
+        List<WellContent> withFeatureVectors = loader.enrichWithFeatureVectors(byAnalysisProcedure);
         return withFeatureVectors;
     }
 
@@ -972,4 +974,27 @@ public class WellContentLoader extends AbstractContentLoader
         return new ExperimentReference(loc.exp_id, loc.exp_perm_id, loc.exp_code,
                 loc.exp_type_code, loc.proj_code, loc.space_code);
     }
+
+    private List<WellContent> filterByAnalysisProcedure(List<WellContent> wells,
+            AnalysisProcedureCriteria criteria)
+    {
+        if (criteria.isAllProcedures())
+        {
+            return wells;
+        }
+        ArrayList<WellContent> filtered = new ArrayList<WellContent>();
+        for (WellContent well : wells)
+        {
+            String analysisProcedureCode =
+                    well.tryGetFeatureVectorDataset() == null ? null : well
+                            .tryGetFeatureVectorDataset().getAnalysisProcedure();
+            if (criteria.matches(analysisProcedureCode))
+            {
+                filtered.add(well);
+            }
+        }
+
+        return filtered;
+    }
+
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/DatasetReference.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/DatasetReference.java
index baa231a517b..71e4bf47bad 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/DatasetReference.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/DatasetReference.java
@@ -51,6 +51,8 @@ public class DatasetReference implements ISerializable, IEntityInformationHolder
 
     private String experimentIdentifier;
 
+    private String analysisProcedure;
+
     // GWT only
     @SuppressWarnings("unused")
     private DatasetReference()
@@ -59,7 +61,7 @@ public class DatasetReference implements ISerializable, IEntityInformationHolder
 
     public DatasetReference(long id, String code, String typeCode, Date registrationDate,
             String fileTypeCode, String datastoreCode, String datastoreHostUrl,
-            String experimentPermId, String experimentIdentifier)
+            String experimentPermId, String experimentIdentifier, String analysisProcedure)
     {
         this.id = id;
         this.datasetCode = code;
@@ -70,6 +72,7 @@ public class DatasetReference implements ISerializable, IEntityInformationHolder
         this.datastoreHostUrl = datastoreHostUrl;
         this.experimentPermId = experimentPermId;
         this.experimentIdentifier = experimentIdentifier;
+        this.analysisProcedure = analysisProcedure;
     }
 
     public String getCode()
@@ -126,4 +129,9 @@ public class DatasetReference implements ISerializable, IEntityInformationHolder
     {
         return experimentIdentifier;
     }
+
+    public String getAnalysisProcedure()
+    {
+        return analysisProcedure;
+    }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
index 1d03f6a13bb..9d079cc84b4 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
@@ -586,6 +586,19 @@ public class WellSearchCriteria implements ISerializable
             return analysisProcedureCodeOrNull;
         }
 
+        public boolean matches(String codeOrNull)
+        {
+            if (isAllProcedures())
+            {
+                return true;
+            }
+            if (StringUtils.isBlank(codeOrNull))
+            {
+                return isNoProcedures();
+            }
+            return codeOrNull.equals(analysisProcedureCodeOrNull);
+        }
+
         @Override
         public String toString()
         {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/grids/WellSearchGridColumnIds.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/grids/WellSearchGridColumnIds.java
index 275c24240d6..7c31ffe54a6 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/grids/WellSearchGridColumnIds.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/grids/WellSearchGridColumnIds.java
@@ -39,6 +39,8 @@ public class WellSearchGridColumnIds
 
     public static final String WELL_IMAGES = "WELL_IMAGES";
 
+    public static final String ANALYSIS_PROCEDURE = "ANALYSIS_PROCEDURE";
+
     private static final String MATERIAL_PROPERTY_GROUP = "MATERIAL_PROPERTY-";
 
     private static final String PROPERTY_CODE_MARKER = "$$$";
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/heatmaps/WellTooltipGeneratorTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/heatmaps/WellTooltipGeneratorTest.java
index 5263a5cf922..9c31a7cec63 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/heatmaps/WellTooltipGeneratorTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/heatmaps/WellTooltipGeneratorTest.java
@@ -191,7 +191,7 @@ public class WellTooltipGeneratorTest extends AssertJUnit
 
     private static DatasetReference createDatasetReference()
     {
-        return new DatasetReference(0, null, null, null, null, null, null, null, null);
+        return new DatasetReference(0, null, null, null, null, null, null, null, null, null);
     }
 
     private static PlateMetadata createEmptyPlateMetadata()
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java
index c03f01d608e..36805f8ca2b 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java
@@ -45,7 +45,7 @@ public class EntityTypeLabelUtilsTest extends AssertJUnit
     {
         DatasetReference ref =
                 new DatasetReference(0, "123412342314-1234", typeCode, null, "DAT", null, null,
-                        null, null);
+                        null, null, null);
         return EntityTypeLabelUtils.createDatasetLabel(ref, withFileType, "2011-05-30", null, true);
     }
 }
\ No newline at end of file
-- 
GitLab