From f79880b7ac59f9a4721c3deaa8c2e527724e92dd Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Tue, 15 Feb 2011 12:58:47 +0000 Subject: [PATCH] LMS-2040 bug fixing HCSImageDatasetLoader.getSegmentationImageDatasets. Tests written for loading child data sets like segmentation images and feature vectors. SVN: 19976 --- .../api/v1/ScreeningClientApiTester.java | 40 +++++ .../logic/FeatureVectorDatasetLoader.java | 80 +--------- .../server/logic/HCSImageDatasetLoader.java | 103 ++++++++++-- .../logic/FeatureVectorDatasetLoaderTest.java | 125 +++++++++++++++ .../logic/HCSImageDatasetLoaderTest.java | 148 ++++++++++++++++++ 5 files changed, 403 insertions(+), 93 deletions(-) create mode 100644 screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java create mode 100644 screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTester.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTester.java index 135f28e0036..371787ab23d 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTester.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTester.java @@ -46,6 +46,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JScrollPane; +import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.text.JTextComponent; @@ -153,6 +154,15 @@ public class ScreeningClientApiTester loadImagesByDataSetCode(); } }); + JMenuItem overlayItem = new JMenuItem("List Overlay Data Sets"); + callApiMenu.add(overlayItem); + overlayItem.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + loadOverlays(); + } + }); } void setUp(String[] args) @@ -180,6 +190,36 @@ public class ScreeningClientApiTester } } + private void loadOverlays() + { + content.removeAll(); + final JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + content.add(panel, BorderLayout.NORTH); + JTextArea textArea = new JTextArea(); + textArea.setEditable(false); + content.add(textArea, BorderLayout.CENTER); + List<Plate> plates = facade.listPlates(); + panel.add(new JLabel(plates.size() + " plates", JLabel.LEFT)); + validate(panel); + List<ImageDatasetReference> rawImageDatasets = facade.listRawImageDatasets(plates); + panel.add(new JLabel(rawImageDatasets.size() + " raw image data sets", JLabel.LEFT)); + validate(panel); + List<ImageDatasetReference> overlays = facade.listSegmentationImageDatasets(plates); + panel.add(new JLabel(overlays.size() + " overlay data sets:", JLabel.LEFT)); + StringBuilder builder = new StringBuilder(); + for (ImageDatasetReference overlay : overlays) + { + builder.append(overlay).append('\n'); + ImageDatasetReference parent = overlay.getParentImageDatasetReference(); + if (parent != null) + { + builder.append(" overlay data set of ").append(parent).append('\n'); + } + } + textArea.setText(builder.toString()); + } + private void loadPlates() { content.removeAll(); 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 cc4381c9cfa..af7ae73c799 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 @@ -21,10 +21,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; @@ -103,7 +100,6 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader private void loadFeatureVectorDatasets() { final Map<Long, ExternalData> featureVectorDatasetSet = new HashMap<Long, ExternalData>(); - IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session); List<ExternalData> imageDatasets = new ArrayList<ExternalData>(); for (ExternalData dataset : getDatasets()) @@ -118,83 +114,11 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader imageDatasets.add(dataset); } } - - List<ExternalData> connectedFeatureVectorDatasets = - listChildrenFeatureVectorDatasets(datasetLister, extractIds(imageDatasets)); - Map<Long, Set<Long>> featureVectorToImageDatasetIdsMap = - datasetLister.listParentIds(extractIds(connectedFeatureVectorDatasets)); - Map<Long, List<ExternalData>> featureVectorToImageDatasetsMap = - createFeatureVectorToImageDatasetsMap(featureVectorToImageDatasetIdsMap, - imageDatasets); - // Implementation note: some data sets in this loop may overwrite data from the first loop. - // This is intended as we want to keep the parent relationship of the feature vector data - // sets, if they exist. - for (ExternalData fv : connectedFeatureVectorDatasets) - { - List<ExternalData> parentImageDatasets = - featureVectorToImageDatasetsMap.get(fv.getId()); - if (parentImageDatasets != null) - { - fv.setParents(parentImageDatasets); - } - featureVectorDatasetSet.put(fv.getId(), fv); - } + + gatherChildrenDataSets(featureVectorDatasetSet, imageDatasets, featureVectorDatasetTypeCode); featureVectorDatasets = featureVectorDatasetSet.values(); } - private List<ExternalData> listChildrenFeatureVectorDatasets(IDatasetLister datasetLister, - Collection<Long> imageDatasetIds) - { - List<ExternalData> datasets = datasetLister.listByParentTechIds(imageDatasetIds); - return ScreeningUtils.filterExternalDataByTypePattern(datasets, - featureVectorDatasetTypeCode); - } - - private static Map<Long/* feature vector dataset id */, List<ExternalData/* image dataset */>> createFeatureVectorToImageDatasetsMap( - Map<Long, Set<Long>> featureVectorToImageDatasetsMap, List<ExternalData> imageDatasets) - { - Map<Long, List<ExternalData>> featureVectorToImageDatasetMap = - new HashMap<Long, List<ExternalData>>(); - for (Entry<Long, Set<Long>> entry : featureVectorToImageDatasetsMap.entrySet()) - { - List<ExternalData> parentImageDatasets = - findDatasetsWithIds(entry.getValue(), imageDatasets); - // NOTE: if a feature vector dataset has more than one image dataset parent, all the - // parents will be ignored. - if (parentImageDatasets.size() == 1) - { - Long featureVectorDatasetId = entry.getKey(); - featureVectorToImageDatasetMap.put(featureVectorDatasetId, parentImageDatasets); - } - } - return featureVectorToImageDatasetMap; - } - - // returns all dataset which have an id contained in the specified id set - private static List<ExternalData> findDatasetsWithIds(Set<Long> datasetIds, - List<ExternalData> datasets) - { - List<ExternalData> found = new ArrayList<ExternalData>(); - for (ExternalData dataset : datasets) - { - if (datasetIds.contains(dataset.getId())) - { - found.add(dataset); - } - } - return found; - } - - private static Collection<Long> extractIds(List<ExternalData> datasets) - { - List<Long> ids = new ArrayList<Long>(); - for (ExternalData dataset : datasets) - { - ids.add(dataset.getId()); - } - return ids; - } - private List<FeatureVectorDatasetReference> asFeatureVectorDatasetReferences() { List<FeatureVectorDatasetReference> result = new ArrayList<FeatureVectorDatasetReference>(); diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java index 98810053aa9..625579a46b1 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java @@ -18,8 +18,13 @@ package ch.systemsx.cisd.openbis.plugin.screening.server.logic; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.Session; @@ -37,6 +42,49 @@ class HCSImageDatasetLoader extends PlateDatasetLoader { // TODO 2010-05-27, CR : See PlateDatasetLoader todo comment + protected static Collection<Long> extractIds(List<ExternalData> datasets) + { + List<Long> ids = new ArrayList<Long>(); + for (ExternalData dataset : datasets) + { + ids.add(dataset.getId()); + } + return ids; + } + + private static Map<Long/* child data set id */, List<ExternalData/* parent data sets */>> createChildDataSetToParentDataSetsMap( + Map<Long, Set<Long>> childIdToParentIdsMap, List<ExternalData> parentDatasets) + { + Map<Long, List<ExternalData>> childDataSetToParentDataSetsMap = + new HashMap<Long, List<ExternalData>>(); + for (Entry<Long, Set<Long>> entry : childIdToParentIdsMap.entrySet()) + { + List<ExternalData> parents = + findDatasetsWithIds(entry.getValue(), parentDatasets); + // NOTE: if a child data set has more than one parent data set, all the + // parents will be ignored. + if (parents.size() == 1) + { + Long childId = entry.getKey(); + childDataSetToParentDataSetsMap.put(childId, parents); + } + } + return childDataSetToParentDataSetsMap; + } + + private static List<ExternalData> findDatasetsWithIds(Set<Long> datasetIds, List<ExternalData> datasets) + { + List<ExternalData> found = new ArrayList<ExternalData>(); + for (ExternalData dataset : datasets) + { + if (datasetIds.contains(dataset.getId())) + { + found.add(dataset); + } + } + return found; + } + HCSImageDatasetLoader(Session session, IScreeningBusinessObjectFactory businessObjectFactory, String homeSpaceOrNull, Collection<? extends PlateIdentifier> plates, String... datasetTypeCodes) @@ -70,9 +118,20 @@ class HCSImageDatasetLoader extends PlateDatasetLoader private List<ExternalData> getSegmentationImageDatasets() { load(); - return filterSegmententationImageDatasets(); + List<ExternalData> imageDatasets = new ArrayList<ExternalData>(); + for (ExternalData dataset : getDatasets()) + { + if (ScreeningUtils.isBasicHcsImageDataset(dataset)) + { + imageDatasets.add(dataset); + } + } + Map<Long, ExternalData> segmentationImageDataSets = new HashMap<Long, ExternalData>(); + gatherChildrenDataSets(segmentationImageDataSets, imageDatasets, + ScreeningConstants.HCS_SEGMENTATION_IMAGE_DATASET_TYPE_PATTERN); + return new ArrayList<ExternalData>(segmentationImageDataSets.values()); } - + /** * Return the image datasets references for the specified plates. */ @@ -123,19 +182,6 @@ class HCSImageDatasetLoader extends PlateDatasetLoader return result; } - private List<ExternalData> filterSegmententationImageDatasets() - { - List<ExternalData> result = new ArrayList<ExternalData>(); - for (ExternalData externalData : getDatasets()) - { - if (ScreeningUtils.isSegmentationHcsImageDataset(externalData)) - { - result.add(externalData); - } - } - return result; - } - private List<ImageDatasetReference> asImageDatasetReferences(List<ExternalData> imageDatasets) { List<ImageDatasetReference> references = new ArrayList<ImageDatasetReference>(); @@ -150,6 +196,33 @@ class HCSImageDatasetLoader extends PlateDatasetLoader return references; } + protected void gatherChildrenDataSets(final Map<Long, ExternalData> childrenDataSets, + List<ExternalData> parentDataSets, String childTypePattern) + { + IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session); + List<ExternalData> filteredChildrenDataSets = + ScreeningUtils.filterExternalDataByTypePattern( + datasetLister.listByParentTechIds(extractIds(parentDataSets)), + childTypePattern); + Map<Long, Set<Long>> childIdToParentIdsMap = + datasetLister.listParentIds(extractIds(filteredChildrenDataSets)); + Map<Long, List<ExternalData>> childIdToParentDataSetsMap = + createChildDataSetToParentDataSetsMap(childIdToParentIdsMap, parentDataSets); + // Implementation note: some data sets in this loop may overwrite data from the first loop. + // This is intended as we want to keep the parent relationship of the feature vector data + // sets, if they exist. + for (ExternalData child : filteredChildrenDataSets) + { + List<ExternalData> parentImageDatasets = + childIdToParentDataSetsMap.get(child.getId()); + if (parentImageDatasets != null) + { + child.setParents(parentImageDatasets); + } + childrenDataSets.put(child.getId(), child); + } + } + private ExternalData tryGetParent(ExternalData externalData) { if (externalData.getParents() != null && externalData.getParents().size() == 1) diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java new file mode 100644 index 00000000000..99b15b63391 --- /dev/null +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java @@ -0,0 +1,125 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.plugin.screening.server.logic; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Set; + +import org.jmock.Expectations; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.common.test.RecordingMatcher; +import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder; +import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory; +import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier; + +/** + * + * + * @author Franz-Josef Elmer + */ +public class FeatureVectorDatasetLoaderTest extends AbstractServerTestCase +{ + private IScreeningBusinessObjectFactory screeningBOFactory; + + @BeforeMethod + public void beforeMethod() + { + screeningBOFactory = context.mock(IScreeningBusinessObjectFactory.class); + } + + @Test + public void testGetFeatureVectorDatasets() + { + final RecordingMatcher<ListOrSearchSampleCriteria> recordingCriteriaMatcher = + new RecordingMatcher<ListOrSearchSampleCriteria>(); + final ExternalData ids1 = new DataSetBuilder(1l).code("ids1").type("HCS_IMAGE").getDataSet(); + final ExternalData fds1 = new DataSetBuilder(11l).code("fds1").type("HCS_ANALYSIS_WELL_FEATURES").getDataSet(); + final ExternalData fds2 = new DataSetBuilder(12l).code("fds2").type("HCS_ANALYSIS_WELL_FEATURES").getDataSet(); + final ExternalData ids2 = new DataSetBuilder(2l).code("ids2").type("HCS_IMAGE").getDataSet(); + final ExternalData fds3 = new DataSetBuilder(21l).code("fds3").type("HCS_ANALYSIS_WELL_FEATURES").getDataSet(); + final ExternalData fds4 = new DataSetBuilder(100l).code("fds4").type("HCS_ANALYSIS_WELL_FEATURES").getDataSet(); + final ExternalData ds1 = new DataSetBuilder(101l).code("ds1").type("BLABLA").getDataSet(); + context.checking(new Expectations() + { + { + one(screeningBOFactory).createSampleLister(SESSION); + will(returnValue(sampleLister)); + allowing(screeningBOFactory).createDatasetLister(SESSION); + will(returnValue(datasetLister)); + + one(sampleLister).list(with(recordingCriteriaMatcher)); + ArrayList<Sample> samples = new ArrayList<Sample>(); + samples.add(new SampleBuilder("/S/P1").id(42l).permID("s-1").getSample()); + will(returnValue(samples)); + + one(datasetLister).listBySampleIds(Arrays.asList(42l)); + will(returnValue(Arrays.asList(ids1, fds1, fds2, ids2, fds3, fds4, ds1))); + + one(datasetLister).listByParentTechIds(Arrays.asList(1l, 2l)); + will(returnValue(Arrays.asList(fds1, fds2, fds3, ds1))); + + one(datasetLister).listParentIds(Arrays.asList(11l, 12l, 21l)); + HashMap<Long, Set<Long>> map = new HashMap<Long, Set<Long>>(); + map.put(11l, Collections.singleton(1l)); + map.put(12l, Collections.singleton(1l)); + map.put(21l, Collections.singleton(2l)); + will(returnValue(map)); + } + }); + List<PlateIdentifier> plateIdentifiers = + Arrays.<PlateIdentifier> asList(new PlateIdentifier("P1", "S", "s-1")); + FeatureVectorDatasetLoader loader = + new FeatureVectorDatasetLoader(SESSION, screeningBOFactory, null, plateIdentifiers); + + List<ExternalData> datasets = new ArrayList<ExternalData>(loader.getFeatureVectorDatasets()); + + assertEquals("[]", Arrays.asList(recordingCriteriaMatcher.recordedObject().trySampleCodes()).toString()); + assertEquals("[s-1]", Arrays.asList(recordingCriteriaMatcher.recordedObject().trySamplePermIds()).toString()); + Collections.sort(datasets, new Comparator<ExternalData>() + { + public int compare(ExternalData o1, ExternalData o2) + { + return o1.getCode().compareTo(o2.getCode()); + } + }); + assertSame(fds1, datasets.get(0)); + assertSame(ids1, datasets.get(0).getParents().iterator().next()); + assertEquals(1, datasets.get(0).getParents().size()); + assertSame(fds2, datasets.get(1)); + assertSame(ids1, datasets.get(1).getParents().iterator().next()); + assertEquals(1, datasets.get(1).getParents().size()); + assertSame(fds3, datasets.get(2)); + assertSame(ids2, datasets.get(2).getParents().iterator().next()); + assertEquals(1, datasets.get(2).getParents().size()); + assertSame(fds4, datasets.get(3)); + assertEquals(null, datasets.get(3).getParents()); + assertEquals(4, datasets.size()); + context.assertIsSatisfied(); + } +} diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java new file mode 100644 index 00000000000..8ad5b2c618a --- /dev/null +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java @@ -0,0 +1,148 @@ +/* + * Copyright 2011 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.plugin.screening.server.logic; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Set; + +import org.jmock.Expectations; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.common.test.RecordingMatcher; +import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase; +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.basic.dto.ListOrSearchSampleCriteria; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataStoreBuilder; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.SampleBuilder; +import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory; +import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ImageDatasetReference; +import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants; + +/** + * + * + * @author Franz-Josef Elmer + */ +public class HCSImageDatasetLoaderTest extends AbstractServerTestCase +{ + private static final String STORE_CODE = "store-1"; + private static final String DOWNLOAD_URL = "http://download"; + private static final String HOST_URL = "http://host"; + + private IScreeningBusinessObjectFactory screeningBOFactory; + + @BeforeMethod + public void beforeMethod() + { + screeningBOFactory = context.mock(IScreeningBusinessObjectFactory.class); + } + + private DataSetBuilder dataSet(long id) + { + DataStoreBuilder dataStoreBuilder = new DataStoreBuilder(STORE_CODE); + dataStoreBuilder.hostUrl(HOST_URL).downloadUrl(DOWNLOAD_URL); + Experiment experiment = new ExperimentBuilder().identifier("/S/P/E1").getExperiment(); + return new DataSetBuilder(id).store(dataStoreBuilder.getStore()).experiment(experiment); + } + + @Test + public void testGetSegmentationImageDatasetReferences() + { + final RecordingMatcher<ListOrSearchSampleCriteria> recordingCriteriaMatcher = + new RecordingMatcher<ListOrSearchSampleCriteria>(); + SampleBuilder sampleBuilder = new SampleBuilder("/S/P1").id(42l).permID("s-1"); + VocabularyTerm value = new VocabularyTerm(); + value.setCode("96_WELLS_8X12"); + sampleBuilder.property(ScreeningConstants.PLATE_GEOMETRY).value(value); + final Sample sample = sampleBuilder.getSample(); + final ExternalData ids1 = dataSet(1l).code("ids1").type("HCS_IMAGE").sample(sample).getDataSet(); + final ExternalData sds1 = dataSet(11l).code("sds1").type("HCS_IMAGE_SEGMENTATION").sample(sample).getDataSet(); + final ExternalData sds2 = dataSet(12l).code("sds2").type("HCS_IMAGE_SEGMENTATION").sample(sample).getDataSet(); + final ExternalData ids2 = dataSet(2l).code("ids2").type("HCS_IMAGE").sample(sample).getDataSet(); + final ExternalData sds3 = dataSet(21l).code("sds3").type("HCS_IMAGE_SEGMENTATION").sample(sample).getDataSet(); + final ExternalData sds4 = dataSet(100l).code("sds4").type("HCS_IMAGE_SEGMENTATION").getDataSet(); + final ExternalData ds1 = dataSet(101l).code("ds1").type("BLABLA").sample(sample).getDataSet(); + context.checking(new Expectations() + { + { + one(screeningBOFactory).createSampleLister(SESSION); + will(returnValue(sampleLister)); + allowing(screeningBOFactory).createDatasetLister(SESSION); + will(returnValue(datasetLister)); + + one(sampleLister).list(with(recordingCriteriaMatcher)); + ArrayList<Sample> samples = new ArrayList<Sample>(); + samples.add(sample); + will(returnValue(samples)); + + one(datasetLister).listBySampleIds(Arrays.asList(42l)); + will(returnValue(Arrays.asList(ids1, sds1, sds2, ids2, sds3, sds4, ds1))); + + one(datasetLister).listByParentTechIds(Arrays.asList(1l, 2l)); + will(returnValue(Arrays.asList(sds1, sds2, sds3, ds1))); + + one(datasetLister).listParentIds(Arrays.asList(11l, 12l, 21l)); + HashMap<Long, Set<Long>> map = new HashMap<Long, Set<Long>>(); + map.put(11l, Collections.singleton(1l)); + map.put(12l, Collections.singleton(1l)); + map.put(21l, Collections.singleton(2l)); + will(returnValue(map)); + } + }); + List<PlateIdentifier> plateIdentifiers = + Arrays.<PlateIdentifier> asList(new PlateIdentifier("P1", "S", "s-1")); + HCSImageDatasetLoader loader = + new HCSImageDatasetLoader(SESSION, screeningBOFactory, null, plateIdentifiers); + + List<ImageDatasetReference> references = loader.getSegmentationImageDatasetReferences(); + + assertEquals("[]", Arrays + .asList(recordingCriteriaMatcher.recordedObject().trySampleCodes()).toString()); + assertEquals("[s-1]", + Arrays.asList(recordingCriteriaMatcher.recordedObject().trySamplePermIds()) + .toString()); + Collections.sort(references, new Comparator<ImageDatasetReference>() + { + public int compare(ImageDatasetReference o1, ImageDatasetReference o2) + { + return o1.getDatasetCode().compareTo(o2.getDatasetCode()); + } + }); + assertEquals("sds1 (plate: /S/P1 [s-1])", references.get(0).toString()); + assertEquals("ids1 (plate: /S/P1 [s-1])", references.get(0).getParentImageDatasetReference().toString()); + assertEquals("sds2 (plate: /S/P1 [s-1])", references.get(1).toString()); + assertEquals("ids1 (plate: /S/P1 [s-1])", references.get(1).getParentImageDatasetReference().toString()); + assertEquals("sds3 (plate: /S/P1 [s-1])", references.get(2).toString()); + assertEquals("ids2 (plate: /S/P1 [s-1])", references.get(2).getParentImageDatasetReference().toString()); + assertEquals(3, references.size()); + context.assertIsSatisfied(); + + } + +} -- GitLab